From da26eae24cb1390f3a86a28c284f7afc79fce946 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Tue, 8 Dec 2020 23:24:01 +0100 Subject: [PATCH 1/9] temporary fix cat balou --- backend/bang/players.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/bang/players.py b/backend/bang/players.py index 6c33e36..382fa69 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -256,7 +256,11 @@ class Player: self.choose(randrange(0, len(self.available_cards))) else: target = self.game.get_player_named(self.target_p) - self.choose(randrange(0, len(target.hand)+len(target.equipment))) + if len(target.hand)+len(target.equipment) == 0: + self.pending_action = PendingAction.PLAY + self.notify_self() + else: + self.choose(randrange(0, len(target.hand)+len(target.equipment))) def play_turn(self): if self.lives == 0: From 929024a717c2420a2bc2c011c4cff817031d683b Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Tue, 8 Dec 2020 23:31:55 +0100 Subject: [PATCH 2/9] fix private toggle --- frontend/src/components/Lobby.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index c9549d8..86ec61b 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -91,6 +91,7 @@ export default { this.lobbyName = data.name this.started = data.started this.password = data.password + this.privateRoom = data.password !== '' this.useDodgeCity = data.expansions.indexOf('dodge_city') !== -1 this.players = data.players.map(x => { return { @@ -221,8 +222,9 @@ export default { }, }, watch: { - privateRoom() { - this.$socket.emit('private') + privateRoom(old, _new) { + if (this.isRoomOwner && old !== _new) + this.$socket.emit('private') } }, mounted() { From b0179afa3de88989abc4d41e493e05f0d04fba7d Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Tue, 8 Dec 2020 23:34:47 +0100 Subject: [PATCH 3/9] fix calamity localization --- backend/bang/cards.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/bang/cards.py b/backend/bang/cards.py index fe27d66..4a664bc 100644 --- a/backend/bang/cards.py +++ b/backend/bang/cards.py @@ -316,7 +316,7 @@ class Mancato(Card): 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'_calamity_special|{player.name}|{self.name}|{against}') + data=f'_special_calamity|{player.name}|{self.name}|{against}') player.has_played_bang = True player.game.attack(player, against) return True From 5557924934037891191811f6b2e6f64a7108d847 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Sun, 13 Dec 2020 00:08:22 +0100 Subject: [PATCH 4/9] fix sheriff death --- backend/bang/game.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/bang/game.py b/backend/bang/game.py index c9df987..4bcf41a 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -230,7 +230,7 @@ class Game: def player_death(self, player: players.Player, disconnected=False): import bang.expansions.dodge_city.characters as chd print(player.attacker) - if player.attacker and isinstance(player.attacker, roles.Sheriff) and isinstance(player.role, roles.Vice): + if player.attacker and isinstance(player.attacker.role, roles.Sheriff) and isinstance(player.role, roles.Vice): for i in range(len(player.attacker.hand)): self.deck.scrap(player.attacker.hand.pop()) for i in range(len(player.attacker.equipment)): From 90b6aad80918b84353e2b47171f45ad122e62192 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Sun, 13 Dec 2020 00:19:51 +0100 Subject: [PATCH 5/9] fix double death --- backend/bang/game.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/bang/game.py b/backend/bang/game.py index 4bcf41a..af20a9e 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -228,6 +228,7 @@ class Game: else: return False def player_death(self, player: players.Player, disconnected=False): + if not player in self.players: return import bang.expansions.dodge_city.characters as chd print(player.attacker) if player.attacker and isinstance(player.attacker.role, roles.Sheriff) and isinstance(player.role, roles.Vice): From a6a5f95a5b56458ef5e7000b7169451cd6010be1 Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Sun, 13 Dec 2020 10:31:16 +0100 Subject: [PATCH 6/9] gameplay modifiers --- backend/__init__.py | 14 +++++++++++++- backend/bang/game.py | 17 ++++++++++++++++- backend/bang/players.py | 8 ++++---- frontend/src/components/Lobby.vue | 16 ++++++++++++++++ frontend/src/i18n/en.json | 5 ++++- frontend/src/i18n/it.json | 5 ++++- 6 files changed, 57 insertions(+), 8 deletions(-) diff --git a/backend/__init__.py b/backend/__init__.py index c25285c..605b4a3 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -101,6 +101,14 @@ def toggle_expansion(sid, expansion_name): g = sio.get_session(sid).game g.toggle_expansion(expansion_name) +@sio.event +def toggle_comp(sid): + sio.get_session(sid).game.toggle_competitive() + +@sio.event +def toggle_replace_with_bot(sid): + sio.get_session(sid).game.toggle_disconnect_bot() + @sio.event def join_room(sid, room): room_name = room['name'] @@ -130,9 +138,13 @@ def chat_message(sid, msg): elif '/removebot' in msg and not ses.game.started: if any([p.is_bot for p in ses.game.players]): [p for p in ses.game.players if p.is_bot][-1].disconnect() - elif '/suicide' in msg and ses.game.started: + elif '/suicide' in msg and ses.game.started and ses.lives > 0: ses.lives = 0 ses.notify_self() + elif '/togglecomp' in msg and ses.game: + ses.game.toggle_competitive() + elif '/togglebot' in msg and ses.game: + ses.game.toggle_disconnect_bot() elif '/cancelgame' in msg and ses.game.started: ses.game.reset() elif '/gameinfo' in msg: diff --git a/backend/bang/game.py b/backend/bang/game.py index af20a9e..b6fc0b1 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -24,6 +24,8 @@ class Game: self.password = '' self.expansions = [] self.shutting_down = False + self.is_competitive = False + self.disconnect_bot = True def notify_room(self): if len([p for p in self.players if p.character == None]) != 0: @@ -32,6 +34,8 @@ class Game: 'started': self.started, 'players': [{'name':p.name, 'ready': p.character != None} for p in self.players], 'password': self.password, + 'is_competitive': self.is_competitive, + 'disconnect_bot': self.disconnect_bot, 'expansions': self.expansions, }) @@ -44,6 +48,14 @@ class Game: self.expansions.append(expansion_name) self.notify_room() + def toggle_competitive(self): + self.is_competitive = not self.is_competitive + self.notify_room() + + def toggle_disconnect_bot(self): + self.disconnect_bot = not self.disconnect_bot + self.notify_room() + def add_player(self, player: players.Player): if player.is_bot and len(self.players) >= 8: return @@ -215,7 +227,10 @@ class Game: def handle_disconnect(self, player: players.Player): print(f'player {player.name} left the game {self.name}') if player in self.players: - self.player_death(player=player, disconnected=True) + if self.disconnect_bot: + player.is_bot = True + else: + self.player_death(player=player, disconnected=True) else: self.dead_players.remove(player) if len([p for p in self.players if not p.is_bot])+len([p for p in self.dead_players if not p.is_bot]) == 0: diff --git a/backend/bang/players.py b/backend/bang/players.py index 382fa69..ad25c59 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -474,7 +474,7 @@ class Player: if self.mancato_needed <= 0: self.game.responders_did_respond_resume_turn() return - if 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: self.take_damage_response() self.game.responders_did_respond_resume_turn() @@ -492,7 +492,7 @@ class Player: for i in range(len(self.equipment)): if self.equipment[i].can_be_used_now: print('usable', self.equipment[i]) - if len([c for c in self.equipment if isinstance(c, cs.Barile)]) == 0 and not isinstance(self.character, chars.Jourdonnais)\ + if not self.game.is_competitive and len([c for c in self.equipment if isinstance(c, cs.Barile)]) == 0 and not isinstance(self.character, chars.Jourdonnais)\ 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: print('Cant defend') @@ -514,7 +514,7 @@ class Player: def get_indians(self, attacker): self.attacker = attacker - if 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') self.take_damage_response() return False @@ -528,7 +528,7 @@ class Player: def get_dueled(self, attacker): self.attacker = attacker - if 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') self.take_damage_response() self.game.responders_did_respond_resume_turn() diff --git a/frontend/src/components/Lobby.vue b/frontend/src/components/Lobby.vue index 86ec61b..e5940c6 100644 --- a/frontend/src/components/Lobby.vue +++ b/frontend/src/components/Lobby.vue @@ -31,6 +31,10 @@

{{$t("expansions")}}

Dodge City +

{{$t('mods')}}

+ {{$t('mod_comp')}} +
+ {{$t('disconnect_bot')}}
@@ -85,6 +89,8 @@ export default { password: '', useDodgeCity: false, hasToSetUsername: false, + is_competitive: false, + disconnect_bot: false, }), sockets: { room(data) { @@ -92,6 +98,8 @@ export default { this.started = data.started this.password = data.password this.privateRoom = data.password !== '' + this.is_competitive = data.is_competitive + this.disconnect_bot = data.disconnect_bot this.useDodgeCity = data.expansions.indexOf('dodge_city') !== -1 this.players = data.players.map(x => { return { @@ -161,6 +169,14 @@ export default { if (!this.isRoomOwner) return; this.$socket.emit('toggle_expansion', name) }, + toggleCompetitive() { + if (!this.isRoomOwner) return; + this.$socket.emit('toggle_comp') + }, + toggleReplaceWithBot() { + if (!this.isRoomOwner) return; + this.$socket.emit('toggle_replace_with_bot') + }, getActionEmoji(p) { if (p.is_my_turn === undefined || p.pending_action === undefined) return ''; if (p.pending_action != 4) { diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 4e46638..1a0b619 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -79,5 +79,8 @@ "special_bart_cassidy": "{0} received a compensation because he was injured.", "special_el_gringo": "{0} stole a card from {1} when he was was injured.", "special_calamity": "{0} played {1} as Bang! against {2}." - } + }, + "mods": "Modifiers", + "mod_comp": "Competitive mode (disables automatic take damage)", + "disconnect_bot": "Replace players that disconnect with bots" } \ No newline at end of file diff --git a/frontend/src/i18n/it.json b/frontend/src/i18n/it.json index 99dbaae..2361cfe 100644 --- a/frontend/src/i18n/it.json +++ b/frontend/src/i18n/it.json @@ -79,5 +79,8 @@ "special_bart_cassidy": "{0} ha ricevuto un risarcimento perchรจ รจ stato ferito.", "special_el_gringo": "{0} rubato una carta a {1} mentre veniva colpito.", "special_calamity": "{0} ha giovato {1} come un Bang! contro {2}." - } + }, + "mods": "Modificatori", + "mod_comp": "Modalitร  competitiva (disattiva il prendi danno automatico)", + "disconnect_bot": "Sostituisci i giocatori che si disconnettono con bot" } \ No newline at end of file From e48236727cccef6efd62b3e94633825533678afa Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Sun, 13 Dec 2020 10:51:27 +0100 Subject: [PATCH 7/9] save language and keep username --- backend/__init__.py | 7 ++++++- backend/bang/game.py | 3 ++- frontend/src/App.vue | 7 ++++++- frontend/src/components/Lobby.vue | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/backend/__init__.py b/backend/__init__.py index 605b4a3..47b42bd 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -64,7 +64,12 @@ def get_me(sid, room): sio.emit('me', data={'error':'Wrong password/Cannot connect'}, room=sid) else: sio.emit('me', data=sio.get_session(sid).name, room=sid) - sio.emit('change_username', room=sid) + if room['username'] == None or any([p.name == room['username'] for p in sio.get_session(sid).game.players]): + sio.emit('change_username', room=sid) + else: + sio.get_session(sid).name = room['username'] + sio.emit('me', data=sio.get_session(sid).name, room=sid) + sio.get_session(sid).game.notify_room() @sio.event def disconnect(sid): diff --git a/backend/bang/game.py b/backend/bang/game.py index b6fc0b1..6d10765 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -227,7 +227,7 @@ class Game: def handle_disconnect(self, player: players.Player): print(f'player {player.name} left the game {self.name}') if player in self.players: - if self.disconnect_bot: + if self.disconnect_bot and self.started: player.is_bot = True else: self.player_death(player=player, disconnected=True) @@ -319,6 +319,7 @@ class Game: print('resetting lobby') self.players.extend(self.dead_players) self.dead_players = [] + self.players = [p for p in self.players if not p.is_bot] print(self.players) self.started = False self.waiting_for = 0 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 36179cc..43eac7f 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -7,7 +7,7 @@

{{$t("warning")}}

{{$t("connection_error")}}

-