From a7fe148ff93479444954865b88b13bf67cdb59fe Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Wed, 23 Dec 2020 14:06:07 +0100 Subject: [PATCH] benedizione, maledizione --- backend/bang/cards.py | 9 ++++ backend/bang/deck.py | 4 ++ .../bang/expansions/high_noon/card_events.py | 41 +++++++++++++++++++ backend/bang/game.py | 2 +- backend/bang/players.py | 15 +++---- 5 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 backend/bang/expansions/high_noon/card_events.py diff --git a/backend/bang/cards.py b/backend/bang/cards.py index 20816d4..ad56b8b 100644 --- a/backend/bang/cards.py +++ b/backend/bang/cards.py @@ -75,6 +75,15 @@ class Card(ABC): def is_duplicate_card(self, player): return self.name in [c.name for c in player.equipment] + def check_suit(self, game, accepted): + import bang.expansions.high_noon.card_events as ceh + if game.check_event(ceh.Benedizione): + return Suit.HEARTS in accepted + elif game.check_event(ceh.Maledizione): + return Suit.SPADES in accepted + return self.suit in accepted + + class Barile(Card): def __init__(self, suit, number): diff --git a/backend/bang/deck.py b/backend/bang/deck.py index 136127d..0205e45 100644 --- a/backend/bang/deck.py +++ b/backend/bang/deck.py @@ -2,6 +2,7 @@ from typing import List, Set, Dict, Tuple, Optional 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 class Deck: def __init__(self, game): @@ -22,6 +23,9 @@ class Deck: self.event_cards: List[ce.CardEvent] = [] if 'fistful_of_cards' in game.expansions: self.event_cards.extend(ce.get_all_events()) + if 'high_noon' in game.expansions: + self.event_cards.extend(ceh.get_all_events()) + if len(self.event_cards) > 0: self.event_cards.insert(0, None) self.event_cards.insert(0, None) # 2 perchè iniziale, e primo flip dallo sceriffo random.shuffle(self.cards) diff --git a/backend/bang/expansions/high_noon/card_events.py b/backend/bang/expansions/high_noon/card_events.py new file mode 100644 index 0000000..034c250 --- /dev/null +++ b/backend/bang/expansions/high_noon/card_events.py @@ -0,0 +1,41 @@ +import random +from bang.expansions.fistful_of_cards.card_events import CardEvent + +class Benedizione(CardEvent): + def __init__(self): + super().__init__("Benedizione", "🙏") + self.desc = "Tutte le carte sono considerate di cuori ♥️" + self.desc_eng = "" + +class Maledizione(CardEvent): + def __init__(self): + super().__init__("Maledizione", "🤬") + self.desc = "Tutte le carte sono considerate di picche ♠" + self.desc_eng = "" + +class MezzogiornoDiFuoco(CardEvent): + def __init__(self): + super().__init__("Mezzogiorno di Fuoco", "🔥") + self.desc = "Ogni giocatore perde 1 punto vita all'inizio del turno" + self.desc_eng = "Every player loses 1 HP when their turn starts" + +def get_all_events(): + cards = [ + Benedizione(), + Maledizione(), + # CittaFantasma(), + # CorsaAllOro(), + # IDalton(), + # IlDottore(), + # IlReverendo(), + # IlTreno(), + # Sbornia(), + # Seromone(), + # Sete(), + # Sparatoria(), + ] + random.shuffle(cards) + cards.append(MezzogiornoDiFuoco()) + for c in cards: + c.expansion = 'high-noon' + return cards \ No newline at end of file diff --git a/backend/bang/game.py b/backend/bang/game.py index b4a210b..f57798a 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -24,7 +24,7 @@ class Game: self.initial_players = 0 self.password = '' self.expansions = [] - self.available_expansions = ['dodge_city', 'fistful_of_cards'] + self.available_expansions = ['dodge_city', 'fistful_of_cards', 'high_noon'] self.shutting_down = False self.is_competitive = False self.disconnect_bot = True diff --git a/backend/bang/players.py b/backend/bang/players.py index cb0297a..ba36176 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -9,6 +9,7 @@ import bang.expansions.dodge_city.cards as csd 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 eventlet class PendingAction(IntEnum): @@ -403,7 +404,7 @@ class Player: for p in self.game.players: if p != self: p.notify_card(self, card, 'blackjack_special' if isinstance(self.character, chars.BlackJack) else 'foc.leggedelwest') - if card.suit == cs.Suit.HEARTS or card.suit == cs.Suit.DIAMONDS and isinstance(self.character, chars.BlackJack): + if card.check_suit(self.game, [cs.Suit.HEARTS, cs.Suit.DIAMONDS]) and isinstance(self.character, chars.BlackJack): self.hand.append(self.game.deck.draw()) if isinstance(self.character, chd.PixiePete): self.hand.append(self.game.deck.draw()) @@ -422,7 +423,7 @@ class Player: print(f'Did pick {picked}') self.sio.emit('chat_message', room=self.game.name, data=f'_flipped|{self.name}|{picked}') - if picked.suit == cs.Suit.SPADES and 2 <= picked.number <= 9 and pickable_cards == 0: + if picked.check_suit(self.game, [cs.Suit.SPADES]) and 2 <= picked.number <= 9 and pickable_cards == 0: self.lives -= 3 self.game.deck.scrap(self.equipment.pop(i), True) self.sio.emit('chat_message', room=self.game.name, data=f'_explode|{self.name}') @@ -448,7 +449,7 @@ class Player: print(f'Did pick {picked}') self.sio.emit('chat_message', room=self.game.name, data=f'_flipped|{self.name}|{picked}') - if picked.suit != cs.Suit.HEARTS and pickable_cards == 0: + if not picked.check_suit(self.game, [cs.Suit.HEARTS]) and pickable_cards == 0: self.game.deck.scrap(self.equipment.pop(i), True) self.end_turn(forced=True) return @@ -497,7 +498,7 @@ class Player: print(self.name, 'is playing ', card, ' against:', against, ' with:', _with) did_play_card = False event_blocks_card = (self.game.check_event(ce.IlGiudice) and (card.is_equipment or (card.usable_next_turn and not card.can_be_used_now))) or (self.game.check_event(ce.Lazo) and card.usable_next_turn and card.can_be_used_now) - if not(against != None and isinstance(self.game.get_player_named(against).character, chd.ApacheKid) and card.suit == cs.Suit.DIAMONDS) and not event_blocks_card: + if not(against != None and isinstance(self.game.get_player_named(against).character, chd.ApacheKid) and card.check_suit(self.game, [cs.Suit.DIAMONDS])) and not event_blocks_card: if against == self.name and not isinstance(card, csd.Tequila): did_play_card = False else: @@ -647,7 +648,7 @@ class Player: print(f'Did pick {picked}') self.sio.emit('chat_message', room=self.game.name, data=f'_flipped|{self.name}|{picked}') - if picked.suit == cs.Suit.HEARTS: + if picked.check_suit(self.game, [cs.Suit.HEARTS]): self.mancato_needed -= 1 self.notify_self() if self.mancato_needed <= 0: @@ -677,7 +678,7 @@ class Player: print(f'Did pick {picked}') self.sio.emit('chat_message', room=self.game.name, data=f'_flipped|{self.name}|{picked}') - if picked.suit == cs.Suit.HEARTS: + if picked.check_suit(self.game, [cs.Suit.HEARTS]): self.mancato_needed -= 1 self.notify_self() if self.mancato_needed <= 0: @@ -921,7 +922,7 @@ class Player: if not forced and self.game.check_event(ce.Vendetta) and self.can_play_vendetta: picked: cs.Card = self.game.deck.pick_and_scrap() self.sio.emit('chat_message', room=self.game.name, data=f'_flipped|{self.name}|{picked}') - if picked.suit == cs.Suit.HEARTS: + if picked.check_suit(self.game, [cs.Suit.HEARTS]): self.play_turn(can_play_vendetta=False) return self.is_my_turn = False