@@ -400,53 +400,96 @@ public boolean hasCreep(final TilePosition position) {
400400 return gameData .hasCreep (position .x , position .y );
401401 }
402402
403- //TODO
404- public boolean hasPowerPrecise (final int x , final int y ) {
405- return true ;
403+ private static boolean bPsiFieldMask [][] = {
404+ { false , false , false , false , false , true , true , true , true , true , true , false , false , false , false , false },
405+ { false , false , true , true , true , true , true , true , true , true , true , true , true , true , false , false },
406+ { false , true , true , true , true , true , true , true , true , true , true , true , true , true , true , false },
407+ { true , true , true , true , true , true , true , true , true , true , true , true , true , true , true , true },
408+ { true , true , true , true , true , true , true , true , true , true , true , true , true , true , true , true },
409+ { true , true , true , true , true , true , true , true , true , true , true , true , true , true , true , true },
410+ { true , true , true , true , true , true , true , true , true , true , true , true , true , true , true , true },
411+ { false , true , true , true , true , true , true , true , true , true , true , true , true , true , true , false },
412+ { false , false , true , true , true , true , true , true , true , true , true , true , true , true , false , false },
413+ { false , false , false , false , false , true , true , true , true , true , true , false , false , false , false , false }
414+ };
415+
416+ private static boolean hasPower (int x , int y , final UnitType unitType , final Set <Unit > pylons ) {
417+ if ( unitType .id >= 0 && unitType .id < UnitType .None .id && (!unitType .requiresPsi () || !unitType .isBuilding ()) ) {
418+ return true ;
419+ }
420+
421+ // Loop through all pylons for the current player
422+ for (Unit i : pylons ) {
423+ if ( !i .exists () || !i .isCompleted () ) {
424+ continue ;
425+ }
426+ final Position p = i .getPosition ();
427+ if (Math .abs (p .x - x ) >= 256 ) {
428+ continue ;
429+ }
430+ if (Math .abs (p .y - y ) >= 160 ) {
431+ continue ;
432+ }
433+
434+ if ( bPsiFieldMask [(y - p .y + 160 ) / 32 ][(x - p .x + 256 ) / 32 ] ) {
435+ return true ;
436+ }
437+ }
438+ return false ;
439+ }
440+
441+ public boolean hasPowerPrecise (final int x , final int y ) {
442+ return hasPowerPrecise (new Position (x , y ));
406443 }
407- //TODO
408- public boolean hasPowerPrecise (final int x , final int y , final UnitType unitType ){
409- return true ;
444+
445+ public boolean hasPowerPrecise (final int x , final int y , final UnitType unitType ) {
446+ return hasPowerPrecise ( new Position ( x , y ), unitType ) ;
410447 }
411- //TODO
448+
412449 public boolean hasPowerPrecise (final Position position ){
413- return true ;
450+ return hasPowerPrecise ( position , UnitType . None ) ;
414451 }
415- //TODO
452+
416453 public boolean hasPowerPrecise (final Position position , final UnitType unitType ){
417- return true ;
454+ if (!position .isValid (this )) {
455+ return false ;
456+ }
457+ return hasPower (position .x , position .y , unitType , self ().getUnits ().stream ().filter (u -> u .getType () == Protoss_Pylon ).collect (Collectors .toSet ()));
418458 }
419- //TODO
459+
420460 public boolean hasPower (final int tileX , final int tileY ){
421- return true ;
461+ return hasPower ( new TilePosition ( tileX , tileY )) ;
422462 }
423- //TODO
463+
424464 public boolean hasPower (final int tileX , final int tileY , final UnitType unitType ){
425- return true ;
465+ return hasPower ( new TilePosition ( tileX , tileY ), unitType ) ;
426466 }
427- //TODO
467+
428468 public boolean hasPower (final TilePosition position ){
429- return true ;
469+ return hasPower ( position . x , position . y , UnitType . None ) ;
430470 }
431- //TODO
471+
432472 public boolean hasPower (final TilePosition position , final UnitType unitType ){
433- return true ;
473+ if ( unitType .id >= 0 && unitType .id < UnitType .None .id ) {
474+ return hasPowerPrecise (position .x * 32 + unitType .tileWidth () * 16 , position .y * 32 + unitType .tileHeight () * 16 , unitType );
475+ }
476+ return hasPowerPrecise ( position .x *32 , position .y *32 , UnitType .None );
434477 }
435- //TODO
478+
436479 public boolean hasPower (final int tileX , final int tileY , final int tileWidth , final int tileHeight ){
437- return true ;
480+ return hasPower ( tileX , tileY , tileWidth , tileHeight , UnitType . Unknown ) ;
438481 }
439- //TODO
482+
440483 public boolean hasPower (final int tileX , final int tileY , final int tileWidth , final int tileHeight , final UnitType unitType ){
441- return true ;
484+ return hasPowerPrecise ( tileX * 32 + tileWidth * 16 , tileY * 32 + tileHeight * 16 , unitType ) ;
442485 }
443- //TODO
486+
444487 public boolean hasPower (final TilePosition position , final int tileWidth , final int tileHeight ){
445- return true ;
488+ return hasPower ( position . x , position . y , tileWidth , tileHeight ) ;
446489 }
447- //TODO
490+
448491 public boolean hasPower (final TilePosition position , final int tileWidth , final int tileHeight , final UnitType unitType ){
449- return true ;
492+ return hasPower ( position . x , position . y , tileWidth , tileHeight , unitType ) ;
450493 }
451494
452495 public boolean canBuildHere (final TilePosition position , final UnitType type , final Unit builder ) {
0 commit comments