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
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 = '👻️'

View File

@ -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()

View File

@ -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

View File

@ -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