From: <th...@us...> - 2008-05-25 02:22:16
|
Revision: 6353 http://pcgen.svn.sourceforge.net/pcgen/?rev=6353&view=rev Author: thpr Date: 2008-05-24 19:22:21 -0700 (Sat, 24 May 2008) Log Message: ----------- Partial conversion of Equipment Modifier Tokens Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/SpecialAbility.java Trunk/pcgen/code/src/java/pcgen/core/SpecialProperty.java Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/EquipmentModifierLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ArmortypeToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/AssigntoallToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ChargesToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostdoubleToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/FormatcatToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/FumblerangeToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ItypeToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/NameoptToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/PlusToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ReplacesToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/SpropToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/VisibleToken.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/ACTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/testsupport/AbstractTypeSafeListTestCase.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/content/Modifier.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModFormatCat.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/ Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/ArmortypeTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/AssignToAllTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/ChargesTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/CostdoubleTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/FormatcatTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/FumblerangeTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/ItypeTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/NameoptTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/PlusTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/ReplacesTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/SPropTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipmentmodifier/VisibleTokenTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -305,4 +305,5 @@ String LST_ANY = "ANY"; String LST_DOT_CLEAR_DOT = ".CLEAR."; String ALLREF_LST = "ANY"; + String DOT = "."; } Added: Trunk/pcgen/code/src/java/pcgen/cdom/content/Modifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/Modifier.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/Modifier.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -0,0 +1,27 @@ +/* + * Copyright 2007 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.content; + +public interface Modifier<T> +{ + + public T applyModifier(T obj); + + public Class<T> getModifiedClass(); + +} Added: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModFormatCat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModFormatCat.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModFormatCat.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -0,0 +1,25 @@ +/* + * Copyright 2007 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.enumeration; + +public enum EqModFormatCat +{ + + FRONT, MIDDLE, PARENS; + +} Added: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -0,0 +1,155 @@ +/* + * Copyright 2007 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.enumeration; + +import java.util.List; + +import pcgen.base.lang.StringUtil; +import pcgen.cdom.base.Constants; +import pcgen.core.AssociatedChoice; +import pcgen.core.EquipmentModifier; +import pcgen.core.Globals; +import pcgen.core.SettingsHandler; +import pcgen.core.spell.Spell; +import pcgen.core.utils.CoreUtility; + +public enum EqModNameOpt +{ + + /* + * NORMAL: the name with a list of choices in parenthesis + * + * NOTHING: a blank string + * + * NOLIST: just the name of the object + * + * NONAME: just the list of choices + * + * SPELL: treats the first entry in associated as a spell, outputs the + * details + */ + NORMAL + { + @Override + public String returnName(EquipmentModifier mod) + { + StringBuilder sb = new StringBuilder(100); + sb.append(mod.getDisplayName()); + sb.append(" ("); + sb.append(mod.associatedList()); + sb.append(')'); + return sb.toString().trim().replace('|', ' '); + } + }, + NOLIST + { + @Override + public String returnName(EquipmentModifier mod) + { + return mod.getDisplayName().toString().trim().replace('|', ' '); + } + }, + NONAME + { + @Override + public String returnName(EquipmentModifier mod) + { + StringBuilder sb = new StringBuilder(100); + sb.append(mod.getDisplayName()); + sb.append(mod.associatedList()); + return sb.toString().trim().replace('|', ' '); + } + }, + NOTHING + { + @Override + public String returnName(EquipmentModifier mod) + { + return Constants.EMPTY_STRING; + } + }, + SPELL + { + @Override + public String returnName(EquipmentModifier mod) + { + StringBuilder sb = new StringBuilder(100); + boolean first = true; + for (AssociatedChoice<String> a : mod.getAssociatedList()) + { + if (!first) + { + sb.append(", "); + } + first = false; + String listEntry = a.getDefaultChoice(); + + String spellName = EquipmentModifier.getSpellInfoString( + listEntry, "SPELLNAME"); + + if (SettingsHandler.guiUsesOutputNameSpells()) + { + final Spell aSpell = Globals.getSpellKeyed(spellName); + + if (aSpell != null) + { + spellName = aSpell.getOutputName(); + } + } + + sb.append(spellName); + + final String info = EquipmentModifier.getSpellInfoString( + listEntry, "VARIANT"); + + if (info.length() != 0) + { + sb.append(" (").append(info).append(')'); + } + + String metaFeat = EquipmentModifier.getSpellInfoString( + listEntry, "METAFEATS"); + List<String> metaFeats = CoreUtility.split(metaFeat, ','); + + if (!metaFeats.isEmpty()) + { + sb.append('/').append(StringUtil.join(metaFeats, "/")); + } + + sb.append('/').append( + EquipmentModifier.getSpellInfoString(listEntry, + "CASTER")); + sb.append('/').append( + CoreUtility.ordinal(EquipmentModifier.getSpellInfo( + listEntry, "CASTERLEVEL"))); + } + + return sb.toString().trim().replace('|', ' '); + } + }, + TEXT + { + @Override + public String returnName(EquipmentModifier mod) + { + return mod.get(StringKey.NAME_TEXT); + } + }; + + public abstract String returnName(EquipmentModifier mod); +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -30,5 +30,5 @@ */ public enum IntegerKey { - ADD_SPELL_LEVEL, FORMAT_CAT, HIT_DIE, LEVEL, NUM_PAGES, RANK, HANDS, REACH, LEGS, BONUS_FEATS, BONUS_CLASS_SKILL_POINTS, NONPP, XP_COST, PP_COST, SKILL_POINTS_PER_LEVEL, INITIAL_SKILL_MULT, CRIT_MULT, CRIT_RANGE, REACH_MULT, RANGE, SLOTS, MAX_DEX, AC_CHECK, SPELL_FAILURE, BASE_QUANTITY, EDR; + ADD_SPELL_LEVEL, FORMAT_CAT, HIT_DIE, LEVEL, NUM_PAGES, RANK, HANDS, REACH, LEGS, BONUS_FEATS, BONUS_CLASS_SKILL_POINTS, NONPP, XP_COST, PP_COST, SKILL_POINTS_PER_LEVEL, INITIAL_SKILL_MULT, PLUS, MIN_CHARGES, MAX_CHARGES, CRIT_MULT, CRIT_RANGE, REACH_MULT, RANGE, SLOTS, MAX_DEX, AC_CHECK, SPELL_FAILURE, BASE_QUANTITY, EDR; } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -28,10 +28,14 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.list.ClassSkillList; +import pcgen.cdom.modifier.ChangeArmorType; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability; import pcgen.core.Equipment; +import pcgen.core.EquipmentModifier; import pcgen.core.Language; import pcgen.core.SpecialAbility; +import pcgen.core.SpecialProperty; import pcgen.core.WeaponProf; import pcgen.core.bonus.BonusObj; import pcgen.persistence.lst.CampaignSourceEntry; @@ -162,6 +166,10 @@ public static final ListKey<String> PROHIBITED_ITEM = new ListKey<String>(); public static final ListKey<String> ITEM = new ListKey<String>(); public static final ListKey<Integer> HITDICE_ADVANCEMENT = new ListKey<Integer>(); + public static final ListKey<String> ITEM_TYPES = new ListKey<String>(); + public static final ListKey<CDOMSingleRef<EquipmentModifier>> REPLACED_KEYS = new ListKey<CDOMSingleRef<EquipmentModifier>>(); + public static final ListKey<SpecialProperty> SPECIAL_PROPERTIES = new ListKey<SpecialProperty>(); + public static final ListKey<ChangeArmorType> ARMORTYPE = new ListKey<ChangeArmorType>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -99,6 +99,14 @@ public static final ObjectKey<PCStat> SPELL_STAT = new ObjectKey<PCStat>(); + public static final ObjectKey<Boolean> COST_DOUBLE = new ObjectKey<Boolean>(); + + public static final ObjectKey<Boolean> ASSIGN_TO_ALL = new ObjectKey<Boolean>(); + + public static final ObjectKey<EqModNameOpt> NAME_OPT = new ObjectKey<EqModNameOpt>(); + + public static final ObjectKey<EqModFormatCat> FORMAT = new ObjectKey<EqModFormatCat>(); + public static final ObjectKey<Boolean> ATTACKS_PROGRESS = new ObjectKey<Boolean>(); public static final ObjectKey<WieldCategory> WIELD = new ObjectKey<WieldCategory>(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -30,5 +30,5 @@ */ public enum StringKey { - NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, RACIAL_FAVORED_CLASS, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE + NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, RACIAL_FAVORED_CLASS, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE } Added: Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -0,0 +1,114 @@ +/* + * Copyright 2007 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.modifier; + +import java.util.ArrayList; +import java.util.List; + +import pcgen.cdom.base.ConcretePrereqObject; +import pcgen.cdom.base.LSTWriteable; +import pcgen.cdom.content.Modifier; + +public class ChangeArmorType extends ConcretePrereqObject implements + Modifier<String>, LSTWriteable +{ + + private final String source; + private final String result; + + public ChangeArmorType(String sourceType, String resultType) + { + if (sourceType == null) + { + throw new IllegalArgumentException( + "Source Type for ChangeArmorType cannot be null"); + } + // if (resultType == null) + // { + // throw new IllegalArgumentException( + // "Resulting Type for ChangeArmorType cannot be null"); + // } + result = resultType; + source = sourceType; + } + + public String applyModifier(String obj) + { + return source.equals(obj) ? result : obj; + } + + public Class<String> getModifiedClass() + { + return String.class; + } + + public String getSourceType() + { + return source; + } + + public String getResultType() + { + return result; + } + + @Override + public int hashCode() + { + return 31 * source.hashCode() + result.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (!(o instanceof ChangeArmorType)) + { + return false; + } + ChangeArmorType other = (ChangeArmorType) o; + if (result == null) + { + return other.result == null; + } + return result.equals(other.result) && source.equals(other.source); + } + + public String getLSTformat() + { + // TODO Don't like this = fix Generics in GraphChanges + return ""; + } + + public List<String> applyModifier(List<String> calculatedTypeList) + { + List<String> returnList = new ArrayList<String>(); + for (String type : calculatedTypeList) + { + String mod = applyModifier(type); + if (mod != null) + { + returnList.add(mod); + } + } + return returnList; + } +} Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -44,10 +44,14 @@ import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.EqModControl; +import pcgen.cdom.enumeration.EqModFormatCat; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.inst.EquipmentHead; +import pcgen.cdom.modifier.ChangeArmorType; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.bonus.BonusObj; import pcgen.core.character.WieldCategory; import pcgen.core.prereq.PrereqHandler; @@ -262,7 +266,7 @@ private String weaponProf; private String shieldProf; private String armorProf; - + { final SizeAdjustment sizeAdj = SettingsHandler.getGame() .getDefaultSizeAdjustment(); @@ -634,13 +638,19 @@ */ public String getFumbleRange() { for (EquipmentModifier eqMod : getEqModifierList(true)) { - if (eqMod.getFumbleRange().length() > 0) - return eqMod.getFumbleRange(); + String fr = eqMod.get(StringKey.FUMBLE_RANGE); + if (fr != null) + { + return fr; + } } for (EquipmentModifier eqMod : getEqModifierList(false)) { - if (eqMod.getFumbleRange().length() > 0) - return eqMod.getFumbleRange(); + String fr = eqMod.get(StringKey.FUMBLE_RANGE); + if (fr != null) + { + return fr; + } } String fr = get(StringKey.FUMBLE_RANGE); @@ -1197,10 +1207,11 @@ final StringBuffer itemName = new StringBuffer(); // Add in front eq mods + int fcf = EqModFormatCat.FRONT.ordinal(); String eqmodDesc = buildEqModDesc( - commonListByFC[EquipmentModifier.FORMATCAT_FRONT], - modListByFC[EquipmentModifier.FORMATCAT_FRONT], - altModListByFC[EquipmentModifier.FORMATCAT_FRONT]); + commonListByFC[fcf], + modListByFC[fcf], + altModListByFC[fcf]); itemName.append(eqmodDesc); if (itemName.length() > 0) { itemName.append(' '); @@ -1218,10 +1229,11 @@ } // Add in middle mods + int fcm = EqModFormatCat.MIDDLE.ordinal(); eqmodDesc = buildEqModDesc( - commonListByFC[EquipmentModifier.FORMATCAT_MIDDLE], - modListByFC[EquipmentModifier.FORMATCAT_MIDDLE], - altModListByFC[EquipmentModifier.FORMATCAT_MIDDLE]); + commonListByFC[fcm], + modListByFC[fcm], + altModListByFC[fcm]); if (eqmodDesc.length() > 0) { itemName.append(' ').append(eqmodDesc); } @@ -1257,10 +1269,11 @@ } // Put in parens mods + int fcp = EqModFormatCat.PARENS.ordinal(); eqmodDesc = buildEqModDesc( - commonListByFC[EquipmentModifier.FORMATCAT_PARENS], - modListByFC[EquipmentModifier.FORMATCAT_PARENS], - altModListByFC[EquipmentModifier.FORMATCAT_PARENS]); + commonListByFC[fcp], + modListByFC[fcp], + altModListByFC[fcp]); itemName.append(eqmodDesc); // @@ -1429,10 +1442,10 @@ */ public int getMaxCharges() { for (EquipmentModifier eqMod : getEqModifierList(true)) { - final int maxCharges = eqMod.getMaxCharges(); - - if (maxCharges > 0) { - return maxCharges; + Integer max = eqMod.get(IntegerKey.MAX_CHARGES); + if (max != null && max > 0) + { + return max; } } @@ -1472,10 +1485,10 @@ */ public int getMinCharges() { for (EquipmentModifier eqMod : getEqModifierList(true)) { - final int minCharges = eqMod.getMinCharges(); - - if (minCharges > 0) { - return minCharges; + Integer min = eqMod.get(IntegerKey.MIN_CHARGES); + if (min != null) + { + return min; } } @@ -1889,7 +1902,8 @@ */ public void setRemainingCharges(final int remainingCharges) { for (EquipmentModifier eqMod : getEqModifierList(true)) { - if (eqMod.getMinCharges() > 0) { + Integer min = eqMod.get(IntegerKey.MIN_CHARGES); + if (min != null && min > 0) { eqMod.setRemainingCharges(remainingCharges); } } @@ -1902,7 +1916,8 @@ */ public int getRemainingCharges() { for (EquipmentModifier eqMod : getEqModifierList(true)) { - if (eqMod.getMinCharges() > 0) { + Integer min = eqMod.get(IntegerKey.MIN_CHARGES); + if (min != null && min > 0) { return eqMod.getRemainingCharges(); } } @@ -2105,7 +2120,8 @@ */ public int getUsedCharges() { for (EquipmentModifier eqMod : getEqModifierList(true)) { - if (eqMod.getMinCharges() > 0) { + Integer min = eqMod.get(IntegerKey.MIN_CHARGES); + if (min != null && min > 0) { return eqMod.getUsedCharges(); } } @@ -2375,8 +2391,9 @@ if (eqMod.getChoiceString().length() != 0) { while (aTok.hasMoreTokens()) { final String x = aTok.nextToken(); - if (eqMod.getMinCharges() > 0 - || (eqMod.getChoiceString().startsWith("EQBUILDER") && !isLoading)) + Integer min = eqMod.get(IntegerKey.MIN_CHARGES); + if (min != null && min > 0 + || (eqMod.getChoiceString().startsWith("EQBUILDER") && !isLoading)) { // We clear the associated info to avoid a buildup of info // like number of charges. @@ -2436,22 +2453,31 @@ return; } - // - // Remove any modifiers that this one will replace - // + List<CDOMSingleRef<EquipmentModifier>> replaces = eqMod.getListFor(ListKey.REPLACED_KEYS); List<EquipmentModifier> eqModList = getEqModifierList(bPrimary); - for (int i = eqModList.size() - 1; i >= 0; --i) { - final EquipmentModifier aMod = eqModList.get(i); - - if (eqMod.willReplace(aMod.getKeyName())) { - eqModList.remove(i); - if (bPrimary) { - typeListCachePrimary = null; - } else { - typeListCacheSecondary = null; + if (replaces != null) + { + // + // Remove any modifiers that this one will replace + // + for (CDOMSingleRef<EquipmentModifier> ref : replaces) + { + EquipmentModifier mod = ref.resolvesTo(); + String key = mod.getKeyName(); + for (int i = eqModList.size() - 1; i >= 0; --i) { + final EquipmentModifier aMod = eqModList.get(i); + if (key.equalsIgnoreCase(aMod.getKeyName())) + { + eqModList.remove(i); + if (bPrimary) { + typeListCachePrimary = null; + } else { + typeListCacheSecondary = null; + } + setDirty(true); + } } - setDirty(true); } } @@ -2670,12 +2696,7 @@ final List<EquipmentModifier> eqModList = getEqModifierList(bPrimary); for (EquipmentModifier eqMod : eqModList) { - // Only add bonuses for items that are not ignored. - // eg. Masterwork is ignored for Adamantine - // - if (!willIgnore(eqMod.getKeyName(), bPrimary)) { - eqMod.bonusTo(aPC, aType, aName, this); - } + eqMod.bonusTo(aPC, aType, aName, this); } for (String key : getBonusMap().keySet()) { @@ -4666,7 +4687,7 @@ * @return An array of equipmod lists. */ private List<EquipmentModifier>[] initSplitModList() { - List<EquipmentModifier>[] modListArray = new List[EquipmentModifier.FORMATCAT_PARENS + 1]; + List<EquipmentModifier>[] modListArray = new List[EqModFormatCat.values().length]; for (int i = 0; i < modListArray.length; i++) { modListArray[i] = new ArrayList<EquipmentModifier>(); @@ -4850,42 +4871,45 @@ final List<EquipmentModifier> eqModList = getEqModifierList(bPrimary); for (EquipmentModifier eqMod : eqModList) { - if (!willIgnore(eqMod.getKeyName(), bPrimary)) { - // - // If we've just replaced the armor type, then make sure it is - // not in the equipment modifier list - // - final String armorType = eqMod - .replaceArmorType(calculatedTypeList); + // + // If we've just replaced the armor type, then make sure it is + // not in the equipment modifier list + // + List<String> newTypeList = new ArrayList<String>(calculatedTypeList); + for (ChangeArmorType cat : eqMod.getSafeListFor(ListKey.ARMORTYPE)) + { + List<String> tempTypeList = cat.applyModifier(newTypeList); + boolean noMatch = newTypeList.size() != tempTypeList.size() + || tempTypeList.equals(newTypeList); + newTypeList = tempTypeList; + if (!noMatch) + { + break; + } + } + List<String> removedTypeList = new ArrayList<String>(calculatedTypeList); + removedTypeList.removeAll(newTypeList); + modTypeList.removeAll(removedTypeList); - if (armorType != null) { - final int idx = modTypeList.indexOf(armorType); + for (String aType : eqMod.getSafeListFor(ListKey.ITEM_TYPES)) + { + aType = aType.toUpperCase(); - if (idx >= 0) { - modTypeList.remove(idx); - } + // If it's BOTH & MELEE, we cannot add RANGED or THROWN to + // it + // BOTH is only used after the split of a Thrown weapon in 2 + // (melee and ranged) + if (calculatedTypeList.contains("BOTH") + && calculatedTypeList.contains("MELEE") + && ("RANGED".equals(aType) || "THROWN".equals(aType))) + { + continue; } - final List<String> eqModTypeList = eqMod.getItemType(); - - for (String aType : eqModTypeList) { - aType = aType.toUpperCase(); - - // If it's BOTH & MELEE, we cannot add RANGED or THROWN to - // it - // BOTH is only used after the split of a Thrown weapon in 2 - // (melee and ranged) - if (calculatedTypeList.contains("BOTH") - && calculatedTypeList.contains("MELEE") - && ("RANGED".equals(aType) || "THROWN" - .equals(aType))) { - continue; - } - - if (!calculatedTypeList.contains(aType) - && !modTypeList.contains(aType)) { - modTypeList.add(aType); - } + if (!calculatedTypeList.contains(aType) + && !modTypeList.contains(aType)) + { + modTypeList.add(aType); } } } @@ -4946,24 +4970,6 @@ } /** - * Description of the Method - * - * @param eqModKey - * Description of the Parameter - * @param bPrimary - * Description of the Parameter - * @return Description of the Return Value - */ - private boolean willIgnore(final String eqModKey, final boolean bPrimary) { - for (EquipmentModifier eqMod : getEqModifierList(bPrimary)) { - if (eqMod.willIgnore(eqModKey)) { - return true; - } - } - return false; - } - - /** * Sets all the BonusObj's to "active". Note this version overrides the * PObject implementation as it will check the bonuses against the * equipment, rather than the PC. Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -32,21 +32,21 @@ import java.util.Set; import java.util.StringTokenizer; -import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.EqModFormatCat; +import pcgen.cdom.enumeration.EqModNameOpt; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.prereq.Prerequisite; import pcgen.core.spell.Spell; -import pcgen.core.utils.CoreUtility; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.util.Delta; -import pcgen.util.Logging; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserInterface; -import pcgen.util.enumeration.Visibility; /** * Definition and games rules for an equipment modifier. @@ -56,33 +56,9 @@ */ public final class EquipmentModifier extends PObject implements Comparable<Object> { - private static final int NAMINGOPTION_NORMAL = 0; - private static final int NAMINGOPTION_NONAME = 1; - private static final int NAMINGOPTION_NOLIST = 2; - private static final int NAMINGOPTION_NOTHING = 3; - private static final int NAMINGOPTION_SPELL = 4; - private static final int NAMINGOPTION_TEXT = 5; - - public static final int FORMATCAT_FRONT = 0; - public static final int FORMATCAT_MIDDLE = 1; - public static final int FORMATCAT_PARENS = 2; - private static final String s_CHARGES = "CHARGES"; - private List<String> ignores = new ArrayList<String>(); - private List<String> itemType = new ArrayList<String>(); - private List<String> replaces = new ArrayList<String>(); - private List<SpecialProperty> specialPropertyList = new ArrayList<SpecialProperty>(); - private List<String> armorType = new ArrayList<String>(); private String cost = "0"; private String preCost = "0"; - private boolean assignToAll = false; - private int costDouble = -1; - private int maxCharges = 0; - private int minCharges = 0; - private int namingOption = NAMINGOPTION_NORMAL; - private String namingOptionText = ""; - private int plus = 0; - private String fumbleRange = ""; /** * returns all BonusObj's that are "active", for example, ones that pass all @@ -101,12 +77,6 @@ for ( BonusObj bonus : getBonusList() ) { - // TODO - This is either wrong or doesn't need to be in the loop. - if (willIgnore(getKeyName())) - { - continue; - } - if (caller instanceof Equipment) { if ( bonus.passesPreReqToGain((Equipment)caller, aPC) ) @@ -126,37 +96,17 @@ } /** - * Add a type to the collection of Armour Types - * - * @param aString the type to add to the collection of Armour Types - */ - public void setArmorType(final String aString) - { - armorType.add(aString.toUpperCase().trim()); - } - - /** * Should this enhancement be applied to both ends of a double weapon? * * @return boolean whether to apply to both ends of a double weapon. */ public boolean getAssignToAll() { - return assignToAll; + Boolean assignToAll = get(ObjectKey.ASSIGN_TO_ALL); + return assignToAll == null ? false : assignToAll; } /** - * Set the assign to all property. When true this object will be applied to - * all heads of a multi headed weapon - * - * @param aString a string beginning with Y to set the property true - */ - public void setAssignment(final String aString) - { - assignToAll = (aString.length() > 0) && (aString.charAt(0) == 'Y'); - } - - /** * This method assumes that there can only be one bonus in any given * Equipment modifier that uses %CHOICE. It retrieves the list of bonuses * using the super classes getBonusList() and then examines each of them in @@ -231,8 +181,7 @@ { if ( (bonus.getTypeOfBonus().indexOf(aType) >= 0) && - (bonus.getBonusInfo().indexOf(aName) >= 0) && - (!willIgnore(getKeyName()))) + (bonus.getBonusInfo().indexOf(aName) >= 0)) { aList.add(bonus); } @@ -263,47 +212,6 @@ } /** - * Takes a string represnting the number of charges. The string is split on - * | and then the first section is converted to an int. The minimum number - * of charges is then set to this int or 0, whichever is greater. If the - * string has a second protion, this is converted to an int and the maximum - * number of charges is set to this second int or it is set the same as the - * minimum charges, whichever is greater - * - * @param charges a string in the form "min" or "min|max" - */ - public void setChargeInfo(final String charges) - { - final StringTokenizer aTok = new StringTokenizer(charges, "|", false); - - try - { - minCharges = Integer.parseInt(aTok.nextToken()); - - if (minCharges < 0) - { - minCharges = 0; - } - - maxCharges = minCharges; - - if (aTok.hasMoreTokens()) - { - maxCharges = Integer.parseInt(aTok.nextToken()); - } - - if (maxCharges < minCharges) - { - maxCharges = minCharges; - } - } - catch (NumberFormatException exc) - { - Logging.errorPrint("Invalid " + s_CHARGES + " tag value: " + charges); - } - } - - /** * set the cost of this object * * @param aString representing the cost @@ -324,90 +232,6 @@ } /** - * Set cost double - * @param costDoubles - */ - public void setCostDouble(final boolean costDoubles) - { - costDouble = costDoubles ? 1 : 0; - } - - /** - * Returns the fumbleRange for this item. - * - * @return the fumbleRange for this item. - */ - public String getFumbleRange() - { - return fumbleRange; - } - - /** - * Sets the fumbleRange for this item. - * - * @param aString the fumbleRange for this item. - */ - public void setFumbleRange(final String aString) - { - fumbleRange = aString; - } - - /** - * Set the list of things to ignore - * - * @param aString a comma separated list of things to ignore - */ - public void setIgnores(final String aString) - { - final StringTokenizer aTok = new StringTokenizer( - aString.toUpperCase().trim(), - ","); - ignores.clear(); - - while (aTok.hasMoreTokens()) - { - final String aReplace = aTok.nextToken(); - - if (!ignores.contains(aReplace)) - { - ignores.add(aReplace); - } - } - } - - /** - * Add one or more types to the object - * - * @param aString a "." separated listof types to add - */ - public void setItemType(final String aString) - { - final String typeString = aString.toUpperCase().trim(); - final StringTokenizer aTok = new StringTokenizer(typeString, "."); - itemType.clear(); - - while (aTok.hasMoreTokens()) - { - final String aType = aTok.nextToken(); - - if (!itemType.contains(aType)) - { - itemType.add(aType); - } - } - } - - /** - * return a list of types - * - * @return a list of this object's types - */ - public List<String> getItemType() - { - return itemType; - } - - /** * Does this Equipment Modifier add aType to the equipment it is applied * to? If aType begins with an " (Exclamation Mark) the " will * be removed before checking the type. @@ -417,110 +241,24 @@ */ public boolean isIType(final String aType) { - final String myType; - - if ((aType.length() > 0) && (aType.charAt(0) == '!')) + for (String s : getSafeListFor(ListKey.ITEM_TYPES)) { - myType = aType.substring(1).toUpperCase(); + if (aType.equalsIgnoreCase(s)) + { + return true; + } } - else - { - myType = aType.toUpperCase(); - } - - return itemType.contains(myType); + return false; } - /** - * Get the maximum number of charges added by this object - * - * @return the maximum number of charges - */ - public int getMaxCharges() - { - return maxCharges; - } - - /** - * Get the minimum number of charges added by this object - * - * @return the minimum number of charges - */ - public int getMinCharges() - { - return minCharges; - } - - /** - * Set the format of the string that this object will stringify to. Valid - * options are "NOLIST", "NONAME", "NOTHING" and "SPELL". If the option - * does not match one of these, then the standard naming convention is - * used. - * - * Standard: the name with a list of choices in parenthesis - * NOTHING: a blank string - * NOLIST: just the name of the object - * NONAME: just the list of choices - * SPELL: treats the first entry in associated as a spell, outputs - * the details - * - * @param option a symbolic constant representing the style of - * stringification. - */ - public void setNamingOption(final String option) - { - namingOptionText = ""; - if ("NOLIST".equalsIgnoreCase(option)) - { - namingOption = NAMINGOPTION_NOLIST; - } - else if ("NONAME".equalsIgnoreCase(option)) - { - namingOption = NAMINGOPTION_NONAME; - } - else if ("NOTHING".equalsIgnoreCase(option)) - { - namingOption = NAMINGOPTION_NOTHING; - } - else if ("SPELL".equalsIgnoreCase(option)) - { - namingOption = NAMINGOPTION_SPELL; - } - else if (option != null && option.toUpperCase().startsWith("TEXT=")) - { - namingOption = NAMINGOPTION_TEXT; - namingOptionText = option.substring(5); - } - else - { - namingOption = NAMINGOPTION_NORMAL; - } - } - - /** - * Set plus - * @param aString - */ - public void setPlus(final String aString) - { - try - { - plus = Integer.parseInt(aString); - } - catch (NumberFormatException nfe) - { - // Ignore - } - } - - /** * Get Plus * @return plus */ public int getPlus() { - return plus; + Integer plus = get(IntegerKey.PLUS); + return plus == null ? 0 : plus; } /** @@ -543,58 +281,6 @@ } /** - * Set replacement - * @param aString - */ - public void setReplacement(final String aString) - { - final StringTokenizer aTok = new StringTokenizer( - aString.toUpperCase().trim(), - ","); - replaces.clear(); - - while (aTok.hasMoreTokens()) - { - final String aReplace = aTok.nextToken(); - - if (!replaces.contains(aReplace)) - { - replaces.add(aReplace); - } - } - } - - /** - * Add special property - * @param sprop - */ - public void addSpecialProperty(final SpecialProperty sprop) - { - specialPropertyList.add(sprop); - } - - public void clearSpecialProperties() - { - specialPropertyList.clear(); - } - - /** - * Get raw special properties - * @return raw special properties - */ - public List<String> getRawSpecialProperties() - { - final List<String> retList = new ArrayList<String>(); - - for ( SpecialProperty sprop : specialPropertyList ) - { - retList.add(sprop.getText()); - } - - return retList; - } - - /** * A list of Special properties tailored to the PC and the piece of * equipment passed as arguments. * @@ -607,10 +293,9 @@ public List<String> getSpecialProperties(final Equipment caller, final PlayerCharacter pc) { final List<String> retList = new ArrayList<String>(); - - for (int i = 0; i < specialPropertyList.size(); i++) + for (SpecialProperty sp : getSafeListFor(ListKey.SPECIAL_PROPERTIES)) { - String propName = specialPropertyList.get(i).getParsedText(pc, caller); + String propName = sp.getParsedText(pc, caller); // TODO WTF is this loop doing? how many times does it expect "%CHOICE" to // appear in the special property? @@ -701,11 +386,6 @@ addAssociated(spellInfo.toString()); } - public void setVisible(Visibility v) - { - visibility = v; - } - /** * Add bonus to * @param aPC @@ -782,11 +462,6 @@ try { aObj = (EquipmentModifier) super.clone(); - aObj.itemType = new ArrayList<String>(itemType); - aObj.specialPropertyList = new ArrayList<SpecialProperty>(specialPropertyList); - aObj.replaces = new ArrayList<String>(replaces); - aObj.ignores = new ArrayList<String>(ignores); - aObj.armorType = new ArrayList<String>(armorType); } catch (CloneNotSupportedException exc) { @@ -805,6 +480,7 @@ * * @return a String representation of the EquipmentModifier */ + @Override public String toString() { return getEquipNamePortion(); @@ -818,94 +494,12 @@ */ public String getEquipNamePortion() { - if (namingOption == NAMINGOPTION_NOTHING) + EqModNameOpt nameopt = get(ObjectKey.NAME_OPT); + if (nameopt == null) { - return ""; + nameopt = EqModNameOpt.NORMAL; } - if (namingOption == NAMINGOPTION_TEXT) - { - return namingOptionText; - } - - final StringBuffer aString = new StringBuffer(getDisplayName().length()); - - if (namingOption == NAMINGOPTION_SPELL) - { - for (int i=0;i<getAssociatedCount();i++) - { - if (i>0) - { - aString.append(", "); - } - final String listEntry = getAssociated(i); - - String spellName = getSpellName(listEntry); - - if (SettingsHandler.guiUsesOutputNameSpells()) - { - final Spell aSpell = Globals.getSpellKeyed(spellName); - - if (aSpell != null) - { - spellName = aSpell.getOutputName(); - } - } - - aString.append(spellName); - - final String info = getSpellVariant(listEntry); - - if (info.length() != 0) - { - aString.append(" (").append(info).append(')'); - } - - final List<String> metaFeats = getSpellMetafeats(listEntry); - if (!metaFeats.isEmpty()) - { - aString.append('/').append(StringUtil.join(metaFeats, "/")); - } - - aString.append('/').append(getSpellCaster(listEntry)); - aString.append('/').append( - CoreUtility.ordinal(getSpellCasterLevel(listEntry))); - } - } - else - { - if (namingOption != NAMINGOPTION_NONAME) - { - aString.append(getDisplayName()); - } - - if ((namingOption != NAMINGOPTION_NOLIST) && (getAssociatedCount() > 0)) - { - if (namingOption != NAMINGOPTION_NONAME) - { - aString.append(" ("); - } - - boolean bFirst = true; - - for (int e = 0; e < getAssociatedCount(); e++) - { - if (!bFirst) - { - aString.append(", "); - } - - aString.append(getAssociated(e)); - bFirst = false; - } - - if (namingOption != NAMINGOPTION_NONAME) - { - aString.append(")"); - } - } - } - - return aString.toString().trim().replace('|', ' '); + return nameopt.returnName(this); } protected int getSR(final PlayerCharacter aPC) @@ -1080,35 +674,6 @@ return equipChoice; } - private String replaceCostSpellLevel(String costFormula, final String listEntry) - { - String modChoice = ""; - - while (costFormula.indexOf("%SPELLLEVEL") >= 0) - { - final int idx = costFormula.indexOf("%SPELLLEVEL"); - - if (modChoice.length() == 0) - { - final int iLevel = getSpellLevel(listEntry); - - if (iLevel == 0) - { - modChoice = "0.5"; - } - else - { - modChoice = Integer.toString(iLevel); - } - } - - costFormula = costFormula.substring(0, idx) + modChoice + - costFormula.substring(idx + 11); - } - - return costFormula; - } - private String replaceCostCasterLevel(String costFormula, final String listEntry) { String modChoice = ""; @@ -1119,13 +684,13 @@ if (modChoice.length() == 0) { - final int iCasterLevel = getSpellCasterLevel(listEntry); + final int iCasterLevel = getSpellInfo(listEntry, "CASTERLEVEL"); modChoice = Integer.toString(iCasterLevel); // // Tack on the item creation multiplier, if there is one // - final String castClassKey = getSpellCaster(listEntry); + final String castClassKey = getSpellInfoString(listEntry, "CASTER"); if (castClassKey.length() != 0) { @@ -1194,7 +759,7 @@ if (modChoice.length() == 0) { - modChoice = Integer.toString(getSpellCharges(listEntry)); + modChoice = Integer.toString(getSpellInfo(listEntry, s_CHARGES)); } costFormula = costFormula.substring(0, idx) + modChoice + @@ -1214,7 +779,7 @@ if (modChoice.length() == 0) { - final String spellName = getSpellName(listEntry); + final String spellName = getSpellInfoString(listEntry, "SPELLNAME"); final Spell aSpell = Globals.getSpellKeyed(spellName); if (aSpell != null) @@ -1272,7 +837,7 @@ if (modChoice.length() == 0) { - final String spellName = getSpellName(listEntry); + final String spellName = getSpellInfoString(listEntry, "SPELLNAME"); final Spell aSpell = Globals.getSpellKeyed(spellName); if (aSpell != null) @@ -1292,8 +857,32 @@ { final String listEntry = getAssociated(eqIdx); String costFormula = cost; + String costFormula1 = costFormula; + String modChoice = ""; + + while (costFormula1.indexOf("%SPELLLEVEL") >= 0) + { + final int idx = costFormula1.indexOf("%SPELLLEVEL"); + + if (modChoice.length() == 0) + { + final int iLevel = getSpellInfo(listEntry, "SPELLLEVEL"); + + if (iLevel == 0) + { + modChoice = "0.5"; + } + else + { + modChoice = Integer.toString(iLevel); + } + } + + costFormula1 = costFormula1.substring(0, idx) + modChoice + + costFormula1.substring(idx + 11); + } - costFormula = replaceCostSpellLevel(costFormula, listEntry); + costFormula = costFormula1; costFormula = replaceCostSpellCost(costFormula, listEntry); costFormula = replaceCostSpellXPCost(costFormula, listEntry); costFormula = replaceCostCasterLevel(costFormula, listEntry); @@ -1308,14 +897,15 @@ // // Uninitialized? // - if (costDouble < 0) + Boolean costdouble = get(ObjectKey.COST_DOUBLE); + if (costdouble == null) { if (isType("MagicalEnhancement") || isType("BaseMaterial")) { return false; } - if (itemType.contains("MAGIC")) + if (isIType("MAGIC")) { return true; } @@ -1334,9 +924,10 @@ return true; } } + return false; } - return costDouble == 1; + return costdouble; } void setRemainingCharges(final int remainingCharges) @@ -1363,7 +954,7 @@ { if (getAssociatedCount() > 0) { - return getSpellCharges(getAssociated(0)); + return getSpellInfo(getAssociated(0), s_CHARGES); } return 0; @@ -1371,59 +962,11 @@ int getUsedCharges() { - return maxCharges - getRemainingCharges(); + return get(IntegerKey.MAX_CHARGES) - getRemainingCharges(); } - String replaceArmorType(final List<String> aTypes) + public static int getSpellInfo(final String listEntry, final String desiredInfo) { - for (int z = 0; z < armorType.size(); z++) - { - final StringTokenizer aTok = new StringTokenizer( - armorType.get(z), "|"); - - if (aTok.hasMoreTokens()) - { - final int idx = aTypes.indexOf(aTok.nextToken()); - - if (idx >= 0) - { - if (aTok.hasMoreTokens()) - { - final String newArmorType = aTok.nextToken(); - aTypes.set(idx, newArmorType); - - return newArmorType; - } - aTypes.remove(idx); - } - } - } - - return null; - } - - boolean willIgnore(final String aString) - { - return ignores.contains(aString.toUpperCase().trim()); - } - - boolean willReplace(final String aString) - { - return replaces.contains(aString.toUpperCase().trim()); - } - - private static String getSpellCaster(final String listEntry) - { - return getSpellInfoString(listEntry, "CASTER"); - } - - private static int getSpellCasterLevel(final String listEntry) - { - return getSpellInfo(listEntry, "CASTERLEVEL"); - } - - private static int getSpellInfo(final String listEntry, final String desiredInfo) - { int modValue = 0; final String info = getSpellInfoString(listEntry, desiredInfo); @@ -1442,7 +985,7 @@ return modValue; } - private static String getSpellInfoString( + public static String getSpellInfoString( final String listEntry, final String desiredInfo) { @@ -1457,36 +1000,6 @@ return ""; } - private static int getSpellLevel(final String listEntry) - { - return getSpellInfo(listEntry, "SPELLLEVEL"); - } - - private int getSpellCharges(final String listEntry) - { - return getSpellInfo(listEntry, s_CHARGES); - } - - /* this is only used by toString, there is no point adding Category - * information since it is not needed by the toString function and - * these ability objects do actually represent Feats */ - private static List<String> getSpellMetafeats(final String listEntry) - { - final String metaFeat = getSpellInfoString(listEntry, "METAFEATS"); - - return CoreUtility.split(metaFeat, ','); - } - - private static String getSpellName(final String listEntry) - { - return getSpellInfoString(listEntry, "SPELLNAME"); - } - - private static String getSpellVariant(final String listEntry) - { - return getSpellInfoString(listEntry, "VARIANT"); - } - /** * Add item cost * @param aPC @@ -1549,22 +1062,17 @@ } /** - * Set the eqmod's format category. - * @param cat - */ - public void setFormatCat(int cat) - { - integerChar.put(IntegerKey.FORMAT_CAT, cat); - } - - /** * Retrieve the eqmod's format category. Defaults to parens. * @return The format category for this eqmod. */ public int getFormatCat() { - final Integer characteristic = integerChar.get(IntegerKey.FORMAT_CAT); - return characteristic == null ? FORMATCAT_PARENS : characteristic.intValue(); + EqModFormatCat format = get(ObjectKey.FORMAT); + if (format == null) + { + format = EqModFormatCat.PARENS; + } + return format.ordinal(); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -1918,8 +1918,7 @@ { for (Spell aSpell : (ArrayList<Spell>)obj) { - if (aSpell.levelForKeyContains(aBuf.toString(), level, currentPC) - && (aSpell.getType().indexOf(spellType.toUpperCase()) >= 0)) + if (aSpell.levelForKeyContains(aBuf.toString(), level, currentPC)) { aList.add(aSpell); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -926,7 +926,39 @@ } } } + + public String associatedList() + { + if (associatedList == null) + { + return Constants.EMPTY_STRING; + } + else + { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (AssociatedChoice<String> choice : associatedList) + { + if (!first) + { + sb.append(", "); + } + first = false; + final String choiceStr = choice.getDefaultChoice(); + if (choiceStr.equals(Constants.EMPTY_STRING)) + { + sb.append('*'); + } + else + { + sb.append(choiceStr); + } + } + return sb.toString(); + } + } + /** * Add to the 'save' for the character list * @param aString Modified: Trunk/pcgen/code/src/java/pcgen/core/SpecialAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SpecialAbility.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/core/SpecialAbility.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -34,6 +34,7 @@ public final class SpecialAbility extends TextProperty { protected String saSource = ""; //$NON-NLS-1$ + private String propDesc = ""; /** Default constructor */ public SpecialAbility() @@ -77,8 +78,9 @@ public SpecialAbility(final String name, final String saSource, final String propDesc) { - super(name, propDesc); + super(name); this.saSource = saSource; + this.propDesc = propDesc; } /** @@ -172,6 +174,10 @@ SpecialAbility sa = (SpecialAbility) obj; if (keyName.equals(sa.getKeyName())) { +// if (keyName.equalsIgnoreCase(tp.getKeyName())) +// { +// return propDesc.compareToIgnoreCase(((TextProperty) obj).propDesc); +// } return saSource.compareToIgnoreCase(sa.saSource); } } @@ -246,4 +252,33 @@ // Otherwise by default we check against the total level return aPC.getTotalLevels() >= level; } + + /** + * Set the property description + * @param propDesc + */ + public void setPropDesc(final String propDesc) + { + this.propDesc = propDesc; + } + + String getPropDesc() + { + return propDesc; + } + + @Override + public String getText() + { + final String text; + if ((getPropDesc() == null) || "".equals(getPropDesc())) + { + text = super.getText(); + } + else + { + text = super.getText() + " (" + getPropDesc() + ")"; + } + return text; + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/SpecialProperty.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SpecialProperty.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/core/SpecialProperty.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -20,13 +20,14 @@ */ package pcgen.core; +import java.util.StringTokenizer; + +import pcgen.cdom.base.Constants; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.prereq.PreParserFactory; import pcgen.util.Logging; -import java.util.StringTokenizer; - /** * <code>SpecialProperty</code>. * @@ -45,17 +46,12 @@ super(name); } - public SpecialProperty(final String name, final String propDesc) - { - super(name, propDesc); - } - //DJ: This will be the same everywhere this gets used....and currently that is spread across the code. //It really shouldn't be in the core layer, but it's this, or have the same code in 10 places..... //TODO: get this into the persistance layer public static SpecialProperty createFromLst(final String input) { - final StringTokenizer tok = new StringTokenizer(input, "|", true); + final StringTokenizer tok = new StringTokenizer(input, Constants.PIPE, false); final SpecialProperty sp = new SpecialProperty(); if (!tok.hasMoreTokens()) @@ -64,7 +60,15 @@ } String spName = tok.nextToken(); + if (PreParserFactory.isPreReqString(spName)) + { + Logging.errorPrint("Leading PRExxx found in SPROP: " + + input); + return null; + } + StringBuilder sb = new StringBuilder(); + sb.append(spName); while (tok.hasMoreTokens()) { final String cString = tok.nextToken(); @@ -81,11 +85,13 @@ catch (PersistenceLayerException ple) { Logging.errorPrint(ple.getMessage(), ple); + return null; } } else { - spName += cString; + sb.append(Constants.PIPE); + sb.append(cString); } if (".CLEAR".equals(cString)) @@ -96,7 +102,7 @@ } } - sp.setName(spName); + sp.setName(sb.toString()); return sp; } } Modified: Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -33,8 +33,6 @@ */ public abstract class TextProperty extends PObject implements Serializable, Comparable<Object> { - protected String propDesc = ""; - /** Constructor */ public TextProperty() { @@ -50,35 +48,13 @@ setName(name); } - /** - * Constructor - * @param name - * @param propDesc - */ - public TextProperty(final String name, final String propDesc) - { - setName(name); - this.propDesc = propDesc; - } - - /** - * Set the property description - * @param propDesc - */ - public void setPropDesc(final String propDesc) - { - this.propDesc = propDesc; - } - + @Override public int compareTo(final Object obj) { if (obj instanceof TextProperty) { TextProperty tp = (TextProperty)obj; - if (keyName.equalsIgnoreCase(tp.getKeyName())) - { - return propDesc.compareToIgnoreCase(((TextProperty) obj).propDesc); - } + return keyName.compareTo(tp.getKeyName()); } else if (obj instanceof PObject) { @@ -89,16 +65,12 @@ return keyName.compareToIgnoreCase(obj.toString()); } + @Override public String toString() { return displayName; } - String getPropDesc() - { - return propDesc; - } - boolean pcQualifiesFor(final PlayerCharacter pc) { if (!PrereqHandler.passesAll(getPreReqList(), pc, null)) @@ -114,16 +86,7 @@ */ public String getText() { - final String text; - if ((getPropDesc() == null) || "".equals(getPropDesc())) - { - text = getDisplayName(); - } - else - { - text = getDisplayName() + " (" + getPropDesc() + ")"; - } - return text; + return getDisplayName(); } /** Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-05-24 22:47:54 UTC (rev 6352) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-05-25 02:22:21 UTC (rev 6353) @@ -66,6 +66,8 @@ import javax.swing.table.TableColumn; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.core.Ability; @@ -292,7 +294,7 @@ continue; } - for (String type : eqMod.getItemType()) + for (String type :... [truncated message content] |