package net.sf.colossus.variant; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * This is a typesafe enumeration of all hazard Hexsides, i.e. the * Hexsides used in the battle maps. * * TODO turn into proper enum */ public class HazardHexside extends Hazards { /** * A map from the serialization string of a Hexside to the instances. */ private final static Map<String, HazardHexside> HEXSIDE_MAP = new HashMap<String, HazardHexside>(); private final static Map<Character, HazardHexside> HEXSIDE_MAP_UGLY = new HashMap<Character, HazardHexside>(); public HazardHexside(String name, char code, EffectOnMovement effectOnGroundMovement, EffectOnMovement effectOnFlyerMovement, CombatEffect defenseEffect, CombatEffect attackEffect, CombatEffect rangedDefenseEffect, CombatEffect rangedAttackEffect, RangeStrikeSpecialEffect RangeStrikeSpecial, SpecialEffect terrainSpecial) { super(name, code, effectOnGroundMovement, effectOnFlyerMovement, defenseEffect, attackEffect, rangedDefenseEffect, rangedAttackEffect, RangeStrikeSpecial, terrainSpecial); HEXSIDE_MAP.put(name, this); HEXSIDE_MAP_UGLY.put(new Character(code), this); } public static HazardHexside getHexsideByName(String name) { return HEXSIDE_MAP.get(name); } /** deprecated because we want to get rid of the single char stuff */ @Deprecated public static HazardHexside getHexsideByCode(char code) { return HEXSIDE_MAP_UGLY.get(new Character(code)); } /** * Returns all available hazard hexsides. * * This is not variant-specific, any hexside known to the program is listed even * if it is not available in the current variant. * * TODO this should really be a question to ask a variant instance */ public static final Collection<HazardHexside> getAllHazardHexsides() { return HEXSIDE_MAP.values(); } public static final HazardHexside NOTHING = new HazardHexside( "Nothing", ' ', EffectOnMovement.FREEMOVE, EffectOnMovement.FREEMOVE, new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), RangeStrikeSpecialEffect.RANGESTRIKEFREE, SpecialEffect.NOSPECIAL); public static final HazardHexside DUNE = new HazardHexside( "Dune", 'd', EffectOnMovement.FREEMOVE, EffectOnMovement.FREEMOVE, new CombatEffect(EffectOnStrike.POWERPENALTY, ScopeOfEffectOnStrike.FOREIGNERS, 1), new CombatEffect(EffectOnStrike.POWERBONUS, ScopeOfEffectOnStrike.NATIVES, 2), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), RangeStrikeSpecialEffect.RANGESTRIKEOCCUPIED, SpecialEffect.NOSPECIAL); public static final HazardHexside CLIFF = new HazardHexside( "Cliff", 'c', EffectOnMovement.BLOCKALL, EffectOnMovement.FREEMOVE, new CombatEffect(EffectOnStrike.BLOCKED, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.BLOCKED, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), RangeStrikeSpecialEffect.RANGESTRIKEOCCUPIED, SpecialEffect.NOSPECIAL); public static final HazardHexside SLOPE = new HazardHexside( "Slope", 's', EffectOnMovement.SLOWFOREIGNER, EffectOnMovement.FREEMOVE, new CombatEffect(EffectOnStrike.SKILLPENALTY, ScopeOfEffectOnStrike.FOREIGNERS, 1), new CombatEffect(EffectOnStrike.POWERBONUS, ScopeOfEffectOnStrike.NATIVES, 1), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), RangeStrikeSpecialEffect.RANGESTRIKEOCCUPIED, SpecialEffect.NOSPECIAL); public static final HazardHexside TOWER = new HazardHexside( "Tower", 'w', EffectOnMovement.SLOWALL, EffectOnMovement.FREEMOVE, new CombatEffect(EffectOnStrike.SKILLBONUS, ScopeOfEffectOnStrike.ALL, 1), new CombatEffect(EffectOnStrike.SKILLPENALTY, ScopeOfEffectOnStrike.ALL, 1), new CombatEffect(EffectOnStrike.SKILLPENALTY, ScopeOfEffectOnStrike.ALL, 1), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), RangeStrikeSpecialEffect.RANGESTRIKEWALL, SpecialEffect.NOSPECIAL); // TODO Verify public static final HazardHexside RIVER = new HazardHexside( "River", 'r', EffectOnMovement.BLOCKFOREIGNER, EffectOnMovement.FREEMOVE, new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), new CombatEffect(EffectOnStrike.NOEFFECT, ScopeOfEffectOnStrike.ALL, 0), RangeStrikeSpecialEffect.RANGESTRIKEFREE, SpecialEffect.NOSPECIAL); @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("+++++++++++++++++++++++++++\n"); builder.append(getName()); builder.append(":\n"); return builder.toString(); } // TODO use combat bonus tables instead of hardcoded those three // (created as result of char-to-HazardHexside refactoring) public boolean isNativeBonusHexside() { if (this == HazardHexside.TOWER || this == HazardHexside.SLOPE || this == HazardHexside.DUNE) { return true; } else { return false; } } // TODO use combat bonus tables instead of hardcoded those three // (created as result of char-to-HazardHexside refactoring) // TODO right now, this is identical behavior as "isNativeBonusHexside()" public boolean isNonNativePenaltyHexside() { if (this == HazardHexside.TOWER || this == HazardHexside.SLOPE || this == HazardHexside.DUNE) { return true; } else { return false; } } }