File tree Expand file tree Collapse file tree 4 files changed +45
-8
lines changed
Expand file tree Collapse file tree 4 files changed +45
-8
lines changed Original file line number Diff line number Diff line change @@ -50,15 +50,14 @@ export class NukeExecution implements Execution {
5050 const tilesInRange = new Map < TileRef , number > ( ) ;
5151 const magnitude = this . mg . config ( ) . nukeMagnitudes ( this . nuke . type ( ) ) ;
5252 const inner2 = magnitude . inner * magnitude . inner ;
53- const outer2 = magnitude . outer * magnitude . outer ;
54- this . mg . bfs ( this . dst , ( _ , n : TileRef ) => {
55- const d2 = this . mg ?. euclideanDistSquared ( this . dst , n ) ?? 0 ;
56- if ( d2 <= outer2 ) {
57- tilesInRange . set ( n , d2 <= inner2 ? 1 : 0.5 ) ;
53+ this . mg . circleSearch (
54+ this . dst ,
55+ magnitude . outer ,
56+ ( t : TileRef , d2 : number ) => {
57+ tilesInRange . set ( t , d2 <= inner2 ? 1 : 0.5 ) ;
5858 return true ;
59- }
60- return false ;
61- } ) ;
59+ } ,
60+ ) ;
6261 return tilesInRange ;
6362 }
6463
Original file line number Diff line number Diff line change @@ -882,6 +882,13 @@ export class GameImpl implements Game {
882882 euclideanDistSquared ( c1 : TileRef , c2 : TileRef ) : number {
883883 return this . _map . euclideanDistSquared ( c1 , c2 ) ;
884884 }
885+ circleSearch (
886+ tile : TileRef ,
887+ radius : number ,
888+ filter ?: ( tile : TileRef , d2 : number ) => boolean ,
889+ ) : Set < TileRef > {
890+ return this . _map . circleSearch ( tile , radius , filter ) ;
891+ }
885892 bfs (
886893 tile : TileRef ,
887894 filter : ( gm : GameMap , tile : TileRef ) => boolean ,
Original file line number Diff line number Diff line change @@ -39,6 +39,11 @@ export interface GameMap {
3939
4040 manhattanDist ( c1 : TileRef , c2 : TileRef ) : number ;
4141 euclideanDistSquared ( c1 : TileRef , c2 : TileRef ) : number ;
42+ circleSearch (
43+ tile : TileRef ,
44+ radius : number ,
45+ filter ?: ( tile : TileRef , d2 : number ) => boolean ,
46+ ) : Set < TileRef > ;
4247 bfs (
4348 tile : TileRef ,
4449 filter : ( gm : GameMap , tile : TileRef ) => boolean ,
@@ -288,6 +293,25 @@ export class GameMapImpl implements GameMap {
288293 const y = this . y ( c1 ) - this . y ( c2 ) ;
289294 return x * x + y * y ;
290295 }
296+ circleSearch (
297+ tile : TileRef ,
298+ radius : number ,
299+ filter ?: ( tile : TileRef , d2 : number ) => boolean ,
300+ ) : Set < TileRef > {
301+ const center = { x : this . x ( tile ) , y : this . y ( tile ) } ;
302+ const tiles : Set < TileRef > = new Set < TileRef > ( ) ;
303+ for ( let i = center . x - radius ; i <= center . x + radius ; ++ i ) {
304+ for ( let j = center . y - radius ; j <= center . y + radius ; j ++ ) {
305+ const t = this . ref ( i , j ) ;
306+ const d2 = this . euclideanDistSquared ( tile , t ) ;
307+ if ( d2 > radius * radius ) continue ;
308+ if ( ! filter || filter ( t , d2 ) ) {
309+ tiles . add ( t ) ;
310+ }
311+ }
312+ }
313+ return tiles ;
314+ }
291315 bfs (
292316 tile : TileRef ,
293317 filter : ( gm : GameMap , tile : TileRef ) => boolean ,
Original file line number Diff line number Diff line change @@ -762,6 +762,13 @@ export class GameView implements GameMap {
762762 euclideanDistSquared ( c1 : TileRef , c2 : TileRef ) : number {
763763 return this . _map . euclideanDistSquared ( c1 , c2 ) ;
764764 }
765+ circleSearch (
766+ tile : TileRef ,
767+ radius : number ,
768+ filter ?: ( tile : TileRef , d2 : number ) => boolean ,
769+ ) : Set < TileRef > {
770+ return this . _map . circleSearch ( tile , radius , filter ) ;
771+ }
765772 bfs (
766773 tile : TileRef ,
767774 filter : ( gm : GameMap , tile : TileRef ) => boolean ,
You can’t perform that action at this time.
0 commit comments