From 3815cc719fe41c54daa1d4eb069ce22d782b460e Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Wed, 25 Jan 2023 15:56:12 +0000 Subject: [PATCH] add animation for scrap --- backend/bang/deck.py | 6 ++++-- backend/bang/game.py | 4 ++-- backend/bang/players.py | 30 +++++++++++++++--------------- frontend/src/components/Deck.vue | 2 +- frontend/src/components/Lobby.vue | 28 ++++++++++++++++++++++++++-- 5 files changed, 48 insertions(+), 22 deletions(-) diff --git a/backend/bang/deck.py b/backend/bang/deck.py index cde7d15..f3a430e 100644 --- a/backend/bang/deck.py +++ b/backend/bang/deck.py @@ -88,7 +88,7 @@ class Deck: card = self.cards.pop(0) if len(self.cards) == 0: self.reshuffle() - if player is not None: + if player is not None and self.game.replay_speed > 0: G.sio.emit('card_drawn', room=self.game.name, data={'player': player.name, 'pile': 'deck'}) player.hand.append(card) return card @@ -107,11 +107,13 @@ class Deck: else: return self.draw() - def scrap(self, card: cs.Card, ignore_event = False): + def scrap(self, card: cs.Card, ignore_event = False, player=None): if card.number == 42: return card.reset_card() if self.game.check_event(ce.MinieraAbbandonata) and not ignore_event: self.put_on_top(card) else: + if player is not None and self.game.replay_speed > 0: + G.sio.emit('card_scrapped', room=self.game.name, data={'player': player.name, 'card':card.__dict__, 'pile': 'scrap'}) self.scrap_pile.append(card) self.game.notify_scrap_pile() diff --git a/backend/bang/game.py b/backend/bang/game.py index 99d5696..187cfec 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -714,9 +714,9 @@ class Game: # se lo sceriffo uccide il proprio vice if player.attacker and player.attacker in self.players 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(), True) + self.deck.scrap(player.attacker.hand.pop(), True, player=player.attacker) for i in range(len(player.attacker.equipment)): - self.deck.scrap(player.attacker.equipment.pop(), True) + self.deck.scrap(player.attacker.equipment.pop(), True, player=player.attacker) for i in range(len(player.attacker.gold_rush_equipment)): self.deck.shop_deck.append(player.attacker.gold_rush_equipment.pop()) player.attacker.notify_self() diff --git a/backend/bang/players.py b/backend/bang/players.py index df00960..f5d8fa0 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -616,7 +616,7 @@ class Player: self.game.deck.draw(player=self) self.game.deck.draw(player=self) self.attacker = None - self.game.deck.scrap(self.equipment.pop(i), True) + self.game.deck.scrap(self.equipment.pop(i), True, player=self) G.sio.emit('chat_message', room=self.game.name, data=f'_explode|{self.name}') self.heal_if_needed() if self.character.check(self.game, chars.BartCassidy) and self.lives > 0: @@ -641,12 +641,12 @@ class Player: G.sio.emit('chat_message', room=self.game.name, data=f'_flipped|{self.name}|{picked.name}|{picked.num_suit()}') if not picked.check_suit(self.game, [cs.Suit.HEARTS]) and pickable_cards == 0: - self.game.deck.scrap(self.equipment.pop(i), True) + self.game.deck.scrap(self.equipment.pop(i), True, player=self) G.sio.emit('chat_message', room=self.game.name, data=f'_prison_turn|{self.name}') self.end_turn(forced=True) return elif pickable_cards == 0: - self.game.deck.scrap(self.equipment.pop(i), True) + self.game.deck.scrap(self.equipment.pop(i), True, player=self) G.sio.emit('chat_message', room=self.game.name, data=f'_prison_free|{self.name}') break break @@ -771,7 +771,7 @@ class Player: if card.name != "Fantasma" or self.name != target.name: #se si uccide facendo panico su fantasma la carta non gli viene messa in mano self.hand.append(card) else: - self.game.deck.scrap(card, True) + self.game.deck.scrap(card, True, player=target) if self.event_type != 'rissa' or len(self.rissa_targets) == 0: self.event_type = '' self.target_p = '' @@ -793,7 +793,7 @@ class Player: self.notify_self() elif self.choose_text == 'choose_sid_scrap': self.scrapped_cards += 1 - self.game.deck.scrap(self.hand.pop(card_index), True) + self.game.deck.scrap(self.hand.pop(card_index), True, player=self) if self.scrapped_cards == 2: self.available_cards = [] self.pending_action = self.previous_pending_action @@ -870,7 +870,7 @@ class Player: self.notify_self() elif 'choose_tornado' in self.choose_text: if card_index <= len(self.available_cards): - self.game.deck.scrap(self.hand.pop(card_index)) + self.game.deck.scrap(self.hand.pop(card_index), player=self) self.game.deck.draw(player=self) self.game.deck.draw(player=self) self.pending_action = PendingAction.WAIT @@ -878,7 +878,7 @@ class Player: self.notify_self() elif 'choose_poker' in self.choose_text: if card_index <= len(self.available_cards): - self.game.deck.scrap(self.hand.pop(card_index)) + self.game.deck.scrap(self.hand.pop(card_index), player=self) self.pending_action = PendingAction.WAIT self.game.responders_did_respond_resume_turn() self.notify_self() @@ -894,7 +894,7 @@ class Player: elif 'choose_bandidos' in self.choose_text: if card_index < len(self.hand): self.available_cards.pop(card_index) - self.game.deck.scrap(self.hand.pop(card_index)) + self.game.deck.scrap(self.hand.pop(card_index), player=self) self.mancato_needed -= 1 else: self.lives -= 1 @@ -961,7 +961,7 @@ class Player: if card_index == len(self.available_cards) - 1: self.hand = [c for c in self.hand if c not in self.discarded_cards] for i in range(len(self.discarded_cards)): - self.game.deck.scrap(self.discarded_cards[i], True) + self.game.deck.scrap(self.discarded_cards[i], True, player=self) self.game.deck.draw(player=self) self.discarded_cards = [] self.is_playing_ranch = False @@ -972,7 +972,7 @@ class Player: elif self.game.dalton_on and self.game.check_event(ceh.IDalton): card = next(c for c in self.equipment if c == self.available_cards[card_index]) self.equipment.remove(card) - self.game.deck.scrap(card, True) + self.game.deck.scrap(card, True, player=self) self.pending_action = PendingAction.WAIT self.notify_self() self.game.responders_did_respond_resume_turn() @@ -1216,7 +1216,7 @@ class Player: self.game.deck.draw(True, player=self) self.lives += 1 if not self.character.check(self.game, chd.TequilaJoe) else 2 self.lives = min(self.lives, self.max_lives) - self.game.deck.scrap(self.hand.pop(i), True) + self.game.deck.scrap(self.hand.pop(i), True, player=self) G.sio.emit('chat_message', room=self.game.name, data=f'_beer_save|{self.name}') break @@ -1243,7 +1243,7 @@ class Player: self.attacker.notify_self() if len(self.hand) > 0 and any((isinstance(cd, tvosc.Shotgun) for cd in self.attacker.equipment)): c = self.hand.pop(randrange(0, len(self.hand))) - self.game.deck.scrap(c, True) + self.game.deck.scrap(c, True, player=self) G.sio.emit('chat_message', room=self.game.name, data=f'_shotgun_scrap|{self.name}|{c.name}') if self.attacker and 'gold_rush' in self.game.expansions: if (isinstance(self.attacker, Player)): @@ -1265,7 +1265,7 @@ class Player: def take_no_damage_response(self): if self.dmg_card_index is not None and self.dmg_card_index != -1 and self.game.check_event(ce.Rimbalzo): - self.game.deck.scrap(self.equipment.pop(self.dmg_card_index)) + self.game.deck.scrap(self.equipment.pop(self.dmg_card_index), player=self) self.dmg_card_index = -1 self.mancato_needed = 0 self.expected_response = [] @@ -1290,7 +1290,7 @@ class Player: card.use_card(self) print(f'{self.game.name}: {self.name} responded with {card.name}') G.sio.emit('chat_message', room=self.game.name, data=f'_respond|{self.name}|{card.name}') - self.game.deck.scrap(card, True) + self.game.deck.scrap(card, True, player=self) self.notify_self() self.mancato_needed -= 1 if isinstance(card, tvosc.RitornoDiFiamma): @@ -1368,7 +1368,7 @@ class Player: self.game.deck.draw(True, player=self) self.game.deck.draw(True, player=self) self.special_use_count += 1 - self.game.deck.scrap(card) + self.game.deck.scrap(card, player=self) self.notify_self() def special(self, data): diff --git a/frontend/src/components/Deck.vue b/frontend/src/components/Deck.vue index 1f0b50f..bff6622 100644 --- a/frontend/src/components/Deck.vue +++ b/frontend/src/components/Deck.vue @@ -22,7 +22,7 @@
-
+
- +
@@ -222,7 +222,6 @@ export default { this.username = username }, card_drawn(data) { - console.log('card_drawn'+data) let decel = document.getElementById('actual-deck') if (!decel) return @@ -234,6 +233,7 @@ export default { playerOffset.top -= 30 playerOffset.left += 10 this.cardsToAnimate.push({ + key: Math.random(), card: { name: 'PewPew!', icon: '💥', @@ -244,6 +244,30 @@ export default { this.cardsToAnimate.shift() }, 900); }, + card_scrapped(data) { + let decel = document.getElementById('actual-scrap') + if (!decel) { + console.log('card_scrapped no deck') + return + } + let decelOffset = cumulativeOffset(decel) + let phand = document.getElementById(`${data.player}-hand`) + if (!phand) { + console.log('card_scrapped no phand') + return + } + let playerOffset = cumulativeOffset(phand) + playerOffset.top -= 30 + playerOffset.left += 10 + console.log('card_scrapped'+decelOffset + ' '+ playerOffset) + this.cardsToAnimate.push({ + key: data.card.name+data.card.number+data.player, + card: data.card, startPosition: playerOffset, endPosition: decelOffset + }) + setTimeout(() => { + this.cardsToAnimate.shift() + }, 900); + }, mount_status() { this.displayAdminStatus = true },