Ejemplo n.º 1
0
 def apply_poison(self):
     # FIXME: when exactly is poison applied?
     for card in self._active_assault_units:
         if card.poisoned() > 0:
             if log_enabled(): log("        Poison damage! Poisoned unit {" + card.description() + "} will suffer " + str(card.poisoned()) + " poison damage")
             card.apply_poison()
             if log_enabled(): log("      --Final poisoned unit status: {" + card.description() + "}")
Ejemplo n.º 2
0
 def activate_structures(self, opposing_board):
     for i in range(0, len(self._active_structures)):
         card = self._active_structures[i]
         if log_enabled(): 
             log("    Activating Structure [" + str(i) + "] {" + card.description() + "}")
         if card.is_active():
             self.perform_activation_skills(card, opposing_board)
         elif log_enabled():
             log("      (structure is not ready)")
Ejemplo n.º 3
0
 def activate_assault_units(self, opposing_board):
     for i in range(0, len(self._active_assault_units)):
         card = self._active_assault_units[i]
         if log_enabled(): 
             log("    Activating Assault Unit [" + str(i) + "] {" + card.description() + "}")
         if card.is_active() and card.can_use_skills():
             self.perform_activation_skills(card, opposing_board)
             self.perform_attack(i, card, opposing_board)
         elif log_enabled():
             log("      (unit is not ready)")
Ejemplo n.º 4
0
    def bury_the_dead(self):
        for card in self._active_structures:
            if card.is_dead():
                self._active_structures.remove(card)
                if log_enabled(): log("    Removed dead structure card: {" + card.description() + "}")

        for card in self._active_assault_units:
            if card.is_dead():
                self._active_assault_units.remove(card)
                if log_enabled(): log("    Removed dead assault card: {" + card.description() + "}")
Ejemplo n.º 5
0
 def perform_one_activation_skill(self, card, skill, opposing_board):
     if log_enabled(): log("      Performing skill " + skill.description())
     targets = self.get_target_list_for_skill(skill, opposing_board)
     if log_enabled():
         if not targets:
             if log_enabled(): log("        (No valid targets)")
     
     if skill.all():
         for target in targets:
             self.perform_activation_skill_on_target(card, skill, target, opposing_board)
     elif targets:
             self.perform_activation_skill_on_target(card, skill, choice(targets), opposing_board)
Ejemplo n.º 6
0
    def perform_attack_on_target(self, target, attacker, opposing_board):
        attacks = 1
        flurry = attacker.flurry()
        if flurry > 0 and coin_toss():
            attacks += flurry
            if log_enabled(): log("      Flurry! performing " + str(attacks) + " total attacks")

            for i in range(1, attacks + 1):
                if i > 0 and attacker.cannot_attack():
                    return
                if log_enabled(): log("      === Attack \#" + str(i) + " ===")
                self.perform_single_attack_on_target(target, attacker, opposing_board)
                if target.is_dead():
                    target = opposing_board.commander_target()
        else:
            self.perform_single_attack_on_target(target, attacker, opposing_board)
Ejemplo n.º 7
0
 def play_from_hand(self, card_to_play):
     self._hand.remove(card_to_play)
     if log_enabled(): log("  Playing card: {" + card_to_play.description() + "}")
     if card_to_play.type() == "assault":
         self._active_assault_units.append(AssaultCardInPlay(card_to_play))
     elif card_to_play.type() == "structure":
         self._active_structures.append(StructureCardInPlay(card_to_play))
     else:
         self._active_action = card_to_play
Ejemplo n.º 8
0
    def play_random_turn(self, opposing_board):
        self.apply_poison()
        self.tick_timers()
        if log_enabled(): log("  Drawing")
        while len(self._hand) < 3 and self._draw_pile: 
            self.draw()
        if self._hand:
            self.play_from_hand(choice(self._hand))

        self.activate_cards(opposing_board)
        self.clean_up(opposing_board)
        return opposing_board.commander().is_dead()
Ejemplo n.º 9
0
    def perform_activation_skill_on_target(self, card, skill, target, opposing_board, can_payback=True):
        # Enfeeble, Heal, Jam, Mimic, Rally, Siege, Strike, Weaken
        # Account for: Evade, Payback, Regenerate

        if log_enabled(): log("        Skill target is: {" + target.description() + "}")
        hostile = skill.is_hostile_activation_skill()
        if hostile and target.evade():
            if coin_toss():
                if log_enabled(): log("        Evade! {" + target.description() + "} evaded " + skill.description())
                if log_enabled(): log("      --Final skill target status: {" + target.description() + "}")
                return

        can_payback = can_payback and hostile and card.type() == "assault"

        skill_name = skill.name()
        if skill_name == "heal":
            target.heal(skill.value())
        elif skill_name == "weaken":
            target.weaken(skill.value())
        elif skill_name == "rally":
            target.rally(skill.value())
        elif skill_name == "strike":
            damage = skill.value()
            enfeebled = target.enfeebled()
            if enfeebled > 0:
                damage += enfeebled
                if log_enabled(): log("        Enfeeble bonus damage: " + str(enfeebled))
            target.take_damage(damage)
        elif skill_name == "siege":
            target.take_damage(skill.value())
            can_payback = False
        elif skill_name == "jam":
            if coin_toss():
                target.suffer_jam()
            else:
                if log_enabled(): log("        Jam failed on {" + target.description() + "}")
                # no chance for payback if it misses
                can_payback = False
        elif skill_name == "enfeeble":
            target.suffer_enfeeble(skill.value())
        elif skill_name == "mimic":
            mimiced_skills = target.activation_skills_for_mimic()
            self.perform_activation_skill_list(card, mimiced_skills, opposing_board)
            can_payback = False

        if log_enabled(): log("      --Final skill target status: {" + target.description() + "}")

        if target.payback() and can_payback:
            if coin_toss():
                if log_enabled(): log("        Payback! {" + target.description() + "} will attempt " + skill.description() + " on {" + card.description() + "}")
                opposing_board.perform_activation_skill_on_target(target, skill, card, self, can_payback=False)
Ejemplo n.º 10
0
    def perform_attack(self, index, attacker, opposing_board):
        # Attack Jammed = Attacker Immobilized = Attacker weakened to 0 > Swipe check > Flurry check > Fear >  Enfeeble = Valor > Flying = Antiair > Armored = Pierce > Immobilize = Poison > Count Damage > Crush > Defender Regenerate > Counter > Attacker Regenerate = Leech > Siphon > Flurry Repeat > Swipe Repeat

        if log_enabled(): log("      Performing attack")

        if attacker.cannot_attack():
            return

        if attacker.fear():
            self.perform_attack_on_target(opposing_board.commander_target(), attacker, opposing_board)

        elif attacker.swipe():
            main_target = opposing_board.non_commander_target_for_index(index)
            if main_target:
                left_target = opposing_board.non_commander_target_for_index(index - 1)
                right_target = opposing_board.non_commander_target_for_index(index + 1)
                if left_target:
                    if log_enabled(): log("      === Swipe Attack left ===")
                    self.perform_attack_on_target(left_target, attacker, opposing_board)

                if left_target or right_target:
                    if log_enabled(): log("      === Swipe Attack center ===")
                    if attacker.cannot_attack():
                        return
                self.perform_attack_on_target(main_target, attacker, opposing_board)

                if right_target:
                    if log_enabled(): log("      === Swipe Attack right ===")
                    if attacker.cannot_attack():
                        return
                    self.perform_attack_on_target(right_target, attacker, opposing_board)
            else:
                self.perform_attack_on_target(opposing_board.commander_target(), attacker, opposing_board)

        else:
            self.perform_attack_on_target(opposing_board.target_for_index(index), attacker, opposing_board)
Ejemplo n.º 11
0
 def activate_cards(self, opposing_board):
     if log_enabled(): log("  Activating cards")
     self.activate_action(opposing_board)
     self.activate_commander(opposing_board)
     self.activate_structures(opposing_board)
     self.activate_assault_units(opposing_board)
Ejemplo n.º 12
0
 def activate_commander(self, opposing_board):
     if log_enabled(): log("    Activating Commander {" + self._commander.description() + "}")
     self.perform_activation_skills(self._commander, opposing_board)
Ejemplo n.º 13
0
 def clean_up(self, opposing_board):
     if log_enabled(): log("  Cleaning up")
     self.bury_the_dead()
     opposing_board.bury_the_dead()
     self._active_action = None
     self.reset_status();
Ejemplo n.º 14
0
 def draw(self):
     if self._draw_pile:
         self._hand.append(self._draw_pile.pop())
         if log_enabled(): 
             log("    Drew: {" + self._hand[-1].description() + "}")
             log("    Hand size: " + str(len(self._hand)) + " | Draw pile size: "  + str(len(self._draw_pile)))
Ejemplo n.º 15
0
 def tick_timers(self):
     if log_enabled(): log("  Ticking Timers")
     for card in self._active_structures:
         card.tick()
     for card in self._active_assault_units:
         card.tick()
Ejemplo n.º 16
0
 def activate_action(self, opposing_board):
     if self._active_action:
         if log_enabled(): log("    Activating Action {" + self._active_action.description() + "}")
         self.perform_activation_skills(self._active_action, opposing_board)
Ejemplo n.º 17
0
    def perform_single_attack_on_target(self, target, attacker, opposing_board):
        if log_enabled(): log("        Attack target is: {" + target.description() + "}")

        damage = attacker.attack()
        if log_enabled(): log("        Base damage (including rally/weaken): " + str(damage))

        enfeebled = target.enfeebled()
        if enfeebled > 0:
            damage += enfeebled
            if log_enabled(): log("         Enfeeble bonus damage: " + str(enfeebled))

        valor = attacker.valor()
        if valor > 0 and self.assault_count() < opposing_board.assault_count():
            damage += valor
            if log_enabled(): log("        Valor bonus damage: " + str(valor))

        if target.flying():
            antiair = attacker.antiair()
            if antiair:
                damage += antiair
                if log_enabled(): log("        Antiair bonus damage: " + str(antiair))
            elif not attacker.flying():
                if coin_toss():
                    if log_enabled(): log("         Flying! Unit {" + attacker.description() + "} missed {" + target.description() + "}")
                    return

        armor = target.armored()
        if armor > 0:
            pierce = attacker.pierce()
            if pierce:
                if log_enabled(): log("        Armor reduced from " + str(armor) + " by pierce " + str(pierce))
                armor = max(0, armor - pierce)
            if log_enabled(): log("        Damage reduced by armor: " + str(armor))
            damage -= armor

        if damage <= 0:
            if log_enabled(): log("        Blocked: {" + attacker.description() + "} has modified damage " + str(damage))
            return

        if attacker.immobilize():
            if coin_toss():
                if log_enabled(): log("        Immobilize! Unit {" + attacker.description() + "} immobilizes {" + target.description() + "}")
                target.suffer_immobilize()
    
        poison = attacker.poison()
        if poison > 0:
            if log_enabled(): log("        Poison! Unit {" + attacker.description() + "} inflicts " + str(poison) + " poison on target {" + target.description() + "}")
            target.suffer_poison(poison)

        target_died = target.take_damage(damage)
        if log_enabled(): log("        Unit {" + attacker.description() + "} does " + str(damage) + " attack damage to {" + target.description() + "}")

        crush = attacker.crush()
        if crush > 0 and target_died:
            crush_target = opposing_board.commander_target()
            if log_enabled(): log("        Crush! Unit {" + attacker.description() + "} does {" + str(damage) + "} crush damage to {" + crush_target.description() + "}")
            crush_target.take_damage(damage)
            if log_enabled(): log("      --Final crushed unit status: {" + crush_target.description() + "}")

        counter = target.counter()
        if counter > 0:
            if log_enabled(): log("        Unit {" + attacker.description() + "} suffers " + str(counter) + " counter damage from {" + target.description() + "}")
            attacker.take_damage(counter)

        target_is_assault = target.type() == "assault"
        leech = attacker.leech()
        if leech > 0 and target_is_assault and not attacker.is_dead():
            if log_enabled(): log("        Leech! Unit {" + attacker.description() + "} leeches for " + str(leech) + "hp")
            attacker.heal(leech)

        siphon = attacker.siphon()
        if siphon > 0 and target_is_assault:
            if log_enabled(): log("        Siphon! Commander {" + self._commander.description() + "} receives siphon for " + str(siphon) + "hp from {" + attacker.description() + "}")
            self._commander.heal(siphon)

        if log_enabled(): log("      --Final attacking unit status: {" + attacker.description() + "}")
        if log_enabled(): log("      --Final defending unit status: {" + target.description() + "}")