/** * 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(); } }