package uulm.teamname.marvelous.gamelibrary.gamelogic; import uulm.teamname.marvelous.gamelibrary.IntVector2; import uulm.teamname.marvelous.gamelibrary.entities.*; import uulm.teamname.marvelous.gamelibrary.Tuple; import java.util.ArrayList; import java.util.HashMap; /** Represents the state of a game instance. */ class GameState { /** The size of the map */ public final IntVector2 mapSize; /** The list of {@link Entity}s inside the game */ public final EntityManager entities = new EntityManager(); /** The total amount of full turn cycles that occurred */ public int roundNumber = 0; /** The turn order of every character */ public ArrayList turnOrder = new ArrayList<>(); /** The total amount of turns that occurred */ public int turnNumber = 0; /** The {@link EntityID} of the active character */ public EntityID activeCharacter = null; /** Whether or not the game was won */ public boolean won = false; /** The global cooldown of every infinity stone */ public final StoneCooldownManager stoneCooldown = new StoneCooldownManager(); /** The store of the {@link WinCondition} data for every win condition for each player */ public final HashMap, Integer> winConditions = new HashMap<>(); /** * Constructs a new {@link GameState}. * @param mapSize The size of the map */ public GameState(IntVector2 mapSize) { this.mapSize = mapSize; } /** * Clones the state into a new {@link GameState} object. This is slow. * @return The cloned game state */ public GameState snapshot() { GameState clone = new GameState(this.mapSize); clone.entities.cloneFrom(entities); clone.roundNumber = roundNumber; clone.turnOrder = new ArrayList<>(); for(EntityID id: turnOrder) { clone.turnOrder.add(id.clone()); } clone.turnNumber = turnNumber; clone.activeCharacter = activeCharacter != null ? activeCharacter.clone() : null; clone.won = won; clone.stoneCooldown.cloneFrom(stoneCooldown); for(Tuple condition: winConditions.keySet()) { clone.winConditions.put(condition, winConditions.get(condition)); } return clone; } }