cardAgainst, ragTime
This commit is contained in:
parent
a141e985da
commit
3772d3cbf9
1
.gitignore
vendored
1
.gitignore
vendored
@ -138,3 +138,4 @@ dmypy.json
|
||||
cython_debug/
|
||||
|
||||
frontend/package-lock.json
|
||||
bang-workspace.code-workspace
|
||||
|
@ -90,58 +90,58 @@ def join_room(sid, room):
|
||||
|
||||
@sio.event
|
||||
def chat_message(sid, msg):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
sio.emit('chat_message', room=ses.game.name, data=f'[{ses.name}]: {msg}')
|
||||
|
||||
@sio.event
|
||||
def start_game(sid):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.game.start_game()
|
||||
advertise_lobbies()
|
||||
|
||||
@sio.event
|
||||
def set_character(sid, name):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.set_character(name)
|
||||
|
||||
@sio.event
|
||||
def refresh(sid):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.notify_self()
|
||||
|
||||
@sio.event
|
||||
def draw(sid, pile):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.draw(pile)
|
||||
|
||||
@sio.event
|
||||
def pick(sid):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.pick()
|
||||
|
||||
@sio.event
|
||||
def end_turn(sid):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.end_turn()
|
||||
|
||||
@sio.event
|
||||
def play_card(sid, data):
|
||||
ses = sio.get_session(sid)
|
||||
ses.play_card(data['index'], data['against'])
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.play_card(data['index'], data['against'], data['with'])
|
||||
|
||||
@sio.event
|
||||
def respond(sid, data):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.respond(data)
|
||||
|
||||
@sio.event
|
||||
def choose(sid, card_index):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.choose(card_index)
|
||||
|
||||
@sio.event
|
||||
def scrap(sid, card_index):
|
||||
ses = sio.get_session(sid)
|
||||
ses: Player = sio.get_session(sid)
|
||||
ses.scrap(card_index)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -35,13 +35,14 @@ class Card(ABC):
|
||||
self.alt_text = f'{self.range} 🔍'
|
||||
self.desc = desc
|
||||
self.need_target = False
|
||||
self.need_with = False
|
||||
|
||||
def __str__(self):
|
||||
char = ['♦️', '♣️', '♥️', '♠️'][int(self.suit)]
|
||||
return f'{self.name} {char}{self.number}'
|
||||
return super().__str__()
|
||||
|
||||
def play_card(self, player, against):#self --> carta
|
||||
def play_card(self, player, against=None, _with=None):#self --> carta
|
||||
if self.is_equipment:
|
||||
if self.is_weapon:
|
||||
has_weapon = False
|
||||
@ -106,7 +107,7 @@ class Prigione(Card):
|
||||
self.desc = "Equipaggia questa carta a un altro giocatore, tranne lo Sceriffo. Il giocatore scelto all'inizio del suo turno, prima di pescare dovrà estrarre: se esce Cuori scarta questa carta e gioca normalmente il turno, altrimenti scarta questa carta e salta il turno"
|
||||
self.need_target = True
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
if against != None and not isinstance(player.game.get_player_named(against).role, r.Sheriff):
|
||||
player.sio.emit('chat_message', room=player.game.name,
|
||||
data=f'{self.name} ha giocato {self.name} contro {against}.')
|
||||
@ -161,7 +162,7 @@ class Bang(Card):
|
||||
self.desc = "Spara a un giocatore a distanta raggiungibile. Se non hai armi la distanza di default è 1"
|
||||
self.need_target = True
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
if player.has_played_bang and not any([isinstance(c, Volcanic) for c in player.equipment]) and against != None:
|
||||
return False
|
||||
elif against != None:
|
||||
@ -180,7 +181,7 @@ class Birra(Card):
|
||||
self.icon = '🍺'
|
||||
self.desc = "Gioca questa carta per recuperare un punto vita. Non puoi andare oltre al limite massimo del tuo personaggio. Se stai per perdere l'ultimo punto vita puoi giocare questa carta anche nel turno dell'avversario. La birra non ha più effetto se ci sono solo due giocatori"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
if len(player.game.players) != 2 and player.lives != player.max_lives:
|
||||
super().play_card(player, against=against)
|
||||
player.lives = min(player.lives+1, player.max_lives)
|
||||
@ -199,7 +200,7 @@ class CatBalou(Card):
|
||||
self.desc = "Fai scartare una carta a un qualsiasi giocatore, scegli a caso dalla mano, oppure fra quelle che ha in gioco"
|
||||
self.need_target = True
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
if against != None and (len(player.game.get_player_named(against).hand) + len(player.game.get_player_named(against).equipment)) > 0:
|
||||
super().play_card(player, against=against)
|
||||
from bang.players import PendingAction
|
||||
@ -217,7 +218,7 @@ class Diligenza(Card):
|
||||
self.icon = '🚡'
|
||||
self.desc = "Pesca 2 carte dalla cima del mazzo"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
super().play_card(player, against=against)
|
||||
player.sio.emit('chat_message', room=player.game.name,
|
||||
data=f'{player.name} ha giocato {self.name} e ha pescato 2 carte.')
|
||||
@ -233,7 +234,7 @@ class Duello(Card):
|
||||
self.icon = '⚔️'
|
||||
self.desc = "Gioca questa carta contro un qualsiasi giocatore. A turno, cominciando dal tuo avversario, potete scartare una carta Bang!, il primo giocatore che non lo fa perde 1 vita"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
if against != None:
|
||||
super().play_card(player, against=against)
|
||||
player.game.duel(player, against)
|
||||
@ -247,7 +248,7 @@ class Emporio(Card):
|
||||
self.icon = '🏪'
|
||||
self.desc = "Scopri dal mazzo tante carte quanto il numero di giocatori, a turno, partendo da te, scegliete una carta e aggiungetela alla vostra mano"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
super().play_card(player, against=against)
|
||||
player.game.emporio()
|
||||
return True
|
||||
@ -259,7 +260,7 @@ class Gatling(Card):
|
||||
self.icon = '🛰'
|
||||
self.desc = "Spara a tutti gli altri giocatori"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
super().play_card(player, against=against)
|
||||
player.game.attack_others(player)
|
||||
return True
|
||||
@ -271,7 +272,7 @@ class Indiani(Card):
|
||||
self.icon = '🏹'
|
||||
self.desc = "Tutti gli altri giocatori devono scartare un Bang! o perdere una vita"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
super().play_card(player, against=against)
|
||||
player.game.indian_others(player)
|
||||
return True
|
||||
@ -283,7 +284,7 @@ class Mancato(Card):
|
||||
self.icon = '😅'
|
||||
self.desc = "Usa questa carta per annullare un bang"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
import bang.characters as chars
|
||||
if (not player.has_played_bang and against != None and isinstance(player.character, chars.CalamityJanet)):
|
||||
player.sio.emit('chat_message', room=player.game.name,
|
||||
@ -301,7 +302,7 @@ class Panico(Card):
|
||||
self.need_target = True
|
||||
self.desc = "Pesca una carta da un giocatore a distanza 1, scegli a caso dalla mano, oppure fra quelle che ha in gioco"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
if against != None and (len(player.game.get_player_named(against).hand) + len(player.game.get_player_named(against).equipment)) > 0:
|
||||
super().play_card(player, against=against)
|
||||
from bang.players import PendingAction
|
||||
@ -319,7 +320,7 @@ class Saloon(Card):
|
||||
self.desc = "Tutti i giocatori recuperano un punto vita compreso chi gioca la carta"
|
||||
self.icon = '🍻'
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
player.sio.emit('chat_message', room=player.game.name,
|
||||
data=f'{player.name} ha giocato {self.name} e ha curato 1 punto vita a tutti.')
|
||||
for p in player.game.players:
|
||||
@ -334,7 +335,7 @@ class WellsFargo(Card):
|
||||
self.desc = "Pesca 3 carte dalla cima del mazzo"
|
||||
self.icon = '💸'
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
player.sio.emit('chat_message', room=player.game.name,
|
||||
data=f'{player.name} ha giocato {self.name} e ha pescato 3 carte.')
|
||||
for i in range(3):
|
||||
|
@ -19,7 +19,7 @@ class Pugno(Card):
|
||||
self.desc = "Spara a un giocatore a distanta 1"
|
||||
self.need_target = True
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
if against != None:
|
||||
import bang.characters as chars
|
||||
super().play_card(player, against=against)
|
||||
@ -34,13 +34,28 @@ class Schivata(Mancato):
|
||||
self.icon = '🙅♂️'
|
||||
self.desc += " e poi pesca una carta"
|
||||
|
||||
def play_card(self, player, against):
|
||||
def play_card(self, player, against, _with=None):
|
||||
return False
|
||||
|
||||
def use_card(self, player):
|
||||
player.hand.append(player.game.deck.draw())
|
||||
player.notify_self()
|
||||
|
||||
class RagTime(Panico):
|
||||
def __init__(self, suit, number):
|
||||
Card.__init__(self, suit, 'Rag Time', number)
|
||||
self.icon = '🎹'
|
||||
self.desc = "Ruba 1 carta dalla mano di un giocatore"
|
||||
self.need_target = True
|
||||
self.need_with = True
|
||||
|
||||
def play_card(self, player, against, _with):
|
||||
if against != None and _with != None:
|
||||
player.game.deck.scrap(_with)
|
||||
super().play_card(player, against=against)
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_starting_deck() -> List[Card]:
|
||||
return [
|
||||
#TODO: aggiungere anche le carte normalmente presenti https://bang.dvgiochi.com/cardslist.php?id=3
|
||||
@ -65,4 +80,5 @@ def get_starting_deck() -> List[Card]:
|
||||
Pugno(Suit.SPADES, 10),
|
||||
Schivata(Suit.DIAMONDS, 7),
|
||||
Schivata(Suit.HEARTS, 'K'),
|
||||
RagTime(Suit.HEARTS, 9)
|
||||
]
|
||||
|
@ -248,18 +248,23 @@ class Player:
|
||||
s += f"equipment {[str(c) for c in self.equipment]}"
|
||||
return s
|
||||
|
||||
def play_card(self, hand_index: int, against=None):
|
||||
def play_card(self, hand_index: int, against=None, _with=None):
|
||||
if not (0 <= hand_index < len(self.hand)):
|
||||
print('illegal')
|
||||
return
|
||||
card: cs.Card = self.hand.pop(hand_index)
|
||||
print(self.name, 'is playing ', card, ' against:', against)
|
||||
did_play_card = card.play_card(self, against)
|
||||
withCard: cs.Card = None
|
||||
if _with:
|
||||
withCard = self.hand.pop(_with) if hand_index > _with else self.hand.pop(_with - 1)
|
||||
print(self.name, 'is playing ', card, ' against:', against, ' with:', _with)
|
||||
did_play_card = card.play_card(self, against, withCard)
|
||||
if not card.is_equipment:
|
||||
if did_play_card:
|
||||
self.game.deck.scrap(card)
|
||||
else:
|
||||
self.hand.insert(hand_index, card)
|
||||
if withCard:
|
||||
self.hand.insert(_with, withCard)
|
||||
self.notify_self()
|
||||
|
||||
def choose(self, card_index):
|
||||
|
@ -32,8 +32,9 @@
|
||||
<Chooser v-if="win_status !== undefined" :text="win_status?'HAI VINTO':'HAI PERSO'" />
|
||||
<Chooser v-if="show_role" text="Tu sei" :cards="[my_role]" :hintText="my_role.goal" :select="() => {show_role=false}" :cancel="() => {show_role=false}" cancelText="OK" />
|
||||
<Chooser v-if="notifycard" :key="notifycard.card" :text="`${notifycard.player} ha pescato come seconda carta:`" :cards="[notifycard.card]" hintText="Se la carta è cuori o quadri ne pesca un'altra" class="turn-notify-4s"/>
|
||||
<Chooser v-if="!show_role && is_my_turn" text="GIOCA IL TUO TURNO" :key="is_my_turn" class="turn-notify" />
|
||||
<Chooser v-if="!show_role && is_my_turn && pending_action < 2" text="GIOCA IL TUO TURNO" :key="is_my_turn" class="turn-notify" />
|
||||
<Chooser v-if="hasToPickResponse" :text="`ESTRAI UNA CARTA ${attacker?('PER DIFENDERTI DA '+attacker):''}`" :key="hasToPickResponse" class="turn-notify" />
|
||||
<Chooser v-if="!card_against && card_with" :text="`SCEGLI CHE CARTA SCARTARE PER GIOCCARE ${card_with.name}`" :cards="hand.filter(x => x !== card_with)" :select="selectWith" :cancel="()=>{card_with = null}"/>
|
||||
<Chooser v-if="showScrapScreen" :text="`SCARTA ${hand.length}/${lives}`" :cards="hand" :select="scrap" :cancel="cancelEndingTurn"/>
|
||||
<Chooser v-if="sidWantsScrapForHealth && sidScrapForHealth.length < 2" :text="`SCARTA ${2 - sidScrapForHealth.length} PER RECUPERARE 1 VITA`"
|
||||
:cards="sidScrapHand" :select="sidScrap" :cancel="() => {sidWantsScrapForHealth = false;sidScrapForHealth=[]}"/>
|
||||
@ -66,6 +67,7 @@ export default {
|
||||
hint: '',
|
||||
pending_action: null,
|
||||
card_against: null,
|
||||
card_with: null,
|
||||
has_played_bang: false,
|
||||
playersDistances: [],
|
||||
is_my_turn: false,
|
||||
@ -195,7 +197,9 @@ export default {
|
||||
let calamity_special = (card.name === 'Mancato!' && this.character.name === 'Calamity Janet')
|
||||
let cant_play_bang = (this.has_played_bang && this.equipment.filter(x => x.name == 'Volcanic').length == 0)
|
||||
if (this.pending_action == 2) {
|
||||
if ((card.need_target || calamity_special) && !((card.name == 'Bang!' || (calamity_special && card.name=='Mancato!')) && cant_play_bang)) {
|
||||
if (card.need_with && !this.card_with) {
|
||||
this.card_with = card
|
||||
} else if ((card.need_target || calamity_special) && !((card.name == 'Bang!' || (calamity_special && card.name=='Mancato!')) && cant_play_bang)) {
|
||||
if (card.name == 'Bang!' || calamity_special)
|
||||
this.range = this.sight
|
||||
else
|
||||
@ -217,14 +221,21 @@ export default {
|
||||
this.really_play_card(this.card_against, player.name)
|
||||
this.card_against = null
|
||||
},
|
||||
selectWith(card) {
|
||||
this.card_against = this.card_with
|
||||
this.card_with = card
|
||||
},
|
||||
cancelCardAgainst() {
|
||||
this.card_against = null
|
||||
this.card_with = null
|
||||
},
|
||||
really_play_card(card, against) {
|
||||
let card_data = {
|
||||
index: this.hand.indexOf(card),
|
||||
against: against
|
||||
against: against,
|
||||
with: this.hand.indexOf(this.card_with),
|
||||
}
|
||||
this.card_with = null
|
||||
console.log(card_data)
|
||||
this.$socket.emit('play_card', card_data)
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user