add ritorno di fiamma

This commit is contained in:
Alberto Xamin 2023-01-07 11:15:40 +00:00
parent 1facfb354d
commit ed057502d6
4 changed files with 90 additions and 12 deletions

View File

@ -1,7 +1,7 @@
from typing import List from typing import List
import bang.roles as r import bang.roles as r
import bang.players as pl 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 import bang.expansions.fistful_of_cards.card_events as ce
class Fantasma(Card): class Fantasma(Card):
@ -177,17 +177,18 @@ class Poker(Card):
# player.game.attack(player, against) # player.game.attack(player, against)
return True return True
class RitornoDiFiamma(Card): class RitornoDiFiamma(Mancato):
def __init__(self, suit, number): def __init__(self, suit, number):
super().__init__(suit, 'RitornoDiFiamma', number) super().__init__(suit, number)
self.name = 'RitornoDiFiamma'
self.icon = '🔥' self.icon = '🔥'
self.alt_text = "😅 | 💥" self.alt_text = "😅 | 💥"
def play_card(self, player, against, _with=None): def play_card(self, player, against, _with=None):
#TODO return False
# super().play_card(player, against=against)
# player.game.attack(player, against) def use_card(self, player):
return True player.notify_self()
def get_starting_deck() -> List[Card]: def get_starting_deck() -> List[Card]:
cards = [ 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 # Fuga(Suit.HEARTS, 3), # evita l'effetto di carte marroni (tipo panico cat balou) di cui sei bersaglio
# Mira(Suit.CLUBS, 6), # 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 # 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: for c in cards:
c.expansion_icon = '👻️' c.expansion_icon = '👻️'

View File

@ -426,13 +426,13 @@ class Player:
data=f'_turn|{self.name}') data=f'_turn|{self.name}')
print(f'{self.name}: I was notified that it is my turn') print(f'{self.name}: I was notified that it is my turn')
self.was_shot = False self.was_shot = False
self.attacker = None
self.is_my_turn = True self.is_my_turn = True
self.is_waiting_for_action = True self.is_waiting_for_action = True
self.has_played_bang = False self.has_played_bang = False
self.special_use_count = 0 self.special_use_count = 0
self.bang_used = 0 self.bang_used = 0
if self.game.check_event(ceh.MezzogiornoDiFuoco): if self.game.check_event(ceh.MezzogiornoDiFuoco):
self.attacker = None
self.lives -= 1 self.lives -= 1
if len([c for c in self.gold_rush_equipment if isinstance(c, grc.Talismano)]) > 0: if len([c for c in self.gold_rush_equipment if isinstance(c, grc.Talismano)]) > 0:
self.gold_nuggets += 1 self.gold_nuggets += 1
@ -576,7 +576,7 @@ class Player:
pickable_cards = 1 + self.character.pick_mod pickable_cards = 1 + self.character.pick_mod
if len([c for c in self.gold_rush_equipment if isinstance(c, grc.FerroDiCavallo)]) > 0: if len([c for c in self.gold_rush_equipment if isinstance(c, grc.FerroDiCavallo)]) > 0:
pickable_cards += 1 pickable_cards += 1
if self.is_my_turn: if self.is_my_turn and self.attacker == None:
for i in range(len(self.equipment)): for i in range(len(self.equipment)):
if i < len(self.equipment) and isinstance(self.equipment[i], cs.Dinamite): if i < len(self.equipment) and isinstance(self.equipment[i], cs.Dinamite):
while pickable_cards > 0: while pickable_cards > 0:
@ -1212,7 +1212,15 @@ class Player:
self.molly_discarded_cards = 0 self.molly_discarded_cards = 0
self.notify_self() self.notify_self()
self.game.responders_did_respond_resume_turn(did_lose=False) 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 = '' 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: else:
self.pending_action = PendingAction.RESPOND self.pending_action = PendingAction.RESPOND
self.notify_self() self.notify_self()

View File

@ -297,8 +297,6 @@ def test_SlabTheKiller():
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name) 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 assert g.players[(g.turn+1)%2].pending_action == PendingAction.RESPOND
g.players[(g.turn+1)%2].respond(0) 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].pending_action == PendingAction.WAIT
assert g.players[(g.turn+1)%2].lives == 3 assert g.players[(g.turn+1)%2].lives == 3

View File

@ -5,6 +5,7 @@ from tests.dummy_socket import DummySocket
from bang.deck import Deck from bang.deck import Deck
from bang.game import Game from bang.game import Game
from bang.players import Player, PendingAction from bang.players import Player, PendingAction
import bang.cards as cs
# test UltimoGiro # test UltimoGiro
def test_ultimo_giro(): def test_ultimo_giro():
@ -69,3 +70,73 @@ def test_fantasma():
pl.choose(0) pl.choose(0)
assert pl.pending_action == PendingAction.PLAY assert pl.pending_action == PendingAction.PLAY
assert len(fantasma_guy.equipment) == 1 and isinstance(fantasma_guy.equipment[0], Fantasma) 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