/** * C++ callback function. * * <p>Notifies the event listener that the game has terminated. * * <p>Note: this is always called after matchEnded(bool), and is meant as a way of notifying the * AI client to clear up state. */ private void gameEnded() { try { listener.gameEnded(); } catch (Error e) { e.printStackTrace(); } }
/** * C++ callback function. * * <p>Notifies the event listener that a game has started. */ public void gameStarted() { try { // get the players self = null; allies.clear(); allyIDs.clear(); enemies.clear(); enemyIDs.clear(); players.clear(); int[] playerData = getPlayersData(); for (int index = 0; index < playerData.length; index += Player.numAttributes) { String name = new String(getPlayerName(playerData[index])); Player player = new Player(playerData, index, name); players.put(player.getID(), player); if (player.isSelf()) { self = player; } else if (player.isAlly()) { allies.add(player); allyIDs.add(player.getID()); } else if (player.isEnemy()) { enemies.add(player); enemyIDs.add(player.getID()); } else if (player.isNeutral()) { neutralPlayer = player; } } // get unit data units.clear(); playerUnits.clear(); alliedUnits.clear(); enemyUnits.clear(); neutralUnits.clear(); int[] unitData = getAllUnitsData(); for (int index = 0; index < unitData.length; index += Unit.numAttributes) { int id = unitData[index]; Unit unit = new Unit(id); unit.update(unitData, index); units.put(id, unit); if (self != null && unit.getPlayerID() == self.getID()) { playerUnits.add(unit); } else if (allyIDs.contains(unit.getPlayerID())) { alliedUnits.add(unit); } else if (enemyIDs.contains(unit.getPlayerID())) { enemyUnits.add(unit); } else { neutralUnits.add(unit); } } listener.gameStarted(); } catch (Error e) { e.printStackTrace(); } }
/** * C++ callback function. * * <p>Notifies the event listener that a connection has been formed to the bridge. */ public void connected() { try { listener.connected(); } catch (Error e) { e.printStackTrace(); } }
/** * C++ callback function. * * <p>Notifies the event listener that a key was pressed. */ public void keyPressed(int keyCode) { try { listener.keyPressed(keyCode); } catch (Error e) { e.printStackTrace(); } }
/** * C++ callback function. * * <p>Sends BWAPI callback events to the event listener. * * @param type - event type (should probably be an enum) */ private void eventOccurred(int type, int param1, int param2, String param3) { try { switch (type) { case 0: listener.matchEnded(param1 == 1); break; case 1: listener.sendText(param3); break; case 2: listener.receiveText(param3); break; case 3: listener.playerLeft(param1); break; case 4: listener.nukeDetect(param2, param2); break; case 5: listener.nukeDetect(); break; case 6: listener.unitDiscover(param1); break; case 7: listener.unitEvade(param1); break; case 8: listener.unitShow(param1); break; case 9: listener.unitHide(param1); break; case 10: listener.unitCreate(param1); break; case 11: listener.unitDestroy(param1); break; case 12: listener.unitMorph(param1); break; case 13: listener.unitRenegade(param1); break; case 14: listener.saveGame(param3); break; case 15: listener.unitComplete(param1); break; case 16: listener.playerDropped(param1); break; } } catch (Error e) { e.printStackTrace(); } }
/** * C++ callback function. * * <p>Notifies the event listener that a game update occurred. */ private void gameUpdate() { try { // update game state gameFrame = getFrame(); if (!isReplay()) { self.update(getPlayerUpdate(self.getID())); self.updateResearch(getResearchStatus(self.getID()), getUpgradeStatus(self.getID())); } else { for (Integer playerID : players.keySet()) { players.get(playerID).update(getPlayerUpdate(playerID)); players .get(playerID) .updateResearch(getResearchStatus(playerID), getUpgradeStatus(playerID)); } } // update units int[] unitData = getAllUnitsData(); int[] bulletData = getAllBulletsData(); HashSet<Integer> deadUnits = new HashSet<Integer>(units.keySet()); ArrayList<Unit> playerList = new ArrayList<Unit>(); ArrayList<Unit> alliedList = new ArrayList<Unit>(); ArrayList<Unit> enemyList = new ArrayList<Unit>(); ArrayList<Unit> neutralList = new ArrayList<Unit>(); for (int index = 0; index < bulletData.length; index += Bullet.numAttributes) { int id = bulletData[index]; Bullet bullet = bullets.get(id); if (bullet == null) { bullet = new Bullet(id); bullets.put(id, bullet); } bullet.update(bulletData, index); } for (int index = 0; index < unitData.length; index += Unit.numAttributes) { int id = unitData[index]; // bugfix - unit list was emptying itself every second frame deadUnits.remove(id); Unit unit = units.get(id); if (unit == null) { unit = new Unit(id); units.put(id, unit); } unit.update(unitData, index); if (self != null) { if (unit.getPlayerID() == self.getID()) { playerList.add(unit); } else if (allyIDs.contains(unit.getPlayerID())) { alliedList.add(unit); } else if (enemyIDs.contains(unit.getPlayerID())) { enemyList.add(unit); } else { neutralList.add(unit); } } else if (allyIDs.contains(unit.getPlayerID())) { alliedList.add(unit); } else if (enemyIDs.contains(unit.getPlayerID())) { enemyList.add(unit); } else { neutralList.add(unit); } } // update the unit lists playerUnits = playerList; alliedUnits = alliedList; enemyUnits = enemyList; neutralUnits = neutralList; for (Integer unitID : deadUnits) { units.get(unitID).setDestroyed(); units.remove(unitID); } listener.gameUpdate(); } catch (Error e) { e.printStackTrace(); } }