package tactic import . "github.com/golangconf/gophers-and-dragons/game" func ChooseCard(s State) CardType { if s.Can(CardHeal) && s.Avatar.HP < 28 { return CardHeal } stunCards := s.Deck[CardStun].Count parryCards := s.Deck[CardParry].Count powerCards := s.Deck[CardPowerAttack].Count fbCards := s.Deck[CardFirebolt].Count switch s.Creep.Type { case CreepClaws: if stunCards > 1 && !s.Creep.IsStunned() { return CardStun } if s.Creep.IsFull() && s.Avatar.HP < 7 { return CardRetreat } if parryCards > 3 && !s.Creep.IsStunned() { return CardParry } if powerCards > 2 && s.Creep.HP > 3 { return CardPowerAttack } case CreepFairy: if stunCards > 0 && !s.Creep.IsStunned() { return CardStun } if powerCards > 1 && s.Creep.HP > 3 { return CardPowerAttack } if s.Creep.HP == 3 && s.Avatar.MP > 4 { return CardMagicArrow } case CreepMummy: if s.Creep.IsFull() && !(s.Can(CardHeal) && s.Avatar.MP > 9 && fbCards > 0 || s.Avatar.HP > 7) { return CardRetreat } if stunCards > 2 && !s.Creep.IsStunned() { return CardStun } if fbCards > 0 && s.Creep.HP > 7 && s.Avatar.MP > 5 { return CardFirebolt } if powerCards > 0 && s.Creep.HP > 3 { return CardPowerAttack } case CreepKubus: if s.Creep.IsFull() && !(s.Can(CardHeal) && s.Avatar.MP > 7 && fbCards > 0 && s.Avatar.HP > 14 || s.Avatar.HP > 32) { return CardRetreat } if fbCards > 0 && s.Creep.HP > 4 && s.Avatar.MP > 3 { return CardFirebolt } case CreepDragon: if s.Can(CardParry) { return CardParry } if s.Can(CardStun) && !s.Creep.IsStunned() { return CardStun } if stunCards == 0 { hp := s.Avatar.HP drHP := s.Creep.HP for hp > -6 && drHP > 0 { hp -= 6 if powerCards > 0 { drHP -= 4 powerCards-- } else { drHP -= 3 } } if drHP > 0 { return CardRetreat } } if s.Can(CardPowerAttack) { return CardPowerAttack } } if s.Avatar.MP == 3 && s.Creep.HP == 3 && s.Creep.Type != CreepDragon { return CardMagicArrow } return CardAttack }