GameSpectator wip
+ forfeit button + refactoring GameSession
This commit is contained in:
@@ -48,7 +48,10 @@ export class GameSession {
|
||||
timeout += c.newRoundDelay*0.5;
|
||||
});
|
||||
}
|
||||
resume(s: GameSession) {
|
||||
resume(s?: GameSession)
|
||||
{
|
||||
if (!s) { s = this; }
|
||||
|
||||
s.playersMap.forEach( (client) => {
|
||||
client.socket.on("message", clientInputListener);
|
||||
});
|
||||
@@ -59,7 +62,10 @@ export class GameSession {
|
||||
s.playersUpdateInterval = setInterval(s._playersUpdate, c.playersUpdateIntervalMS, s);
|
||||
s.spectatorsUpdateInterval = setInterval(s._spectatorsUpdate, c.spectatorsUpdateIntervalMS, s);
|
||||
}
|
||||
pause(s: GameSession) {
|
||||
pause(s?: GameSession)
|
||||
{
|
||||
if (!s) { s = this; }
|
||||
|
||||
s.playersMap.forEach( (client) => {
|
||||
client.socket.off("message", clientInputListener);
|
||||
});
|
||||
@@ -68,6 +74,19 @@ export class GameSession {
|
||||
clearInterval(s.playersUpdateInterval);
|
||||
clearInterval(s.spectatorsUpdateInterval);
|
||||
}
|
||||
destroy(s?: GameSession)
|
||||
{
|
||||
if (!s) { s = this; }
|
||||
|
||||
s.pause();
|
||||
|
||||
s.spectatorsMap.forEach((client) => {
|
||||
clientTerminate(client);
|
||||
});
|
||||
s.playersMap.forEach((client) => {
|
||||
clientTerminate(client);
|
||||
});
|
||||
}
|
||||
instantInputDebug(client: ClientPlayer) {
|
||||
this._handleInput(c.fixedDeltaTime, client);
|
||||
}
|
||||
@@ -200,26 +219,35 @@ export class GameSession {
|
||||
ball.speed = ball.baseSpeed;
|
||||
ball.ballInPlay = true;
|
||||
}
|
||||
private _checkDisconnexions() {
|
||||
private _checkDisconnexions()
|
||||
{
|
||||
if (this.playersMap.size !== 2)
|
||||
{
|
||||
this.matchEnded = true;
|
||||
if (this.playersMap.size != 0)
|
||||
{
|
||||
console.log("Forfeit Ending");
|
||||
const gc = this.components;
|
||||
const luckyWinner: ClientPlayer = this.playersMap.values().next().value;
|
||||
if (luckyWinner.racket === gc.playerLeft) {
|
||||
this._matchEnd(en.PlayerSide.left, true);
|
||||
}
|
||||
else {
|
||||
this._matchEnd(en.PlayerSide.right, true);
|
||||
}
|
||||
if (this.playersMap.size != 0) {
|
||||
this._forfeit();
|
||||
}
|
||||
else {
|
||||
// WIP: envoyer un truc à Nest ? Genre "match draw"
|
||||
this.destroy();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
private _forfeit()
|
||||
{
|
||||
this.matchEnded = true;
|
||||
console.log("Forfeit Ending");
|
||||
const gc = this.components;
|
||||
const luckyWinner: ClientPlayer = this.playersMap.values().next().value;
|
||||
if (luckyWinner.racket === gc.playerLeft) {
|
||||
this._matchEnd(en.PlayerSide.left, true);
|
||||
}
|
||||
else {
|
||||
this._matchEnd(en.PlayerSide.right, true);
|
||||
}
|
||||
}
|
||||
private async _matchEnd(winner: en.PlayerSide, forfeit_flag: boolean = false)
|
||||
{
|
||||
this.matchEnded = true;
|
||||
@@ -246,15 +274,7 @@ export class GameSession {
|
||||
})
|
||||
});
|
||||
|
||||
const gameSession = this;
|
||||
setTimeout(function kickRemainingClients() {
|
||||
gameSession.spectatorsMap.forEach((client) => {
|
||||
clientTerminate(client);
|
||||
});
|
||||
gameSession.playersMap.forEach((client) => {
|
||||
clientTerminate(client);
|
||||
});
|
||||
}, 15000);
|
||||
setTimeout(this.destroy, 15000, this);
|
||||
|
||||
// logs
|
||||
if (winner === en.PlayerSide.left) {
|
||||
|
||||
@@ -40,6 +40,14 @@ function connectionListener(socket: WebSocket, request: IncomingMessage)
|
||||
console.log(`client ${shortId(client.id)} is alive`);
|
||||
});
|
||||
|
||||
socket.on("error", function errorPrint(this: WebSocket, err: Error) {
|
||||
console.log(`error socket ${shortId(this.id)}:`);
|
||||
console.log(`${err.name}: ${err.message}`);
|
||||
if (err.stack) {
|
||||
console.log(`err.stack: ${err.stack}`);
|
||||
}
|
||||
});
|
||||
|
||||
socket.on("message", function log(data: string) {
|
||||
try {
|
||||
const event: ev.ClientEvent = JSON.parse(data);
|
||||
@@ -96,10 +104,13 @@ async function clientAnnounceListener(this: WebSocket, data: string)
|
||||
const player = clientsMap.get(this.id) as ClientPlayer;
|
||||
player.matchOptions = announce.matchOptions;
|
||||
player.token = announce.token;
|
||||
announce.isInvitedPerson ? player.username = announce.playerTwoUsername : player.username = announce.username;
|
||||
player.username = announce.username;
|
||||
this.send(JSON.stringify( new ev.EventAssignId(this.id) )); // unused
|
||||
this.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchmakingInProgress) ));
|
||||
if (announce.privateMatch) {
|
||||
if (announce.isInvitedPerson) {
|
||||
player.username = announce.playerTwoUsername;
|
||||
}
|
||||
privateMatchmaking(player);
|
||||
}
|
||||
else {
|
||||
@@ -365,9 +376,7 @@ export function clientTerminate(client: Client)
|
||||
client.gameSession.playersMap.delete(client.id);
|
||||
if (client.gameSession.playersMap.size === 0)
|
||||
{
|
||||
clearInterval(client.gameSession.playersUpdateInterval);
|
||||
clearInterval(client.gameSession.spectatorsUpdateInterval);
|
||||
clearInterval(client.gameSession.gameLoopInterval);
|
||||
client.gameSession.destroy();
|
||||
gameSessionsMap.delete(client.gameSession.id);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user