From 3d88fdeb1253db9d5cb96015e93215cef4c43452 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 26 Nov 2020 15:53:27 +0100 Subject: [PATCH 1/4] fix bug and new structure --- backend/__init__.py | 4 ++-- backend/{ => bang}/cards.py | 21 +++++++++++++-------- backend/{ => bang}/characters.py | 0 backend/{ => bang}/deck.py | 2 +- backend/bang/expansions/__init__.py | 5 +++++ backend/bang/expansions/dodge_city/cards.py | 13 +++++++++++++ backend/{ => bang}/game.py | 8 ++++---- backend/{ => bang}/players.py | 10 +++++----- backend/{ => bang}/roles.py | 0 9 files changed, 43 insertions(+), 20 deletions(-) rename backend/{ => bang}/cards.py (96%) rename backend/{ => bang}/characters.py (100%) rename backend/{ => bang}/deck.py (98%) create mode 100644 backend/bang/expansions/__init__.py create mode 100644 backend/bang/expansions/dodge_city/cards.py rename backend/{ => bang}/game.py (98%) rename backend/{ => bang}/players.py (99%) rename backend/{ => bang}/roles.py (100%) diff --git a/backend/__init__.py b/backend/__init__.py index 1c730cc..1d6cd71 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -4,8 +4,8 @@ from typing import List import eventlet import socketio -from game import Game -from players import Player +from bang.game import Game +from bang.players import Player sio = socketio.Server(cors_allowed_origins="*") app = socketio.WSGIApp(sio, static_files={ diff --git a/backend/cards.py b/backend/bang/cards.py similarity index 96% rename from backend/cards.py rename to backend/bang/cards.py index bbed56d..a5c1084 100644 --- a/backend/cards.py +++ b/backend/bang/cards.py @@ -1,7 +1,7 @@ from typing import List, Set, Dict, Tuple, Optional from abc import ABC, abstractmethod from enum import IntEnum -import roles as r +import bang.roles as r class Suit(IntEnum): DIAMONDS = 0 # ♦ @@ -57,7 +57,7 @@ class Card(ABC): for i in range(len(player.equipment)): print('tipo',type(self)) if type(player.equipment[i]) == type(self): - player.game.deck.scrap(self.equipment[i]) + player.game.deck.scrap(player.equipment[i]) player.equipment[i] = self break else: @@ -162,7 +162,7 @@ class Bang(Card): if player.has_played_bang and not any([isinstance(c, Volcanic) for c in player.equipment]) and against != None: return False elif against != None: - import characters as chars + import bang.characters as chars super().play_card(player, against=against) player.has_played_bang = not isinstance( player.character, chars.WillyTheKid) @@ -199,7 +199,7 @@ class CatBalou(Card): def play_card(self, player, against): 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 players import PendingAction + from bang.players import PendingAction player.pending_action = PendingAction.CHOOSE player.choose_action = 'discard' player.target_p = against @@ -281,7 +281,7 @@ class Mancato(Card): self.desc = "Usa questa carta per annullare un bang" def play_card(self, player, against): - import characters as chars + 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, data=f'{player.name} ha giocato {self.name} come un BANG! contro {against}.') @@ -301,7 +301,7 @@ class Panico(Card): def play_card(self, player, against): 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 players import PendingAction + from bang.players import PendingAction player.pending_action = PendingAction.CHOOSE player.choose_action = 'steal' player.target_p = against @@ -339,8 +339,9 @@ class WellsFargo(Card): return True -def get_starting_deck() -> List[Card]: - return [ +def get_starting_deck(expansions:List[str]) -> List[Card]: + from bang.expansions import DodgeCity + base_cards = [ Barile(Suit.SPADES, 'Q'), Barile(Suit.SPADES, 'K'), Dinamite(Suit.HEARTS, 2), @@ -422,3 +423,7 @@ def get_starting_deck() -> List[Card]: Saloon(Suit.HEARTS, 5), WellsFargo(Suit.HEARTS, 3), ] + if 'dodge_city' in expansions: + base_cards.extend(DodgeCity.get_cards()) + return base_cards + diff --git a/backend/characters.py b/backend/bang/characters.py similarity index 100% rename from backend/characters.py rename to backend/bang/characters.py diff --git a/backend/deck.py b/backend/bang/deck.py similarity index 98% rename from backend/deck.py rename to backend/bang/deck.py index 202fbe0..c9ebdb0 100644 --- a/backend/deck.py +++ b/backend/bang/deck.py @@ -1,6 +1,6 @@ from typing import List, Set, Dict, Tuple, Optional import random -import cards as cs +import bang.cards as cs class Deck: def __init__(self, game): diff --git a/backend/bang/expansions/__init__.py b/backend/bang/expansions/__init__.py new file mode 100644 index 0000000..aebf978 --- /dev/null +++ b/backend/bang/expansions/__init__.py @@ -0,0 +1,5 @@ + +from bang.expansions.dodge_city import cards +class DodgeCity(): + def get_cards(): + return cards.get_starting_deck() \ No newline at end of file diff --git a/backend/bang/expansions/dodge_city/cards.py b/backend/bang/expansions/dodge_city/cards.py new file mode 100644 index 0000000..58a95d8 --- /dev/null +++ b/backend/bang/expansions/dodge_city/cards.py @@ -0,0 +1,13 @@ +from bang.cards import * + +class Riparo(Mustang): + def __init__(self, suit, number): + super().__init__(suit, number) + self.name = 'Riparo' + self.icon = '⛰' + +def get_starting_deck() -> List[Card]: + return [ + Riparo(Suit.DIAMONDS, 'K'), + Mustang(Suit.DIAMONDS, 'K'), + ]*100 diff --git a/backend/game.py b/backend/bang/game.py similarity index 98% rename from backend/game.py rename to backend/bang/game.py index 961e608..4fb6d1f 100644 --- a/backend/game.py +++ b/backend/bang/game.py @@ -2,10 +2,10 @@ from typing import List, Set, Dict, Tuple, Optional import random import socketio -import players -import characters -from deck import Deck -import roles +import bang.players as players +import bang.characters as characters +from bang.deck import Deck +import bang.roles as roles class Game: def __init__(self, name, sio:socketio): diff --git a/backend/players.py b/backend/bang/players.py similarity index 99% rename from backend/players.py rename to backend/bang/players.py index 0c5fe0f..d4ab136 100644 --- a/backend/players.py +++ b/backend/bang/players.py @@ -2,10 +2,10 @@ from enum import IntEnum import json from random import randrange import socketio -import deck -import roles as r -import cards as cs -import characters as chars +import bang.deck as deck +import bang.roles as r +import bang.cards as cs +import bang.characters as chars class PendingAction(IntEnum): PICK = 0 @@ -17,9 +17,9 @@ class PendingAction(IntEnum): class Player: - import game as g def __init__(self, name, sid, sio): + import bang.game as g super().__init__() self.name = name self.sid = sid diff --git a/backend/roles.py b/backend/bang/roles.py similarity index 100% rename from backend/roles.py rename to backend/bang/roles.py From 24f7a68024742a1dffd796b280d05be30cf8bdc3 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 26 Nov 2020 16:26:48 +0100 Subject: [PATCH 2/4] ready status and expansion --- backend/bang/deck.py | 2 +- backend/bang/expansions/dodge_city/cards.py | 27 +++++++++++++++++++-- backend/bang/game.py | 6 +++-- frontend/src/components/Lobby.vue | 5 ++-- frontend/src/components/Player.vue | 6 ++--- 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/backend/bang/deck.py b/backend/bang/deck.py index c9ebdb0..015a841 100644 --- a/backend/bang/deck.py +++ b/backend/bang/deck.py @@ -5,7 +5,7 @@ import bang.cards as cs class Deck: def __init__(self, game): super().__init__() - self.cards: List[cs.Card] = cs.get_starting_deck() + self.cards: List[cs.Card] = cs.get_starting_deck(game.expansions) self.game = game random.shuffle(self.cards) self.scrap_pile: List[cs.Card] = [] diff --git a/backend/bang/expansions/dodge_city/cards.py b/backend/bang/expansions/dodge_city/cards.py index 58a95d8..aecabbe 100644 --- a/backend/bang/expansions/dodge_city/cards.py +++ b/backend/bang/expansions/dodge_city/cards.py @@ -6,8 +6,31 @@ class Riparo(Mustang): self.name = 'Riparo' self.icon = '⛰' +class Binocolo(Mirino): + def __init__(self, suit, number): + super().__init__(suit, number) + self.name = 'Binocolo' + self.icon = '🔍' + +class Pugno(Card): + def __init__(self, suit, number): + super().__init__(suit, 'Pugno!', number, range=1) + self.icon = '👊' + self.desc = "Spara a un giocatore a distanta 1" + self.need_target = True + + def play_card(self, player, against): + if against != None: + import bang.characters as chars + super().play_card(player, against=against) + player.game.attack(player, 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 Riparo(Suit.DIAMONDS, 'K'), - Mustang(Suit.DIAMONDS, 'K'), - ]*100 + Binocolo(Suit.DIAMONDS, 10), + Pugno(Suit.SPADES, 10), + ] diff --git a/backend/bang/game.py b/backend/bang/game.py index 4fb6d1f..091e778 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -20,6 +20,7 @@ class Game: self.waiting_for = 0 self.initial_players = 0 self.password = '' + self.expansions = [] def add_player(self, player: players.Player): if player in self.players or len(self.players) >= 7: @@ -27,7 +28,7 @@ class Game: player.join_game(self) self.players.append(player) print(f'Added player {player.name} to game') - self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players], 'password': self.password}) + self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [{'name':p.name, 'ready': False} for p in self.players], 'password': self.password}) self.sio.emit('chat_message', room=self.name, data=f'{player.name} è entrato nella lobby.') def set_private(self): @@ -36,10 +37,11 @@ class Game: print(self.name, 'is now private pwd', self.password) else: self.password = '' - self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players], 'password': self.password}) + self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [{'name':p.name, 'ready': False} for p in self.players], 'password': self.password}) def notify_character_selection(self): self.readyCount += 1 + self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [{'name':p.name, 'ready': p.character!=None} for p in self.players], 'password': self.password}) if self.readyCount == len(self.players): self.distribute_roles() diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index fa2a236..73c6d17 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -86,7 +86,8 @@ export default { this.password = data.password this.players = data.players.map(x => { return { - name: x, + name: x.name, + ready: x.ready, ncards: 0, } }) @@ -154,7 +155,7 @@ export default { return { name: player.name, number: ((this.username == player.name) ? 'YOU' : (this.players[0].name == player.name) ? 'OWNER' :'') + (player.dist ? `${player.dist}⛰` : ''), - icon: (player.lives === undefined || player.lives > 0) ? (player.is_sheriff ? '⭐' : player.icon || '🤠' ) : '☠️', + icon: (player.lives === undefined || player.lives > 0) ? (player.is_sheriff ? '⭐' : player.icon || ((player.ready)?'👍': '🤠') ) : '☠️', is_character: true, } }, diff --git a/frontend/src/components/Player.vue b/frontend/src/components/Player.vue index 2c2ab44..6d3ebeb 100644 --- a/frontend/src/components/Player.vue +++ b/frontend/src/components/Player.vue @@ -196,12 +196,10 @@ export default { 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.name == 'Panico!' || (card.name == 'Bang!' && cant_play_bang)) - this.range = 1 - else if (card.name == 'Bang!' || calamity_special) + if (card.name == 'Bang!' || calamity_special) this.range = this.sight else - this.range = 999 + this.range = card.range this.can_target_sheriff = (card.name !== 'Prigione') if (this.visiblePlayers.length == 0 && this.hand.length > this.lives) { this.really_play_card(card, null) From 7ba1b0c7b91fa319190f0d53db4e5be4337ec565 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 26 Nov 2020 16:58:27 +0100 Subject: [PATCH 3/4] toggle espansione --- backend/__init__.py | 5 +++++ backend/bang/game.py | 26 ++++++++++++++++++++++---- frontend/src/components/Lobby.vue | 10 ++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/backend/__init__.py b/backend/__init__.py index 1d6cd71..6dfda89 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -69,6 +69,11 @@ def private(sid): g.set_private() advertise_lobbies() +@sio.event +def toggle_expansion(sid, expansion_name): + g = sio.get_session(sid).game + g.toggle_expansion(expansion_name) + @sio.event def join_room(sid, room): room_name = room['name'] diff --git a/backend/bang/game.py b/backend/bang/game.py index 091e778..75c3ddc 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -22,13 +22,31 @@ class Game: self.password = '' self.expansions = [] + def notify_room(self): + self.sio.emit('room', room=self.name, data={ + 'name': self.name, + 'started': self.started, + 'players': [{'name':p.name, 'ready': False} for p in self.players], + 'password': self.password, + 'expansions': self.expansions, + }) + + def toggle_expansion(self, expansion_name): + if not self.started: + print('toggling', expansion_name) + if expansion_name in self.expansions: + self.expansions.remove(expansion_name) + else: + self.expansions.append(expansion_name) + self.notify_room() + def add_player(self, player: players.Player): if player in self.players or len(self.players) >= 7: return player.join_game(self) self.players.append(player) print(f'Added player {player.name} to game') - self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [{'name':p.name, 'ready': False} for p in self.players], 'password': self.password}) + self.notify_room() self.sio.emit('chat_message', room=self.name, data=f'{player.name} è entrato nella lobby.') def set_private(self): @@ -37,11 +55,11 @@ class Game: print(self.name, 'is now private pwd', self.password) else: self.password = '' - self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [{'name':p.name, 'ready': False} for p in self.players], 'password': self.password}) + self.notify_room() def notify_character_selection(self): self.readyCount += 1 - self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [{'name':p.name, 'ready': p.character!=None} for p in self.players], 'password': self.password}) + self.notify_room() if self.readyCount == len(self.players): self.distribute_roles() @@ -214,7 +232,7 @@ class Game: if self.started and index <= self.turn: self.turn -= 1 self.players.pop(index) - self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players]}) + self.notify_room() self.sio.emit('chat_message', room=self.name, data=f'{player.name} è morto.') if self.started: self.sio.emit('chat_message', room=self.name, data=f'{player.name} era {player.role.name}!') diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index 73c6d17..df51713 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -27,6 +27,10 @@ +
+

Espansioni

+ Dodge City +
@@ -78,12 +82,14 @@ export default { selectedInfo: null, privateRoom: false, password: '', + useDodgeCity: false, }), sockets: { room(data) { this.lobbyName = data.name this.started = data.started this.password = data.password + this.useDodgeCity = data.expansions.indexOf('dodge_city') !== -1 this.players = data.players.map(x => { return { name: x.name, @@ -141,6 +147,10 @@ export default { } }, methods: { + toggleExpansions(name) { + if (!this.isRoomOwner) return; + this.$socket.emit('toggle_expansion', name) + }, getActionEmoji(p) { if (p.is_my_turn === undefined || p.pending_action === undefined) return ''; if (p.pending_action != 4) { From 739c7bec5e40ca0f9247a1bb7b3905c7815cd5d4 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 26 Nov 2020 17:08:06 +0100 Subject: [PATCH 4/4] Update Lobby.vue --- frontend/src/components/Lobby.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index df51713..073c40e 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -28,7 +28,7 @@
-

Espansioni

+

Espansioni (NON COMPLETE)

Dodge City