diff --git a/backend/bang/game.py b/backend/bang/game.py index db79c77..9114f56 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -6,6 +6,7 @@ import bang.players as players import bang.characters as characters from bang.deck import Deck import bang.roles as roles +import eventlet class Game: def __init__(self, name, sio:socketio): @@ -13,6 +14,7 @@ class Game: self.sio = sio self.name = name self.players: List[players.Player] = [] + self.dead_players: List[players.Player] = [] self.deck: Deck = None self.started = False self.turn = 0 @@ -62,10 +64,12 @@ class Game: self.notify_room() def notify_character_selection(self): - self.readyCount += 1 self.notify_room() - if self.readyCount == len(self.players): + if len([p for p in self.players if p.character == None]) == 0: for i in range(len(self.players)): + print(self.name) + print(self.players[i].name) + print(self.players[i].character) self.sio.emit('chat_message', room=self.name, data=f'{self.players[i].name} ha come personaggio {self.players[i].character.name}, la sua abilità speciale è: {self.players[i].character.desc}') self.players[i].prepare() for k in range(self.players[i].max_lives): @@ -203,6 +207,7 @@ class Game: def handle_disconnect(self, player: players.Player): print(f'player {player.name} left the game {self.name}') self.player_death(player=player) + self.dead_players.remove(player) if len(self.players) == 0: print(f'no players left in game {self.name}') return True @@ -225,31 +230,11 @@ class Game: if (self.waiting_for > 0): self.responders_did_respond_resume_turn() - vulture = [p for p in self.players if isinstance(p.character, characters.VultureSam)] - if len(vulture) == 0: - for i in range(len(player.hand)): - self.deck.scrap(player.hand.pop()) - for i in range(len(player.equipment)): - self.deck.scrap(player.equipment.pop()) - else: - for i in range(len(player.hand)): - vulture[0].hand.append(player.hand.pop()) - for i in range(len(player.equipment)): - vulture[0].hand.append(player.equipment.pop()) - vulture[0].notify_self() - greg = [p for p in self.players if isinstance(p.character, chd.GregDigger)] - if len(greg) > 0: - greg[0].lives = min(greg[0].lives+2, greg[0].max_lives) - herb = [p for p in self.players if isinstance(p.character, chd.HerbHunter)] - if len(herb) > 0: - herb[0].hand.append(self.deck.draw()) - herb[0].hand.append(self.deck.draw()) - index = self.players.index(player) died_in_his_turn = self.started and index == self.turn if self.started and index <= self.turn: self.turn -= 1 - self.players.pop(index) + self.dead_players.append(self.players.pop(index)) self.notify_room() self.sio.emit('chat_message', room=self.name, data=f'{player.name} è morto.') if self.started: @@ -267,12 +252,47 @@ class Game: print('WE HAVE A WINNER') for p in self.players: p.win_status = p in winners + self.sio.emit('chat_message', room=self.name, data=f'{p.name} ha vinto.') p.notify_self() - return + eventlet.sleep(5.0) + return self.reset() + vulture = [p for p in self.players if isinstance(p.character, characters.VultureSam)] + if len(vulture) == 0: + for i in range(len(player.hand)): + self.deck.scrap(player.hand.pop()) + for i in range(len(player.equipment)): + self.deck.scrap(player.equipment.pop()) + else: + for i in range(len(player.hand)): + vulture[0].hand.append(player.hand.pop()) + for i in range(len(player.equipment)): + vulture[0].hand.append(player.equipment.pop()) + vulture[0].notify_self() + greg = [p for p in self.players if isinstance(p.character, chd.GregDigger)] + if len(greg) > 0: + greg[0].lives = min(greg[0].lives+2, greg[0].max_lives) + herb = [p for p in self.players if isinstance(p.character, chd.HerbHunter)] + if len(herb) > 0: + herb[0].hand.append(self.deck.draw()) + herb[0].hand.append(self.deck.draw()) + if died_in_his_turn: self.next_turn() + def reset(self): + print('resetting lobby') + self.players.extend(self.dead_players) + self.dead_players = [] + print(self.players) + self.started = False + self.waiting_for = 0 + for p in self.players: + p.reset() + p.notify_self() + eventlet.sleep(0.5) + self.notify_room() + def get_visible_players(self, player: players.Player): i = self.players.index(player) sight = player.get_sight() diff --git a/backend/bang/players.py b/backend/bang/players.py index 7df2d44..bb80a84 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -48,6 +48,33 @@ class Player: self.mancato_needed = 0 self.molly_discarded_cards = 0 + def reset(self): + self.hand: cs.Card = [] + self.equipment: cs.Card = [] + self.role: r.Role = None + self.character: chars.Character = None + self.lives = 0 + self.max_lives = 0 + self.is_my_turn = False + self.is_waiting_for_action = True + self.has_played_bang = False + self.pending_action: PendingAction = None + self.available_characters = [] + self.was_shot = False + self.on_pick_cb = None + self.on_failed_response_cb = None + self.event_type: str = None + self.expected_response = [] + self.attacker: Player = None + self.target_p: str = None + self.is_drawing = False + try: + del self.win_status + except: + pass + self.mancato_needed = 0 + self.molly_discarded_cards = 0 + def join_game(self, game): self.game = game print(f'I {self.name} joined {self.game}')