package client import ( "math/rand" ) type Target string const ( TargetSelf Target = "self" TargetAny Target = "any" TargetEnemy Target = "enemy" TargetAlly Target = "ally" TargetAll Target = "all" TargetAllEnemies Target = "all_enemies" TargetAllAllies Target = "all_allies" TargetLowestHP Target = "lowest_hp" TargetLowestHPEnemy Target = "lowest_hp_enemy" TargetLowestHPAlly Target = "lowest_hp_ally" TargetHighestHP Target = "highest_hp" TargetHighestHPEnemy Target = "highest_hp_enemy" TargetHighestHPAlly Target = "highest_hp_ally" ) func (t Target) Filter(source *Combatant, targets ...*Combatant) []*Combatant { if len(targets) == 0 { return []*Combatant{} } getTeamTargets := func(isAlly bool) []*Combatant { out := make([]*Combatant, 0) for _, target := range targets { if target.Alive && ((isAlly && source.Team == target.Team) || (!isAlly && source.Team != target.Team)) { out = append(out, target) } } return out } switch t { case TargetSelf: return []*Combatant{source} case TargetAny, TargetAll: out := make([]*Combatant, 0) for _, target := range targets { if target.Alive { out = append(out, target) } } return out case TargetEnemy, TargetAllEnemies: return getTeamTargets(false) case TargetAlly, TargetAllAllies: return getTeamTargets(true) case TargetLowestHP: // TODO //slices.SortFunc(targets, func(a *Entity, b *Entity) int { }) } return targets } func (t Target) Pick(source *Combatant, targets ...*Combatant) []*Combatant { availableTargets := t.Filter(source, targets...) if len(availableTargets) == 0 { return []*Combatant{} } switch t { case TargetSelf: return []*Combatant{source} case TargetAll, TargetAllEnemies, TargetAllAllies: return availableTargets default: return []*Combatant{availableTargets[rand.Intn(len(availableTargets))]} } }