panico e catbalou

This commit is contained in:
Alberto Xamin 2020-11-21 17:19:40 +01:00
parent 5068eafe5b
commit badc9565da
No known key found for this signature in database
GPG Key ID: 4F026F48309500A2
6 changed files with 89 additions and 8 deletions

View File

@ -101,5 +101,10 @@ def respond(sid, data):
ses = sio.get_session(sid) ses = sio.get_session(sid)
ses.respond(data) ses.respond(data)
@sio.event
def choose(sid, card_index):
ses = sio.get_session(sid)
ses.choose(card_index)
if __name__ == '__main__': if __name__ == '__main__':
eventlet.wsgi.server(eventlet.listen(('', 5001)), app) eventlet.wsgi.server(eventlet.listen(('', 5001)), app)

View File

@ -25,6 +25,7 @@ class Game:
self.deck.scrap(c) self.deck.scrap(c)
for c in player.equipment: for c in player.equipment:
self.deck.scrap(c) self.deck.scrap(c)
died_in_his_turn = self.started and index == self.turn
if self.started and index < self.turn: if self.started and index < self.turn:
self.turn -= 1 self.turn -= 1
self.players.pop(index) self.players.pop(index)
@ -34,6 +35,8 @@ class Game:
self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players]}) self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players]})
self.sio.emit('chat_message', room=self.name, data=f'{player.name} si è disconnesso.') self.sio.emit('chat_message', room=self.name, data=f'{player.name} si è disconnesso.')
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)}
if died_in_his_turn:
self.next_turn()
return False return False
def add_player(self, player: players.Player): def add_player(self, player: players.Player):
@ -125,7 +128,8 @@ class Game:
for c in player.equipment: for c in player.equipment:
self.deck.scrap(c) self.deck.scrap(c)
index = self.players.index(player) index = self.players.index(player)
if index < self.turn: died_in_his_turn = index == self.turn
if index <= self.turn:
self.turn -= 1 self.turn -= 1
self.players.pop(index) self.players.pop(index)
if len(self.players) == 0: if len(self.players) == 0:
@ -136,7 +140,9 @@ class Game:
for p in self.players: for p in self.players:
p.notify_self() p.notify_self()
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)}
if died_in_his_turn:
self.next_turn()
def notify_all(self): def notify_all(self):
data = [{ data = [{
'name': p.name, 'name': p.name,

View File

@ -13,6 +13,7 @@ class PendingAction(IntEnum):
PLAY = 2 PLAY = 2
RESPOND = 3 RESPOND = 3
WAIT = 4 WAIT = 4
CHOOSE = 5
class Player: class Player:
def __init__(self, name, sid, sio): def __init__(self, name, sid, sio):
@ -36,6 +37,7 @@ class Player:
self.on_pick_cb = None self.on_pick_cb = None
self.on_response_cb = None self.on_response_cb = None
self.expected_response = None self.expected_response = None
self.target_p: str = None
def join_game(self, game): def join_game(self, game):
self.game = game self.game = game
@ -85,6 +87,7 @@ class Player:
def play_turn(self): def play_turn(self):
if self.lives == 0: if self.lives == 0:
self.end_turn(forced=True) self.end_turn(forced=True)
self.sio.emit('chat_message', room=self.game.name, data=f'È il turno di {self.name}.')
print(f'I {self.name} was notified that it is my turn') print(f'I {self.name} was notified that it is my turn')
self.was_shot = False self.was_shot = False
self.is_my_turn = True self.is_my_turn = True
@ -118,6 +121,7 @@ class Player:
if picked.suit == cards.Suit.SPADES and 2 <= picked.number <= 9 and pickable_cards == 0: if picked.suit == cards.Suit.SPADES and 2 <= picked.number <= 9 and pickable_cards == 0:
self.lives -= 3 self.lives -= 3
self.game.deck.scrap(self.equipment.pop(i)) self.game.deck.scrap(self.equipment.pop(i))
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha fatto esplodere la dinamite.')
print(f'{self.name} Boom, -3 hp') print(f'{self.name} Boom, -3 hp')
else: else:
self.game.next_player().equipment.append(self.equipment.pop(i)) self.game.next_player().equipment.append(self.equipment.pop(i))
@ -189,40 +193,76 @@ class Player:
self.hand.insert(hand_index, card) self.hand.insert(hand_index, card)
return return
if isinstance(card, cards.Bang) and againts != None: if isinstance(card, cards.Bang) and againts != None:
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} contro {againts}.')
self.has_played_bang = True self.has_played_bang = True
self.game.attack(self, againts) self.game.attack(self, againts)
if isinstance(card, cards.Birra) and len(self.game.players) != 2: if isinstance(card, cards.Birra) and len(self.game.players) != 2:
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato una {card.name}.')
self.lives = min(self.lives+1, self.max_lives) self.lives = min(self.lives+1, self.max_lives)
if isinstance(card, cards.CatBalou): if isinstance(card, cards.CatBalou) and againts != None:
pass self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} contro {againts}.')
self.pending_action = PendingAction.CHOOSE
self.choose_action = 'discard'
self.target_p = againts
print('choose now')
if isinstance(card, cards.Diligenza): if isinstance(card, cards.Diligenza):
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} e ha pescato 2 carte.')
for i in range(2): for i in range(2):
self.hand.append(self.game.deck.draw()) self.hand.append(self.game.deck.draw())
if isinstance(card, cards.Duello): if isinstance(card, cards.Duello):
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} contro {againts}.')
pass pass
if isinstance(card, cards.Emporio): if isinstance(card, cards.Emporio):
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name}.')
pass pass
if isinstance(card, cards.Gatling): if isinstance(card, cards.Gatling):
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name}.')
for p in self.game.players: for p in self.game.players:
if p != self: if p != self:
self.game.attack(self, p) self.game.attack(self, p)
pass pass
if isinstance(card, cards.Indiani): if isinstance(card, cards.Indiani):
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name}.')
pass pass
if isinstance(card, cards.Mancato): if isinstance(card, cards.Mancato):
pass pass
if isinstance(card, cards.Panico): if isinstance(card, cards.Panico):
pass self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} contro {againts}.')
self.pending_action = PendingAction.CHOOSE
self.choose_action = 'steal'
self.target_p = againts
print('choose now')
if isinstance(card, cards.Saloon): if isinstance(card, cards.Saloon):
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} e ha curato 1 punto vita a tutti.')
for p in self.game.players: for p in self.game.players:
p.lives = min(p.lives+1, p.max_lives) p.lives = min(p.lives+1, p.max_lives)
p.notify_self() p.notify_self()
if isinstance(card, cards.WellsFargo): if isinstance(card, cards.WellsFargo):
self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} e ha pescato 3 carte.')
for i in range(3): for i in range(3):
self.hand.append(self.game.deck.draw()) self.hand.append(self.game.deck.draw())
self.game.deck.scrap(card) self.game.deck.scrap(card)
self.notify_self() self.notify_self()
def choose(self, card_index):
if self.pending_action != PendingAction.CHOOSE:
return
target = self.game.get_player_named(self.target_p)
card = None
if card_index >= len(target.hand):
card = target.equipment.pop(card_index - len(target.hand))
else:
card = target.hand.pop(card_index)
target.notify_self()
if self.choose_action == 'steal':
self.hand.append(card)
else:
self.game.deck.scrap(card)
self.target_p = ''
self.choose_action = ''
self.pending_action = PendingAction.PLAY
self.notify_self()
def barrel_pick(self): def barrel_pick(self):
pickable_cards = 1 + self.character.pick_mod pickable_cards = 1 + self.character.pick_mod
while pickable_cards > 0: while pickable_cards > 0:

View File

@ -1,5 +1,5 @@
<template> <template>
<div :class="{ card: true, equipment: card.is_equipment, character:card.is_character}"> <div :class="{ card: true, equipment: card.is_equipment, character:card.is_character, back:card.is_back}">
<h4>{{card.name}}</h4> <h4>{{card.name}}</h4>
<div class="emoji">{{card.icon}}</div> <div class="emoji">{{card.icon}}</div>
<div v-if="card.is_character" class="alt_text">{{card.alt_text}}</div> <div v-if="card.is_character" class="alt_text">{{card.alt_text}}</div>

View File

@ -17,11 +17,12 @@
</div> </div>
<div v-if="started"> <div v-if="started">
<deck/> <deck/>
<player/> <player :chooseCardFromPlayer="choose"/>
</div> </div>
<chat/> <chat/>
<transition name="bounce"> <transition name="bounce">
<Chooser v-if="showChooser" text="Scegli il tuo personaggio" :cards="availableCharacters" :select="setCharacter"/> <Chooser v-if="showChooser" text="Scegli il tuo personaggio" :cards="availableCharacters" :select="setCharacter"/>
<Chooser v-if="hasToChoose" text="Scegli una carta" :cards="chooseCards" :select="chooseCard"/>
</transition> </transition>
</div> </div>
</template> </template>
@ -55,6 +56,8 @@ export default {
distances: {}, distances: {},
availableCharacters: [], availableCharacters: [],
self: {}, self: {},
hasToChoose: false,
chooseCards: [],
}), }),
sockets: { sockets: {
room(data) { room(data) {
@ -130,6 +133,27 @@ export default {
this.availableCharacters = [] this.availableCharacters = []
this.$socket.emit('set_character', char.name) this.$socket.emit('set_character', char.name)
}, },
choose(player_name) {
console.log('choose from' + player_name)
let pl = this.players.filter(x=>x.name === player_name)[0]
console.log(pl)
let arr = []
for (let i=0; i<pl.ncards; i++)
arr.push({
name: 'PewPew!',
icon: '💥',
is_back: true,
})
pl.equipment.forEach(x=>arr.push(x))
this.chooseCards = arr
this.hasToChoose = true
},
chooseCard(card) {
this.$socket.emit('choose', this.chooseCards.indexOf(card))
console.log(card + ' ' + this.chooseCards.indexOf(card))
this.chooseCards = []
this.hasToChoose = false
},
}, },
} }
</script> </script>

View File

@ -34,6 +34,9 @@ import Chooser from '@/components/Chooser.vue'
export default { export default {
name: 'Player', name: 'Player',
props: {
chooseCardFromPlayer: Function
},
components: { components: {
Card, Card,
Chooser, Chooser,
@ -65,6 +68,9 @@ export default {
this.lives = self.lives this.lives = self.lives
this.max_lives = self.max_lives this.max_lives = self.max_lives
this.has_played_bang = self.has_played_bang this.has_played_bang = self.has_played_bang
if (this.pending_action == 5) {
this.chooseCardFromPlayer(self.target_p)
}
}, },
self_vis(vis) { self_vis(vis) {
console.log('received visibility update') console.log('received visibility update')
@ -82,7 +88,7 @@ export default {
instruction() { instruction() {
if (this.pending_action == null) if (this.pending_action == null)
return '' return ''
let x = ['Estrai una carta', 'Pesca le tue carte', 'Gioca le tue carte', 'Rispondi alla carta', 'Attendi'] let x = ['Estrai una carta', 'Pesca le tue carte', 'Gioca le tue carte', 'Rispondi alla carta', 'Attendi', 'Scegli una carta']
return x[this.pending_action] return x[this.pending_action]
}, },
canEndTurn() { canEndTurn() {