From 0a503794478fd9a41bace1371d10eda78a46889e Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Sat, 28 Nov 2020 14:37:16 +0100 Subject: [PATCH 01/11] add mancato verdi --- backend/bang/cards.py | 4 +- backend/bang/deck.py | 4 ++ backend/bang/expansions/dodge_city/cards.py | 55 ++++++++++++++++++++- backend/bang/players.py | 24 ++++++--- frontend/src/App.vue | 2 +- frontend/src/components/Card.vue | 6 ++- frontend/src/components/Player.vue | 12 ++++- 7 files changed, 94 insertions(+), 13 deletions(-) diff --git a/backend/bang/cards.py b/backend/bang/cards.py index 7cce19e..ce84677 100644 --- a/backend/bang/cards.py +++ b/backend/bang/cards.py @@ -36,6 +36,8 @@ class Card(ABC): self.desc = desc self.need_target = False self.can_target_self = False + self.can_be_used_now = True + self.usable_next_turn = False self.need_with = False def __str__(self): @@ -284,7 +286,7 @@ class Mancato(Card): def __init__(self, suit, number): super().__init__(suit, 'Mancato!', number) self.icon = '๐Ÿ˜…' - self.desc = "Usa questa carta per annullare un bang" + self.desc = "Usa questa carta per annullare un Bang!" def play_card(self, player, against, _with=None): import bang.characters as chars diff --git a/backend/bang/deck.py b/backend/bang/deck.py index 015a841..03e31f0 100644 --- a/backend/bang/deck.py +++ b/backend/bang/deck.py @@ -6,6 +6,10 @@ class Deck: def __init__(self, game): super().__init__() self.cards: List[cs.Card] = cs.get_starting_deck(game.expansions) + self.mancato_cards: List[str] = [] + for c in self.cards: + if isinstance(c, cs.Mancato) and c.name not in self.mancato_cards: + self.mancato_cards.append(c.name) self.game = game random.shuffle(self.cards) self.scrap_pile: List[cs.Card] = [] diff --git a/backend/bang/expansions/dodge_city/cards.py b/backend/bang/expansions/dodge_city/cards.py index b5f57bc..f5d61d5 100644 --- a/backend/bang/expansions/dodge_city/cards.py +++ b/backend/bang/expansions/dodge_city/cards.py @@ -31,7 +31,7 @@ class Schivata(Mancato): super().__init__(suit, number) self.name = 'Schivata' self.icon = '๐Ÿ™…โ€โ™‚๏ธ' - self.desc += " e poi pesca una carta" + self.desc = "Usa questa carta per annullare un Bang! e poi pesca una carta" self.alt_text = 'โ˜๏ธ๐Ÿ†“' def play_card(self, player, against, _with=None): @@ -130,6 +130,53 @@ class Whisky(Card): return True return False +class Bibbia(Schivata): + def __init__(self, suit, number): + super().__init__(suit, number) + self.name = 'Bibbia' + self.icon = '๐Ÿ“–' + self.usable_next_turn = True + self.can_be_used_now = False + + def play_card(self, player, against, _with=None): + if self.can_be_used_now: + pass + return False + else: + player.equipment.append(self) + return True + + def use_card(self, player): + player.hand.append(player.game.deck.draw()) + player.notify_self() + +class Cappello(Mancato): + def __init__(self, suit, number): + super().__init__(suit, number) + self.name = 'Cappello' + self.icon = '๐Ÿงข' + self.usable_next_turn = True + self.can_be_used_now = False + + def play_card(self, player, against, _with=None): + if self.can_be_used_now: + pass + return False + else: + player.equipment.append(self) + return True + +class PlaccaDiFerro(Cappello): + def __init__(self, suit, number): + super().__init__(suit, number) + self.name = 'Placca Di Ferro' + self.icon = '๐Ÿ›ก' + +class Sombrero(Cappello): + def __init__(self, suit, number): + super().__init__(suit, number) + self.name = 'Sombrero' + self.icon = '๐Ÿ‘’' def get_starting_deck() -> List[Card]: return [ @@ -160,4 +207,10 @@ def get_starting_deck() -> List[Card]: SpringField(Suit.SPADES, 'K'), Tequila(Suit.CLUBS, 9), Whisky(Suit.HEARTS, 'Q'), + Bibbia(Suit.HEARTS, 10), + Cappello(Suit.DIAMONDS, 'J'), + PlaccaDiFerro(Suit.DIAMONDS, 'A'), + PlaccaDiFerro(Suit.SPADES, 'Q'), + Sombrero(Suit.CLUBS, 7), + ] diff --git a/backend/bang/players.py b/backend/bang/players.py index fd9162d..2bb94ed 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -16,7 +16,6 @@ class PendingAction(IntEnum): WAIT = 4 CHOOSE = 5 - class Player: def __init__(self, name, sid, sio): @@ -321,19 +320,25 @@ class Player: if self.mancato_needed <= 0: self.game.responders_did_respond_resume_turn() return - if len([c for c in self.hand if isinstance(c, cs.Mancato) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Bang))]) == 0: + if len([c for c in self.hand if isinstance(c, cs.Mancato) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Bang))]) == 0\ + and len([c for c in self.equipment if c.can_be_used_now and isinstance(c, cs.Mancato)]) == 0: self.take_damage_response() self.game.responders_did_respond_resume_turn() else: self.pending_action = PendingAction.RESPOND - self.expected_response = [cs.Mancato(0, 0).name, csd.Schivata(0,0).name] + self.expected_response = self.game.deck.mancato_cards self.on_failed_response_cb = self.take_damage_response self.notify_self() def get_banged(self, attacker, double=False): self.attacker = attacker self.mancato_needed = 1 if not double else 2 - if len([c for c in self.hand if isinstance(c, cs.Mancato) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Bang))]) == 0 and len([c for c in self.equipment if isinstance(c, cs.Barile)]) == 0 and not isinstance(self.character, chars.Jourdonnais): + for i in range(len(self.equipment)): + if self.equipment[i].can_be_used_now: + print('usable', self.equipment[i]) + if len([c for c in self.equipment if isinstance(c, cs.Barile)]) == 0 and not isinstance(self.character, chars.Jourdonnais)\ + and len([c for c in self.hand if isinstance(c, cs.Mancato) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Bang))]) == 0\ + and len([c for c in self.equipment if c.can_be_used_now and isinstance(c, cs.Mancato)]) == 0: print('Cant defend') self.take_damage_response() return False @@ -345,7 +350,7 @@ class Player: else: print('has mancato') self.pending_action = PendingAction.RESPOND - self.expected_response = [cs.Mancato(0, 0).name, csd.Schivata(0,0).name] + self.expected_response = self.game.deck.mancato_cards self.on_failed_response_cb = self.take_damage_response self.notify_self() return True @@ -407,8 +412,10 @@ class Player: def respond(self, hand_index): self.pending_action = PendingAction.WAIT - if hand_index != -1 and self.hand[hand_index].name in self.expected_response: - card = self.hand.pop(hand_index) + if hand_index != -1 and ( + ((hand_index < len(self.hand) and self.hand[hand_index].name in self.expected_response)) or + self.equipment[hand_index-len(self.hand)].name in self.expected_response): + card = self.hand.pop(hand_index) if hand_index < len(self.hand) else self.equipment.pop(hand_index-len(self.hand)) card.use_card(self) self.game.deck.scrap(card) self.notify_self() @@ -465,6 +472,9 @@ class Player: f"I {self.name} have to many cards in my hand and I can't end the turn") else: self.is_my_turn = False + for i in range(len(self.equipment)): + if self.equipment[i].usable_next_turn and not self.equipment[i].can_be_used_now: + self.equipment[i].can_be_used_now = True self.pending_action = PendingAction.WAIT self.notify_self() self.game.next_turn() diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 9052697..1c3e3e1 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -16,7 +16,7 @@

{{$t("online_players")}}{{onlinePlayers}}

- +

{{$t("available_lobbies")}}

diff --git a/frontend/src/components/Card.vue b/frontend/src/components/Card.vue index fae0568..f6d6956 100644 --- a/frontend/src/components/Card.vue +++ b/frontend/src/components/Card.vue @@ -1,5 +1,5 @@