refactor pending action

This commit is contained in:
Alberto Xamin 2024-06-10 17:22:30 +01:00
parent 399645de27
commit da7e4834b7
No known key found for this signature in database
GPG Key ID: 5ABFCD8A22EA6F5D
18 changed files with 91 additions and 64 deletions

View File

@ -1,5 +1,6 @@
from typing import List from typing import List
from bang.characters import Character from bang.characters import Character
from globals import PendingAction
class PixiePete(Character): class PixiePete(Character):
@ -165,8 +166,6 @@ class DocHolyday(Character):
def special(self, player, data): def special(self, player, data):
if super().special(player, data): if super().special(player, data):
from bang.players import PendingAction
if ( if (
player.special_use_count < 1 player.special_use_count < 1
and player.pending_action == PendingAction.PLAY and player.pending_action == PendingAction.PLAY

View File

@ -1,7 +1,7 @@
from bang.cards import * from bang.cards import *
import bang.roles as r import bang.roles as r
import bang.players as pl import bang.players as pl
from globals import G from globals import G, PendingAction
class ShopCardKind(IntEnum): class ShopCardKind(IntEnum):
BROWN = 0 # Se lequipaggiamento ha il bordo marrone, applicane subito leffetto e poi scartalo. BROWN = 0 # Se lequipaggiamento ha il bordo marrone, applicane subito leffetto e poi scartalo.
@ -47,7 +47,7 @@ class Bicchierino(ShopCard):
'is_player': True 'is_player': True
} for p in player.game.get_alive_players()] } for p in player.game.get_alive_players()]
player.choose_text = 'choose_bicchierino' player.choose_text = 'choose_bicchierino'
player.pending_action = pl.PendingAction.CHOOSE player.pending_action = PendingAction.CHOOSE
player.notify_self() player.notify_self()
return super().play_card(player, against, _with) return super().play_card(player, against, _with)
@ -64,7 +64,7 @@ class Bottiglia(ShopCard):
for i in range(len(player.available_cards)): for i in range(len(player.available_cards)):
player.available_cards[i].must_be_used = True player.available_cards[i].must_be_used = True
player.choose_text = 'choose_bottiglia' player.choose_text = 'choose_bottiglia'
player.pending_action = pl.PendingAction.CHOOSE player.pending_action = PendingAction.CHOOSE
player.notify_self() player.notify_self()
return super().play_card(player, against, _with) return super().play_card(player, against, _with)
@ -79,7 +79,7 @@ class Complice(ShopCard):
for i in range(len(player.available_cards)): for i in range(len(player.available_cards)):
player.available_cards[i].must_be_used = True player.available_cards[i].must_be_used = True
player.choose_text = 'choose_complice' player.choose_text = 'choose_complice'
player.pending_action = pl.PendingAction.CHOOSE player.pending_action = PendingAction.CHOOSE
player.notify_self() player.notify_self()
return super().play_card(player, against, _with) return super().play_card(player, against, _with)
@ -175,7 +175,7 @@ class Ricercato(ShopCard):
} for p in player.game.get_alive_players() if p != player and not isinstance(p.role, r.Sheriff)] } for p in player.game.get_alive_players() if p != player and not isinstance(p.role, r.Sheriff)]
player.available_cards.append({'name': player.name, 'number':0,'icon': 'you', 'is_character': True}) player.available_cards.append({'name': player.name, 'number':0,'icon': 'you', 'is_character': True})
player.choose_text = 'choose_ricercato' player.choose_text = 'choose_ricercato'
player.pending_action = pl.PendingAction.CHOOSE player.pending_action = PendingAction.CHOOSE
player.notify_self() player.notify_self()
return True return True
# la giochi su un altro giocatore, ricompensa di 2 carte e 1 pepita a chi lo uccide # la giochi su un altro giocatore, ricompensa di 2 carte e 1 pepita a chi lo uccide

View File

@ -3,7 +3,7 @@ import bang.roles as r
import bang.players as pl import bang.players as pl
from bang.cards import Card, Suit, Bang, Mancato 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
from globals import G from globals import G, PendingAction
class Fantasma(Card): class Fantasma(Card):
@ -15,7 +15,7 @@ class Fantasma(Card):
if (player.game.check_event(ce.IlGiudice)) or not self.can_be_used_now: if (player.game.check_event(ce.IlGiudice)) or not self.can_be_used_now:
return False return False
if len(player.game.get_dead_players(include_ghosts=False)) > 0: if len(player.game.get_dead_players(include_ghosts=False)) > 0:
player.pending_action = pl.PendingAction.CHOOSE player.pending_action = PendingAction.CHOOSE
player.choose_text = "choose_fantasma" player.choose_text = "choose_fantasma"
player.available_cards = [ player.available_cards = [
{ {
@ -181,7 +181,7 @@ class Sventagliata(
if p["name"] != player.name and p["name"] != t.name and p["dist"] if p["name"] != player.name and p["name"] != t.name and p["dist"]
] ]
if len(player.available_cards) > 0: if len(player.available_cards) > 0:
player.pending_action = pl.PendingAction.CHOOSE player.pending_action = PendingAction.CHOOSE
player.choose_text = "choose_sventagliata" player.choose_text = "choose_sventagliata"
else: else:
player.available_cards = [] player.available_cards = []

View File

@ -1,6 +1,6 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
import bang.cards as cs import bang.cards as cs
import bang.players as pl from globals import PendingAction
if TYPE_CHECKING: if TYPE_CHECKING:
from bang.players import Player from bang.players import Player
@ -28,7 +28,7 @@ class StationCard:
player.game.deck.scrap(card, True, player=player) player.game.deck.scrap(card, True, player=player)
player.equipment.append(self.attached_train) player.equipment.append(self.attached_train)
self.attached_train = None self.attached_train = None
player.pending_action = pl.PendingAction.PLAY player.pending_action = PendingAction.PLAY
def check_price(self, player: "Player") -> bool: def check_price(self, player: "Player") -> bool:
"""Check if the card can be used to rob the train""" """Check if the card can be used to rob the train"""

View File

@ -1,8 +1,13 @@
import random import random
from bang.cards import Card, Bang, Panico, CatBalou, Mancato from bang.cards import Card, Bang, Panico, CatBalou, Mancato
from bang.players import Player, PendingAction from typing import TYPE_CHECKING
from globals import G from globals import G
if TYPE_CHECKING:
from bang.players import Player, PendingAction
class TrainCard(Card): class TrainCard(Card):
def __init__(self, name: str, is_locomotive: bool = False): def __init__(self, name: str, is_locomotive: bool = False):
super().__init__(suit=5, number=0, name=name) super().__init__(suit=5, number=0, name=name)
@ -103,7 +108,7 @@ class BaggageCar(TrainCard):
super().__init__("Baggage Car") super().__init__("Baggage Car")
self.icon = "🚋🛄" self.icon = "🚋🛄"
def choose_callback(self, player: Player, card_index): def choose_callback(self, player: 'Player', card_index):
player.hand.append(player.available_cards[card_index]) player.hand.append(player.available_cards[card_index])
player.pending_action = PendingAction.PLAY player.pending_action = PendingAction.PLAY
@ -227,7 +232,7 @@ class MailCar(TrainCard):
super().__init__("Mail Car") super().__init__("Mail Car")
self.icon = "🚋📮" self.icon = "🚋📮"
def choose_card_callback(self, player: Player, card_index): def choose_card_callback(self, player: 'Player', card_index):
chosen_card = player.available_cards.pop(card_index) chosen_card = player.available_cards.pop(card_index)
player.hand.extend(player.available_cards) player.hand.extend(player.available_cards)
player.set_choose_action( player.set_choose_action(
@ -236,7 +241,7 @@ class MailCar(TrainCard):
lambda p, other_player_index: self.choose_player_callback(p, other_player_index, chosen_card) lambda p, other_player_index: self.choose_player_callback(p, other_player_index, chosen_card)
) )
def choose_player_callback(self, player: Player, other_player_index, chosen_card): def choose_player_callback(self, player: 'Player', other_player_index, chosen_card):
pl_name = player.game.get_other_players(player)[other_player_index]["name"] pl_name = player.game.get_other_players(player)[other_player_index]["name"]
other_player = player.game.get_player_named(pl_name) other_player = player.game.get_player_named(pl_name)
other_player.hand.append(chosen_card) other_player.hand.append(chosen_card)
@ -311,8 +316,22 @@ class SleeperCar(TrainCard):
super().__init__("Sleeper Car") super().__init__("Sleeper Car")
self.icon = "🚋🛌" self.icon = "🚋🛌"
def choose_card_callback(self, player: 'Player', card_index):
player.game.deck.scrap(player.equipment.pop(card_index), player=player)
player.pending_action = PendingAction.PLAY
self.usable_next_turn = True
self.can_be_used_now = False
player.notify_self()
def play_card(self, player, against=None, _with=None) -> bool: def play_card(self, player, against=None, _with=None) -> bool:
return True if not self.can_be_used_now:
return False
player.set_choose_action(
"choose_sleeper_car",
player.equipment,
self.choose_card_callback,
)
return False
def get_all_cards(rng=random): def get_all_cards(rng=random):

View File

@ -18,7 +18,7 @@ import bang.expansions.gold_rush.shop_cards as grc
import bang.expansions.gold_rush.characters as grch import bang.expansions.gold_rush.characters as grch
import bang.expansions.the_valley_of_shadows.cards as tvosc import bang.expansions.the_valley_of_shadows.cards as tvosc
from metrics import Metrics from metrics import Metrics
from globals import G from globals import G, PendingAction
debug_commands = [ debug_commands = [
@ -464,7 +464,7 @@ class Game:
def discard_others(self, attacker: pl.Player, card_name: str = None): def discard_others(self, attacker: pl.Player, card_name: str = None):
self.attack_in_progress = True self.attack_in_progress = True
attacker.pending_action = pl.PendingAction.WAIT attacker.pending_action = PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.waiting_for = 0 self.waiting_for = 0
self.ready_count = 0 self.ready_count = 0
@ -474,7 +474,7 @@ class Game:
self.waiting_for += 1 self.waiting_for += 1
p.notify_self() p.notify_self()
if self.waiting_for == 0: if self.waiting_for == 0:
attacker.pending_action = pl.PendingAction.PLAY attacker.pending_action = PendingAction.PLAY
attacker.notify_self() attacker.notify_self()
self.attack_in_progress = False self.attack_in_progress = False
elif card_name == "Poker": elif card_name == "Poker":
@ -482,7 +482,7 @@ class Game:
def attack_others(self, attacker: pl.Player, card_name: str = None): def attack_others(self, attacker: pl.Player, card_name: str = None):
self.attack_in_progress = True self.attack_in_progress = True
attacker.pending_action = pl.PendingAction.WAIT attacker.pending_action = PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.waiting_for = 0 self.waiting_for = 0
self.ready_count = 0 self.ready_count = 0
@ -492,7 +492,7 @@ class Game:
self.waiting_for += 1 self.waiting_for += 1
p.notify_self() p.notify_self()
if self.waiting_for == 0: if self.waiting_for == 0:
attacker.pending_action = pl.PendingAction.PLAY attacker.pending_action = PendingAction.PLAY
attacker.notify_self() attacker.notify_self()
self.attack_in_progress = False self.attack_in_progress = False
if self.pending_winners and not self.someone_won: if self.pending_winners and not self.someone_won:
@ -500,7 +500,7 @@ class Game:
def indian_others(self, attacker: pl.Player): def indian_others(self, attacker: pl.Player):
self.attack_in_progress = True self.attack_in_progress = True
attacker.pending_action = pl.PendingAction.WAIT attacker.pending_action = PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.waiting_for = 0 self.waiting_for = 0
self.ready_count = 0 self.ready_count = 0
@ -510,7 +510,7 @@ class Game:
self.waiting_for += 1 self.waiting_for += 1
p.notify_self() p.notify_self()
if self.waiting_for == 0: if self.waiting_for == 0:
attacker.pending_action = pl.PendingAction.PLAY attacker.pending_action = PendingAction.PLAY
attacker.notify_self() attacker.notify_self()
self.attack_in_progress = False self.attack_in_progress = False
if self.pending_winners and not self.someone_won: if self.pending_winners and not self.someone_won:
@ -547,11 +547,11 @@ class Game:
self.attack_in_progress = True self.attack_in_progress = True
self.ready_count = 0 self.ready_count = 0
self.waiting_for = 1 self.waiting_for = 1
attacker.pending_action = pl.PendingAction.WAIT attacker.pending_action = PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.get_player_named(target_username).notify_self() self.get_player_named(target_username).notify_self()
elif not attacker.is_my_turn or len(self.attack_queue) == 0: elif not attacker.is_my_turn or len(self.attack_queue) == 0:
self.players[self.turn].pending_action = pl.PendingAction.PLAY self.players[self.turn].pending_action = PendingAction.PLAY
def steal_discard(self, attacker: pl.Player, target_username: str, card: cs.Card): def steal_discard(self, attacker: pl.Player, target_username: str, card: cs.Card):
p = self.get_player_named(target_username) p = self.get_player_named(target_username)
@ -562,11 +562,11 @@ class Game:
): ):
self.ready_count = 0 self.ready_count = 0
self.waiting_for = 1 self.waiting_for = 1
attacker.pending_action = pl.PendingAction.WAIT attacker.pending_action = PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.get_player_named(target_username).notify_self() self.get_player_named(target_username).notify_self()
else: else:
attacker.pending_action = pl.PendingAction.CHOOSE attacker.pending_action = PendingAction.CHOOSE
attacker.target_p = target_username attacker.target_p = target_username
if isinstance(card, cs.CatBalou): if isinstance(card, cs.CatBalou):
attacker.choose_action = "discard" attacker.choose_action = "discard"
@ -580,7 +580,7 @@ class Game:
): ):
self.ready_count = 0 self.ready_count = 0
self.waiting_for = 1 self.waiting_for = 1
attacker.pending_action = pl.PendingAction.WAIT attacker.pending_action = PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.get_player_named(target_username).notify_self() self.get_player_named(target_username).notify_self()
@ -588,14 +588,14 @@ class Game:
if self.get_player_named(target_username).get_dueled(attacker=attacker): if self.get_player_named(target_username).get_dueled(attacker=attacker):
self.ready_count = 0 self.ready_count = 0
self.waiting_for = 1 self.waiting_for = 1
attacker.pending_action = pl.PendingAction.WAIT attacker.pending_action = PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.get_player_named(target_username).notify_self() self.get_player_named(target_username).notify_self()
def emporio(self): def emporio(self):
pls = self.get_alive_players() pls = self.get_alive_players()
self.available_cards = [self.deck.draw(True) for i in range(len(pls))] self.available_cards = [self.deck.draw(True) for i in range(len(pls))]
self.players[self.turn].pending_action = pl.PendingAction.CHOOSE self.players[self.turn].pending_action = PendingAction.CHOOSE
self.players[self.turn].choose_text = "choose_card_to_get" self.players[self.turn].choose_text = "choose_card_to_get"
self.players[self.turn].available_cards = self.available_cards self.players[self.turn].available_cards = self.available_cards
G.sio.emit( G.sio.emit(
@ -617,7 +617,7 @@ class Game:
) )
player.hand.append(card) player.hand.append(card)
player.available_cards = [] player.available_cards = []
player.pending_action = pl.PendingAction.WAIT player.pending_action = PendingAction.WAIT
player.notify_self() player.notify_self()
pls = self.get_alive_players() pls = self.get_alive_players()
next_player = pls[ next_player = pls[
@ -636,14 +636,14 @@ class Game:
next_player.hand.append(self.available_cards.pop()) next_player.hand.append(self.available_cards.pop())
next_player.notify_self() next_player.notify_self()
G.sio.emit("emporio", room=self.name, data='{"name":"","cards":[]}') G.sio.emit("emporio", room=self.name, data='{"name":"","cards":[]}')
self.players[self.turn].pending_action = pl.PendingAction.PLAY self.players[self.turn].pending_action = PendingAction.PLAY
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
elif next_player == self.players[self.turn]: elif next_player == self.players[self.turn]:
G.sio.emit("emporio", room=self.name, data='{"name":"","cards":[]}') G.sio.emit("emporio", room=self.name, data='{"name":"","cards":[]}')
self.players[self.turn].pending_action = pl.PendingAction.PLAY self.players[self.turn].pending_action = PendingAction.PLAY
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
else: else:
next_player.pending_action = pl.PendingAction.CHOOSE next_player.pending_action = PendingAction.CHOOSE
next_player.choose_text = "choose_card_to_get" next_player.choose_text = "choose_card_to_get"
next_player.available_cards = self.available_cards next_player.available_cards = self.available_cards
G.sio.emit( G.sio.emit(
@ -729,7 +729,7 @@ class Game:
elif self.poker_on and not any( elif self.poker_on and not any(
c.number == 1 for c in self.deck.scrap_pile[-tmp:] c.number == 1 for c in self.deck.scrap_pile[-tmp:]
): ):
self.players[self.turn].pending_action = pl.PendingAction.CHOOSE self.players[self.turn].pending_action = PendingAction.CHOOSE
self.players[ self.players[
self.turn self.turn
].choose_text = f"choose_from_poker;{min(2, tmp)}" ].choose_text = f"choose_from_poker;{min(2, tmp)}"
@ -740,10 +740,10 @@ class Game:
print("attack completed, next attack") print("attack completed, next attack")
atk = self.attack_queue.pop(0) atk = self.attack_queue.pop(0)
self.attack(atk[0], atk[1], atk[2], atk[3], skip_queue=True) self.attack(atk[0], atk[1], atk[2], atk[3], skip_queue=True)
elif self.players[self.turn].pending_action == pl.PendingAction.CHOOSE: elif self.players[self.turn].pending_action == PendingAction.CHOOSE:
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
else: else:
self.players[self.turn].pending_action = pl.PendingAction.PLAY self.players[self.turn].pending_action = PendingAction.PLAY
self.poker_on = False self.poker_on = False
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
@ -1036,9 +1036,9 @@ class Game:
self.deck.draw(True, player=player.attacker) self.deck.draw(True, player=player.attacker)
player.attacker.notify_self() player.attacker.notify_self()
print(f"{self.name}: player {player.name} died") print(f"{self.name}: player {player.name} died")
if self.waiting_for > 0 and player.pending_action == pl.PendingAction.RESPOND: if self.waiting_for > 0 and player.pending_action == PendingAction.RESPOND:
self.responders_did_respond_resume_turn() self.responders_did_respond_resume_turn()
player.pending_action = pl.PendingAction.WAIT player.pending_action = PendingAction.WAIT
if player.is_dead: if player.is_dead:
return return

View File

@ -1,5 +1,4 @@
from __future__ import annotations from __future__ import annotations
from enum import IntEnum
import json import json
from random import randrange, sample, uniform, randint from random import randrange, sample, uniform, randint
import bang.roles as r import bang.roles as r
@ -16,9 +15,10 @@ import bang.expansions.gold_rush.characters as grch
import bang.expansions.the_valley_of_shadows.cards as tvosc import bang.expansions.the_valley_of_shadows.cards as tvosc
import bang.expansions.the_valley_of_shadows.characters as tvosch import bang.expansions.the_valley_of_shadows.characters as tvosch
import bang.expansions.train_robbery.stations as trs import bang.expansions.train_robbery.stations as trs
import bang.expansions.train_robbery.trains as trt
from typing import List, TYPE_CHECKING, Callable from typing import List, TYPE_CHECKING, Callable
from metrics import Metrics from metrics import Metrics
from globals import G from globals import G, PendingAction
import sys import sys
if TYPE_CHECKING: if TYPE_CHECKING:
@ -44,15 +44,6 @@ robot_pictures = [
] ]
class PendingAction(IntEnum):
PICK = 0
DRAW = 1
PLAY = 2
RESPOND = 3
WAIT = 4
CHOOSE = 5
class Player: class Player:
def is_admin(self): def is_admin(self):
return self.discord_id in {"244893980960096266", "539795574019457034"} return self.discord_id in {"244893980960096266", "539795574019457034"}
@ -2556,7 +2547,6 @@ class Player:
self.notify_self() self.notify_self()
def buy_train(self, index): def buy_train(self, index):
import bang.expansions.train_robbery.trains as trt
if self.pending_action != PendingAction.PLAY: if self.pending_action != PendingAction.PLAY:
return return
print( print(
@ -2701,6 +2691,8 @@ class Player:
and not self.equipment[i].can_be_used_now and not self.equipment[i].can_be_used_now
): ):
self.equipment[i].can_be_used_now = True self.equipment[i].can_be_used_now = True
if isinstance(self.equipment[i], trt.TrainCard):
self.equipment[i].usable_next_turn = False
for i in range(len(self.hand)): for i in range(len(self.hand)):
if self.hand[i].must_be_used: if self.hand[i].must_be_used:
self.hand[i].must_be_used = False self.hand[i].must_be_used = False

View File

@ -1,6 +1,17 @@
from enum import IntEnum
class G: class G:
sio = None sio = None
def __init__(self): def __init__(self):
pass pass
class PendingAction(IntEnum):
PICK = 0
DRAW = 1
PLAY = 2
RESPOND = 3
WAIT = 4
CHOOSE = 5

View File

@ -16,8 +16,8 @@ import socketio
from discord_webhook import DiscordWebhook from discord_webhook import DiscordWebhook
from bang.game import Game from bang.game import Game
from bang.players import PendingAction, Player from bang.players import Player
from globals import G from globals import G, PendingAction
from metrics import Metrics from metrics import Metrics
sys.setrecursionlimit(10**6) # this should prevents bots from stopping sys.setrecursionlimit(10**6) # this should prevents bots from stopping

View File

@ -3,7 +3,8 @@ from bang.characters import Character
from bang.cards import * from bang.cards import *
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
from globals import PendingAction
# test card Barile # test card Barile
def test_barile(): def test_barile():

View File

@ -2,7 +2,8 @@ from random import randint
from bang.characters import * from bang.characters import *
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
from globals import PendingAction
from bang.cards import * from bang.cards import *
def test_bartcassidy(): def test_bartcassidy():

View File

@ -3,7 +3,7 @@ from bang.characters import Character
from bang.expansions.dodge_city.cards import * from bang.expansions.dodge_city.cards import *
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
import bang.cards as cs import bang.cards as cs
# test Borraccia # test Borraccia

View File

@ -1,8 +1,9 @@
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
from bang.roles import * from bang.roles import *
from bang.cards import * from bang.cards import *
from globals import PendingAction
from tests import started_game from tests import started_game

View File

@ -1,7 +1,8 @@
from bang.characters import Character from bang.characters import Character
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
from globals import PendingAction
from bang.roles import * from bang.roles import *
from bang.cards import * from bang.cards import *

View File

@ -3,8 +3,9 @@ from bang.characters import Character
from bang.expansions.the_valley_of_shadows.characters import * from bang.expansions.the_valley_of_shadows.characters import *
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
import bang.cards as cs import bang.cards as cs
from globals import PendingAction
# test TucoFranziskaner # test TucoFranziskaner
def test_TucoFranziskaner(): def test_TucoFranziskaner():

View File

@ -3,8 +3,9 @@ from bang.characters import Character
from bang.expansions.the_valley_of_shadows.cards import * from bang.expansions.the_valley_of_shadows.cards import *
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
import bang.cards as cs import bang.cards as cs
from globals import PendingAction
from tests import started_game, set_events, current_player, next_player, current_player_with_cards from tests import started_game, set_events, current_player, next_player, current_player_with_cards

View File

@ -4,7 +4,7 @@ from tests import started_game, set_events, current_player, next_player, current
from bang.expansions.wild_west_show.characters import * from bang.expansions.wild_west_show.characters import *
from bang.cards import Card, Suit from bang.cards import Card, Suit
import bang.roles as roles import bang.roles as roles
from bang.players import PendingAction from globals import PendingAction
# test TerenKill # test TerenKill

View File

@ -4,7 +4,7 @@ from tests import started_game, set_events, current_player, next_player, current
from bang.expansions.wild_west_show.card_events import * from bang.expansions.wild_west_show.card_events import *
from bang.cards import Card, Suit from bang.cards import Card, Suit
import bang.roles as roles import bang.roles as roles
from bang.players import PendingAction from globals import PendingAction
# test Camposanto # test Camposanto