package mahyarise.judge; import Logic.*; import common.exceptions.GameObjectNotFoundException; import common.exceptions.NotEnoughMoneyException; import common.exceptions.UnauthorizedAccessException; import engine.gameView.animation.InfantryAnimation; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import javafx.scene.layout.StackPane; import mahyarise.common.GameObjectID; import mahyarise.common.exceptions.MahyariseExceptionBase; public class GameManager { public static void setMapSize(int columns, int rows) { Game.getMap().setColumnsLength(columns); Game.getMap().setRowsLength(rows); } public static int getMapWidth() { return Game.getMap().getColLength(); } public static int getMapHeight() { return Game.getMap().getRowsLength(); } public static void loadMap(int[][] types) { Game.getMap().loadMap(types); } public static void setMapCellType(int col, int row, int type) { Game.getMap().setCellsType(type, col, row); } public static int getMapCellType(int col, int row) { return Game.getMap().getCellsType(col, row); } // TODO:: any statement need run before game start ... public static void setup() { } public static GameObjectID createAttacker(int teamID, int attackerType, int path, int lane,StackPane gameStack) throws MahyariseExceptionBase { GameObjectID id = null; switch (attackerType) { case GameState.ATTACKER_INFANTRY: id = GameObjectID.create(Infantry.class); new Infantry(Game.getTeamByID(teamID).getMilitaryBases().get(path).getLane()[lane], id, Game.getTeamByID(teamID),gameStack); break; case GameState.ATTACKER_TANK: id = GameObjectID.create(Tank.class); new Tank(Game.getTeamByID(teamID).getMilitaryBases().get(path).getLane()[lane], id, Game.getTeamByID(teamID),gameStack); break; } return id; } // Complete public static GameObjectID createTower(int teamID, int towerType, int col, int row,StackPane gameStack) throws MahyariseExceptionBase { //TODO need to check for path and lane and cell, each team has it's own tower try { GameObjectID id = null; switch (towerType) { case GameState.TOWER_TYPE_BLACK: if (Game.getTeamByID(teamID).getMoney() < BlackTower.getCost()) throw new NotEnoughMoneyException(Game.getTeamByID(teamID).getMoney()); id = GameObjectID.create(BlackTower.class); new BlackTower(Game.getMap().getCell(col, row), id, Game.getTeamByID(teamID),gameStack); break; case GameState.TOWER_TYPE_GAME: if (Game.getTeamByID(teamID).getMoney() < GameTower.getCost()) throw new NotEnoughMoneyException(Game.getTeamByID(teamID).getMoney()); id = GameObjectID.create(GameTower.class); new GameTower(Game.getMap().getCell(col, row), id, Game.getTeamByID(teamID),gameStack); break; case GameState.TOWER_TYPE_TANK: if (Game.getTeamByID(teamID).getMoney() < TankTower.getCost()) throw new NotEnoughMoneyException(Game.getTeamByID(teamID).getMoney()); id = GameObjectID.create(TankTower.class); new TankTower(Game.getMap().getCell(col, row), id, Game.getTeamByID(teamID),gameStack); break; case GameState.TOWER_TYPE_GENERAL_MATH: if (Game.getTeamByID(teamID).getMoney() < GeneralMathTower.getCost()) throw new NotEnoughMoneyException(Game.getTeamByID(teamID).getMoney()); id = GameObjectID.create(GeneralMathTower.class); new GeneralMathTower(Game.getMap().getCell(col, row), id, Game.getTeamByID(teamID),gameStack); break; case GameState.TOWER_TYPE_ELECTRICITY: if (Game.getTeamByID(teamID).getMoney() < ElectricityTower.getCost()) throw new NotEnoughMoneyException(Game.getTeamByID(teamID).getMoney()); id = GameObjectID.create(ElectricityTower.class); new ElectricityTower(Game.getMap().getCell(col, row), id, Game.getTeamByID(teamID),gameStack); break; case GameState.TOWER_TYPE_POISON: if (Game.getTeamByID(teamID).getMoney() < PoisonTower.getCost()) throw new NotEnoughMoneyException(Game.getTeamByID(teamID).getMoney()); id = GameObjectID.create(PoisonTower.class); new PoisonTower(Game.getMap().getCell(col, row), id, Game.getTeamByID(teamID),gameStack); break; } return id; } catch (Exception e) { e.printStackTrace(); return null; } } public static void purchaseTeamPowerup(int teamID, int powerupType) throws MahyariseExceptionBase { //TODO each team has it's own powerup ... try { switch (powerupType) { case GameState.PU_CE_HEALTH: Game.getTeamByID(teamID).healthBounceUpgrade(); break; case GameState.PU_CE_PACE: Game.getTeamByID(teamID).speedUpgrade(); break; case GameState.PU_CE_ARMOR: Game.getTeamByID(teamID).shieldUpgrade(); break; case GameState.PU_MATH_ECO: Game.getTeamByID(teamID).moneyBounceUpgrade(); break; case GameState.PU_MATH_DEC_VAL: Game.getTeamByID(teamID).reduceUnitsPriceUpgrade(); break; case GameState.PU_MATH_PROFIT: Game.getTeamByID(teamID).enemyPriceUpgrade(); } } catch (Exception e){ e.printStackTrace(); } } // Complete public static void purchaseTowerPowerup(int teamID, GameObjectID id, int powerupType) throws MahyariseExceptionBase { try { if (!Game.getObjects().containsKey(id)) throw new GameObjectNotFoundException(id); if (!(Game.getObjects().get(id) instanceof Tower)) throw new UnauthorizedAccessException("is not a tower"); Tower tower = (Tower) Game.getObjects().get(id); switch (powerupType) { case GameState.PU_TOWER_POWER: tower.powerUpgrade(); break; case GameState.PU_TOWER_PACE: tower.reloadTimeUpgrade(); break; case GameState.PU_TOWER_RANGE: tower.rangeUpgrade(); break; case GameState.PU_TOWER_AUTO_HEALING: // for phase2 tower.autoRepair(); break; } } catch (Exception e) { e.printStackTrace(); } } public static int getMoney(int teamID) { if (teamID == GameState.TEAM_CE) return Game.getTeamCE().getMoney(); else return Game.getTeamMath().getMoney(); } // Complete public static int[] getTeamPowerups(int teamID) { return Game.getTeamByID(teamID).getTeamUpgradePurchaseList(); } // Complete public static HashMap<String, Integer> getInfo(GameObjectID id) throws MahyariseExceptionBase { try { if (!Game.getObjects().containsKey(id)) throw new GameObjectNotFoundException(id); GameObject object = Game.getObjects().get(id); if (object instanceof Attacker) return ((Attacker) object).getInfo(); else if (object instanceof Tower) return ((Tower) object).getInfo(); else { System.out.println("HERE"); return ((Building) object).getInfo(); } } catch (GameObjectNotFoundException e){ e.printStackTrace(); return null; } } // Complete public static GameObjectID[] getBuildingID(int teamID, int buildingType) { ArrayList<GameObjectID> idList = new ArrayList<GameObjectID>(); idList.add(Game.getTeamByID(teamID).getHeadQuarter().getID()); for (MilitaryBase mb: Game.getTeamByID(teamID).getMilitaryBases().values()) { idList.add(mb.getID()); } return idList.toArray(new GameObjectID[idList.size()]); } // Complete public static GameObjectID[] getInRange(GameObjectID id) throws MahyariseExceptionBase { ArrayList<GameObjectID> idList = new ArrayList<GameObjectID>(); try { if (!(Game.getObjects().get(id) instanceof Unit)) throw new UnauthorizedAccessException("is not Unit"); Cell enemyCells[] = ((Unit) Game.getObjects().get(id)).findEnemies(); for (Cell cell: enemyCells) { for (GameObject obj: cell.getObjects()) { idList.add(obj.getID()); } } return idList.toArray(new GameObjectID[idList.size()]); } catch (Exception e) { e.printStackTrace(); return null; } } // Complete public static GameObjectID getTarget(GameObjectID id) throws MahyariseExceptionBase { try { if (!(Game.getObjects().get(id) instanceof Unit)) throw new UnauthorizedAccessException("is not a Unit"); Unit unit = (Unit) Game.getObjects().get(id); return unit.findTargets(unit.findEnemies()).getObjects()[0].getID(); } catch (Exception e) { e.printStackTrace(); return null; } } public static void next50milis() { Game.next50ms(); } public static void startTimer() { Game.startTimer(); } public static void pauseTimer() { Game.stopTimer(); } public static float getTime() { return Game.getTime() / 1000; } // Complete public static void setMoney(int teamID, int amount) { if (teamID == GameState.TEAM_CE) Game.getTeamCE().setMoney(amount); else Game.getTeamMath().setMoney(amount); } // Complete public static void updateInfo(GameObjectID id, String infoKey, Integer infoValue) throws MahyariseExceptionBase { try { if (!Game.getObjects().containsKey(id)) throw new GameObjectNotFoundException(id); GameObject object = Game.getObjects().get(id); if (object instanceof Attacker) { ((Attacker) object).getInfo().put(infoKey, infoValue); } else if (object instanceof Tower) { ((Tower) object).getInfo().put(infoKey, infoValue); } else ((Building) object).getInfo().put(infoKey, infoValue); } catch (Exception e) { e.printStackTrace(); } } // Complete public static void updateInfo(GameObjectID id, HashMap<String, Integer> newInfo) throws MahyariseExceptionBase { try { if (!Game.getObjects().containsKey(id)) throw new GameObjectNotFoundException(id); GameObject object = Game.getObjects().get(id); if (object instanceof Attacker) { for (String key: newInfo.keySet()) { if (((Attacker) object).getInfo().containsKey(key)) ((Attacker) object).getInfo().put(key, newInfo.get(key)); } } else if (object instanceof Tower) { for (String key: newInfo.keySet()) { if (((Tower) object).getInfo().containsKey(key)) ((Tower) object).getInfo().put(key, newInfo.get(key)); } } else { for (String key: newInfo.keySet()) { if (((Building) object).getInfo().containsKey(key)) ((Building) object).getInfo().put(key, newInfo.get(key)); } } } catch (Exception e) { e.printStackTrace(); } } /** * Saves the game in "saves" directory. * @author Saeed Rajabzadeh */ public static void saveGame() throws IOException { //TODO the name of file must be get from user FileOutputStream fileOutputStream = new FileOutputStream("src/saves/save.ser"); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); // objectOutputStream.writeObject(Game); fileOutputStream.close(); objectOutputStream.close(); } /** * Loads the game from "saves" directory. * @author Saeed Rajabzadeh */ public static void loadGame() throws IOException, ClassNotFoundException { //TODO the name of the file which must be loaded, should be get from user FileInputStream fileInputStream = new FileInputStream("src/saves/save.ser"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); // Game = (Game) objectInputStream.readObject(); fileInputStream.close(); objectInputStream.close(); } }