add camposanto DarlingValentine

This commit is contained in:
Alberto Xamin 2023-02-26 16:14:56 +00:00
parent e68be77edc
commit d089cce48d
9 changed files with 42 additions and 8 deletions

View File

@ -3,6 +3,7 @@ import random
import bang.cards as cs import bang.cards as cs
import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.fistful_of_cards.card_events as ce
import bang.expansions.high_noon.card_events as ceh import bang.expansions.high_noon.card_events as ceh
import bang.expansions.wild_west_show.card_events as cew
import bang.expansions.gold_rush.shop_cards as grc import bang.expansions.gold_rush.shop_cards as grc
from globals import G from globals import G
@ -33,6 +34,9 @@ class Deck:
if 'high_noon' in game.expansions: if 'high_noon' in game.expansions:
self.event_cards.extend(ceh.get_all_events(game.rng)) self.event_cards.extend(ceh.get_all_events(game.rng))
endgame_cards.append(ceh.get_endgame_card()) endgame_cards.append(ceh.get_endgame_card())
if 'wild_west_show' in game.expansions:
self.event_cards.extend(cew.get_all_events(game.rng))
endgame_cards.append(cew.get_endgame_card())
if len(self.event_cards) > 0: if len(self.event_cards) > 0:
game.rng.shuffle(self.event_cards) game.rng.shuffle(self.event_cards)
self.event_cards = self.event_cards[:12] self.event_cards = self.event_cards[:12]

View File

@ -61,7 +61,6 @@ def get_endgame_card():
def get_all_events(rng=random): def get_all_events(rng=random):
cards = [ cards = [
Bavaglio(),
Camposanto(), Camposanto(),
DarlingValentine(), DarlingValentine(),
DorothyRage(), DorothyRage(),

View File

@ -12,6 +12,7 @@ from bang.deck import Deck
import bang.roles as roles import bang.roles as roles
import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.fistful_of_cards.card_events as ce
import bang.expansions.high_noon.card_events as ceh import bang.expansions.high_noon.card_events as ceh
import bang.expansions.wild_west_show.card_events as cew
import bang.expansions.gold_rush.shop_cards as grc 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
@ -61,7 +62,7 @@ class Game:
self.initial_players = 0 self.initial_players = 0
self.password = '' self.password = ''
self.expansions: List[str] = [] self.expansions: List[str] = []
self.available_expansions = ['dodge_city', 'fistful_of_cards', 'high_noon', 'gold_rush', 'the_valley_of_shadows'] self.available_expansions = ['dodge_city', 'fistful_of_cards', 'high_noon', 'gold_rush', 'the_valley_of_shadows', 'wild_west_show']
self.shutting_down = False self.shutting_down = False
self.is_competitive = False self.is_competitive = False
self.disconnect_bot = True self.disconnect_bot = True
@ -78,6 +79,7 @@ class Game:
self.attack_in_progress = False self.attack_in_progress = False
self.characters_to_distribute = 2 # personaggi da dare a inizio partita self.characters_to_distribute = 2 # personaggi da dare a inizio partita
self.debug = self.name == 'debug' self.debug = self.name == 'debug'
self.dead_roles: List[roles.Role] = []
self.is_changing_pwd = False self.is_changing_pwd = False
self.is_hidden = False self.is_hidden = False
self.rng = random.Random() self.rng = random.Random()
@ -113,6 +115,7 @@ class Game:
self.incremental_turn = 0 self.incremental_turn = 0
self.turn = 0 self.turn = 0
self.pending_winners = [] self.pending_winners = []
self.dead_roles: List[roles.Role] = []
for p in self.players: for p in self.players:
p.reset() p.reset()
p.notify_self() p.notify_self()
@ -579,12 +582,16 @@ class Game:
Metrics.send_metric('incremental_turn', points=[self.incremental_turn], tags=[f'game:{self.SEED}']) Metrics.send_metric('incremental_turn', points=[self.incremental_turn], tags=[f'game:{self.SEED}'])
if self.players[self.turn].is_dead: if self.players[self.turn].is_dead:
pl = sorted(self.get_dead_players(), key=lambda x:x.death_turn)[0] pl = sorted(self.get_dead_players(), key=lambda x:x.death_turn)[0]
if self.check_event(ce.DeadMan) and not self.did_resuscitate_deadman and pl == self.players[self.turn]: if self.check_event([ce.DeadMan, cew.Camposanto]) and not self.did_resuscitate_deadman and pl == self.players[self.turn]:
print(f'{self.name}: {self.players[self.turn]} is dead, revive') print(f'{self.name}: {self.players[self.turn]} is dead, revive')
if self.check_event(ce.DeadMan):
self.did_resuscitate_deadman = True self.did_resuscitate_deadman = True
pl.lives = 2
elif self.check_event(cew.Camposanto):
pl.lives = 1
pl.set_role = self.dead_roles.pop(random.randint(0, len(self.dead_roles)-1))
pl.is_dead = False pl.is_dead = False
pl.is_ghost = False pl.is_ghost = False
pl.lives = 2
self.deck.draw(player=pl) self.deck.draw(player=pl)
self.deck.draw(player=pl) self.deck.draw(player=pl)
if (ghost := next((c for c in pl.equipment if isinstance(c, tvosc.Fantasma)), None)) is not None: if (ghost := next((c for c in pl.equipment if isinstance(c, tvosc.Fantasma)), None)) is not None:
@ -762,6 +769,7 @@ class Game:
# if not disconnected: # if not disconnected:
# self.dead_players.append(corpse) # self.dead_players.append(corpse)
self.notify_room() self.notify_room()
self.dead_roles.append(player.role)
G.sio.emit('chat_message', room=self.name, data=f'_died|{player.name}') G.sio.emit('chat_message', room=self.name, data=f'_died|{player.name}')
for p in self.players: for p in self.players:
if not p.is_bot: if not p.is_bot:
@ -845,7 +853,10 @@ class Game:
def check_event(self, ev): def check_event(self, ev):
if self.deck is None or len(self.deck.event_cards) == 0: return False if self.deck is None or len(self.deck.event_cards) == 0: return False
if isinstance(ev, type):
return isinstance(self.deck.event_cards[0], ev) return isinstance(self.deck.event_cards[0], ev)
else:
return any(isinstance(self.deck.event_cards[0], evc) for evc in ev)
def get_visible_players(self, player: pl.Player): # returns a dictionary because we need to add the distance def get_visible_players(self, player: pl.Player): # returns a dictionary because we need to add the distance
pls = self.get_alive_players() pls = self.get_alive_players()

View File

@ -11,6 +11,7 @@ import bang.characters as chars
import bang.expansions.dodge_city.characters as chd import bang.expansions.dodge_city.characters as chd
import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.fistful_of_cards.card_events as ce
import bang.expansions.high_noon.card_events as ceh import bang.expansions.high_noon.card_events as ceh
import bang.expansions.wild_west_show.card_events as cew
import bang.expansions.gold_rush.shop_cards as grc 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
@ -453,6 +454,11 @@ class Player:
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(cew.DarlingValentine):
hand = len(self.hand)
for _ in range(hand):
self.game.deck.scrap(self.hand.pop(0), True, player=self)
self.game.deck.draw(True, player=self)
if self.game.check_event(ceh.MezzogiornoDiFuoco): if self.game.check_event(ceh.MezzogiornoDiFuoco):
self.lives -= 1 self.lives -= 1
if any((isinstance(c, grc.Talismano) for c in self.gold_rush_equipment)): if any((isinstance(c, grc.Talismano) for c in self.gold_rush_equipment)):

View File

@ -631,11 +631,14 @@ def chat_message(sid, msg, pl=None):
sio.emit('chat_message', room=ses.game.name, data={'color': f'red','text':f'🚨 {ses.name} is in debug mode and changed event'}) sio.emit('chat_message', room=ses.game.name, data={'color': f'red','text':f'🚨 {ses.name} is in debug mode and changed event'})
import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.fistful_of_cards.card_events as ce
import bang.expansions.high_noon.card_events as ceh import bang.expansions.high_noon.card_events as ceh
import bang.expansions.wild_west_show.card_events as cew
chs = [] chs = []
chs.extend(ce.get_all_events()) chs.extend(ce.get_all_events())
chs.append(ce.get_endgame_card()) chs.append(ce.get_endgame_card())
chs.extend(ceh.get_all_events()) chs.extend(ceh.get_all_events())
chs.append(ceh.get_endgame_card()) chs.append(ceh.get_endgame_card())
chs.extend(cew.get_all_events())
chs.append(cew.get_endgame_card())
ses.game.deck.event_cards.insert(int(cmd[1]), [c for c in chs if c is not None and c.name == ' '.join(cmd[2:])][0]) ses.game.deck.event_cards.insert(int(cmd[1]), [c for c in chs if c is not None and c.name == ' '.join(cmd[2:])][0])
ses.game.notify_event_card() ses.game.notify_event_card()
elif '/removecard' in msg: elif '/removecard' in msg:

View File

@ -118,6 +118,10 @@ export default {
box-shadow: box-shadow:
0 0 0 3pt #6aa16e, 0 0 0 6pt var(--bg-color), 0 0 5pt 6pt #aaa 0 0 0 3pt #6aa16e, 0 0 0 6pt var(--bg-color), 0 0 5pt 6pt #aaa
} }
.card.wild-west-show{
box-shadow: 0 0 0pt 4pt var(--bg-color), 0 0 5pt 4pt #aaa;
border: 2pt dotted #987e51;
}
.card.high-noon{ .card.high-noon{
box-shadow: 0 0 0pt 4pt var(--bg-color), 0 0 5pt 4pt #aaa; box-shadow: 0 0 0pt 4pt var(--bg-color), 0 0 5pt 4pt #aaa;
border: 2pt dotted rgb(198 78 45); border: 2pt dotted rgb(198 78 45);
@ -230,7 +234,7 @@ export default {
.card.must-be-used { .card.must-be-used {
filter: drop-shadow(0 0 5px red); filter: drop-shadow(0 0 5px red);
} }
.fistful-of-cards .emoji, .high-noon .emoji, .exp-pack .emoji{ .fistful-of-cards .emoji, .high-noon .emoji, .card.wild-west-show .emoji, .exp-pack .emoji{
top:auto !important; top:auto !important;
bottom:15% !important; bottom:15% !important;
} }

View File

@ -159,7 +159,7 @@ Card
password: '', password: '',
togglable_expansions: [], togglable_expansions: [],
expansions: [], expansions: [],
beta_expansions: ['the_valley_of_shadows'], beta_expansions: ['the_valley_of_shadows', 'wild_west_show'],
hasToSetUsername: false, hasToSetUsername: false,
is_competitive: false, is_competitive: false,
disconnect_bot: false, disconnect_bot: false,

View File

@ -4,4 +4,5 @@ export const emojiMap = {
'high_noon': '🔥', 'high_noon': '🔥',
'fistful_of_cards': '🎴', 'fistful_of_cards': '🎴',
'the_valley_of_shadows': '👻', 'the_valley_of_shadows': '👻',
'wild_west_show': '🎪',
} }

View File

@ -28,5 +28,11 @@ export const expansionsMap = {
icon: '👻', icon: '👻',
back: true, back: true,
expansion: 'the-valley-of-shadows', expansion: 'the-valley-of-shadows',
},
'wild_west_show': {
name: 'Wild West Show',
icon: '🎪',
back: true,
expansion: 'wild-west-show'
} }
} }