refactor: improve stone cooldown storing and implement better cloning

This commit is contained in:
punchready 2021-05-01 19:47:19 +02:00
parent 01ee534a56
commit fe249f39ea
6 changed files with 74 additions and 19 deletions

View File

@ -32,7 +32,7 @@ public class EntityID {
* @return The cloned {@link EntityID} * @return The cloned {@link EntityID}
*/ */
public EntityID clone() { public EntityID clone() {
return new EntityID(this.id, this.type); return new EntityID(id, type);
} }
/** /**

View File

@ -4,11 +4,22 @@ import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
/** Represents a list of {@link Entity}s. */ /** Represents a managed list of {@link Entity}s. */
public class EntityList { public class EntityManager {
/** The internal collection of {@link Entity}s */ /** The internal collection of {@link Entity}s */
private final HashSet<Entity> entities = new HashSet<>(); private final HashSet<Entity> entities = new HashSet<>();
/**
* Takes over all the entities from a different {@link EntityManager}.
* @param other The entity list to take the data from
*/
public void cloneFrom(EntityManager other) {
entities.clear();
for(Entity entity: other.entities) {
entities.add(entity.clone());
}
}
/** /**
* Clears the list of entities. * Clears the list of entities.
*/ */

View File

@ -27,7 +27,7 @@ public class Rock extends Entity {
} }
public void decreaseHp(int damage) { public void decreaseHp(int damage) {
this.hp -= damage; hp -= damage;
} }
@Override @Override

View File

@ -0,0 +1,52 @@
package uulm.teamname.marvelous.gamelibrary.entities;
import java.util.HashMap;
/** Represents a manager for infinity stone cooldowns. */
public class StoneCooldownManager {
/** The cooldown round numbers for every stone */
private final HashMap<StoneType, Integer> cooldowns = new HashMap<>();
/**
* Takes over all the cooldowns from a different {@link StoneCooldownManager}.
* @param other The cooldown manager to take the data from
*/
public void cloneFrom(StoneCooldownManager other) {
cooldowns.clear();
cooldowns.putAll(other.cooldowns);
}
/**
* Decreases all cooldowns by one according to a round having passed.
*/
public void update() {
cooldowns.replaceAll((s, v) -> Math.max(0, cooldowns.get(s) - 1));
}
/**
* Checks if a stone is on cooldown.
* @param stone The {@link StoneType} to check for
* @return Whether or not the stone is on cooldown
*/
public boolean onCooldown(StoneType stone) {
return cooldowns.containsKey(stone);
}
/**
* Retrieves the current cooldown for a stone.
* @param stone The {@link StoneType} to check for
* @return The stone's cooldown in rounds
*/
public int getCooldown(StoneType stone) {
return cooldowns.get(stone);
}
/**
* Marks a stone as on cooldown.
* @param stone The {@link StoneType} to check for
* @param duration The number of rounds the stone should be on cooldown
*/
public void setCooldown(StoneType stone, int duration) {
cooldowns.put(stone, Math.max(0, duration));
}
}

View File

@ -1,15 +1,11 @@
package uulm.teamname.marvelous.gamelibrary.gamelogic; package uulm.teamname.marvelous.gamelibrary.gamelogic;
import uulm.teamname.marvelous.gamelibrary.IntVector2; import uulm.teamname.marvelous.gamelibrary.IntVector2;
import uulm.teamname.marvelous.gamelibrary.entities.Entity; import uulm.teamname.marvelous.gamelibrary.entities.*;
import uulm.teamname.marvelous.gamelibrary.entities.EntityID;
import uulm.teamname.marvelous.gamelibrary.entities.EntityList;
import uulm.teamname.marvelous.gamelibrary.entities.StoneType;
import uulm.teamname.marvelous.gamelibrary.Tuple; import uulm.teamname.marvelous.gamelibrary.Tuple;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
/** Represents the state of a game instance. */ /** Represents the state of a game instance. */
class GameState { class GameState {
@ -17,7 +13,7 @@ class GameState {
public final IntVector2 mapSize; public final IntVector2 mapSize;
/** The list of {@link Entity}s inside the game */ /** The list of {@link Entity}s inside the game */
public final EntityList entities = new EntityList(); public final EntityManager entities = new EntityManager();
/** The total amount of full turn cycles that occurred */ /** The total amount of full turn cycles that occurred */
public int roundNumber = 0; public int roundNumber = 0;
@ -35,7 +31,7 @@ class GameState {
public boolean won = false; public boolean won = false;
/** The global cooldown of every infinity stone */ /** The global cooldown of every infinity stone */
public final HashMap<StoneType, Float> stoneCooldown = new HashMap<>(); public final StoneCooldownManager stoneCooldown = new StoneCooldownManager();
/** The store of the {@link WinCondition} data for every win condition for each player */ /** The store of the {@link WinCondition} data for every win condition for each player */
public final HashMap<Tuple<ParticipantType, WinCondition>, Integer> winConditions = new HashMap<>(); public final HashMap<Tuple<ParticipantType, WinCondition>, Integer> winConditions = new HashMap<>();
@ -55,9 +51,7 @@ class GameState {
public GameState snapshot() { public GameState snapshot() {
GameState clone = new GameState(this.mapSize); GameState clone = new GameState(this.mapSize);
for(Iterator<Entity> it = this.entities.getEntities(); it.hasNext(); ) { clone.entities.cloneFrom(entities);
clone.entities.addEntity(it.next().clone());
}
clone.roundNumber = roundNumber; clone.roundNumber = roundNumber;
@ -72,9 +66,7 @@ class GameState {
clone.won = won; clone.won = won;
for(StoneType type: stoneCooldown.keySet()) { clone.stoneCooldown.cloneFrom(stoneCooldown);
clone.stoneCooldown.put(type, stoneCooldown.get(type));
}
for(Tuple<ParticipantType, WinCondition> condition: winConditions.keySet()) { for(Tuple<ParticipantType, WinCondition> condition: winConditions.keySet()) {
clone.winConditions.put(condition, winConditions.get(condition)); clone.winConditions.put(condition, winConditions.get(condition));

View File

@ -45,7 +45,7 @@ public class GameStateView {
return state.won; return state.won;
} }
public float getStoneCooldown(StoneType stone) { public int getStoneCooldown(StoneType stone) {
return state.stoneCooldown.get(stone); return state.stoneCooldown.getCooldown(stone);
} }
} }