From: <nu...@us...> - 2006-03-29 10:27:20
|
Revision: 508 Author: nuance Date: 2006-03-29 02:27:11 -0800 (Wed, 29 Mar 2006) ViewCVS: http://svn.sourceforge.net/pcgen/?rev=508&view=rev Log Message: ----------- Fix two bugs in the item price calculator. 1) items worth less than 1gp were being rounded to 1gp before having the value of an EqMod added. This was coded as per the previous wizards FAQ, but wizards have changed their minds on how it works. as reflected in the latest FAQ. 2) Apply a change that ensures that when an item which is really multiple items (quiver of arrows for example) has an Equipmod added that referenced BASECOST in its cost formula, that this is divided by the number of pieces in the bundle. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2006-03-29 09:53:42 UTC (rev 507) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2006-03-29 10:27:11 UTC (rev 508) @@ -39,6 +39,8 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * <code>Equipment</code>. @@ -1185,7 +1187,7 @@ * Sets the cost attribute of the Equipment object * * @param aString The new cost value - * @param bBase The new cost value + * @param bBase if true, set the base cost along with the cost */ public void setCost(final String aString, final boolean bBase) { @@ -1288,14 +1290,17 @@ BigDecimal eqModCost; String costFormula = aEqMod.getCost(); + Pattern pat = Pattern.compile("BASECOST"); + Matcher mat; if ((aEqMod.getAssociatedCount() > 0) && !costFormula.equals(aEqMod.getCost(0))) { eqModCost = BigDecimalHelper.ZERO; - + for (int idx = 0; idx < aEqMod.getAssociatedCount(); ++idx) { - costFormula = aEqMod.getCost(idx); + mat = pat.matcher(aEqMod.getCost(idx)); + costFormula = mat.replaceAll("(BASECOST/" + getBaseQty() + ")"); final BigDecimal thisModCost = new BigDecimal(getVariableValue(costFormula, "", true, aPC).toString()); @@ -1315,6 +1320,9 @@ } else { + mat = pat.matcher(aEqMod.getCost()); + costFormula = mat.replaceAll("(BASECOST/" + getBaseQty() + ")"); + eqModCost = new BigDecimal(getVariableValue(costFormula, "", true, aPC).toString()); if (!aEqMod.getCostDouble()) @@ -1327,7 +1335,12 @@ } } - c = c.add(eqModCost.multiply(new BigDecimal(Integer.toString(getBaseQty() * iCount)))); + // Per D20 FAQ adjustments for special materials are per piece; + if (aEqMod.isType("BaseMaterial")) + { + eqModCost = eqModCost.multiply(new BigDecimal(getBaseQty())); + } + c = c.add(eqModCost); iPlus += (aEqMod.getPlus() * iCount); } @@ -1367,14 +1380,14 @@ // should be 6 gp. This would give a cost of 6.05 gp per arrow, 6.1 gp per bolt and 6.01 gp // per bullet. // - if (c.compareTo(BigDecimalHelper.ZERO) != 0) - { - // - // Convert to double and use math.ceil as ROUND_CEILING doesn't appear to work - // on BigDecimal.divide - final int baseQ = getBaseQty(); - itemCost = new BigDecimal(Math.ceil(itemCost.doubleValue() / baseQ) * baseQ); - } + // if (c.compareTo(BigDecimalHelper.ZERO) != 0) + // { + // // + // // Convert to double and use math.ceil as ROUND_CEILING doesn't appear to work + // // on BigDecimal.divide + // final int baseQ = getBaseQty(); + // itemCost = new BigDecimal(Math.ceil(itemCost.doubleValue() / baseQ) * baseQ); + // } if (!isAmmunition() && !isArmor() && !isShield() && !isWeapon()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |