From c4ed006020d5ed45183c5ce71467b52c38885d5a Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Fri, 20 Nov 2020 17:33:15 +0100 Subject: [PATCH] player component --- backend/deck.py | 2 +- backend/game.py | 10 +++- backend/players.py | 13 +++++ frontend/src/App.vue | 6 ++- frontend/src/components/Card.vue | 19 +++++-- frontend/src/components/Chat.vue | 47 +++++++++++++++++ frontend/src/components/Chooser.vue | 5 +- frontend/src/components/Lobby.vue | 39 ++++++-------- frontend/src/components/Player.vue | 81 +++++++++++++++++++++++++++++ 9 files changed, 191 insertions(+), 31 deletions(-) create mode 100644 frontend/src/components/Chat.vue create mode 100644 frontend/src/components/Player.vue diff --git a/backend/deck.py b/backend/deck.py index 708fdd8..b6e108f 100644 --- a/backend/deck.py +++ b/backend/deck.py @@ -3,7 +3,7 @@ import random from cards import Card, get_starting_deck class Deck: - def __init__(self): + def __init__(self, sio): super().__init__() self.cards: List[Card] = get_starting_deck() random.shuffle(self.cards) diff --git a/backend/game.py b/backend/game.py index f2025ac..e7bb22c 100644 --- a/backend/game.py +++ b/backend/game.py @@ -15,6 +15,7 @@ class Game: self.deck: Deck = None self.started = False self.turn = 0 + self.readyCount = 0 def handle_disconnect(self, player: players.Player): print(f'player {player.name} left the game {self.name}') @@ -35,6 +36,11 @@ 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('chat_message', room=self.name, data=f'{player.name} è entrato nella lobby.') + def notify_character_selection(self): + self.readyCount += 1 + if self.readyCount == len(self.players): + self.distribute_roles() + def choose_characters(self): char_cards = random.sample(all_characters(), len(self.players)*2) for i in range(len(self.players)): @@ -45,8 +51,9 @@ class Game: if self.started: return self.sio.emit('chat_message', room=self.name, data=f'La partita sta iniziando...') + self.sio.emit('start', room=self.name) self.started = True - self.deck = Deck() + self.deck = Deck(self.sio) self.choose_characters() def distribute_roles(self): @@ -61,6 +68,7 @@ class Game: self.players[i].prepare() for k in range(self.players[i].max_lives): self.players[i].hand.append(self.deck.draw()) + self.players[i].notify_self() self.play_turn() def get_visible_players(self, player): diff --git a/backend/players.py b/backend/players.py index 1ed0003..d613bef 100644 --- a/backend/players.py +++ b/backend/players.py @@ -43,6 +43,7 @@ class Player: def set_role(self, role: roles.Role): self.role = role print(f'I {self.name} am a {role.name}, my goal is "{role.goal}"') + self.sio.emit('role', room=self.sid, data=json.dumps(role, default=lambda o: o.__dict__)) def set_character(self, character: str): print(self.available_characters, character) @@ -50,6 +51,7 @@ class Player: self.available_characters = [] print(f'I {self.name} chose character {self.character.name}') self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha scelto il personaggio.') + self.game.notify_character_selection() def prepare(self): self.max_lives = self.character.max_lives + self.role.health_mod @@ -62,6 +64,13 @@ class Player: print(f'I {self.name} have to choose between {available}') self.sio.emit('characters', room=self.sid, data=json.dumps(available, default=lambda o: o.__dict__)) + def notify_self(self): + ser = self.__dict__.copy() + ser.pop('game') + ser.pop('sio') + ser.pop('sid') + self.sio.emit('self', room=self.sid, data=json.dumps(ser, default=lambda o: o.__dict__)) + def play_turn(self): print(f'I {self.name} was notified that it is my turn') self.was_shot = False @@ -70,6 +79,9 @@ class Player: self.has_played_bang = False if any([isinstance(c) == cards.Dinamite or isinstance(c) == cards.Prigione for c in self.equipment]): self.pending_action = PendingAction.PICK + else: + self.pending_action = PendingAction.DRAW + self.notify_self() # # print(f'lives: {self.lives}/{self.max_lives} hand: {[str(c) for c in self.hand]}') # print(f'I {self.name} can see {[p.get_public_description() for p in self.game.get_visible_players(self)]}') @@ -80,6 +92,7 @@ class Player: for i in range(2): self.hand.append(self.game.deck.draw()) self.pending_action = PendingAction.PLAY + self.notify_self() def pick(self): pickable_cards = 1 + self.character.pick_mod diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 4938b09..cfca9c4 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,6 +1,6 @@