forked from mirrors/webxoss-core
258 lines
6.5 KiB
JavaScript
258 lines
6.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
function Room (name,host,password,mayusRoom) {
|
||
|
this.name = name;
|
||
|
this.host = host;
|
||
|
this.guest = null;
|
||
|
|
||
|
this.hostSpectatorList = []; // 列表,client或undefined或null,
|
||
|
this.guestSpectatorList = []; // undefined表示禁用,null表示空.
|
||
|
for (var i = 0; i < 5; i++) {
|
||
|
this.hostSpectatorList.push(undefined);
|
||
|
this.guestSpectatorList.push(undefined);
|
||
|
}
|
||
|
|
||
|
// 直播
|
||
|
this.live = false;
|
||
|
this.liveSpectators = [];
|
||
|
|
||
|
this.game = null;
|
||
|
this.password = password;
|
||
|
this.mayusRoom = !!mayusRoom;
|
||
|
this.reconnecting = false;
|
||
|
this.activateTime = Date.now();
|
||
|
}
|
||
|
|
||
|
Room.prototype.toInfo = function () {
|
||
|
var total = 2;
|
||
|
var count = 1;
|
||
|
if (this.guest) count++;
|
||
|
concat(this.hostSpectatorList,this.guestSpectatorList).forEach(function (spectator) {
|
||
|
if (spectator === undefined) return;
|
||
|
total++;
|
||
|
if (spectator) count++;
|
||
|
},this);
|
||
|
var info = {
|
||
|
roomName: this.name,
|
||
|
passwordRequired: !!this.password,
|
||
|
total: total,
|
||
|
count: count,
|
||
|
live: this.live,
|
||
|
mayusRoom: this.mayusRoom
|
||
|
};
|
||
|
return info;
|
||
|
};
|
||
|
|
||
|
Room.prototype.getAllClients = function () {
|
||
|
return this.liveSpectators.concat(this.getRoomMembers());
|
||
|
};
|
||
|
|
||
|
Room.prototype.getRoomMembers = function () { // 除了直播观众
|
||
|
var clients = this.hostSpectatorList.concat(this.guestSpectatorList).filter(function (spectator) {
|
||
|
return spectator;
|
||
|
});
|
||
|
if (this.host) clients.push(this.host);
|
||
|
if (this.guest) clients.push(this.guest);
|
||
|
return clients;
|
||
|
};
|
||
|
|
||
|
Room.prototype.emit = function (name,value) {
|
||
|
var clients = this.getAllClients();
|
||
|
clients.forEach(function (client) {
|
||
|
client.socket.emit(name,value);
|
||
|
},this);
|
||
|
};
|
||
|
|
||
|
Room.prototype.emitTo = function (positions,name,value) {
|
||
|
var clients = this.getAllClients();
|
||
|
clients.forEach(function (client) {
|
||
|
if (!inArr(client.getPosition(),positions)) return;
|
||
|
client.socket.emit(name,value);
|
||
|
},this);
|
||
|
};
|
||
|
|
||
|
Room.prototype.removeSpectator = function (client) {
|
||
|
return this.removeHostSpectator(client) ||
|
||
|
this.removeGuestSpectator(client) ||
|
||
|
this.removeLiveSpectator(client);
|
||
|
};
|
||
|
|
||
|
Room.prototype.removeHostSpectator = function (client) {
|
||
|
var i = this.hostSpectatorList.indexOf(client);
|
||
|
if (i === -1) return false;
|
||
|
this.hostSpectatorList[i] = null;
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
Room.prototype.removeGuestSpectator = function (client) {
|
||
|
var i = this.guestSpectatorList.indexOf(client);
|
||
|
if (i === -1) return false;
|
||
|
this.guestSpectatorList[i] = null;
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
Room.prototype.removeClient = function (client) {
|
||
|
if (client === this.guest) {
|
||
|
this.guest = null;
|
||
|
return true;
|
||
|
}
|
||
|
return this.removeSpectator(client);
|
||
|
};
|
||
|
|
||
|
Room.prototype.isHostSpectatorsFull = function () {
|
||
|
return this.hostSpectatorList.every(function (spectator) {
|
||
|
return (spectator !== null);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
Room.prototype.isGuestSpectatorsFull = function () {
|
||
|
return this.guestSpectatorList.every(function (spectator) {
|
||
|
return (spectator !== null);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
Room.prototype.isFull = function () {
|
||
|
if (!this.guest) return false;
|
||
|
if (!this.isHostSpectatorsFull()) return false;
|
||
|
if (!this.isGuestSpectatorsFull()) return false;
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
Room.prototype.pushHostSpectator = function (client) {
|
||
|
for (var i = 0; i < this.hostSpectatorList.length; i++) {
|
||
|
if (this.hostSpectatorList[i] === null) {
|
||
|
this.hostSpectatorList[i] = client;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
Room.prototype.pushGuestSpectator = function (client) {
|
||
|
for (var i = 0; i < this.guestSpectatorList.length; i++) {
|
||
|
if (this.guestSpectatorList[i] === null) {
|
||
|
this.guestSpectatorList[i] = client;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
Room.prototype.setHostSpectator = function (client,i) {
|
||
|
if (this.hostSpectatorList[i] !== null) return false;
|
||
|
client.cfg = null;
|
||
|
this.removeClient(client);
|
||
|
this.hostSpectatorList[i] = client;
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
Room.prototype.setGuestSpectator = function (client,i) {
|
||
|
if (this.guestSpectatorList[i] !== null) return false;
|
||
|
client.cfg = null;
|
||
|
this.removeClient(client);
|
||
|
this.guestSpectatorList[i] = client;
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
Room.prototype.update = function () {
|
||
|
this.getRoomMembers().forEach(function (client) {
|
||
|
var msgObj = {
|
||
|
roomName: this.name,
|
||
|
host: this.host.nickname,
|
||
|
guest: this.guest? this.guest.nickname : '',
|
||
|
hostSpectatorList: this.hostSpectatorList.map(function (spectator) {
|
||
|
if (spectator === null) return '';
|
||
|
if (spectator === undefined) return null;
|
||
|
return spectator.nickname;
|
||
|
}),
|
||
|
guestSpectatorList: this.guestSpectatorList.map(function (spectator) {
|
||
|
if (spectator === null) return '';
|
||
|
if (spectator === undefined) return null;
|
||
|
return spectator.nickname;
|
||
|
}),
|
||
|
guestReady: !!(this.guest && this.guest.cfg),
|
||
|
me: client.getPosition(),
|
||
|
mayusRoom: this.mayusRoom
|
||
|
}
|
||
|
client.emit('update room',msgObj);
|
||
|
},this);
|
||
|
};
|
||
|
|
||
|
Room.prototype.getHostSpectators = function () {
|
||
|
var spaectators = [];
|
||
|
this.hostSpectatorList.forEach(function (spectator) {
|
||
|
if (!spectator) return;
|
||
|
spaectators.push(spectator);
|
||
|
});
|
||
|
return spaectators;
|
||
|
};
|
||
|
|
||
|
Room.prototype.getGuestSpectators = function () {
|
||
|
var spaectators = [];
|
||
|
this.guestSpectatorList.forEach(function (spectator) {
|
||
|
if (!spectator) return;
|
||
|
spaectators.push(spectator);
|
||
|
});
|
||
|
return spaectators;
|
||
|
};
|
||
|
|
||
|
Room.prototype.lockHostSpec = function (i) {
|
||
|
var spectator = this.hostSpectatorList[i];
|
||
|
this.hostSpectatorList[i] = undefined;
|
||
|
if (spectator) {
|
||
|
spectator.reset();
|
||
|
spectator.emit('kicked');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Room.prototype.lockGuestSpec = function (i) {
|
||
|
var spectator = this.guestSpectatorList[i];
|
||
|
this.guestSpectatorList[i] = undefined;
|
||
|
if (spectator) {
|
||
|
spectator.reset();
|
||
|
spectator.emit('kicked');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Room.prototype.unlockHostSpec = function (i) {
|
||
|
if (this.hostSpectatorList[i]) return;
|
||
|
this.hostSpectatorList[i] = null;
|
||
|
};
|
||
|
|
||
|
Room.prototype.unlockGuestSpec = function (i) {
|
||
|
if (this.guestSpectatorList[i]) return;
|
||
|
this.guestSpectatorList[i] = null;
|
||
|
};
|
||
|
|
||
|
// 直播
|
||
|
Room.prototype.pushLiveSpectator = function (client) {
|
||
|
this.liveSpectators.push(client);
|
||
|
};
|
||
|
Room.prototype.removeLiveSpectator = function (client) {
|
||
|
removeFromArr(client,this.liveSpectators);
|
||
|
};
|
||
|
|
||
|
Room.prototype.gameover = function () {
|
||
|
this.reconnecting = false;
|
||
|
if (this.game) this.game.destroy();
|
||
|
this.game = null;
|
||
|
this.live = false;
|
||
|
this.activateTime = Date.now();
|
||
|
this.getAllClients().forEach(function (client) {
|
||
|
client.gameover();
|
||
|
},this);
|
||
|
this.liveSpectators.length = 0;
|
||
|
this.update();
|
||
|
};
|
||
|
|
||
|
Room.prototype.createHostIO = function () {
|
||
|
return new IO(this.host,function () {
|
||
|
return this.liveSpectators.concat(this.getHostSpectators());
|
||
|
}.bind(this));
|
||
|
};
|
||
|
|
||
|
Room.prototype.createGuestIO = function () {
|
||
|
return new IO(this.guest,this.getGuestSpectators.bind(this));
|
||
|
};
|
||
|
|
||
|
global.Room = Room;
|