/* * Copyright (c) 2012. HappyDroids LLC, All rights reserved. */ package com.happydroids.droidtowers.gamestate; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.math.Vector3; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonView; import com.google.common.collect.Lists; import com.happydroids.droidtowers.DifficultyLevel; import com.happydroids.droidtowers.TowerConsts; import com.happydroids.droidtowers.achievements.Achievement; import com.happydroids.droidtowers.achievements.AchievementEngine; import com.happydroids.droidtowers.achievements.TutorialEngine; import com.happydroids.droidtowers.entities.GridObject; import com.happydroids.droidtowers.entities.Player; import com.happydroids.droidtowers.grid.GameGrid; import com.happydroids.droidtowers.grid.GridObjectState; import com.happydroids.droidtowers.gui.HeadsUpDisplay; import com.happydroids.droidtowers.input.CameraController; import com.happydroids.droidtowers.math.GridPoint; import java.util.ArrayList; import java.util.List; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC; import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT; import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.MINIMAL_CLASS; @JsonAutoDetect(fieldVisibility = PROTECTED_AND_PUBLIC, getterVisibility = NONE, setterVisibility = NONE, isGetterVisibility = NONE) @JsonTypeInfo(use = MINIMAL_CLASS, include = WRAPPER_OBJECT, property = "class") //@JsonTypeIdResolver(TowerTypeIdResolver.class) public class GameSave { @JsonView({Views.Metadata.class, Views.All.class}) protected Player player; @JsonView(Views.All.class) protected Vector3 cameraPosition; @JsonView(Views.All.class) protected float cameraZoom; @JsonView(Views.All.class) protected GridPoint gridSize; @JsonView(Views.All.class) protected List<GridObjectState> gridObjects; @JsonView(Views.All.class) protected ArrayList<String> completedAchievements; @JsonView(Views.All.class) protected List<String> neighbors; private boolean newGame; private boolean saveToDiskDisabled; @JsonView({Views.Metadata.class, Views.All.class}) protected GameSaveMetadata metadata; protected int fileFormat = 4; public GameSave() { newGame = false; } public GameSave(String towerName, DifficultyLevel difficultyLevel) { newGame = true; this.metadata = new GameSaveMetadata(towerName, difficultyLevel); player = new Player(difficultyLevel.getStartingMoney()); gridSize = new GridPoint(TowerConsts.GAME_GRID_START_SIZE, TowerConsts.GAME_GRID_START_SIZE); } public void attachToGame(GameGrid gameGrid, OrthographicCamera camera, CameraController cameraController) { gameGrid.clearObjects(); gameGrid.setTowerName(metadata.towerName); gameGrid.setGridSize(gridSize.x, gridSize.y); gameGrid.updateWorldSize(true); Player.setInstance(player); if (cameraPosition != null) { camera.zoom = cameraZoom; cameraController.panTo(cameraPosition, false); } if (gridObjects != null) { for (GridObjectState gridObjectState : gridObjects) { gridObjectState.materialize(gameGrid); } } if (newGame) { TutorialEngine.instance().setEnabled(true); TutorialEngine.instance().moveToStepWhenReady("tutorial-welcome"); } else { TutorialEngine.instance().setEnabled(false); TutorialEngine.instance().completeAll(); HeadsUpDisplay.instance().getAchievementButton().setVisible(true); HeadsUpDisplay.instance().toggleViewNeighborsButton(true); } AchievementEngine.instance().loadCompletedAchievements(completedAchievements, gameGrid); AchievementEngine.instance().checkAchievements(gameGrid); newGame = false; } public void update(OrthographicCamera camera, GameGrid gameGrid, List<String> neighbors) { gridSize = gameGrid.getGridSize(); gridObjects = Lists.newArrayList(); for (GridObject gridObject : gameGrid.getObjects()) { if (gridObject.isPlaced()) { gridObjects.add(new GridObjectState(gridObject)); } } completedAchievements = Lists.newArrayList(); for (Achievement achievement : AchievementEngine.instance().getAchievements()) { if (achievement.isCompleted() && achievement.hasGivenReward()) { completedAchievements.add(achievement.getId()); } } cameraPosition = camera.position; cameraZoom = camera.zoom; player = Player.instance(); this.neighbors = neighbors; metadata.fileGeneration += 1; } public String getCloudSaveUri() { return metadata.cloudSaveUri; } public String getBaseFilename() { return metadata.baseFilename; } public boolean isNewGame() { return newGame; } public void setCloudSaveUri(String cloudSaveUri) { metadata.cloudSaveUri = cloudSaveUri; } public int getFileGeneration() { return metadata.fileGeneration; } public String getTowerName() { return metadata.towerName; } public Player getPlayer() { return player; } public void disableSaving() { saveToDiskDisabled = true; } public void setNewGame(boolean newGame) { this.newGame = newGame; } public boolean hasGridObjects() { return gridObjects != null && !gridObjects.isEmpty(); } public boolean isSaveToDiskDisabled() { return saveToDiskDisabled; } public GameSaveMetadata getMetadata() { return metadata; } public void setNeighbors(List<String> neighbors) { this.neighbors = neighbors; } public int numNeighbors() { if (neighbors != null) { return neighbors.size(); } return 0; } public static class Views { public static class Metadata { } public static class All { } } }