diff --git a/backend/bang/expansions/the_valley_of_shadows/cards.py b/backend/bang/expansions/the_valley_of_shadows/cards.py index ed8f828..8c90d0b 100644 --- a/backend/bang/expansions/the_valley_of_shadows/cards.py +++ b/backend/bang/expansions/the_valley_of_shadows/cards.py @@ -1,7 +1,7 @@ from typing import List import bang.roles as r import bang.players as pl -from bang.cards import Card, Suit, Bang +from bang.cards import Card, Suit, Bang, Mancato import bang.expansions.fistful_of_cards.card_events as ce class Fantasma(Card): @@ -177,17 +177,18 @@ class Poker(Card): # player.game.attack(player, against) return True -class RitornoDiFiamma(Card): +class RitornoDiFiamma(Mancato): def __init__(self, suit, number): - super().__init__(suit, 'RitornoDiFiamma', number) + super().__init__(suit, number) + self.name = 'RitornoDiFiamma' self.icon = '🔥' self.alt_text = "😅 | 💥" def play_card(self, player, against, _with=None): - #TODO - # super().play_card(player, against=against) - # player.game.attack(player, against) - return True + return False + + def use_card(self, player): + player.notify_self() def get_starting_deck() -> List[Card]: cards = [ @@ -205,7 +206,7 @@ def get_starting_deck() -> List[Card]: # Fuga(Suit.HEARTS, 3), # evita l'effetto di carte marroni (tipo panico cat balou) di cui sei bersaglio # Mira(Suit.CLUBS, 6), # Poker(Suit.HEARTS, 'J'), # tutti gli altri scartano 1 carta a scelta, se non ci sono assi allora pesca 2 dal mazzo - # RitornoDiFiamma(Suit.CLUBS, 'Q'), # un mancato che fa bang + RitornoDiFiamma(Suit.CLUBS, 'Q'), # un mancato che fa bang ] for c in cards: c.expansion_icon = '👻️' diff --git a/backend/bang/players.py b/backend/bang/players.py index 22e6a8a..269e3b5 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -426,13 +426,13 @@ class Player: data=f'_turn|{self.name}') print(f'{self.name}: I was notified that it is my turn') self.was_shot = False + self.attacker = None self.is_my_turn = True self.is_waiting_for_action = True self.has_played_bang = False self.special_use_count = 0 self.bang_used = 0 if self.game.check_event(ceh.MezzogiornoDiFuoco): - self.attacker = None self.lives -= 1 if len([c for c in self.gold_rush_equipment if isinstance(c, grc.Talismano)]) > 0: self.gold_nuggets += 1 @@ -576,7 +576,7 @@ class Player: pickable_cards = 1 + self.character.pick_mod if len([c for c in self.gold_rush_equipment if isinstance(c, grc.FerroDiCavallo)]) > 0: pickable_cards += 1 - if self.is_my_turn: + if self.is_my_turn and self.attacker == None: for i in range(len(self.equipment)): if i < len(self.equipment) and isinstance(self.equipment[i], cs.Dinamite): while pickable_cards > 0: @@ -1212,7 +1212,15 @@ class Player: self.molly_discarded_cards = 0 self.notify_self() self.game.responders_did_respond_resume_turn(did_lose=False) + if isinstance(card, tvosc.RitornoDiFiamma): + self.game.attack(self, self.attacker.name, card_name=card.name) self.event_type = '' + elif len([c for c in self.hand if (isinstance(c, cs.Mancato) and c.can_be_used_now) or (self.character.check(self.game, chars.CalamityJanet) and isinstance(c, cs.Bang)) or self.character.check(self.game, chd.ElenaFuente)]) == 0 and len([c for c in self.equipment if c.can_be_used_now and isinstance(c, cs.Mancato)]) == 0: + self.on_failed_response_cb() + if self.game: + self.game.responders_did_respond_resume_turn(did_lose=True) + if isinstance(card, tvosc.RitornoDiFiamma): + self.game.attack(self, self.attacker.name, card_name=card.name) else: self.pending_action = PendingAction.RESPOND self.notify_self() diff --git a/backend/tests/character_test.py b/backend/tests/character_test.py index 740f757..daaf109 100644 --- a/backend/tests/character_test.py +++ b/backend/tests/character_test.py @@ -297,8 +297,6 @@ def test_SlabTheKiller(): g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name) assert g.players[(g.turn+1)%2].pending_action == PendingAction.RESPOND g.players[(g.turn+1)%2].respond(0) - assert g.players[(g.turn+1)%2].pending_action == PendingAction.RESPOND - g.players[(g.turn+1)%2].respond(-1) assert g.players[(g.turn+1)%2].pending_action == PendingAction.WAIT assert g.players[(g.turn+1)%2].lives == 3 diff --git a/backend/tests/valley_of_shadows_test.py b/backend/tests/valley_of_shadows_test.py index 3768f76..c477ab2 100644 --- a/backend/tests/valley_of_shadows_test.py +++ b/backend/tests/valley_of_shadows_test.py @@ -5,6 +5,7 @@ from tests.dummy_socket import DummySocket from bang.deck import Deck from bang.game import Game from bang.players import Player, PendingAction +import bang.cards as cs # test UltimoGiro def test_ultimo_giro(): @@ -69,3 +70,73 @@ def test_fantasma(): pl.choose(0) assert pl.pending_action == PendingAction.PLAY assert len(fantasma_guy.equipment) == 1 and isinstance(fantasma_guy.equipment[0], Fantasma) + +# test SerpenteASonagli +def test_serpente_a_sonagli(): + sio = DummySocket() + g = Game('test', sio) + ps = [Player(f'p{i}', f'p{i}', sio) for i in range(3)] + for p in ps: + g.add_player(p) + g.start_game() + for p in ps: + p.available_characters = [Character('test_char', 4)] + p.set_character(p.available_characters[0].name) + p = g.players[g.turn] + serp = g.players[(g.turn+1)%3] + p.draw('') + p.hand = [SerpenteASonagli(0,0)] + assert len(p.hand) == 1 + p.play_card(0, serp.name) + assert len(p.hand) == 0 + assert len(serp.equipment) == 1 and isinstance(serp.equipment[0], SerpenteASonagli) + p.end_turn() + assert serp.pending_action == PendingAction.PICK + g.deck.cards[0] = Bang(Suit.SPADES, 5) + serp.pick() + assert serp.lives == 3 + serp.draw('') + serp.hand = [SerpenteASonagli(0,0)] + serp.play_card(0, g.players[(g.turn+1)%3].name) + assert len(serp.hand) == 0 + serp.end_turn() + assert g.players[g.turn].pending_action == PendingAction.PICK + g.deck.cards[0] = Bang(Suit.HEARTS, 5) + g.players[g.turn].pick() + assert g.players[g.turn].lives == 4 + +# test RitornoDiFiamma +def test_ritorno_di_fiamma(): + sio = DummySocket() + g = Game('test', sio) + g.expansions = ['the_valley_of_shadows'] + ps = [Player(f'p{i}', f'p{i}', sio) for i in range(3)] + for p in ps: + g.add_player(p) + g.start_game() + for p in ps: + p.available_characters = [Character('test_char', 4)] + p.set_character(p.available_characters[0].name) + p = g.players[g.turn] + p1 = g.players[(g.turn+1)%3] + p.draw('') + p.hand = [Bang(1, 1)] + p1.hand = [RitornoDiFiamma(0,0)] + p.play_card(0, p1.name) + assert len(p.hand) == 0 + assert len(p1.hand) == 1 + p1.respond(0) + assert len(p1.hand) == 0 + assert p.lives == 3 + p.end_turn() + p1.draw('') + p1.hand = [Bang(1, 1)] + p.equipment = [cs.Barile(0,0)] + p.hand = [RitornoDiFiamma(0,0)] + p1.play_card(0, p.name) + assert p.pending_action == PendingAction.PICK + g.deck.cards[0] = Bang(Suit.SPADES, 5) + p.pick() + assert p.pending_action == PendingAction.RESPOND + p.respond(0) + assert p1.lives == 3