Skip to content

Commit 866b0a8

Browse files
committed
implement haspower
1 parent d7d7641 commit 866b0a8

File tree

1 file changed

+69
-26
lines changed

1 file changed

+69
-26
lines changed

src/main/java/bwapi/Game.java

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)