init pong refactoring for spectator mode
+ pongSpectator.ts should be good + EventError wip, not tested
This commit is contained in:
@@ -88,7 +88,7 @@ async function clientAnnounceListener(this: WebSocket, data: string)
|
||||
});
|
||||
if (!response.ok)
|
||||
{
|
||||
// send message to client ? or just gtfo ?
|
||||
this.send(JSON.stringify( new ev.EventError((await response.json()).message)));
|
||||
clientTerminate(clientsMap.get(this.id));
|
||||
return;
|
||||
}
|
||||
@@ -111,7 +111,7 @@ async function clientAnnounceListener(this: WebSocket, data: string)
|
||||
const announce: ev.ClientAnnounceSpectator = <ev.ClientAnnounceSpectator>msg;
|
||||
const gameSession = gameSessionsMap.get(announce.gameSessionId);
|
||||
if (!gameSession) {
|
||||
// WIP: send "invalid game session"
|
||||
this.send(JSON.stringify( new ev.EventError("invalid gameSessionId")));
|
||||
clientTerminate(clientsMap.get(this.id));
|
||||
return;
|
||||
}
|
||||
@@ -187,13 +187,15 @@ function privateMatchmaking(player: ClientPlayer)
|
||||
});
|
||||
createGameSession(compatiblePlayers, matchOptions);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
setTimeout(async function abortMatch() {
|
||||
if (!player.gameSession)
|
||||
{
|
||||
// TODO: informe le back de l'invalidité du token d'invitation
|
||||
player.socket.send(JSON.stringify( new ev.EventMatchAbort() ));
|
||||
const responseTobakc = await fetch(c.addressBackEnd + "/game/gameserver/destroysession",{
|
||||
if (player.socket.OPEN) {
|
||||
player.socket.send(JSON.stringify( new ev.EventMatchAbort() ));
|
||||
}
|
||||
const response = await fetch(c.addressBackEnd + "/game/gameserver/destroysession",{
|
||||
method: "POST",
|
||||
headers : {"Content-Type": "application/json"},
|
||||
body : JSON.stringify({
|
||||
@@ -201,7 +203,7 @@ function privateMatchmaking(player: ClientPlayer)
|
||||
})
|
||||
})
|
||||
.then(x => x.json())
|
||||
.catch(error => console.log("ERROR : " + error))
|
||||
.catch(error => console.log("ERROR : " + error));
|
||||
clientTerminate(player);
|
||||
}
|
||||
}, 60000);
|
||||
|
||||
@@ -72,12 +72,19 @@ export class EventMatchEnd extends ServerEvent {
|
||||
}
|
||||
|
||||
export class EventMatchAbort extends ServerEvent {
|
||||
|
||||
constructor() {
|
||||
super(en.EventTypes.matchAbort);
|
||||
}
|
||||
}
|
||||
|
||||
export class EventError extends ServerEvent {
|
||||
message: string;
|
||||
constructor(message: string) {
|
||||
super(en.EventTypes.error);
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* From Client */
|
||||
export class ClientEvent {
|
||||
|
||||
@@ -6,6 +6,7 @@ export enum EventTypes {
|
||||
matchEnd,
|
||||
assignId,
|
||||
matchmakingComplete,
|
||||
error,
|
||||
|
||||
// Generic
|
||||
matchmakingInProgress,
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
import * as enumeration from './shared_js/enums';
|
||||
import * as pong from "./client/pong"
|
||||
import * as pongSpectator from "./client/pongSpectator" // TODO init spectator
|
||||
|
||||
// Pour Chérif: variables indiquant l'état du match
|
||||
import { matchEnded, matchAbort } from "./client/ws";
|
||||
|
||||
//user's stuff
|
||||
@@ -43,7 +45,6 @@
|
||||
})
|
||||
|
||||
onDestroy( async() => {
|
||||
// TODO: destroy() in pong
|
||||
pong.destroy();
|
||||
})
|
||||
|
||||
@@ -52,13 +53,8 @@
|
||||
optionsAreNotSet = false;
|
||||
showWaitPage = true;
|
||||
|
||||
let matchOptions = enumeration.MatchOptions.noOption;
|
||||
if (options.multi_balls === true) {
|
||||
matchOptions |= enumeration.MatchOptions.multiBalls
|
||||
}
|
||||
if (options.moving_walls === true) {
|
||||
matchOptions |= enumeration.MatchOptions.movingWalls
|
||||
}
|
||||
const matchOptions = pong.computeMatchOptions(options);
|
||||
|
||||
const responseWhenGrantToken = fetch("http://transcendance:8080/api/v2/game/ticket", {
|
||||
method : "POST",
|
||||
headers : {'Content-Type': 'application/json'},
|
||||
@@ -72,7 +68,7 @@
|
||||
const responseFromServer = await responseWhenGrantToken;
|
||||
const responseInjson = await responseFromServer.json();
|
||||
const token : string = responseInjson.token;
|
||||
showWaitPage = false
|
||||
showWaitPage = false;
|
||||
if (!responseFromServer.ok)
|
||||
{
|
||||
errorMessageWhenAttemptingToGetATicket = responseInjson.message;
|
||||
@@ -82,8 +78,7 @@
|
||||
showWaitPage = false
|
||||
optionsAreNotSet = true
|
||||
options.playerTwoUsername = "";
|
||||
matchOptions = enumeration.MatchOptions.noOption;
|
||||
}, 5000)
|
||||
}, 5000);
|
||||
}
|
||||
else if (token)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
export class InitOptions {
|
||||
sound = "off";
|
||||
multi_balls = false;
|
||||
moving_walls = false;
|
||||
isSomeoneIsInvited = false;
|
||||
isInvitedPerson = false;
|
||||
playerOneUsername = "";
|
||||
playerTwoUsername = "";
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
|
||||
import * as c from "./constants.js"
|
||||
import * as en from "../shared_js/enums.js"
|
||||
import { GameArea } from "./class/GameArea.js";
|
||||
import { GameComponentsClient } from "./class/GameComponentsClient.js";
|
||||
import { socket } from "./ws.js";
|
||||
import { initAudio } from "./audio.js";
|
||||
import type { InitOptions } from "./class/InitOptions.js";
|
||||
|
||||
import { pong } from "./global.js"
|
||||
import { initPong, initGc, initMatchOptions } from "./global.js"
|
||||
|
||||
export function computeMatchOptions(options: InitOptions)
|
||||
{
|
||||
let matchOptions = en.MatchOptions.noOption;
|
||||
|
||||
if (options.multi_balls === true) {
|
||||
matchOptions |= en.MatchOptions.multiBalls
|
||||
}
|
||||
if (options.moving_walls === true) {
|
||||
matchOptions |= en.MatchOptions.movingWalls
|
||||
}
|
||||
|
||||
return matchOptions;
|
||||
}
|
||||
|
||||
export function initBase(options: InitOptions, gameAreaId: string)
|
||||
{
|
||||
const matchOptions = computeMatchOptions(options);
|
||||
initMatchOptions(matchOptions);
|
||||
initAudio(options.sound);
|
||||
initPong(new GameArea(gameAreaId));
|
||||
initGc(new GameComponentsClient(matchOptions, pong.ctx));
|
||||
}
|
||||
|
||||
export function destroyBase()
|
||||
{
|
||||
if (pong)
|
||||
{
|
||||
clearInterval(pong.handleInputInterval);
|
||||
clearInterval(pong.gameLoopInterval);
|
||||
clearInterval(pong.drawLoopInterval);
|
||||
initPong(null);
|
||||
}
|
||||
if (socket && socket.OPEN) {
|
||||
socket.close();
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,23 @@
|
||||
|
||||
import * as c from "./constants.js"
|
||||
import { gc } from "./global.js"
|
||||
import { gc, pong } from "./global.js"
|
||||
import * as en from "../shared_js/enums.js"
|
||||
|
||||
/*
|
||||
before game
|
||||
*/
|
||||
export function error(message: string)
|
||||
{
|
||||
console.log("msg.error()");
|
||||
pong.clear();
|
||||
const text = "error: " + message;
|
||||
console.log(text);
|
||||
gc.text2.clear();
|
||||
gc.text2.pos.assign(c.w*0.2, c.h*0.5);
|
||||
gc.text2.text = text;
|
||||
gc.text2.update();
|
||||
}
|
||||
|
||||
export function matchmaking()
|
||||
{
|
||||
const text = "searching...";
|
||||
|
||||
@@ -1,48 +1,26 @@
|
||||
|
||||
import * as c from "./constants.js"
|
||||
import * as en from "../shared_js/enums.js"
|
||||
import { GameArea } from "./class/GameArea.js";
|
||||
import { GameComponentsClient } from "./class/GameComponentsClient.js";
|
||||
import { handleInput } from "./handleInput.js";
|
||||
// import { sendLoop } from "./handleInput.js";
|
||||
import { gameLoop } from "./gameLoop.js"
|
||||
import { drawLoop } from "./draw.js";
|
||||
import { countdown } from "./utils.js";
|
||||
import { initWebSocket } from "./ws.js";
|
||||
import { initAudio } from "./audio.js";
|
||||
|
||||
import type { InitOptions } from "./class/InitOptions.js";
|
||||
export { InitOptions } from "./class/InitOptions.js";
|
||||
import { initBase, destroyBase, computeMatchOptions } from "./init.js";
|
||||
export { computeMatchOptions } from "./init.js";
|
||||
|
||||
/* TODO: A way to delay the init of variables, but still use "const" not "let" ? */
|
||||
import { pong, gc } from "./global.js"
|
||||
import { initPong, initGc, initMatchOptions, initStartFunction } from "./global.js"
|
||||
import { initStartFunction } from "./global.js"
|
||||
|
||||
export class InitOptions {
|
||||
sound = "off";
|
||||
multi_balls = false;
|
||||
moving_walls = false;
|
||||
isSomeoneIsInvited = false;
|
||||
isInvitedPerson = false;
|
||||
playerOneUsername = "";
|
||||
playerTwoUsername = "";
|
||||
}
|
||||
|
||||
export function init(options: InitOptions, gameAreaId: string, token: string)
|
||||
{
|
||||
let matchOptions = en.MatchOptions.noOption;
|
||||
if (options.multi_balls === true) {
|
||||
matchOptions |= en.MatchOptions.multiBalls
|
||||
}
|
||||
if (options.moving_walls === true) {
|
||||
matchOptions |= en.MatchOptions.movingWalls
|
||||
}
|
||||
initBase(options, gameAreaId);
|
||||
|
||||
initMatchOptions(matchOptions);
|
||||
initAudio(options.sound);
|
||||
|
||||
initPong(new GameArea(gameAreaId));
|
||||
initGc(new GameComponentsClient(matchOptions, pong.ctx));
|
||||
initStartFunction(start);
|
||||
|
||||
const matchOptions = computeMatchOptions(options);
|
||||
if (options.isSomeoneIsInvited) {
|
||||
initWebSocket(matchOptions, token, options.playerOneUsername, true, options.playerTwoUsername, options.isInvitedPerson);
|
||||
}
|
||||
@@ -53,14 +31,7 @@ export function init(options: InitOptions, gameAreaId: string, token: string)
|
||||
|
||||
export function destroy()
|
||||
{
|
||||
// TODO
|
||||
if (pong)
|
||||
{
|
||||
clearInterval(pong.handleInputInterval);
|
||||
clearInterval(pong.gameLoopInterval);
|
||||
clearInterval(pong.drawLoopInterval);
|
||||
initPong(null);
|
||||
}
|
||||
destroyBase();
|
||||
}
|
||||
|
||||
function start()
|
||||
|
||||
@@ -1,37 +1,29 @@
|
||||
|
||||
initSpectator();
|
||||
function initSpectator() {
|
||||
// Wip
|
||||
init();
|
||||
}
|
||||
|
||||
import * as c from "./constants.js"
|
||||
import * as en from "../shared_js/enums.js"
|
||||
import { GameArea } from "./class/GameArea.js";
|
||||
import { GameComponentsClient } from "./class/GameComponentsClient.js";
|
||||
import { gameLoopSpectator } from "./gameLoop.js"
|
||||
import { drawLoop } from "./draw.js";
|
||||
import { initWebSocketSpectator } from "./ws.js";
|
||||
import { initAudio } from "./audio.js";
|
||||
|
||||
import type { InitOptions } from "./class/InitOptions.js";
|
||||
export { InitOptions } from "./class/InitOptions.js";
|
||||
import { initBase, destroyBase, computeMatchOptions } from "./init.js";
|
||||
export { computeMatchOptions } from "./init.js";
|
||||
|
||||
/* TODO: A way to delay the init of variables, but still use "const" not "let" ? */
|
||||
import { pong, gc } from "./global.js"
|
||||
import { initPong, initGc, initMatchOptions, initStartFunction } from "./global.js"
|
||||
import { initStartFunction } from "./global.js"
|
||||
|
||||
function init()
|
||||
|
||||
export function init(options: InitOptions, gameAreaId: string, gameSessionId: string)
|
||||
{
|
||||
initAudio(false);
|
||||
initBase(options, gameAreaId);
|
||||
|
||||
// WIP matchOptions
|
||||
let matchOptions: en.MatchOptions = en.MatchOptions.noOption;
|
||||
initMatchOptions(matchOptions);
|
||||
|
||||
|
||||
initPong(new GameArea());
|
||||
initGc(new GameComponentsClient(matchOptions, pong.ctx));
|
||||
initStartFunction(start);
|
||||
initWebSocketSpectator(c.gameSessionIdPLACEHOLDER);
|
||||
initWebSocketSpectator(gameSessionId);
|
||||
}
|
||||
|
||||
export function destroy()
|
||||
{
|
||||
destroyBase();
|
||||
}
|
||||
|
||||
function start()
|
||||
|
||||
@@ -48,6 +48,7 @@ export function initWebSocket(options: en.MatchOptions, token: string, username:
|
||||
}
|
||||
});
|
||||
// socket.addEventListener("message", logListener); // for testing purpose
|
||||
socket.addEventListener("message", errorListener);
|
||||
socket.addEventListener("message", preMatchListener);
|
||||
}
|
||||
|
||||
@@ -55,6 +56,15 @@ function logListener(this: WebSocket, event: MessageEvent) {
|
||||
console.log("%i: " + event.data, Date.now());
|
||||
}
|
||||
|
||||
function errorListener(this: WebSocket, event: MessageEvent) {
|
||||
console.log("errorListener");
|
||||
const data: ev.ServerEvent = JSON.parse(event.data);
|
||||
if (data.type === en.EventTypes.error) {
|
||||
console.log("actual Error");
|
||||
msg.error((data as ev.EventError).message);
|
||||
}
|
||||
}
|
||||
|
||||
function preMatchListener(this: WebSocket, event: MessageEvent)
|
||||
{
|
||||
const data: ev.ServerEvent = JSON.parse(event.data);
|
||||
|
||||
@@ -72,12 +72,19 @@ export class EventMatchEnd extends ServerEvent {
|
||||
}
|
||||
|
||||
export class EventMatchAbort extends ServerEvent {
|
||||
|
||||
constructor() {
|
||||
super(en.EventTypes.matchAbort);
|
||||
}
|
||||
}
|
||||
|
||||
export class EventError extends ServerEvent {
|
||||
message: string;
|
||||
constructor(message: string) {
|
||||
super(en.EventTypes.error);
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* From Client */
|
||||
export class ClientEvent {
|
||||
|
||||
@@ -6,6 +6,7 @@ export enum EventTypes {
|
||||
matchEnd,
|
||||
assignId,
|
||||
matchmakingComplete,
|
||||
error,
|
||||
|
||||
// Generic
|
||||
matchmakingInProgress,
|
||||
|
||||
Reference in New Issue
Block a user