diff --git a/backend/bang/deck.py b/backend/bang/deck.py index 5c49d6d..cf6aedf 100644 --- a/backend/bang/deck.py +++ b/backend/bang/deck.py @@ -3,6 +3,7 @@ import random import bang.cards as cs import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.high_noon.card_events as ceh +import bang.expansions.wild_west_show.card_events as cew import bang.expansions.gold_rush.shop_cards as grc from globals import G @@ -33,6 +34,9 @@ class Deck: if 'high_noon' in game.expansions: self.event_cards.extend(ceh.get_all_events(game.rng)) endgame_cards.append(ceh.get_endgame_card()) + if 'wild_west_show' in game.expansions: + self.event_cards.extend(cew.get_all_events(game.rng)) + endgame_cards.append(cew.get_endgame_card()) if len(self.event_cards) > 0: game.rng.shuffle(self.event_cards) self.event_cards = self.event_cards[:12] diff --git a/backend/bang/expansions/wild_west_show/card_events.py b/backend/bang/expansions/wild_west_show/card_events.py index 4fe6a1d..bc98b5c 100644 --- a/backend/bang/expansions/wild_west_show/card_events.py +++ b/backend/bang/expansions/wild_west_show/card_events.py @@ -61,7 +61,6 @@ def get_endgame_card(): def get_all_events(rng=random): cards = [ - Bavaglio(), Camposanto(), DarlingValentine(), DorothyRage(), diff --git a/backend/bang/game.py b/backend/bang/game.py index 82f006e..816add5 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -12,6 +12,7 @@ from bang.deck import Deck import bang.roles as roles import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.high_noon.card_events as ceh +import bang.expansions.wild_west_show.card_events as cew import bang.expansions.gold_rush.shop_cards as grc import bang.expansions.gold_rush.characters as grch import bang.expansions.the_valley_of_shadows.cards as tvosc @@ -61,7 +62,7 @@ class Game: self.initial_players = 0 self.password = '' self.expansions: List[str] = [] - self.available_expansions = ['dodge_city', 'fistful_of_cards', 'high_noon', 'gold_rush', 'the_valley_of_shadows'] + self.available_expansions = ['dodge_city', 'fistful_of_cards', 'high_noon', 'gold_rush', 'the_valley_of_shadows', 'wild_west_show'] self.shutting_down = False self.is_competitive = False self.disconnect_bot = True @@ -78,6 +79,7 @@ class Game: self.attack_in_progress = False self.characters_to_distribute = 2 # personaggi da dare a inizio partita self.debug = self.name == 'debug' + self.dead_roles: List[roles.Role] = [] self.is_changing_pwd = False self.is_hidden = False self.rng = random.Random() @@ -113,6 +115,7 @@ class Game: self.incremental_turn = 0 self.turn = 0 self.pending_winners = [] + self.dead_roles: List[roles.Role] = [] for p in self.players: p.reset() p.notify_self() @@ -579,12 +582,16 @@ class Game: Metrics.send_metric('incremental_turn', points=[self.incremental_turn], tags=[f'game:{self.SEED}']) if self.players[self.turn].is_dead: 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]: + if self.check_event([ce.DeadMan, cew.Camposanto]) and not self.did_resuscitate_deadman and pl == self.players[self.turn]: print(f'{self.name}: {self.players[self.turn]} is dead, revive') - self.did_resuscitate_deadman = True + if self.check_event(ce.DeadMan): + self.did_resuscitate_deadman = True + pl.lives = 2 + elif self.check_event(cew.Camposanto): + pl.lives = 1 + pl.set_role = self.dead_roles.pop(random.randint(0, len(self.dead_roles)-1)) pl.is_dead = False pl.is_ghost = False - pl.lives = 2 self.deck.draw(player=pl) self.deck.draw(player=pl) if (ghost := next((c for c in pl.equipment if isinstance(c, tvosc.Fantasma)), None)) is not None: @@ -762,6 +769,7 @@ class Game: # if not disconnected: # self.dead_players.append(corpse) self.notify_room() + self.dead_roles.append(player.role) G.sio.emit('chat_message', room=self.name, data=f'_died|{player.name}') for p in self.players: if not p.is_bot: @@ -845,7 +853,10 @@ class Game: def check_event(self, ev): if self.deck is None or len(self.deck.event_cards) == 0: return False - return isinstance(self.deck.event_cards[0], ev) + if isinstance(ev, type): + return isinstance(self.deck.event_cards[0], ev) + else: + return any(isinstance(self.deck.event_cards[0], evc) for evc in ev) def get_visible_players(self, player: pl.Player): # returns a dictionary because we need to add the distance pls = self.get_alive_players() diff --git a/backend/bang/players.py b/backend/bang/players.py index 034be39..509edf2 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -11,6 +11,7 @@ import bang.characters as chars import bang.expansions.dodge_city.characters as chd import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.high_noon.card_events as ceh +import bang.expansions.wild_west_show.card_events as cew import bang.expansions.gold_rush.shop_cards as grc import bang.expansions.gold_rush.characters as grch import bang.expansions.the_valley_of_shadows.cards as tvosc @@ -453,6 +454,11 @@ class Player: self.has_played_bang = False self.special_use_count = 0 self.bang_used = 0 + if self.game.check_event(cew.DarlingValentine): + hand = len(self.hand) + for _ in range(hand): + self.game.deck.scrap(self.hand.pop(0), True, player=self) + self.game.deck.draw(True, player=self) if self.game.check_event(ceh.MezzogiornoDiFuoco): self.lives -= 1 if any((isinstance(c, grc.Talismano) for c in self.gold_rush_equipment)): diff --git a/backend/server.py b/backend/server.py index c42dda1..6a21aa8 100644 --- a/backend/server.py +++ b/backend/server.py @@ -631,11 +631,14 @@ def chat_message(sid, msg, pl=None): sio.emit('chat_message', room=ses.game.name, data={'color': f'red','text':f'🚨 {ses.name} is in debug mode and changed event'}) import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.high_noon.card_events as ceh + import bang.expansions.wild_west_show.card_events as cew chs = [] chs.extend(ce.get_all_events()) chs.append(ce.get_endgame_card()) chs.extend(ceh.get_all_events()) chs.append(ceh.get_endgame_card()) + chs.extend(cew.get_all_events()) + chs.append(cew.get_endgame_card()) ses.game.deck.event_cards.insert(int(cmd[1]), [c for c in chs if c is not None and c.name == ' '.join(cmd[2:])][0]) ses.game.notify_event_card() elif '/removecard' in msg: diff --git a/frontend/src/components/Card.vue b/frontend/src/components/Card.vue index 9fd488b..fc83483 100644 --- a/frontend/src/components/Card.vue +++ b/frontend/src/components/Card.vue @@ -118,6 +118,10 @@ export default { box-shadow: 0 0 0 3pt #6aa16e, 0 0 0 6pt var(--bg-color), 0 0 5pt 6pt #aaa } +.card.wild-west-show{ + box-shadow: 0 0 0pt 4pt var(--bg-color), 0 0 5pt 4pt #aaa; + border: 2pt dotted #987e51; +} .card.high-noon{ box-shadow: 0 0 0pt 4pt var(--bg-color), 0 0 5pt 4pt #aaa; border: 2pt dotted rgb(198 78 45); @@ -230,7 +234,7 @@ export default { .card.must-be-used { filter: drop-shadow(0 0 5px red); } -.fistful-of-cards .emoji, .high-noon .emoji, .exp-pack .emoji{ +.fistful-of-cards .emoji, .high-noon .emoji, .card.wild-west-show .emoji, .exp-pack .emoji{ top:auto !important; bottom:15% !important; } diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index b9e06b1..15fd7a7 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -159,7 +159,7 @@ Card password: '', togglable_expansions: [], expansions: [], - beta_expansions: ['the_valley_of_shadows'], + beta_expansions: ['the_valley_of_shadows', 'wild_west_show'], hasToSetUsername: false, is_competitive: false, disconnect_bot: false, diff --git a/frontend/src/utils/emoji-map.js b/frontend/src/utils/emoji-map.js index 7e61c32..ec5ec17 100644 --- a/frontend/src/utils/emoji-map.js +++ b/frontend/src/utils/emoji-map.js @@ -4,4 +4,5 @@ export const emojiMap = { 'high_noon': '🔥', 'fistful_of_cards': '🎴', 'the_valley_of_shadows': '👻', + 'wild_west_show': '🎪', } \ No newline at end of file diff --git a/frontend/src/utils/expansions-map.js b/frontend/src/utils/expansions-map.js index ae6a70e..b8b61d8 100644 --- a/frontend/src/utils/expansions-map.js +++ b/frontend/src/utils/expansions-map.js @@ -28,5 +28,11 @@ export const expansionsMap = { icon: '👻', back: true, expansion: 'the-valley-of-shadows', + }, + 'wild_west_show': { + name: 'Wild West Show', + icon: '🎪', + back: true, + expansion: 'wild-west-show' } } \ No newline at end of file