Gamelib/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/StoneCooldownManager.java

96 lines
3.2 KiB
Java

package uulm.teamname.marvelous.gamelibrary.gamelogic;
import uulm.teamname.marvelous.gamelibrary.config.PartyConfig;
import uulm.teamname.marvelous.gamelibrary.entities.StoneType;
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<>();
/** The max cooldown round numbers for every stone */
private final HashMap<StoneType, Integer> maxCooldowns = new HashMap<>();
/**
* Constructs a new {@link StoneCooldownManager} with the given config.
*/
public StoneCooldownManager(PartyConfig partyConfig) {
//thanks
maxCooldowns.put(StoneType.SpaceStone, partyConfig.spaceStoneCD);
maxCooldowns.put(StoneType.MindStone, partyConfig.mindStoneCD);
maxCooldowns.put(StoneType.RealityStone, partyConfig.realityStoneCD);
maxCooldowns.put(StoneType.PowerStone, partyConfig.powerStoneCD);
maxCooldowns.put(StoneType.TimeStone, partyConfig.timeStoneCD);
maxCooldowns.put(StoneType.SoulStone, partyConfig.soulStoneCD);
}
/**
* 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);
maxCooldowns.clear();
maxCooldowns.putAll(other.maxCooldowns);
}
/**
* Decreases all cooldowns by one according to a round having passed.
*/
public void update() {
cooldowns.replaceAll((s, v) -> Math.max(0, cooldowns.getOrDefault(s, 0) - 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.getOrDefault(stone, 0) > 0;
}
/**
* 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 mark
*/
public void setCooldown(StoneType stone) {
cooldowns.put(stone, Math.max(0, maxCooldowns.getOrDefault(stone, 0)));
}
/**
* Exports the cooldowns as an array ordered according to the enum.
* @return An array containing every cooldown
*/
public Integer[] export() {
Integer[] data = new Integer[6];
int i = 0;
for (StoneType stone: StoneType.values()) {
data[i++] = cooldowns.getOrDefault(stone, 0);
}
return data;
}
/**
* Imports the cooldowns from an array ordered according to the enum.
* @param data An array containing every cooldown
*/
public void import_(Integer[] data) {
for(int i = 0; i < data.length; i++) {
cooldowns.put(StoneType.valueOf(i), data[i]);
}
}
}