diff --git a/backend/__init__.py b/backend/__init__.py index 27b167c..dd38d44 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -130,7 +130,8 @@ def chat_message(sid, msg): if any([p.is_bot for p in ses.game.players]): [p for p in ses.game.players if p.is_bot][-1].disconnect() elif '/suicide' in msg and ses.game.started: - ses.game.player_death(player=ses) + ses.lives = 0 + ses.notify_self() @sio.event def start_game(sid): diff --git a/backend/bang/game.py b/backend/bang/game.py index 32ea89f..f95349e 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -23,6 +23,7 @@ class Game: self.initial_players = 0 self.password = '' self.expansions = [] + self.shutting_down = False def notify_room(self): if len([p for p in self.players if p.character == None]) != 0: @@ -197,6 +198,7 @@ class Game: self.players[self.turn].play_turn() def next_turn(self): + if self.shutting_down: return if len(self.players) > 0: self.turn = (self.turn + 1) % len(self.players) self.play_turn() @@ -210,9 +212,16 @@ class Game: def handle_disconnect(self, player: players.Player): print(f'player {player.name} left the game {self.name}') - self.player_death(player=player, disconnected=True) - if len([p for p in self.players if not p.is_bot]) == 0: + if player in self.players: + self.player_death(player=player, disconnected=True) + else: + self.dead_players.remove(player) + if len([p for p in self.players if not p.is_bot])+len([p for p in self.dead_players if not p.is_bot]) == 0: print(f'no players left in game {self.name}') + self.shutting_down = True + self.players = [] + self.dead_players = [] + self.deck = None return True else: return False diff --git a/backend/bang/players.py b/backend/bang/players.py index 9020d91..4c976bb 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -155,6 +155,10 @@ class Player: randrange(0, len(self.hand)))) if self.lives <= 0 and self.max_lives > 0: self.pending_action = PendingAction.WAIT + ser['hand'] = [] + ser['equipment'] = [] + self.sio.emit('self', room=self.sid, data=json.dumps( + ser, default=lambda o: o.__dict__)) self.game.player_death(self) elif not self.is_bot: self.sio.emit('self_vis', room=self.sid, data=json.dumps( @@ -169,6 +173,7 @@ class Player: self.game.notify_all() def bot_logic(self): + if self.game.shutting_down: return if self.pending_action != PendingAction.WAIT: eventlet.sleep(uniform(0.6, 1.5)) else: @@ -218,7 +223,7 @@ class Player: if not c.need_target: self.play_card(len(self.hand)+i) else: - _range = self.get_sight() if c.name == "Pepperbox" else self.hand[i].range + _range = self.get_sight() if c.name == "Pepperbox" else c.range others = [p for p in self.game.get_visible_players(self) if _range >= p['dist'] and not (isinstance(self.role, r.Vice) and p['is_sheriff'])] if len(others) == 0: continue