package tactic
import "github.com/golangconf/gophers-and-dragons/game"
func ChooseCard(s game.State) game.CardType {
return myTactic(s)
}
func myTactic(s game.State) game.CardType {
var CriticalHP = s.Avatar.HP - 1
if s.Avatar.HP < 20 {
if s.Can(game.CardHeal) {
return game.CardHeal
}
}
if s.Round == 12 {
if s.RoundTurn == 1 && diffInDamage(s) > s.Avatar.HP {
return game.CardRetreat
}
} else if s.RoundTurn == 1 && diffInDamage(s) > CriticalHP {
return game.CardRetreat
}
if s.Creep.HP == 3 && s.Creep.Type != game.CreepDragon && s.Can(game.CardMagicArrow) {
return game.CardMagicArrow
}
if s.Creep.Type == game.CreepCheepy {
return fightCheepy(s)
}
if s.Creep.Type == game.CreepMummy && s.Can(game.CardFirebolt) {
return game.CardFirebolt
}
if s.Creep.Type == game.CreepDragon {
return fightDragon(s)
}
return burst(s)
}
func fightCheepy(s game.State) game.CardType {
if s.Avatar.HP < 35 && s.RoundTurn <= 2 {
return game.CardRest
}
return game.CardAttack
}
func fightDragon(s game.State) game.CardType {
if s.Can(game.CardParry) {
return game.CardParry
}
if s.Can(game.CardStun) && !s.Creep.IsStunned() {
return game.CardStun
}
burst(s)
}
func diffInDamage(s game.State) int {
var diff = 0
var CreepHP = s.Creep.HP
var highestCreepDamage = s.Creep.Damage.High()
var lowestMyDamage = 2
var powerAttacks = s.Deck[game.CardPowerAttack].Count
var fireboltAttacks = s.Deck[game.CardFirebolt].Count
var stuns = s.Deck[game.CardStun].Count
CreepHP = CreepHP - 4*powerAttacks
diff = highestCreepDamage*powerAttacks - 4*powerAttacks
if s.Creep.Traits.Has(game.TraitWeakToFire) {
CreepHP = CreepHP - 8*fireboltAttacks
diff = diff + highestCreepDamage*fireboltAttacks - 8*fireboltAttacks
}
if !s.Creep.Traits.Has(game.TraitMagicImmunity) {
if fireboltAttacks > 3 {
fireboltAttacks = fireboltAttacks - 3
CreepHP = CreepHP - 4*fireboltAttacks
diff = diff + highestCreepDamage*fireboltAttacks - 4*fireboltAttacks
}
}
if s.Creep.Type == game.CreepDragon {
var parry = s.Deck[game.CardParry].Count
CreepHP = CreepHP - 5*parry
diff = diff - 5*parry
}
CreepHP = CreepHP - 2*stuns
diff = diff + highestCreepDamage*stuns - 2*stuns
for CreepHP >= 0 {
diff = diff + highestCreepDamage
diff = diff - 2
CreepHP = CreepHP - 2
}
return diff
}
func burst(s game.State) game.CardType {
if s.Deck[game.CardFirebolt].Count > 3 && s.Creep.Type != game.CreepDragon && s.Creep.HP > 4 {
return game.CardFirebolt
}
if s.Round == 11 && s.Can(game.CardFirebolt) {
return game.CardFirebolt
}
if s.Creep.HP > 4 && !s.Creep.IsStunned() && s.Can(game.CardStun) {
return game.CardStun
}
if s.Creep.HP > 4 && s.Can(game.CardPowerAttack) {
return game.CardPowerAttack
}
return game.CardAttack
}