diff --git a/backend/__init__.py b/backend/__init__.py index cd3a1dd..0975ea2 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -456,29 +456,9 @@ def scrap(sid, card_index): ses.scrap(card_index) @sio.event -def chuck_lose_hp_draw(sid): +def special(sid, data): ses: Player = sio.get_session(sid) - ses.chuck_lose_hp_draw() - -@sio.event -def holyday_special(sid, data): - ses: Player = sio.get_session(sid) - ses.holyday_special(data) - -@sio.event -def murieta_special(sid): - ses: Player = sio.get_session(sid) - ses.murieta_special() - -@sio.event -def cloud_special(sid): - ses: Player = sio.get_session(sid) - ses.cloud_special() - -@sio.event -def snake_special(sid): - ses: Player = sio.get_session(sid) - ses.snake_special() + ses.special(data) @sio.event def buy_gold_rush_card(sid, data:int): diff --git a/backend/bang/characters.py b/backend/bang/characters.py index 0962555..47c66c4 100644 --- a/backend/bang/characters.py +++ b/backend/bang/characters.py @@ -20,6 +20,13 @@ class Character(ABC): return False return isinstance(self, character) + def special(self, player, data): + import bang.expansions.high_noon.card_events as ceh + if player.game.check_event(ceh.Sbornia): + return False + player.sio.emit('chat_message', room=player.game.name, data=f'_use_special|{player.name}|{self.name}') + return True + class BartCassidy(Character): def __init__(self): super().__init__("Bart Cassidy", max_lives=4) diff --git a/backend/bang/expansions/dodge_city/characters.py b/backend/bang/expansions/dodge_city/characters.py index 5567f44..7ae51da 100644 --- a/backend/bang/expansions/dodge_city/characters.py +++ b/backend/bang/expansions/dodge_city/characters.py @@ -85,6 +85,19 @@ class ChuckWengam(Character): # self.desc_eng = "On his turn he may decide to lose 1 HP to draw 2 cards from the deck." self.icon = '💰' + def special(self, player, data): + if super().special(player, data): + if player.lives > 1 and player.is_my_turn: + import bang.expansions.gold_rush.shop_cards as grc + player.lives -= 1 + if len([c for c in player.gold_rush_equipment if isinstance(c, grc.Talismano)]) > 0: + player.gold_nuggets += 1 + if len([c for c in player.gold_rush_equipment if isinstance(c, grc.Stivali)]) > 0: + player.hand.append(player.game.deck.draw()) + player.hand.append(player.game.deck.draw(True)) + player.hand.append(player.game.deck.draw(True)) + player.notify_self() + class PatBrennan(Character): def __init__(self): super().__init__("Pat Brennan", max_lives=4) @@ -106,6 +119,17 @@ class DocHolyday(Character): # self.desc_eng = "He can discard 2 cards to play a bang." self.icon = '✌🏻' + def special(self, player, data): + if super().special(player, data): + from bang.players import PendingAction + if player.special_use_count < 1 and player.pending_action == PendingAction.PLAY: + player.special_use_count += 1 + cards = sorted(data['cards'], reverse=True) + for c in cards: + player.game.deck.scrap(player.hand.pop(c), True) + player.notify_self() + player.game.attack(player, data['against']) + def all_characters() -> List[Character]: cards = [ PixiePete(), diff --git a/backend/bang/expansions/gold_rush/characters.py b/backend/bang/expansions/gold_rush/characters.py index edd9ade..e431d85 100644 --- a/backend/bang/expansions/gold_rush/characters.py +++ b/backend/bang/expansions/gold_rush/characters.py @@ -19,12 +19,29 @@ class JackyMurieta(Character): # puo pagare 2 pepite per sparare 1 bang extra self.icon = '💆♂️️' + def special(self, player, data): + if super().special(player, data): + if player.gold_nuggets >= 2 and player.is_my_turn: + player.gold_nuggets -= 2 + player.has_played_bang = False + player.bang_used -= 1 + player.notify_self() + class JoshMcCloud(Character): def __init__(self): super().__init__("Josh McCloud", max_lives=4) # puo pagare 2 pepite per pescare il primo equipaggiamento dalla pila gold rush self.icon = '⛅️' + def special(self, player, data): + if super().special(player, data): + if player.gold_nuggets >= 2 and player.is_my_turn: + player.gold_nuggets -= 2 + card = player.game.deck.shop_deck.pop(0) + if card.play_card(player): + player.game.deck.shop_deck.append(card) + player.notify_self() + class MadamYto(Character): def __init__(self): super().__init__("Madam Yto", max_lives=4) @@ -43,6 +60,14 @@ class RaddieSnake(Character): # può scartare 1 pepita per pescare 1 carta (2 volte per turno) self.icon = '🐍️' + def special(self, player, data): + if super().special(player, data): + if player.gold_nuggets >= 1 and player.is_my_turn and player.special_use_count < 2: + player.gold_nuggets -= 1 + player.special_use_count += 1 + player.hand.append(player.game.deck.draw(True)) + player.notify_self() + class SimeonPicos(Character): def __init__(self): super().__init__("Simeon Picos", max_lives=4) diff --git a/backend/bang/players.py b/backend/bang/players.py index eb85dbb..4e3af6f 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -1074,47 +1074,8 @@ class Player: self.game.deck.scrap(card) self.notify_self() - def holyday_special(self, data): - if self.character.check(self.game, chd.DocHolyday) and self.special_use_count < 1 and self.pending_action == PendingAction.PLAY: - self.special_use_count += 1 - cards = sorted(data['cards'], reverse=True) - for c in cards: - self.game.deck.scrap(self.hand.pop(c), True) - self.notify_self() - self.game.attack(self, data['against']) - - def chuck_lose_hp_draw(self): - if self.character.check(self.game, chd.ChuckWengam) and self.lives > 1 and self.is_my_turn: - self.lives -= 1 - if len([c for c in self.gold_rush_equipment if isinstance(c, grc.Talismano)]) > 0: - self.gold_nuggets += 1 - if len([c for c in self.gold_rush_equipment if isinstance(c, grc.Stivali)]) > 0: - self.hand.append(self.game.deck.draw()) - self.hand.append(self.game.deck.draw(True)) - self.hand.append(self.game.deck.draw(True)) - self.notify_self() - - def murieta_special(self): - if self.character.check(self.game, grch.JackyMurieta) and self.gold_nuggets >= 2 and self.is_my_turn: - self.gold_nuggets -= 2 - self.has_played_bang = False - self.bang_used -= 1 - self.notify_self() - - def cloud_special(self): - if self.character.check(self.game, grch.JoshMcCloud) and self.gold_nuggets >= 2 and self.is_my_turn: - self.gold_nuggets -= 2 - card = self.game.deck.shop_deck.pop(0) - if card.play_card(self): - self.game.deck.shop_deck.append(card) - self.notify_self() - - def snake_special(self): - if self.character.check(self.game, grch.RaddieSnake) and self.gold_nuggets >= 1 and self.is_my_turn and self.special_use_count < 2: - self.gold_nuggets -= 1 - self.special_use_count += 1 - self.hand.append(self.game.deck.draw(True)) - self.notify_self() + def special(self, data): + self.character.special(self, data) def buy_gold_rush_card(self, index): print(f'{self.name} wants to buy gr-card index {index} in room {self.game.name}') diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index 3df8785..d77e7ce 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -62,7 +62,7 @@ :card="card" @click.native="selectedInfo = p.gold_rush_equipment" :style="`margin-top: ${i+p.equipment.length<1?10:-(Math.min((p.equipment.length+p.gold_rush_equipment.length+1)*12,80))}pt`"/> -