refactor: improve stone cooldown storing and implement better cloning
This commit is contained in:
parent
01ee534a56
commit
fe249f39ea
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
@ -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
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
@ -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));
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user