diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..c683393 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,10 @@ +name: Test Pull requests +on: + pull_request: +jobs: + test_build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build the Unified Docker image + run: docker build . --file Dockerfile diff --git a/backend/__init__.py b/backend/__init__.py index 2bb0999..a2e267a 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -173,13 +173,14 @@ def chat_message(sid, msg): elif '/cancelgame' in msg and ses.game.started: ses.game.reset() elif '/gameinfo' in msg: - sio.emit('chat_message', room=sid, data=f'info: {ses.game.__dict__}') + sio.emit('chat_message', room=sid, data={'color': f'#black','text':f'info: {ses.game.__dict__}'}) elif '/meinfo' in msg: - sio.emit('chat_message', room=sid, data=f'info: {ses.__dict__}') + sio.emit('chat_message', room=sid, data={'color': f'#black','text':f'info: {ses.__dict__}'}) else: - sio.emit('chat_message', room=sid, data=f'{msg} COMMAND NOT FOUND') + sio.emit('chat_message', room=sid, data={'color': f'#black','text':f'{msg} COMMAND NOT FOUND'}) else: - sio.emit('chat_message', room=ses.game.name, data=f'[{ses.name}]: {msg}') + color = sid.encode('utf-8').hex()[-3:] + sio.emit('chat_message', room=ses.game.name, data={'color': f'#{color}','text':f'[{ses.name}]: {msg}'}) @sio.event def start_game(sid): diff --git a/backend/bang/deck.py b/backend/bang/deck.py index f3924f6..b15806b 100644 --- a/backend/bang/deck.py +++ b/backend/bang/deck.py @@ -7,9 +7,12 @@ class Deck: super().__init__() self.cards: List[cs.Card] = cs.get_starting_deck(game.expansions) self.mancato_cards: List[str] = [] + self.mancato_cards_not_green: List[str] = [] for c in self.cards: if isinstance(c, cs.Mancato) and c.name not in self.mancato_cards: self.mancato_cards.append(c.name) + if not c.usable_next_turn: + self.mancato_cards_not_green.append(c.name) self.all_cards_str: List[str] = [] for c in self.cards: if c.name not in self.all_cards_str: diff --git a/backend/bang/expansions/dodge_city/cards.py b/backend/bang/expansions/dodge_city/cards.py index 3add899..a431a58 100644 --- a/backend/bang/expansions/dodge_city/cards.py +++ b/backend/bang/expansions/dodge_city/cards.py @@ -66,7 +66,7 @@ class Rissa(CatBalou): self.name = 'Rissa' self.icon = '🥊' self.desc = "Fai scartare una carta a tutti gli altri giocatori, scegli a caso dalla mano, oppure fra quelle che hanno in gioco" - self.desc_eng = "Choose a card to discard from the hand/equipment ofc all the other players" + self.desc_eng = "Choose a card to discard from the hand/equipment of all the other players" self.need_with = True self.need_target = False self.alt_text = '2🃏' diff --git a/backend/bang/expansions/dodge_city/characters.py b/backend/bang/expansions/dodge_city/characters.py index c5c6ea7..9a23a03 100644 --- a/backend/bang/expansions/dodge_city/characters.py +++ b/backend/bang/expansions/dodge_city/characters.py @@ -57,6 +57,20 @@ class ApacheKid(Character): self.desc_eng = "Cards of diamonds ♦️ played against him, do no have effect (doesn't work in duels)." self.icon = '♦️' +class SeanMallory(Character): + def __init__(self): + super().__init__("Sean Mallory", max_lives=3) + self.desc = "Quando finisce il suo turno può tenere fino a 10 carte in mano" + self.desc_eng = "He can keep up to 10 cards in his hand when ending the turn." + self.icon = '🍟' + +class BelleStar(Character): + def __init__(self): + super().__init__("Belle Star", max_lives=3) + self.desc = "Nel suo turno le carte verdi degli altri giocatori non hanno effetto." + self.desc_eng = "During her turn the green cards of the other players do not work." + self.icon = '❎' + def all_characters() -> List[Character]: return [ PixiePete(), @@ -67,6 +81,8 @@ def all_characters() -> List[Character]: BillNoface(), MollyStark(), ApacheKid(), + SeanMallory(), + BelleStar(), ] #Apache Kid: il suo effetto non conta nei duelli diff --git a/backend/bang/players.py b/backend/bang/players.py index ad25c59..e90f2e9 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -233,7 +233,8 @@ class Player: self.play_card(len(self.hand)+i, against=target['name']) has_played = True break - if not has_played and len(self.hand) > self.lives: + maxcards = self.lives if not isinstance(self.character, chd.SeanMallory) else 10 + if not has_played and len(self.hand) > maxcards: self.scrap(0) else: self.end_turn() @@ -507,6 +508,8 @@ class Player: print('has mancato') self.pending_action = PendingAction.RESPOND self.expected_response = self.game.deck.mancato_cards + if self.attacker and isinstance(self.attacker.character, chd.BelleStar): + self.expected_response = self.game.deck.mancato_cards_not_green if isinstance(self.character, chd.ElenaFuente): self.expected_response = self.game.deck.all_cards_str self.on_failed_response_cb = self.take_damage_response @@ -575,7 +578,7 @@ class Player: ((hand_index < len(self.hand) and self.hand[hand_index].name in self.expected_response)) or self.equipment[hand_index-len(self.hand)].name in self.expected_response): card = self.hand.pop(hand_index) if hand_index < len(self.hand) else self.equipment.pop(hand_index-len(self.hand)) - if isinstance(self.character, chd.MollyStark) and hand_index < len(self.hand) and not self.is_my_turn and self.event_type != 'duel': + if isinstance(self.character, chd.MollyStark) and hand_index < len(self.hand)+1 and not self.is_my_turn and self.event_type != 'duel': self.hand.append(self.game.deck.draw()) card.use_card(self) self.game.deck.scrap(card) @@ -584,7 +587,7 @@ class Player: if self.mancato_needed <= 0: if self.event_type == 'duel': self.game.duel(self, self.attacker.name) - if isinstance(self.character, chd.MollyStark) and hand_index < len(self.hand) and not self.is_my_turn: + if isinstance(self.character, chd.MollyStark) and hand_index < len(self.hand)+1 and not self.is_my_turn: self.molly_discarded_cards += 1 else: self.game.responders_did_respond_resume_turn() @@ -640,7 +643,8 @@ class Player: def end_turn(self, forced=False): if not self.is_my_turn: return - if len(self.hand) > self.max_lives and not forced: + maxcards = self.lives if not isinstance(self.character, chd.SeanMallory) else 10 + if len(self.hand) > maxcards and not forced: print( f"I {self.name} have to many cards in my hand and I can't end the turn") elif self.pending_action == PendingAction.PLAY or forced: diff --git a/backend/bang/roles.py b/backend/bang/roles.py index 449de58..66d8405 100644 --- a/backend/bang/roles.py +++ b/backend/bang/roles.py @@ -50,7 +50,7 @@ class Vice(Role): class Outlaw(Role): def __init__(self, alternative_goal=None, alternative_goal_eng=None): super().__init__("Fuorilegge", "Elimina lo Sceriffo!") - self.goal_eng = "Kill the sSheriff!" + self.goal_eng = "Kill the Sheriff!" if alternative_goal: self.goal = alternative_goal self.goal_eng = alternative_goal_eng diff --git a/frontend/src/components/Chat.vue b/frontend/src/components/Chat.vue index 67c992b..967cb59 100644 --- a/frontend/src/components/Chat.vue +++ b/frontend/src/components/Chat.vue @@ -2,7 +2,7 @@
.
{{desc}}