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 @@
{{instruction}}
+{{instruction}}