package com.lateensoft.pathfinder.toolkit.model.character.stats; import android.os.Parcel; import android.os.Parcelable; public class CombatStatSet implements Parcelable { public static final AbilityType DEFAULT_INIT_ABILITY = AbilityType.DEX; public static final AbilityType DEFAULT_AC_ABILITY = AbilityType.DEX; public static final AbilityType DEFAULT_CMB_ABILITY = AbilityType.STR; public static final AbilityType DEFAULT_CMD_ABILITY = AbilityType.DEX; private int m_totalHP; private int m_wounds; private int m_nonLethalDamage; private int m_damageReduction; private int m_baseSpeedFt; //may need other for speed /** Defaulted to dex */ private AbilityType initAbility; private int m_initMiscMod; private int m_ACArmour; private int m_ACShield; /** Defaulted to dex */ private AbilityType ACAbility; private int m_sizeMod; private int m_ACNaturalArmour; private int m_deflectionMod; private int m_ACMiscMod; private int m_spellResist; private int m_BABPrimary; private String m_BABSecondary; /** Defaulted to strength */ private AbilityType CMBAbility; /** Defaulted to dex */ private AbilityType CMDAbility; private int m_CMDMiscMod; public CombatStatSet(){ m_totalHP = 0; m_wounds = 0; m_nonLethalDamage = 0; m_damageReduction = 0; m_baseSpeedFt = 0; initAbility = DEFAULT_INIT_ABILITY; m_initMiscMod = 0; m_ACArmour = 0; m_ACShield = 0; ACAbility = DEFAULT_AC_ABILITY; m_sizeMod = 0; m_ACNaturalArmour = 0; m_deflectionMod = 0; m_ACMiscMod = 0; m_BABPrimary = 0; m_BABSecondary = ""; CMBAbility = DEFAULT_CMB_ABILITY; CMDAbility = DEFAULT_CMD_ABILITY; m_CMDMiscMod = 0; m_spellResist = 0; } public CombatStatSet(Parcel in) { m_totalHP = in.readInt(); m_wounds = in.readInt(); m_nonLethalDamage = in.readInt(); m_damageReduction = in.readInt(); m_baseSpeedFt = in.readInt(); initAbility = AbilityType.forKey(in.readInt()); m_initMiscMod = in.readInt(); m_ACArmour = in.readInt(); m_ACShield = in.readInt(); ACAbility = AbilityType.forKey(in.readInt()); m_sizeMod = in.readInt(); m_ACNaturalArmour = in.readInt(); m_deflectionMod = in.readInt(); m_ACMiscMod = in.readInt(); m_BABPrimary = in.readInt(); m_BABSecondary = in.readString(); CMBAbility = AbilityType.forKey(in.readInt()); CMDAbility = AbilityType.forKey(in.readInt()); m_CMDMiscMod = in.readInt(); m_spellResist = in.readInt(); } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(m_totalHP); out.writeInt(m_wounds); out.writeInt(m_nonLethalDamage); out.writeInt(m_damageReduction); out.writeInt(m_baseSpeedFt); out.writeInt(initAbility.getKey()); out.writeInt(m_initMiscMod); out.writeInt(m_ACArmour); out.writeInt(m_ACShield); out.writeInt(ACAbility.getKey()); out.writeInt(m_sizeMod); out.writeInt(m_ACNaturalArmour); out.writeInt(m_deflectionMod); out.writeInt(m_ACMiscMod); out.writeInt(m_BABPrimary); out.writeString(m_BABSecondary); out.writeInt(CMBAbility.getKey()); out.writeInt(CMDAbility.getKey()); out.writeInt(m_CMDMiscMod); out.writeInt(m_spellResist); } public void setTotalHP(int totalHP){ m_totalHP = totalHP; } public int getTotalHP(){ return m_totalHP; } public void setWounds(int wounds){ m_wounds = wounds; } public int getWounds(){ return m_wounds; } public void setNonLethalDamage(int nonlethalDamage){ m_nonLethalDamage = nonlethalDamage; } public int getNonLethalDamage(){ return m_nonLethalDamage; } public int getCurrentHP(){ return m_totalHP - m_wounds - m_nonLethalDamage; } public void setDamageReduction(int damageReduction){ m_damageReduction = damageReduction; } public int getDamageReduction(){ return m_damageReduction; } public void setBaseSpeed(int baseSpeedInFeet){ m_baseSpeedFt = baseSpeedInFeet; } public int getBaseSpeed(){ return m_baseSpeedFt; } public void setInitAbility(AbilityType ability){ initAbility = ability; } public AbilityType getInitAbility(){ return initAbility; } public void setInitiativeMiscMod(int initMiscMod){ m_initMiscMod = initMiscMod; } public int getInitiativeMiscMod(){ return m_initMiscMod; } /** * @param abilitySet * @return the totalled initiative mod, using the values in abilitySet */ public int getInitiativeMod(AbilitySet abilitySet, int maxDex){ return abilitySet.getTotalAbilityMod(initAbility, maxDex) + m_initMiscMod; } public void setACArmourBonus(int armourBonus){ m_ACArmour = armourBonus; } public int getACArmourBonus(){ return m_ACArmour; } public void setACShieldBonus(int shieldBonus){ m_ACShield = shieldBonus; } public int getACShieldBonus(){ return m_ACShield; } public void setACAbility(AbilityType abilityKey){ ACAbility = abilityKey; } public AbilityType getACAbility(){ return ACAbility; } public void setSizeModifier(int sizeMod){ m_sizeMod = sizeMod; } public int getSizeModifier(){ return m_sizeMod; } public void setNaturalArmour(int naturalArmour){ m_ACNaturalArmour = naturalArmour; } public int getNaturalArmour(){ return m_ACNaturalArmour; } public void setDeflectionMod(int deflectionMod){ m_deflectionMod = deflectionMod; } public int getDeflectionMod(){ return m_deflectionMod; } public void setACMiscMod(int miscMod){ m_ACMiscMod = miscMod; } public int getACMiscMod(){ return m_ACMiscMod; } /** * * @return the net AC of the character. This is 10 + armour + shield + dexmod + sizemod + natural + defect + misc */ public int getTotalAC(AbilitySet abilitySet, int maxDex){ return 10 + m_ACArmour + m_ACShield + abilitySet.getTotalAbilityMod(ACAbility, maxDex) + m_sizeMod + m_ACNaturalArmour + m_deflectionMod + m_ACMiscMod; } /** * * @return the touch AC of the character. This is 10 + dexmod + sizemod + defect + misc */ public int getTouchAC(AbilitySet abilitySet, int maxDex){ return 10 + abilitySet.getTotalAbilityMod(ACAbility, maxDex) + m_sizeMod + m_deflectionMod + m_ACMiscMod; } /** * * @return the touch AC of the character. This is normal AC without dex */ public int getFlatFootedAC(){ return 10 + m_ACArmour + m_ACShield + m_sizeMod + m_ACNaturalArmour + m_deflectionMod + m_ACMiscMod; } /** * Used to set the Base Attack Bonus for first attack. Sometimes referred to as "full" BAB * @param BABPrimary */ public void setBABPrimary(int BABPrimary){ m_BABPrimary = BABPrimary; } public int getBABPrimary(){ return m_BABPrimary; } /** * Sets the representation of the Base Attack Bonus for attacks after the first. * If a character has a BAB of x/y/z, this should be in the format of y/z * @param BABSecondary */ public void setBABSecondary(String BABSecondary){ if(BABSecondary != null) m_BABSecondary = BABSecondary; } public String getBABSecondary(){ return m_BABSecondary; } public void setCMBAbility(AbilityType abilityKey){ CMBAbility = abilityKey; } public AbilityType getCMBAbility(){ return CMBAbility; } public void setCMDAbility(AbilityType abilityKey){ CMDAbility = abilityKey; } public AbilityType getCMDAbility(){ return CMDAbility; } public void setSpellResistance(int spellResist){ m_spellResist = spellResist; } public int getSpellResist(){ return m_spellResist; } public int getCMDMiscMod(){ return m_CMDMiscMod; } public void setCMDMiscMod(int miscMod){ m_CMDMiscMod = miscMod; } /** * * @return CMB = BAB + Strength mod - size mod */ public int getCombatManeuverBonus(AbilitySet abilitySet, int maxDex){ return m_BABPrimary + abilitySet.getTotalAbilityMod(CMBAbility, maxDex) - m_sizeMod; } /** * * @return CMD = BAB + Strength mod - size mod + dex mod + 10 + misc mod */ public int getCombatManeuverDefense(AbilitySet abilitySet, int maxDex){ return getCombatManeuverBonus(abilitySet, maxDex) + abilitySet.getTotalAbilityMod(CMDAbility, maxDex) + m_CMDMiscMod + 10; } @Override public int describeContents() { return 0; } public static final Parcelable.Creator<CombatStatSet> CREATOR = new Parcelable.Creator<CombatStatSet>() { public CombatStatSet createFromParcel(Parcel in) { return new CombatStatSet(in); } public CombatStatSet[] newArray(int size) { return new CombatStatSet[size]; } }; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof CombatStatSet)) return false; CombatStatSet that = (CombatStatSet) o; if (ACAbility != that.ACAbility) return false; if (m_ACArmour != that.m_ACArmour) return false; if (m_ACMiscMod != that.m_ACMiscMod) return false; if (m_ACNaturalArmour != that.m_ACNaturalArmour) return false; if (m_ACShield != that.m_ACShield) return false; if (m_BABPrimary != that.m_BABPrimary) return false; if (CMBAbility != that.CMBAbility) return false; if (CMDAbility != that.CMDAbility) return false; if (m_CMDMiscMod != that.m_CMDMiscMod) return false; if (m_baseSpeedFt != that.m_baseSpeedFt) return false; if (m_damageReduction != that.m_damageReduction) return false; if (m_deflectionMod != that.m_deflectionMod) return false; if (initAbility != that.initAbility) return false; if (m_initMiscMod != that.m_initMiscMod) return false; if (m_nonLethalDamage != that.m_nonLethalDamage) return false; if (m_sizeMod != that.m_sizeMod) return false; if (m_spellResist != that.m_spellResist) return false; if (m_totalHP != that.m_totalHP) return false; if (m_wounds != that.m_wounds) return false; if (!m_BABSecondary.equals(that.m_BABSecondary)) return false; return true; } @Override public int hashCode() { int result = m_totalHP; result = 31 * result + m_wounds; result = 31 * result + m_nonLethalDamage; result = 31 * result + m_damageReduction; result = 31 * result + m_baseSpeedFt; result = 31 * result + initAbility.getKey(); result = 31 * result + m_initMiscMod; result = 31 * result + m_ACArmour; result = 31 * result + m_ACShield; result = 31 * result + ACAbility.getKey(); result = 31 * result + m_sizeMod; result = 31 * result + m_ACNaturalArmour; result = 31 * result + m_deflectionMod; result = 31 * result + m_ACMiscMod; result = 31 * result + m_spellResist; result = 31 * result + m_BABPrimary; result = 31 * result + m_BABSecondary.hashCode(); result = 31 * result + CMBAbility.getKey(); result = 31 * result + CMDAbility.getKey(); result = 31 * result + m_CMDMiscMod; return result; } }