From 579501e01cd6ec3389ec1ae73c00c4f17746d1b5 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 24 Dec 2020 12:01:31 +0100 Subject: [PATCH] ghosts --- backend/bang/game.py | 28 ++++++++++++++++++++-------- backend/bang/players.py | 10 +++++++--- frontend/src/components/Deck.vue | 2 +- frontend/src/components/Lobby.vue | 5 ++++- frontend/src/components/Player.vue | 10 ++++++---- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/backend/bang/game.py b/backend/bang/game.py index 1baaf69..e8c70fa 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -270,14 +270,18 @@ class Game: def play_turn(self): self.incremental_turn += 1 if self.players[self.turn].lives <= 0 or self.players[self.turn].is_dead: - if self.check_event(ce.DeadMan) and not self.did_resuscitate_deadman and len(self.get_dead_players()) > 0: + pl = sorted(self.get_dead_players(), key=lambda x:x.death_turn)[0] + if self.check_event(ce.DeadMan) and not self.did_resuscitate_deadman and pl != self.players[self.turn]: self.did_resuscitate_deadman = True - pl = sorted(self.get_dead_players(), key=lambda x:x.death_turn)[0] pl.is_dead = False + pl.is_ghost = False pl.lives = 2 pl.hand.append(self.deck.draw()) pl.hand.append(self.deck.draw()) pl.notify_self() + elif self.check_event(ceh.CittaFantasma): + pl.is_ghost = True + pl.notify_self() else: return self.next_turn() self.player_bangs = 0 @@ -323,8 +327,14 @@ class Game: def next_turn(self): if self.shutting_down: return + if self.players[self.turn].is_dead and self.players[self.turn].is_ghost and self.check_event(ceh.CittaFantasma): + self.players[self.turn].is_ghost = False + for i in range(len(self.players[self.turn].attacker.hand)): + self.deck.scrap(self.players[self.turn].attacker.hand.pop(), True) + for i in range(len(self.players[self.turn].attacker.equipment)): + self.deck.scrap(self.players[self.turn].attacker.equipment.pop(), True) + self.players[self.turn].notify_self() pls = self.get_alive_players() - print(self.turn) if len(pls) > 0: if self.check_event(ceh.CorsaAllOro): self.turn = (self.turn - 1) % len(self.players) @@ -368,7 +378,7 @@ class Game: else: return False def player_death(self, player: pl.Player, disconnected=False): - if not player in self.players: return + if not player in self.players or player.is_ghost: return import bang.expansions.dodge_city.characters as chd print(player.attacker) if player.attacker and player.attacker in self.players and isinstance(player.attacker.role, roles.Sheriff) and isinstance(player.role, roles.Vice): @@ -481,7 +491,7 @@ class Game: def get_visible_players(self, player: pl.Player): pls = self.get_alive_players() - if len(pls) == 0: return [] + if len(pls) == 0 or player not in pls: return [] i = pls.index(player) sight = player.get_sight() mindist = 99 if not self.check_event(ce.Agguato) else 1 @@ -491,11 +501,12 @@ class Game: 'lives': pls[j].lives, 'max_lives': pls[j].max_lives, 'is_sheriff': isinstance(pls[j].role, roles.Sheriff), - 'cards': len(pls[j].hand)+len(pls[j].equipment) + 'cards': len(pls[j].hand)+len(pls[j].equipment), + 'is_ghost': pls[j].is_ghost, } for j in range(len(pls)) if i != j] def get_alive_players(self): - return [p for p in self.players if not p.is_dead] + return [p for p in self.players if not p.is_dead or p.is_ghost] def get_dead_players(self): return [p for p in self.players if p.is_dead] @@ -513,6 +524,7 @@ class Game: 'pending_action': p.pending_action, 'character': p.character.__dict__ if p.character else None, 'real_character': p.real_character.__dict__ if p.real_character else None, - 'icon': p.role.icon if self.initial_players == 3 and p.role else '🤠' + 'icon': p.role.icon if self.initial_players == 3 and p.role else '🤠', + 'is_ghost': p.is_ghost, } for p in self.get_alive_players()] self.sio.emit('players_update', room=self.name, data=data) diff --git a/backend/bang/players.py b/backend/bang/players.py index c7003b1..c41d6ea 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -63,6 +63,7 @@ class Player: self.special_use_count = 0 self.is_dead = False self.death_turn = 0 + self.is_ghost = False def reset(self): self.hand: cs.Card = [] @@ -96,6 +97,7 @@ class Player: self.mancato_needed = 0 self.molly_discarded_cards = 0 self.is_dead = False + self.is_ghost = False self.death_turn = 0 def join_game(self, game): @@ -181,7 +183,7 @@ class Player: self.pending_action = PendingAction.CHOOSE elif self.character and self.character.check(self.game, chars.SuzyLafayette) and len(self.hand) == 0 and ( not self.is_my_turn or self.pending_action == PendingAction.PLAY): self.hand.append(self.game.deck.draw(True)) - if self.lives <= 0 and self.max_lives > 0: + if self.lives <= 0 and self.max_lives > 0 and not self.is_ghost: print('dying, attacker', self.attacker) if self.character.check(self.game, chars.SidKetchum) and len(self.hand) > 1: self.lives += 1 @@ -203,7 +205,7 @@ class Player: ser['sight'] = self.get_sight() ser['lives'] = max(ser['lives'], 0) - if self.lives <= 0 and self.max_lives > 0: + if self.lives <= 0 and self.max_lives > 0 and not self.is_ghost: self.pending_action = PendingAction.WAIT ser['hand'] = [] ser['equipment'] = [] @@ -310,7 +312,7 @@ class Player: self.choose(randrange(0, len(target.hand)+len(target.equipment))) def play_turn(self, can_play_vendetta = True): - if self.lives == 0 or self.is_dead: + if (self.lives == 0 or self.is_dead) and not self.is_ghost: return self.end_turn(forced=True) self.scrapped_cards = 0 self.can_play_ranch = True @@ -333,6 +335,8 @@ class Player: self.heal_if_needed() if self.lives <= 0: return self.notify_self() + + #non è un elif perchè vera custer deve fare questo poi cambiare personaggio if self.game.check_event(ce.FratelliDiSangue) and self.lives > 1 and not self.is_giving_life and len([p for p in self.game.get_alive_players() if p != self and p.lives < p.max_lives]): self.available_cards = [{ 'name': p.name, diff --git a/frontend/src/components/Deck.vue b/frontend/src/components/Deck.vue index 2b0ed6a..27ea016 100644 --- a/frontend/src/components/Deck.vue +++ b/frontend/src/components/Deck.vue @@ -52,7 +52,7 @@ export default { sockets: { self(self){ self = JSON.parse(self) - this.isPlaying = self.lives > 0 + this.isPlaying = self.lives > 0 || self.is_ghost this.pending_action = self.pending_action }, scrap(card) { diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index 7f01be0..c964eab 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -16,10 +16,13 @@
- + ❤️ 💀 +
+ 👻 +
diff --git a/frontend/src/components/Player.vue b/frontend/src/components/Player.vue index 78fc6f3..384f6f4 100644 --- a/frontend/src/components/Player.vue +++ b/frontend/src/components/Player.vue @@ -1,6 +1,6 @@