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
}