diff --git a/backend/bang/cards.py b/backend/bang/cards.py index 0b98427..9d3c77e 100644 --- a/backend/bang/cards.py +++ b/backend/bang/cards.py @@ -42,7 +42,10 @@ class Card(ABC): self.must_be_used = False def __str__(self): - char = ['♦️', '♣️', '♥️', '♠️'][int(self.suit)] + if str(self.suit).isnumeric(): + char = ['♦️', '♣️', '♥️', '♠️'][int(self.suit)] + else: + char = self.suit return f'{self.name} {char}{self.number}' return super().__str__() diff --git a/backend/bang/expansions/gold_rush/shop_cards.py b/backend/bang/expansions/gold_rush/shop_cards.py index 120b9c8..f0519d6 100644 --- a/backend/bang/expansions/gold_rush/shop_cards.py +++ b/backend/bang/expansions/gold_rush/shop_cards.py @@ -17,11 +17,16 @@ class ShopCard(Card): self.reset_card() if not self.is_duplicate_card(player): self.reset_card() + self.can_be_used_now = True player.equipment.append(self) return True else: return False + def reset_card(self): + if self.kind == ShopCardKind.BLACK: + self.can_be_used_now = False + class Bicchierino(ShopCard): def __init__(self): super().__init__('Bicchierino', 1, ShopCardKind.BROWN) @@ -130,6 +135,7 @@ class Ricercato(ShopCard): def play_card(self, player, against=None, _with=None): pass + # TODO # la giochi su un altro giocatore, ricompensa di 2 carte e 1 pepita a chi lo uccide class Setaccio(ShopCard): @@ -138,7 +144,12 @@ class Setaccio(ShopCard): self.icon = '🥘️' def play_card(self, player, against=None, _with=None): - super().play_card(player, against, _with) + if not self.can_be_used_now: + super().play_card(player, against, _with) + else: + if player.gold_nuggets > 1: + player.gold_nuggets -= 1 + player.hand.append(player.game.deck.draw()) # paghi 1 pepita per pescare 1 carta durante il tuo turno (max 2 volte per turno) class Stivali(ShopCard): @@ -166,6 +177,12 @@ class Zaino(ShopCard): def play_card(self, player, against=None, _with=None): super().play_card(player, against, _with) + if not self.can_be_used_now: + super().play_card(player, against, _with) + else: + if player.gold_nuggets > 2: + player.gold_nuggets -= 2 + player.lives = min(player.lives + 1, player.max_lives) # paga 2 pepite per recuperare 1 vita def get_cards() -> List[Card]: diff --git a/backend/bang/players.py b/backend/bang/players.py index 5852dfe..c4eec35 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -541,9 +541,12 @@ class Player: return playable_cards def play_card(self, hand_index: int, against=None, _with=None): + print(self.name, 'wants to play card ', hand_index, ' against:', against, ' with:', _with) if not self.is_my_turn or self.pending_action != PendingAction.PLAY or self.game.is_handling_death: + print('but cannot') return if not (0 <= hand_index < len(self.hand) + len(self.equipment)): + print('but the card index is out of range') return card: cs.Card = self.hand.pop(hand_index) if hand_index < len(self.hand) else self.equipment.pop(hand_index-len(self.hand)) withCard: cs.Card = None @@ -552,19 +555,19 @@ 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) or (self.game.check_event(ceh.Manette) and card.suit != self.committed_suit_manette and not (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) or len([c for c in self.game.get_player_named(against).equipment if isinstance(c, grc.Calumet)]) > 0) and card.check_suit(self.game, [cs.Suit.DIAMONDS])) and not event_blocks_card: + if not(against != None and (isinstance(self.game.get_player_named(against).character, chd.ApacheKid) or len([c for c in self.game.get_player_named(against).equipment if isinstance(c, grc.Calumet)]) > 0) and card.check_suit(self.game, [cs.Suit.DIAMONDS])) or (isinstance(card, grc.ShopCard) and card.kind == grc.ShopCardKind.BLACK) and not event_blocks_card: if against == self.name and not isinstance(card, csd.Tequila): did_play_card = False else: did_play_card = card.play_card(self, against, withCard) - if not card.is_equipment and not card.usable_next_turn or event_blocks_card: + if not card.is_equipment and not card.usable_next_turn and not (isinstance(card, grc.ShopCard) and card.kind == grc.ShopCardKind.BLACK) or event_blocks_card: if did_play_card: self.game.deck.scrap(card, True) else: self.hand.insert(hand_index, card) if withCard: self.hand.insert(_with, withCard) - elif card.usable_next_turn and card.can_be_used_now: + elif (card.usable_next_turn and card.can_be_used_now) or (isinstance(card, grc.ShopCard) and card.kind == grc.ShopCardKind.BLACK): if did_play_card: self.game.deck.scrap(card, True) else: diff --git a/frontend/src/components/Player.vue b/frontend/src/components/Player.vue index 4554c2e..3626de7 100644 --- a/frontend/src/components/Player.vue +++ b/frontend/src/components/Player.vue @@ -29,7 +29,7 @@
{{$t('hand')}} - @@ -328,7 +328,8 @@ export default { this.$socket.emit('scrap', this.hand.indexOf(c)) }, play_card(card, from_equipment) { - if (from_equipment && (!card.usable_next_turn || !card.can_be_used_now || (this.eventCard && this.eventCard.name == "Lazo"))) return; + console.log('play' + card.name) + if (from_equipment && (!card.can_be_used_now || (this.eventCard && this.eventCard.name == "Lazo"))) return; else if (card.usable_next_turn && !card.can_be_used_now) return this.really_play_card(card, null); let calamity_special = (card.name === 'Mancato!' && this.character.name === 'Calamity Janet') let cant_play_bang = (this.has_played_bang && this.equipment.filter(x => x.name == 'Volcanic').length == 0)