package org.mafagafogigante.dungeon.entity.creatures;
import java.util.EnumMap;
import java.util.Map;
/**
* This class presents a static renderAttack method that handles attack rendering.
*/
final class AttackAlgorithms {
private static final Map<AttackAlgorithmId, AttackAlgorithm> ATTACK_ALGORITHM_MAP =
new EnumMap<>(AttackAlgorithmId.class);
private static boolean uninitialized = true;
private AttackAlgorithms() { // Ensure that this class cannot be instantiated.
throw new AssertionError();
}
/**
* Renders an attack of the attacker on the defender.
*
* @param attacker the Creature that is attacking
* @param defender the Creature that is being attacked
*/
public static void renderAttack(Creature attacker, Creature defender) {
if (uninitialized) {
initialize();
}
ATTACK_ALGORITHM_MAP.get(attacker.getAttackAlgorithmId()).renderAttack(attacker, defender);
}
private static void initialize() {
registerAttackAlgorithm(AttackAlgorithmId.BAT, new BatAttackAlgorithm());
registerAttackAlgorithm(AttackAlgorithmId.CRITTER, new CritterAttackAlgorithm());
registerAttackAlgorithm(AttackAlgorithmId.DUMMY, new DummyAttackAlgorithm());
registerAttackAlgorithm(AttackAlgorithmId.ORC, new OrcAttackAlgorithm());
registerAttackAlgorithm(AttackAlgorithmId.SIMPLE, new SimpleAttackAlgorithm());
validateMap();
uninitialized = false;
}
/**
* Registers an AttackAlgorithm using specified AttackAlgorithmId.
*/
private static void registerAttackAlgorithm(AttackAlgorithmId id, AttackAlgorithm algorithm) {
if (ATTACK_ALGORITHM_MAP.containsKey(id)) {
throw new IllegalStateException("There is an AttackAlgorithm already defined for this AttackAlgorithmId!");
}
ATTACK_ALGORITHM_MAP.put(id, algorithm);
}
/**
* Ensure that all AttackAlgorithmIDs are mapped to an AttackAlgorithm.
*/
private static void validateMap() {
for (AttackAlgorithmId id : AttackAlgorithmId.values()) {
if (!ATTACK_ALGORITHM_MAP.containsKey(id)) {
throw new AssertionError(id + " is not mapped to an AttackAlgorithm!");
}
}
}
}