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 cooldowns = new HashMap<>(); /** The max cooldown round numbers for every stone */ private final HashMap 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, v - 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]); } } }