Ejemplo n.º 1
0
 def trigger(self,
             minion: Minion,
             own_board: PlayerBoard,
             opposing_board: PlayerBoard,
             macaw_trigger: Optional[bool] = False):
     # Filter out un purchaseable elementals like curator token, water droplet, and elementals above current tech level
     not_allowed_elementals = ["Amalgam", "Water Droplet", "Gentle Djinni"]
     isSpawnable = lambda x: (MinionType.Elemental in x.types) and (
         x.name not in not_allowed_elementals)
     elementals_to_summon = 2 if minion.golden else 1
     # Golden genie summons two distinct random elementals
     Deathrattle.summon_random_minions(minion, own_board,
                                       elementals_to_summon, isSpawnable,
                                       macaw_trigger)
     for _ in range(elementals_to_summon):
         own_board.call_triggers(TriggerType.ON_CARD_PUT_IN_HAND, own_board)
Ejemplo n.º 2
0
    def attack(self, attacking_minion: Minion, defending_minion: Minion,
               attacking_board: PlayerBoard, defending_board: PlayerBoard):
        """Let one minion attack the other

        Arguments:
            attacking_minion {Minion} -- Minion that attacks
            defending_minion {Minion} -- Minion that is attacked
        """
        # Pre-attack triggers
        attacking_board.call_triggers(TriggerType.ON_FRIENDLY_BEFORE_ATTACK,
                                      attacking_minion, attacking_board,
                                      defending_minion, defending_board)
        defending_board.call_triggers(TriggerType.ON_FRIENDLY_ATTACKED,
                                      defending_minion, defending_board,
                                      attacking_board)

        # If minion is killed by pyro spawn trigger, attack is cancelled
        if defending_minion.dead:
            attacking_minion.on_attack_after(attacking_board, defending_board)
            return

        # Deal attack damage
        if attacking_minion.cleave:
            # Minions hit with cleave should take damage all at once, but triggers resolve after
            neighbors = defending_board.get_minions_neighbors(defending_minion)
            defenders = [neighbors[0], defending_minion, neighbors[1]]
            for minion in [x for x in defenders if x]:
                self.deal_attack_damage(minion, defending_board,
                                        attacking_minion, attacking_board,
                                        True)
            self.deal_attack_damage(attacking_minion, attacking_board,
                                    defending_minion, defending_board)
        else:
            self.deal_attack_damage(defending_minion, defending_board,
                                    attacking_minion, attacking_board)
            self.deal_attack_damage(attacking_minion, attacking_board,
                                    defending_minion, defending_board)

        # Damage triggers from cleave and herald of flame should be resolved after attack and overkill trigger resolution
        for trigger in defending_board.deferred_damage_triggers:
            trigger(defending_board)
        defending_board.deferred_damage_triggers.clear()

        # Post attack triggers (macaw)
        attacking_minion.on_attack_after(attacking_board, defending_board)
Ejemplo n.º 3
0
 def trigger_on_friendly_divine_shield_lost(self, minion_losing_shield: Minion, own_board: PlayerBoard):
     for _ in range(2 if self.golden else 1):
         own_board.call_triggers(TriggerType.ON_CARD_PUT_IN_HAND, own_board)
Ejemplo n.º 4
0
 def on_receive_damage(self, own_board: PlayerBoard):
     if not self.dead and not self.frenzy_triggered:
         self.frenzy_triggered = True
         for _ in range (2 if self.golden else 1):
             own_board.call_triggers(TriggerType.ON_CARD_PUT_IN_HAND, own_board)