webxoss-core/Room.js
2016-10-23 13:56:45 +08:00

258 lines
No EOL
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;