From: <jde...@us...> - 2007-07-15 01:18:06
|
Revision: 3416 http://svn.sourceforge.net/pcgen/?rev=3416&view=rev Author: jdempsey Date: 2007-07-14 18:18:07 -0700 (Sat, 14 Jul 2007) Log Message: ----------- Fix bug: CHOOSE:FEATADD doesn't work - Merged from 5.12.x branch r3415 Issue#: 1753755 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java Property Changed: ---------------- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2007-07-15 01:16:53 UTC (rev 3415) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2007-07-15 01:18:07 UTC (rev 3416) @@ -473,4 +473,22 @@ } return null; } + + + /** + * Mod choices can send back weaponprofs, abilities or strings, + * so we have to do a conversion here. + * + * @param choiceList The list of choices provided by modChoices + * @param stringList The list of strings representing the choices. + */ + public static void convertChoiceListToStringList(final List choiceList, + final List<String> stringList) + { + for (Iterator iter = choiceList.iterator(); iter.hasNext();) + { + stringList.add(String.valueOf(iter.next())); + } + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java 2007-07-15 01:16:53 UTC (rev 3415) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java 2007-07-15 01:18:07 UTC (rev 3416) @@ -43,7 +43,6 @@ */ public class FeatAddChoiceManager extends AbstractComplexChoiceManager<String> { - Ability anAbility = null; /** * Make a Feat chooser. @@ -78,7 +77,6 @@ final List<String> availableList, final List<String> selectedList) { - anAbility = null; Iterator<String> choiceIt = choices.iterator(); while (choiceIt.hasNext()) @@ -106,121 +104,144 @@ else { final StringTokenizer bTok = new StringTokenizer(aString, ","); - String featKey = bTok.nextToken().trim(); - String subName = ""; - anAbility = Globals.getAbilityKeyed("FEAT", featKey); + while (bTok.hasMoreElements()) + { + String tokString = (String) bTok.nextElement(); + + addChoiceToAvailable(aPc, availableList, tokString.trim()); + } + } + } + } - if (anAbility == null) + /** + * Add a single feat to the list of available feat names. + * + * @param aPc The character being processed. + * @param availableList The list of feats to be offered + * @param tokString The key of the feat to be added. + */ + private void addChoiceToAvailable(final PlayerCharacter aPc, + final List<String> availableList, String featKey) + { + String subName = ""; + Ability anAbility = Globals.getAbilityKeyed("FEAT", featKey); + + if (anAbility == null) + { + Logging.errorPrint("Feat not found: " + featKey); + return; + } + + if (!featKey.equalsIgnoreCase(anAbility.getKeyName())) + { + subName = featKey.substring(anAbility.getKeyName().length()); + featKey = anAbility.getKeyName(); + + final int si = subName.indexOf('('); + + if (si > -1) + { + subName = subName.substring(si + 1); + } + } + + if (PrereqHandler.passesAll(anAbility.getPreReqList(), aPc, anAbility)) + { + if (anAbility.isMultiples()) + { + // + // If already have taken the feat, use it so we can remove + // any choices already selected + // + final Ability pcFeat = aPc.getFeatKeyed(featKey); + + if (pcFeat != null) { - Logging.errorPrint("Feat not found: " + featKey); - - //return false; + anAbility = pcFeat; } - if (!featKey.equalsIgnoreCase(anAbility.getKeyName())) + final int percIdx = subName.indexOf('%'); + + if (percIdx > -1) { - subName = featKey.substring(anAbility.getKeyName().length()); - featKey = anAbility.getKeyName(); + subName = subName.substring(0, percIdx); + } + else if (subName.length() != 0) + { + final int idx = subName.lastIndexOf(')'); - final int si = subName.indexOf('('); - - if (si > -1) + if (idx > -1) { - subName = subName.substring(si + 1); + subName = subName.substring(0, idx); } } - if (PrereqHandler.passesAll(anAbility.getPreReqList(), aPc, anAbility)) + // Retrieve the choices offered by the ability + final List tempAvailList = new ArrayList(); + final List tempSelList = new ArrayList(); + anAbility.modChoices(tempAvailList, tempSelList, false, aPc, + true, null); + final List<String> aavailableList = new ArrayList<String>(); // available list of choices + final List<String> sselectedList = new ArrayList<String>(); // selected list of choices + ChooserUtilities.convertChoiceListToStringList(tempAvailList, aavailableList); + ChooserUtilities.convertChoiceListToStringList(tempSelList, sselectedList); + + // + // Remove any that don't match + // + if (subName.length() != 0) { - if (anAbility.isMultiples()) + for (int n = aavailableList.size() - 1; n >= 0; --n) { - // - // If already have taken the feat, use it so we can remove - // any choices already selected - // - final Ability pcFeat = aPc.getFeatKeyed(featKey); + final String bString = aavailableList.get(n); - if (pcFeat != null) + if (!bString.startsWith(subName)) { - anAbility = pcFeat; + aavailableList.remove(n); } + } - final int percIdx = subName.indexOf('%'); + // + // Example: ADD:FEAT(Skill Focus(Craft (Basketweaving))) + // If you have no ranks in Craft (Basketweaving), the available list will be empty + // + // Make sure that the specified feat is available, even though it does not meet the prerequisite + // + if ((percIdx == -1) && (aavailableList.size() == 0)) + { + aavailableList.add(subName); + } + } - if (percIdx > -1) - { - subName = subName.substring(0, percIdx); - } - else if (subName.length() != 0) - { - final int idx = subName.lastIndexOf(')'); + // + // Remove any already selected + // + if (!anAbility.isStacks()) + { + for (Iterator<String> e = sselectedList.iterator(); e + .hasNext();) + { + final int idx = aavailableList.indexOf(e.next()); - if (idx > -1) - { - subName = subName.substring(0, idx); - } - } - - final List<String> aavailableList = new ArrayList<String>(); // available list of choices - final List<String> sselectedList = new ArrayList<String>(); // selected list of choices - anAbility.modChoices(aavailableList, sselectedList, false, aPc, true, null); - - // - // Remove any that don't match - // - if (subName.length() != 0) + if (idx > -1) { - for (int n = aavailableList.size() - 1; n >= 0; --n) - { - final String bString = aavailableList.get(n); - - if (!bString.startsWith(subName)) - { - aavailableList.remove(n); - } - } - - // - // Example: ADD:FEAT(Skill Focus(Craft (Basketweaving))) - // If you have no ranks in Craft (Basketweaving), the available list will be empty - // - // Make sure that the specified feat is available, even though it does not meet the prerequisite - // - if ((percIdx == -1) && (aavailableList.size() == 0)) - { - aavailableList.add(subName); - } + aavailableList.remove(idx); } - - // - // Remove any already selected - // - if (!anAbility.isStacks()) - { - for (Iterator e = sselectedList.iterator(); e.hasNext();) - { - final int idx = aavailableList.indexOf(e.next().toString()); - - if (idx > -1) - { - aavailableList.remove(idx); - } - } - } - - for (Iterator e = aavailableList.iterator(); e.hasNext();) - { - availableList.add(featKey + "(" + e.next() + ")"); - } - - //return false; } - else if (!aPc.hasRealFeat(Globals.getAbilityKeyed("FEAT", featKey)) && !aPc.hasFeatAutomatic(featKey)) - { - availableList.add(aString); - } } + + for (Iterator<String> e = aavailableList.iterator(); e + .hasNext();) + { + availableList.add(featKey + "(" + e.next() + ")"); + } } + else if (!aPc.hasRealFeat(Globals.getAbilityKeyed("FEAT", featKey)) + && !aPc.hasFeatAutomatic(featKey)) + { + availableList.add(featKey); + } } } @@ -238,14 +259,15 @@ { super.associateChoice(aPc, item, prefix); - if (anAbility != null) + boolean adjPool = !aPc.hasRealFeatNamed(item); + if (adjPool) { - if (!aPc.hasRealFeatNamed(item)) - { - aPc.adjustFeats(1); - } + aPc.adjustFeats(1); + } - AbilityUtilities.modFeat(aPc, null, item, true, false); + if (0 == AbilityUtilities.modFeat(aPc, null, item, true, false) && adjPool) + { + aPc.adjustFeats(-1); } } Property changes on: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java ___________________________________________________________________ Name: keywords - "Date Revision Author Id" + Date Revision Author Id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |