func (a *AoeAttack) getTargetsAt(g *game.Game, tx, ty int) []*game.Entity { x := tx - (a.Diameter+1)/2 y := ty - (a.Diameter+1)/2 x2 := tx + a.Diameter/2 y2 := ty + a.Diameter/2 // If the diameter is even we need to run los from all four positions // around the center of the aoe. num_centers := 1 if a.Diameter%2 == 0 { num_centers = 4 } var targets []*game.Entity for i := 0; i < num_centers; i++ { // If num_centers is 4 then this will calculate the los for all four // positions around the center g.DetermineLos(tx+i%2, ty+i/2, a.Diameter, grid[i]) } for _, ent := range g.Ents { entx, enty := ent.Pos() has_los := false for i := 0; i < num_centers; i++ { has_los = has_los || grid[i][entx][enty] } if has_los && entx >= x && entx < x2 && enty >= y && enty < y2 { targets = append(targets, ent) } } algorithm.Choose(&targets, func(e *game.Entity) bool { return e.Stats != nil }) return targets }