package tactic import "github.com/golangconf/gophers-and-dragons/game" func ChooseCard(s game.State) game.CardType { if s.Avatar.HP < 20 && s.Creep.CreepStats.Damage[0] <=3 && s.Can(game.CardHeal) { return game.CardHeal } if s.Avatar.HP < 10 && s.Can(game.CardHeal) { return game.CardHeal } if s.Avatar.HP < 7 && s.Creep.Traits.Has(game.TraitSlow) { return game.CardRetreat } if s.Creep.Type == game.CreepFairy { return FairyMonsterAttack(s) } if s.Creep.Type == game.CreepDragon { return DragonMonsterAttack(s) } if s.Creep.Type == game.CreepMummy { return MummyMonsterAttack(s) } if s.Creep.Type == game.CreepKubus { return KubusMonsterAttack(s) } if s.Creep.Type == game.CreepClaws { return ClawsMonsterAttack(s) } if s.Creep.HP > 15 { return BestMonsterAttack(s) } return DefaulMonsterAttack(s) } func FairyMonsterAttack(s game.State) game.CardType { if s.Can(game.CardFirebolt) && s.Creep.HP == 4 { return game.CardFirebolt } return BestMonsterAttack(s) } func DragonMonsterAttack(s game.State) game.CardType { if s.Can(game.CardParry) { return game.CardParry } if s.Can(game.CardStun) && !s.Creep.IsStunned() { return game.CardStun } if s.Avatar.HP >= 3 && s.Avatar.HP < 7 && s.Can(game.CardRest) { return game.CardRest } if s.Avatar.HP == 7 && s.Creep.HP > 4 && !s.Creep.IsStunned() { return game.CardRetreat } if s.Can(game.CardPowerAttack) { return game.CardPowerAttack } return game.CardAttack } func ClawsMonsterAttack(s game.State) game.CardType { if s.Can(game.CardHeal) && s.Avatar.HP < 20 { return game.CardHeal } if s.Avatar.HP < 20 { return BestMonsterAttack(s) } return game.CardAttack } func KubusMonsterAttack(s game.State) game.CardType { if s.RoundTurn < 3 && s.Avatar.HP < 25 && s.Deck[game.CardHeal].Count > 1 { if s.Can(game.CardHeal) { return game.CardHeal } } if s.RoundTurn == 1 && (s.Deck[game.CardStun].Count <= 1 && s.Deck[game.CardParry].Count <= 2 && s.Deck[game.CardPowerAttack].Count <= 1) { return game.CardRetreat } return BestMonsterAttack(s) } func MummyMonsterAttack(s game.State) game.CardType { if s.RoundTurn <= 2 && s.Avatar.MP < 3 { return game.CardRetreat } if s.Can(game.CardFirebolt) && s.Creep.HP > 4 { return game.CardFirebolt } return game.CardAttack } func BestMonsterAttack(s game.State) game.CardType { mageLimit := 2 if s.Avatar.MP < 7 { mageLimit = 10 } if s.Round < 5 { mageLimit = 3 } if s.NextCreep != game.CreepDragon { mageLimit = 0 } if s.Round == 8 && s.NextCreep != game.CreepMummy { mageLimit = 0 } if s.Creep.HP <= 3 { return DefaulMonsterAttack(s) } if s.Can(game.CardParry) && s.Creep.Type != game.CreepFairy { if s.Deck[game.CardParry].Count > 2 && s.Creep.CreepStats.Damage[0] >= 3 { return game.CardParry } if s.Deck[game.CardParry].Count >= 5 && s.Creep.CreepStats.Damage[0] >= 2 { return game.CardParry } } if s.Can(game.CardStun) && !s.Creep.IsStunned() && s.Deck[game.CardStun].Count > 1 { return game.CardStun } if s.Can(game.CardFirebolt) && s.Deck[game.CardFirebolt].Count > mageLimit { return game.CardFirebolt } if s.Can(game.CardPowerAttack) && s.Deck[game.CardPowerAttack].Count > 1 { return game.CardPowerAttack } return DefaulMonsterAttack(s) } func DefaulMonsterAttack(s game.State) game.CardType { if s.Creep.Type == game.CreepKubus && s.Creep.HP == 3 { return game.CardMagicArrow } if s.Avatar.MP > 14 && s.Creep.HP == 3 { return game.CardMagicArrow } return game.CardAttack }