package com.lateensoft.pathfinder.toolkit.serialize; import com.google.common.collect.ImmutableBiMap; import com.lateensoft.pathfinder.toolkit.model.character.stats.AbilityType; import com.lateensoft.pathfinder.toolkit.model.character.stats.CombatStatSet; import org.dom4j.Element; import java.io.InvalidObjectException; /** * @author trevsiemens */ public class CombatStatSetXMLAdapter extends XMLObjectAdapter<CombatStatSet> { public static final String ELEMENT_NAME = "combat-stats"; private static final String HP_ATTR = "total-HP"; private static final String WOUNDS_ATTR = "wounds"; private static final String NON_LETHAL_DMG_ATTR = "non-lethal-dmg"; private static final String DMG_REDUCT_ATTR = "dmg-reduct"; private static final String SPEED_ATTR = "base-spd"; private static final String INIT_ABILITY_ATTR = "init-ability"; private static final String INIT_MISC_ATTR = "init-misc-mod"; private static final String AC_ARMOR_ATTR = "AC-armour"; private static final String AC_SHIELD_ATTR = "AC-shield"; private static final String AC_ABILITY_ATTR = "AC-ability"; private static final String SIZE_ATTR = "size-mod"; private static final String AC_NATURAL_ATTR = "AC-natural-armour"; private static final String DEFLECT_ATTR = "deflect-mod"; private static final String AC_MISC_ATTR = "AC-misc-mod"; private static final String SPELL_RESIST_ATTR = "spell-resist"; private static final String BAB_P_ATTR = "BAB-primary"; private static final String BAB_S_ATTR = "BAB-secondary"; private static final String CMB_ABILITY_ATTR = "CMB-ability"; private static final String CMD_ABILITY_ATTR = "CMD-ability"; private static final String CMD_MISC_ATTR = "CMD-misc-mod"; @Override public String getElementName() { return ELEMENT_NAME; } @Override protected CombatStatSet createObjectForElement(Element element) throws InvalidObjectException { ImmutableBiMap<String, AbilityType> abilityStringsToKeys = AbilityXMLAdapter.ABILITY_TYPE_STRINGS.inverse(); CombatStatSet combatStats = new CombatStatSet(); combatStats.setTotalHP(getIntAttribute(element, HP_ATTR)); combatStats.setWounds(getIntAttribute(element, WOUNDS_ATTR)); combatStats.setNonLethalDamage(getIntAttribute(element, NON_LETHAL_DMG_ATTR)); combatStats.setDamageReduction(getIntAttribute(element, DMG_REDUCT_ATTR)); combatStats.setBaseSpeed(getIntAttribute(element, SPEED_ATTR)); combatStats.setInitAbility(getAbilityKey(abilityStringsToKeys, getStringAttribute(element, INIT_ABILITY_ATTR))); combatStats.setInitiativeMiscMod(getIntAttribute(element, INIT_MISC_ATTR)); combatStats.setACArmourBonus(getIntAttribute(element, AC_ARMOR_ATTR)); combatStats.setACShieldBonus(getIntAttribute(element, AC_SHIELD_ATTR)); combatStats.setACAbility(getAbilityKey(abilityStringsToKeys, getStringAttribute(element, AC_ABILITY_ATTR))); combatStats.setSizeModifier(getIntAttribute(element, SIZE_ATTR)); combatStats.setNaturalArmour(getIntAttribute(element, AC_NATURAL_ATTR)); combatStats.setDeflectionMod(getIntAttribute(element, DEFLECT_ATTR)); combatStats.setACMiscMod(getIntAttribute(element, AC_MISC_ATTR)); combatStats.setSpellResistance(getIntAttribute(element, SPELL_RESIST_ATTR)); combatStats.setBABPrimary(getIntAttribute(element, BAB_P_ATTR)); if (element.attribute(BAB_S_ATTR) != null) { combatStats.setBABSecondary(getStringAttribute(element, BAB_S_ATTR)); } combatStats.setCMBAbility(getAbilityKey(abilityStringsToKeys, getStringAttribute(element, CMB_ABILITY_ATTR))); combatStats.setCMDAbility(getAbilityKey(abilityStringsToKeys, getStringAttribute(element, CMD_ABILITY_ATTR))); combatStats.setCMDMiscMod(getIntAttribute(element, CMD_MISC_ATTR)); return combatStats; } @Override protected void setElementContentForObject(Element element, CombatStatSet combatStats) { element.addAttribute(HP_ATTR, Integer.toString(combatStats.getTotalHP())); element.addAttribute(WOUNDS_ATTR, Integer.toString(combatStats.getWounds())); element.addAttribute(NON_LETHAL_DMG_ATTR, Integer.toString(combatStats.getNonLethalDamage())); element.addAttribute(DMG_REDUCT_ATTR, Integer.toString(combatStats.getDamageReduction())); element.addAttribute(SPEED_ATTR, Integer.toString(combatStats.getBaseSpeed())); element.addAttribute(INIT_ABILITY_ATTR, AbilityXMLAdapter.ABILITY_TYPE_STRINGS.get(combatStats.getInitAbility())); element.addAttribute(INIT_MISC_ATTR, Integer.toString(combatStats.getInitiativeMiscMod())); element.addAttribute(AC_ARMOR_ATTR, Integer.toString(combatStats.getACArmourBonus())); element.addAttribute(AC_SHIELD_ATTR, Integer.toString(combatStats.getACShieldBonus())); element.addAttribute(AC_ABILITY_ATTR, AbilityXMLAdapter.ABILITY_TYPE_STRINGS.get(combatStats.getACAbility())); element.addAttribute(SIZE_ATTR, Integer.toString(combatStats.getSizeModifier())); element.addAttribute(AC_NATURAL_ATTR, Integer.toString(combatStats.getNaturalArmour())); element.addAttribute(DEFLECT_ATTR, Integer.toString(combatStats.getDeflectionMod())); element.addAttribute(AC_MISC_ATTR, Integer.toString(combatStats.getACMiscMod())); element.addAttribute(SPELL_RESIST_ATTR, Integer.toString(combatStats.getSpellResist())); element.addAttribute(BAB_P_ATTR, Integer.toString(combatStats.getBABPrimary())); element.addAttribute(BAB_S_ATTR, combatStats.getBABSecondary()); element.addAttribute(CMB_ABILITY_ATTR, AbilityXMLAdapter.ABILITY_TYPE_STRINGS.get(combatStats.getCMBAbility())); element.addAttribute(CMD_ABILITY_ATTR, AbilityXMLAdapter.ABILITY_TYPE_STRINGS.get(combatStats.getCMDAbility())); element.addAttribute(CMD_MISC_ATTR, Integer.toString(combatStats.getCMDMiscMod())); } private AbilityType getAbilityKey(ImmutableBiMap<String, AbilityType> abilityStringsToKeys, String abilityString) throws InvalidObjectException { AbilityType abilityKey = abilityStringsToKeys.get(abilityString); if (abilityKey == null) { throw new InvalidObjectException("Invalid ability \"" + abilityString + "\" in combat stats"); } return abilityKey; } }