game: add: defeated by forfeit

This commit is contained in:
starnakin 2024-02-25 17:52:48 +01:00 committed by AdrienLSH
parent d814363b36
commit d0e87066b0
3 changed files with 49 additions and 22 deletions

View File

@ -10,9 +10,10 @@ class Game
{ {
/** /**
* @param {Client} client * @param {Client} client
* @param {CallableFunction} update_goal * @param {CallableFunction} goal_handler
* @param {CallableFunction} finish_handler
*/ */
constructor(client, id, update_goal) constructor(client, id, goal_handler, finish_handler)
{ {
/** /**
* @type {Client} * @type {Client}
@ -27,7 +28,12 @@ class Game
/** /**
* @type {CallableFunction} * @type {CallableFunction}
*/ */
this.update_goal = update_goal; this.goal_handler = goal_handler;
/**
* @type {CallableFunction}
*/
this.finish_handler = finish_handler;
} }
/** /**
@ -161,6 +167,16 @@ class Game
this.ball.from_json(data); this.ball.from_json(data);
} }
_receive_finish(data)
{
this.finish_handler(data)
}
_receive_goal(data)
{
this.goal_handler(data)
}
_receive(data) _receive(data)
{ {
if (data.detail === "update_paddle") if (data.detail === "update_paddle")
@ -170,7 +186,9 @@ class Game
else if (data.detail === "init_game") else if (data.detail === "init_game")
this._init_game(data); this._init_game(data);
else if (data.detail === "goal") else if (data.detail === "goal")
this.update_goal(data); this._receive_goal(data);
else if (data.detail === "finish")
this._receive_finish(data)
} }
_init_game(data) _init_game(data)

View File

@ -1,4 +1,4 @@
import { client } from "../index.js"; import { client, reloadView } from "../index.js";
import { Game } from "../api/game/Game.js"; import { Game } from "../api/game/Game.js";
import AbstractView from "./abstracts/AbstractView.js"; import AbstractView from "./abstracts/AbstractView.js";
import { MyPlayer } from "../api/game/MyPlayer.js"; import { MyPlayer } from "../api/game/MyPlayer.js";
@ -9,11 +9,17 @@ export default class extends AbstractView
constructor(params) constructor(params)
{ {
super(params, "Game"); super(params, "Game");
this.game = new Game(client, params.id, this.update_goal); this.game = new Game(client, params.id, this.on_goal, this.on_finish);
this.keys_pressed = []; this.keys_pressed = [];
this.my_player = undefined; this.my_player = undefined;
} }
on_finish(data)
{
console.log(data)
reloadView()
}
keyReleaseHandler(event) keyReleaseHandler(event)
{ {
const idx = this.keys_pressed.indexOf(event.key); const idx = this.keys_pressed.indexOf(event.key);
@ -51,7 +57,7 @@ export default class extends AbstractView
/** /**
* @param {Object} data * @param {Object} data
*/ */
update_goal(data) on_goal(data)
{ {
document.getElementById(`goal-${data.player}`).innerText = data.nb_goal; document.getElementById(`goal-${data.player}`).innerText = data.nb_goal;
} }

View File

@ -106,17 +106,11 @@ class Game(AbstractRoom):
def _send_game_data(self, member: Spectator | Player): def _send_game_data(self, member: Spectator | Player):
member.send("init_game", self.to_dict()) member.send("init_game", self.to_dict())
def everbody_is_here(self): def _everbody_is_here(self):
for player in self.players: return len(self.players) == len(self.get_players_connected())
if not player.is_connected():
return False
return True
def nobody_is_here(self): def _nobody_is_here(self):
for player in self.players: return len(self.get_players_connected()) == 0
if player.is_connected():
return False
return len(self.spectators) == 0
def _player_join(self, user_id: int, socket: WebsocketConsumer): def _player_join(self, user_id: int, socket: WebsocketConsumer):
@ -130,7 +124,7 @@ class Game(AbstractRoom):
player.socket = socket player.socket = socket
if (self.everbody_is_here()): if (self._everbody_is_here()):
self.start() self.start()
self._update_player(player) self._update_player(player)
@ -141,13 +135,22 @@ class Game(AbstractRoom):
self._updated_players.append(player) self._updated_players.append(player)
def finish(self, winner: Player): def finish(self, winner: Player):
print("yo")
self.broadcast("finish", {"winner": winner.to_dict()})
self.model.finish(winner.user_id) self.model.finish(winner.user_id)
def _player_leave(self, player: Player): def _player_leave(self, player: Player):
if (self.nobody_is_here()):
if (self.model.started): connected_players: list[Player] = self.get_players_connected()
self.finish(player)
if (self.model.started):
print(len(connected_players))
if (len(connected_players) == 1):
last_player: Player = connected_players[0]
print("finish")
self.finish(last_player)
return return
self._update_player(player) self._update_player(player)
def _spectator_join(self, user_id: int, socket: WebsocketConsumer): def _spectator_join(self, user_id: int, socket: WebsocketConsumer):
@ -178,7 +181,7 @@ class Game(AbstractRoom):
self._player_leave(member) self._player_leave(member)
elif (isinstance(member, Spectator)): elif (isinstance(member, Spectator)):
self._spectator_leave(member) self._spectator_leave(member)
if (self.nobody_is_here()): if (self._nobody_is_here()):
self.stopped = True self.stopped = True
self.thread.join(10) self.thread.join(10)
self.game_manager.remove(self) self.game_manager.remove(self)