Skip to content

Commit ea9705e

Browse files
committed
cache position & cache mapsize in pixels
1 parent 08103b5 commit ea9705e

File tree

4 files changed

+85
-25
lines changed

4 files changed

+85
-25
lines changed

src/main/java/bwapi/EventHandler.java

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class EventHandler implements Client.EventHandler {
88
private final BWListener eventListener;
99
private Game game;
1010
private Client.GameData data;
11+
private int frames;
1112

1213
public EventHandler(final BWListener eventListener, final Client.GameData data) {
1314
this.eventListener = eventListener;
@@ -16,16 +17,20 @@ public EventHandler(final BWListener eventListener, final Client.GameData data)
1617
}
1718

1819
public void operation(Client.GameData.Event event) {
20+
final Unit u;
1921
switch (event.type()) {
2022
case 0: //MatchStart
23+
frames = 0;
2124
game.init();
2225
eventListener.onStart();
2326
break;
2427
case 1: //MatchEnd
2528
eventListener.onEnd(event.v1() != 0);
2629
break;
2730
case 2: //MatchFrame
31+
game.updateUnitPositions(frames);
2832
eventListener.onFrame();
33+
frames += 1;
2934
break;
3035
//case 3: //MenuFrame
3136
case 4: //SendText
@@ -40,45 +45,64 @@ public void operation(Client.GameData.Event event) {
4045
case 7: //NukeDetect
4146
eventListener.onNukeDetect(new Position(event.v1(), event.v2()));
4247
break;
48+
case 16: //SaveGame
49+
eventListener.onSaveGame(data.eventString(event.v1()));
50+
break;
4351
case 8: //UnitDiscover
4452
game.unitShow(event.v1());
45-
eventListener.onUnitDiscover(game.getUnit(event.v1()));
53+
u = game.getUnit(event.v1());
54+
u.updatePosition(frames);
55+
u.updateType(frames);
56+
u.updatePlayer(frames);
57+
eventListener.onUnitDiscover(u);
4658
break;
4759
case 9: //UnitEvade
48-
eventListener.onUnitEvade(game.getUnit(event.v1()));
60+
u = game.getUnit(event.v1());
61+
u.updatePosition(frames);
62+
eventListener.onUnitEvade(u);
4963
break;
5064
case 10: // UnitShow
51-
game.getUnit(event.v1()).updateType();
52-
game.getUnit(event.v1()).updatePlayer();
5365
game.unitShow(event.v1());
54-
eventListener.onUnitShow(game.getUnit(event.v1()));
66+
u = game.getUnit(event.v1());
67+
u.updatePosition(frames);
68+
u.updateType(frames);
69+
u.updatePlayer(frames);
70+
eventListener.onUnitShow(u);
5571
break;
5672
case 11: //UnitHide
73+
u = game.getUnit(event.v1());
5774
game.unitHide(event.v1());
58-
eventListener.onUnitHide(game.getUnit(event.v1()));
75+
eventListener.onUnitHide(u);
5976
break;
6077
case 12: //UnitCreate
6178
game.unitShow(event.v1());
62-
eventListener.onUnitCreate(game.getUnit(event.v1()));
79+
u = game.getUnit(event.v1());
80+
u.updatePosition(frames);
81+
u.updateType(frames);
82+
u.updatePlayer(frames);
83+
eventListener.onUnitCreate(u);
6384
break;
6485
case 13: //UnitDestroy
86+
u = game.getUnit(event.v1());
6587
game.unitHide(event.v1());
66-
eventListener.onUnitDestroy(game.getUnit(event.v1()));
88+
eventListener.onUnitDestroy(u);
6789
break;
6890
case 14: //UnitMorph
69-
game.getUnit(event.v1()).updateType();
70-
eventListener.onUnitMorph(game.getUnit(event.v1()));
91+
u = game.getUnit(event.v1());
92+
u.updatePosition(frames);
93+
u.updateType(frames);
94+
eventListener.onUnitMorph(u);
7195
break;
7296
case 15: //UnitRenegade
73-
game.getUnit(event.v1()).updatePlayer();
74-
eventListener.onUnitRenegade(game.getUnit(event.v1()));
75-
break;
76-
case 16: //SaveGame
77-
eventListener.onSaveGame(data.eventString(event.v1()));
97+
u = game.getUnit(event.v1());
98+
u.updatePlayer(frames);
99+
eventListener.onUnitRenegade(u);
78100
break;
79101
case 17: //UnitComplete
80102
game.unitShow(event.v1());
81-
eventListener.onUnitComplete(game.getUnit((event.v1())));
103+
u = game.getUnit(event.v1());
104+
u.updatePlayer(frames);
105+
eventListener.onUnitComplete(u);
82106
break;
83107
}
84108
}

src/main/java/bwapi/Game.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import static bwapi.types.UnitType.*;
1818

1919
public class Game {
20-
private final GameData gameData;
20+
private GameData gameData;
2121

2222
// CONSTANT
2323
private Player[] players;
@@ -50,6 +50,8 @@ public class Game {
5050
private List<TilePosition> startLocations;
5151
private int mapWidth;
5252
private int mapHeight;
53+
private int mapPixelWidth;
54+
private int mapPixelHeight;
5355
private String mapFileName;
5456
private String mapPathName;
5557
private String mapName;
@@ -175,6 +177,9 @@ void init() {
175177
mapSplitTilesRegion1[i] = gameData.mapSplitTilesRegion1(i);
176178
mapSplitTilesRegion2[i] = gameData.mapSplitTilesRegion2(i);
177179
}
180+
181+
mapPixelWidth = mapWidth * TilePosition.SIZE_IN_PIXELS;
182+
mapPixelHeight = mapHeight * TilePosition.SIZE_IN_PIXELS;
178183
}
179184

180185
void unitShow(final int id) {
@@ -194,6 +199,10 @@ void unitHide(final int id) {
194199
visibleUnits.remove(id);
195200
}
196201

202+
void updateUnitPositions(final int frame) {
203+
getAllUnits().forEach(u -> u.updatePosition(frame));
204+
}
205+
197206
void addUnitCommand(final int type, final int unit, final int target, final int x, final int y, final int extra) {
198207
gameData.addUnitCommand(new Client.UnitCommand(type, unit, target, x, y, extra));
199208
}
@@ -409,6 +418,14 @@ public int mapHeight() {
409418
return mapHeight;
410419
}
411420

421+
public int mapPixelWidth() {
422+
return mapPixelWidth;
423+
}
424+
425+
public int mapPixelHeight() {
426+
return mapPixelHeight;
427+
}
428+
412429
public String mapFileName() {
413430
return mapFileName;
414431
}

src/main/java/bwapi/Unit.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,20 @@ public class Unit {
3434
// variable
3535
private Player player;
3636
private UnitType unitType;
37+
private Position position;
38+
private int lastPositionUpdate = -1;
39+
private int lastTypeUpdate = -1;
40+
private int lastPlayerUpdate = -1;
3741
private int lastCommandFrame = 0;
3842
private UnitCommand lastCommand;
3943

4044
Unit(final UnitData unitData, final Game game) {
4145
this.unitData = unitData;
4246
this.game = game;
4347

44-
updateType();
45-
updatePlayer();
48+
updateType(0);
49+
updatePlayer(0);
50+
updatePosition(0);
4651

4752
initialType = getType();
4853
initialResources = getResources();
@@ -76,7 +81,7 @@ public UnitType getType() {
7681
}
7782

7883
public Position getPosition() {
79-
return new Position(unitData.positionX(), unitData.positionY());
84+
return position;
8085
}
8186

8287
public TilePosition getTilePosition() {
@@ -3933,11 +3938,25 @@ public int hashCode(){
39333938
return getID();
39343939
}
39353940

3936-
void updateType() {
3941+
void updateType(final int frame) {
3942+
if (frame > lastTypeUpdate) {
3943+
lastTypeUpdate = frame;
3944+
position = new Position(unitData.positionX(), unitData.positionY());
3945+
}
39373946
unitType = UnitType.unitTypes[unitData.type()];
39383947
}
39393948

3940-
void updatePlayer() {
3941-
player = game.getPlayer(unitData.player());
3949+
void updatePlayer(final int frame) {
3950+
if (frame > lastPlayerUpdate) {
3951+
lastPlayerUpdate = frame;
3952+
player = game.getPlayer(unitData.player());
3953+
}
3954+
}
3955+
3956+
void updatePosition(final int frame) {
3957+
if (frame > lastPositionUpdate) {
3958+
lastPositionUpdate = frame;
3959+
position = new Position(unitData.positionX(), unitData.positionY());
3960+
}
39423961
}
39433962
}

src/main/java/bwapi/point/Point.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ public boolean equals(Object o) {
4242
*/
4343
public boolean isValid(final Game game) {
4444
return x >= 0 && y >= 0 &&
45-
scalar * x < game.mapWidth() * TilePosition.SIZE_IN_PIXELS &&
46-
scalar * y < game.mapHeight() * TilePosition.SIZE_IN_PIXELS;
45+
scalar * x < game.mapPixelWidth() &&
46+
scalar * y < game.mapPixelHeight();
4747
}
4848

4949
public int hashCode() {

0 commit comments

Comments
 (0)