package net.demilich.metastone.game.spells.desc; import java.util.EnumMap; import java.util.Map; import net.demilich.metastone.game.cards.desc.Desc; import net.demilich.metastone.game.logic.CustomCloneable; import net.demilich.metastone.game.spells.Spell; import net.demilich.metastone.game.spells.TargetPlayer; import net.demilich.metastone.game.spells.desc.filter.EntityFilter; import net.demilich.metastone.game.targeting.EntityReference; public class SpellDesc extends Desc<SpellArg> { public SpellDesc(Map<SpellArg, Object> arguments) { super(arguments); } public static Map<SpellArg, Object> build(Class<? extends Spell> spellClass) { final Map<SpellArg, Object> arguments = new EnumMap<>(SpellArg.class); arguments.put(SpellArg.CLASS, spellClass); return arguments; } public SpellDesc addArg(SpellArg spellArg, Object value) { SpellDesc clone = clone(); clone.arguments.put(spellArg, value); return clone; } public SpellDesc removeArg(SpellArg spellArg) { SpellDesc clone = clone(); clone.arguments.remove(spellArg); return clone; } @Override public SpellDesc clone() { SpellDesc clone = new SpellDesc(build(getSpellClass())); for (SpellArg spellArg : arguments.keySet()) { Object value = arguments.get(spellArg); if (value instanceof CustomCloneable) { CustomCloneable cloneable = (CustomCloneable) value; clone.arguments.put(spellArg, cloneable.clone()); } else { clone.arguments.put(spellArg, value); } } return clone; } public EntityFilter getEntityFilter() { return (EntityFilter) get(SpellArg.FILTER); } public int getInt(SpellArg spellArg, int defaultValue) { return arguments.containsKey(spellArg) ? (int) get(spellArg) : defaultValue; } @SuppressWarnings("unchecked") public Class<? extends Spell> getSpellClass() { return (Class<? extends Spell>) arguments.get(SpellArg.CLASS); } public EntityReference getTarget() { return (EntityReference) arguments.get(SpellArg.TARGET); } public TargetPlayer getTargetPlayer() { return (TargetPlayer) get(SpellArg.TARGET_PLAYER); } public boolean hasPredefinedTarget() { return arguments.get(SpellArg.TARGET) != null; } @Override public String toString() { String result = "[SpellDesc arguments= {\n"; for (SpellArg spellArg : arguments.keySet()) { result += "\t" + spellArg + ": " + arguments.get(spellArg) + "\n"; } result += "}"; return result; } }