roulette russa

This commit is contained in:
Alberto Xamin 2020-12-20 14:19:50 +01:00
parent f47c8fb053
commit 622d8d7330
No known key found for this signature in database
GPG Key ID: 4F026F48309500A2
3 changed files with 72 additions and 42 deletions

View File

@ -84,7 +84,7 @@ class Rimbalzo(CardEvent):
self.desc_eng = "The player can play bang against the cards equipped by the other players, if they do not play miss they are discarded" self.desc_eng = "The player can play bang against the cards equipped by the other players, if they do not play miss they are discarded"
class RouletteRussa(CardEvent): class RouletteRussa(CardEvent):
def __init__(self):#TODO def __init__(self):
super().__init__("Roulette Russa", "🇷🇺") super().__init__("Roulette Russa", "🇷🇺")
self.desc = "A partire dallo sceriffo, ogni giocatore scarta 1 mancato, il primo che non lo fa perde 2 vite" self.desc = "A partire dallo sceriffo, ogni giocatore scarta 1 mancato, il primo che non lo fa perde 2 vite"
self.desc_eng = "Starting from the sheriff, every player discards 1 missed, the first one that doesn't loses 2 HP" self.desc_eng = "Starting from the sheriff, every player discards 1 missed, the first one that doesn't loses 2 HP"
@ -110,6 +110,6 @@ def get_all_events():
Peyote(), Peyote(),
# Ranch(), # Ranch(),
# Rimbalzo(), # Rimbalzo(),
# RouletteRussa(), RouletteRussa(),
Vendetta(), Vendetta(),
] ]

View File

@ -2,7 +2,7 @@
from typing import List, Set, Dict, Tuple, Optional from typing import List, Set, Dict, Tuple, Optional
import random import random
import socketio import socketio
import bang.players as players import bang.players as pl
import bang.characters as characters import bang.characters as characters
from bang.deck import Deck from bang.deck import Deck
import bang.roles as roles import bang.roles as roles
@ -14,8 +14,8 @@ class Game:
super().__init__() super().__init__()
self.sio = sio self.sio = sio
self.name = name self.name = name
self.players: List[players.Player] = [] self.players: List[pl.Player] = []
self.dead_players: List[players.Player] = [] self.dead_players: List[pl.Player] = []
self.deck: Deck = None self.deck: Deck = None
self.started = False self.started = False
self.turn = 0 self.turn = 0
@ -29,6 +29,7 @@ class Game:
self.is_competitive = False self.is_competitive = False
self.disconnect_bot = True self.disconnect_bot = True
self.player_bangs = 0 self.player_bangs = 0
self.is_russian_roulette_on = False
def notify_room(self, sid=None): def notify_room(self, sid=None):
if len([p for p in self.players if p.character == None]) != 0 or sid: if len([p for p in self.players if p.character == None]) != 0 or sid:
@ -60,7 +61,7 @@ class Game:
self.disconnect_bot = not self.disconnect_bot self.disconnect_bot = not self.disconnect_bot
self.notify_room() self.notify_room()
def add_player(self, player: players.Player): def add_player(self, player: pl.Player):
if player.is_bot and len(self.players) >= 8: if player.is_bot and len(self.players) >= 8:
return return
if player in self.players or len(self.players) >= 10: if player in self.players or len(self.players) >= 10:
@ -140,8 +141,8 @@ class Game:
self.turn = i self.turn = i
self.players[i].notify_self() self.players[i].notify_self()
def attack_others(self, attacker: players.Player): def attack_others(self, attacker: pl.Player):
attacker.pending_action = players.PendingAction.WAIT attacker.pending_action = pl.PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.waiting_for = 0 self.waiting_for = 0
self.readyCount = 0 self.readyCount = 0
@ -151,11 +152,11 @@ 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 = players.PendingAction.PLAY attacker.pending_action = pl.PendingAction.PLAY
attacker.notify_self() attacker.notify_self()
def indian_others(self, attacker: players.Player): def indian_others(self, attacker: pl.Player):
attacker.pending_action = players.PendingAction.WAIT attacker.pending_action = pl.PendingAction.WAIT
attacker.notify_self() attacker.notify_self()
self.waiting_for = 0 self.waiting_for = 0
self.readyCount = 0 self.readyCount = 0
@ -165,62 +166,82 @@ 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 = players.PendingAction.PLAY attacker.pending_action = pl.PendingAction.PLAY
attacker.notify_self() attacker.notify_self()
def attack(self, attacker: players.Player, target_username:str, double:bool=False): def attack(self, attacker: pl.Player, target_username:str, double:bool=False):
if self.get_player_named(target_username).get_banged(attacker=attacker, double=double): if self.get_player_named(target_username).get_banged(attacker=attacker, double=double):
self.readyCount = 0 self.readyCount = 0
self.waiting_for = 1 self.waiting_for = 1
attacker.pending_action = players.PendingAction.WAIT attacker.pending_action = pl.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 duel(self, attacker: players.Player, target_username:str): def duel(self, attacker: pl.Player, target_username:str):
if self.get_player_named(target_username).get_dueled(attacker=attacker): if self.get_player_named(target_username).get_dueled(attacker=attacker):
self.readyCount = 0 self.readyCount = 0
self.waiting_for = 1 self.waiting_for = 1
attacker.pending_action = players.PendingAction.WAIT attacker.pending_action = pl.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):
self.available_cards = [self.deck.draw() for i in range(len(self.players))] self.available_cards = [self.deck.draw() for i in range(len(self.players))]
self.players[self.turn].pending_action = players.PendingAction.CHOOSE self.players[self.turn].pending_action = pl.PendingAction.CHOOSE
self.players[self.turn].available_cards = self.available_cards self.players[self.turn].available_cards = self.available_cards
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
def respond_emporio(self, player, i): def respond_emporio(self, player, i):
player.hand.append(self.available_cards.pop(i)) player.hand.append(self.available_cards.pop(i))
player.available_cards = [] player.available_cards = []
player.pending_action = players.PendingAction.WAIT player.pending_action = pl.PendingAction.WAIT
player.notify_self() player.notify_self()
nextPlayer = self.players[(self.turn + (len(self.players)-len(self.available_cards))) % len(self.players)] nextPlayer = self.players[(self.turn + (len(self.players)-len(self.available_cards))) % len(self.players)]
if nextPlayer == self.players[self.turn]: if nextPlayer == self.players[self.turn]:
self.players[self.turn].pending_action = players.PendingAction.PLAY self.players[self.turn].pending_action = pl.PendingAction.PLAY
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
else: else:
nextPlayer.pending_action = players.PendingAction.CHOOSE nextPlayer.pending_action = pl.PendingAction.CHOOSE
nextPlayer.available_cards = self.available_cards nextPlayer.available_cards = self.available_cards
nextPlayer.notify_self() nextPlayer.notify_self()
def get_player_named(self, name:str): def get_player_named(self, name:str):
return self.players[self.players_map[name]] return self.players[self.players_map[name]]
def responders_did_respond_resume_turn(self): def responders_did_respond_resume_turn(self, did_lose=False):
print('did_lose', did_lose)
if self.player_bangs > 0 and self.check_event(ce.PerUnPugnoDiCarte): if self.player_bangs > 0 and self.check_event(ce.PerUnPugnoDiCarte):
self.player_bangs -= 1 self.player_bangs -= 1
if self.player_bangs > 1: if self.player_bangs > 1:
self.players[self.turn].get_banged('') print('bang again')
if self.players[self.turn].get_banged(self.deck.event_cards[0]):
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
else: else:
self.responders_did_respond_resume_turn()
else:
print('ok play turn now')
self.player_bangs = 0 self.player_bangs = 0
self.players[self.turn].play_turn() self.players[self.turn].play_turn()
elif self.is_russian_roulette_on and self.check_event(ce.RouletteRussa):
if did_lose:
print('stop roulette')
self.players[(self.turn+self.player_bangs) % len(self.players)].lives -= 1
self.players[(self.turn+self.player_bangs) % len(self.players)].notify_self()
self.is_russian_roulette_on = False
self.players[self.turn].play_turn()
else:
self.player_bangs += 1
print(f'next in line {self.players[(self.turn+self.player_bangs) % len(self.players)].name}')
if self.players[(self.turn+self.player_bangs) % len(self.players)].get_banged(self.deck.event_cards[0]):
self.players[(self.turn+self.player_bangs) % len(self.players)].notify_self()
else:
self.responders_did_respond_resume_turn(did_lose=True)
else:
self.readyCount += 1 self.readyCount += 1
if self.readyCount == self.waiting_for: if self.readyCount == self.waiting_for:
self.waiting_for = 0 self.waiting_for = 0
self.readyCount = 0 self.readyCount = 0
self.players[self.turn].pending_action = players.PendingAction.PLAY self.players[self.turn].pending_action = pl.PendingAction.PLAY
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
def next_player(self): def next_player(self):
@ -237,10 +258,19 @@ class Game:
self.players[-1].hand.append(self.deck.draw()) self.players[-1].hand.append(self.deck.draw())
self.players_map = {c.name: i for i, c in enumerate(self.players)} self.players_map = {c.name: i for i, c in enumerate(self.players)}
self.players[-1].notify_self() self.players[-1].notify_self()
elif self.check_event(ce.RouletteRussa):
self.is_russian_roulette_on = True
if self.players[self.turn].get_banged(self.deck.event_cards[0]):
self.players[self.turn].notify_self()
else:
self.responders_did_respond_resume_turn(did_lose=True)
return
if self.check_event(ce.PerUnPugnoDiCarte): if self.check_event(ce.PerUnPugnoDiCarte):
self.player_bangs = len(self.players[self.turn].hand) self.player_bangs = len(self.players[self.turn].hand)
self.players[self.turn].get_banged('') if self.players[self.turn].get_banged(self.deck.event_cards[0]):
self.players[self.turn].notify_self() self.players[self.turn].notify_self()
else:
self.responders_did_respond_resume_turn()
else: else:
self.players[self.turn].play_turn() self.players[self.turn].play_turn()
@ -261,7 +291,7 @@ class Game:
else: else:
self.sio.emit('scrap', room=self.name, data=None) self.sio.emit('scrap', room=self.name, data=None)
def handle_disconnect(self, player: players.Player): def handle_disconnect(self, player: pl.Player):
print(f'player {player.name} left the game {self.name}') print(f'player {player.name} left the game {self.name}')
if player in self.players: if player in self.players:
if self.disconnect_bot and self.started: if self.disconnect_bot and self.started:
@ -281,17 +311,17 @@ class Game:
return True return True
else: return False else: return False
def player_death(self, player: players.Player, disconnected=False): def player_death(self, player: pl.Player, disconnected=False):
if not player in self.players: return if not player in self.players: return
import bang.expansions.dodge_city.characters as chd import bang.expansions.dodge_city.characters as chd
print(player.attacker) print(player.attacker)
if player.attacker and isinstance(player.attacker.role, roles.Sheriff) and isinstance(player.role, roles.Vice): if player.attacker and player.attacker in self.players and isinstance(player.attacker.role, roles.Sheriff) and isinstance(player.role, roles.Vice):
for i in range(len(player.attacker.hand)): for i in range(len(player.attacker.hand)):
self.deck.scrap(player.attacker.hand.pop()) self.deck.scrap(player.attacker.hand.pop())
for i in range(len(player.attacker.equipment)): for i in range(len(player.attacker.equipment)):
self.deck.scrap(player.attacker.equipment.pop()) self.deck.scrap(player.attacker.equipment.pop())
player.attacker.notify_self() player.attacker.notify_self()
elif player.attacker and (isinstance(player.role, roles.Outlaw) or self.initial_players == 3): elif player.attacker and player.attacker in self.players and (isinstance(player.role, roles.Outlaw) or self.initial_players == 3):
for i in range(3): for i in range(3):
player.attacker.hand.append(self.deck.draw()) player.attacker.hand.append(self.deck.draw())
player.attacker.notify_self() player.attacker.notify_self()
@ -372,7 +402,7 @@ class Game:
if len(self.deck.event_cards) == 0: return False if len(self.deck.event_cards) == 0: return False
return isinstance(self.deck.event_cards[0], ev) return isinstance(self.deck.event_cards[0], ev)
def get_visible_players(self, player: players.Player): def get_visible_players(self, player: pl.Player):
i = self.players.index(player) i = self.players.index(player)
sight = player.get_sight() sight = player.get_sight()
mindist = 99 if not self.check_event(ce.Agguato) else 1 mindist = 99 if not self.check_event(ce.Agguato) else 1

View File

@ -540,12 +540,12 @@ class Player:
self.mancato_needed -= 1 self.mancato_needed -= 1
self.notify_self() self.notify_self()
if self.mancato_needed <= 0: if self.mancato_needed <= 0:
self.game.responders_did_respond_resume_turn() self.game.responders_did_respond_resume_turn(did_lose=False)
return return
if not self.game.is_competitive and len([c for c in self.hand if isinstance(c, cs.Mancato) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Bang)) or isinstance(self.character, chd.ElenaFuente)]) == 0\ if not self.game.is_competitive and len([c for c in self.hand if isinstance(c, cs.Mancato) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Bang)) or isinstance(self.character, chd.ElenaFuente)]) == 0\
and len([c for c in self.equipment if c.can_be_used_now and isinstance(c, cs.Mancato)]) == 0: and len([c for c in self.equipment if c.can_be_used_now and isinstance(c, cs.Mancato)]) == 0:
self.take_damage_response() self.take_damage_response()
self.game.responders_did_respond_resume_turn() self.game.responders_did_respond_resume_turn(did_lose=True)
else: else:
self.pending_action = PendingAction.RESPOND self.pending_action = PendingAction.RESPOND
self.expected_response = self.game.deck.mancato_cards self.expected_response = self.game.deck.mancato_cards
@ -575,7 +575,7 @@ class Player:
print('has mancato') print('has mancato')
self.pending_action = PendingAction.RESPOND self.pending_action = PendingAction.RESPOND
self.expected_response = self.game.deck.mancato_cards self.expected_response = self.game.deck.mancato_cards
if self.attacker and isinstance(self.attacker.character, chd.BelleStar) or self.game.check_event(ce.Lazo): if self.attacker and self.attacker in self.game.players and isinstance(self.attacker.character, chd.BelleStar) or self.game.check_event(ce.Lazo):
self.expected_response = self.game.deck.mancato_cards_not_green self.expected_response = self.game.deck.mancato_cards_not_green
if isinstance(self.character, chd.ElenaFuente): if isinstance(self.character, chd.ElenaFuente):
self.expected_response = self.game.deck.all_cards_str self.expected_response = self.game.deck.all_cards_str
@ -601,7 +601,7 @@ class Player:
if not self.game.is_competitive and len([c for c in self.hand if isinstance(c, cs.Bang) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Mancato))]) == 0: if not self.game.is_competitive and len([c for c in self.hand if isinstance(c, cs.Bang) or (isinstance(self.character, chars.CalamityJanet) and isinstance(c, cs.Mancato))]) == 0:
print('Cant defend') print('Cant defend')
self.take_damage_response() self.take_damage_response()
self.game.responders_did_respond_resume_turn() self.game.responders_did_respond_resume_turn(did_lose=True)
return False return False
else: else:
self.pending_action = PendingAction.RESPOND self.pending_action = PendingAction.RESPOND
@ -657,7 +657,7 @@ class Player:
if isinstance(self.character, chd.MollyStark) and hand_index < len(self.hand)+1 and not self.is_my_turn: if isinstance(self.character, chd.MollyStark) and hand_index < len(self.hand)+1 and not self.is_my_turn:
self.molly_discarded_cards += 1 self.molly_discarded_cards += 1
else: else:
self.game.responders_did_respond_resume_turn() self.game.responders_did_respond_resume_turn(did_lose=False)
self.event_type = '' self.event_type = ''
else: else:
self.pending_action = PendingAction.RESPOND self.pending_action = PendingAction.RESPOND
@ -674,7 +674,7 @@ class Player:
self.attacker.molly_discarded_cards = 0 self.attacker.molly_discarded_cards = 0
self.attacker.notify_self() self.attacker.notify_self()
self.on_failed_response_cb() self.on_failed_response_cb()
self.game.responders_did_respond_resume_turn() self.game.responders_did_respond_resume_turn(did_lose=True)
if self.mancato_needed <= 0: if self.mancato_needed <= 0:
self.attacker = None self.attacker = None