From: <jde...@us...> - 2012-12-30 23:43:29
|
Revision: 18903 http://sourceforge.net/p/pcgen/code/18903 Author: jdempsey Date: 2012-12-30 23:43:25 +0000 (Sun, 30 Dec 2012) Log Message: ----------- Exception when changing to ex-Paladin * Merge back into 6.0 branch Issue#: CODE-601 Modified Paths: -------------- branches/6.00.x/pcgen/code/src/java/pcgen/cdom/facet/ClassFacet.java branches/6.00.x/pcgen/code/src/java/pcgen/core/PlayerCharacter.java branches/6.00.x/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java branches/6.00.x/pcgen/code/src/utest/pcgen/cdom/facet/ClassFacetTest.java Property Changed: ---------------- branches/6.00.x/pcgen/ Index: branches/6.00.x/pcgen =================================================================== --- branches/6.00.x/pcgen 2012-12-30 22:17:47 UTC (rev 18902) +++ branches/6.00.x/pcgen 2012-12-30 23:43:25 UTC (rev 18903) Property changes on: branches/6.00.x/pcgen ___________________________________________________________________ Modified: svn:mergeinfo ## -1,2 +1,2 ## -/Trunk/pcgen:18886 +/Trunk/pcgen:18710-18711,18886 /sandbox/uisync:14608-15990 \ No newline at end of property Modified: branches/6.00.x/pcgen/code/src/java/pcgen/cdom/facet/ClassFacet.java =================================================================== --- branches/6.00.x/pcgen/code/src/java/pcgen/cdom/facet/ClassFacet.java 2012-12-30 22:17:47 UTC (rev 18902) +++ branches/6.00.x/pcgen/code/src/java/pcgen/cdom/facet/ClassFacet.java 2012-12-30 23:43:25 UTC (rev 18903) @@ -525,7 +525,9 @@ Map<Integer, PCClassLevel> localMap = map.get(pcc); if (localMap == null) { - return null; + throw new IllegalArgumentException( + "Level cannot be returned for Class " + pcc.getKeyName() + + " which is not in the PC"); } PCClassLevel classLevel = localMap.get(level); if (classLevel == null) Modified: branches/6.00.x/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- branches/6.00.x/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2012-12-30 22:17:47 UTC (rev 18902) +++ branches/6.00.x/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2012-12-30 23:43:25 UTC (rev 18903) @@ -6567,47 +6567,73 @@ return false; } - public void makeIntoExClass(final PCClass aClass) + public void makeIntoExClass(final PCClass fromClass) { - CDOMSingleRef<PCClass> exc = aClass.get(ObjectKey.EX_CLASS); + CDOMSingleRef<PCClass> exc = fromClass.get(ObjectKey.EX_CLASS); try { PCClass cl = exc.resolvesTo(); - PCClass bClass = getClassKeyed(cl.getKeyName()); + PCClass toClass = getClassKeyed(cl.getKeyName()); - if (bClass == null) + boolean bClassNew; + int toLevel; + if (toClass == null) { - bClass = cl.clone(); //Still required :( + toClass = cl.clone(); //Still required :( + bClassNew = true; + toLevel = 0; + } + else + { + bClassNew = false; + toLevel = getLevel(toClass); + } - rebuildLists(bClass, aClass, getLevel(aClass), this); - - bClass.setLevel(getLevel(aClass), this); - for (int i = 0; i < getLevel(aClass); ++i) + //Capture necessary information + final int fromLevel = getLevel(fromClass); + Integer[] hpArray = new Integer[fromLevel]; + for (int i = 0; i < fromLevel; i++) + { + PCClassLevel frompcl = getActiveClassLevel(fromClass, i); + Integer hp = getHP(frompcl); + if (hp == null) { - PCClassLevel frompcl = getActiveClassLevel(aClass, i + 1); - Integer hp = getHP(frompcl); - PCClassLevel topcl = getActiveClassLevel(bClass, i + 1); - setHP(topcl, hp); + System.err.println("Did not find HP for " + fromClass + " " + + (i + 1) + " " + frompcl); } + hpArray[i] = hp; + } - classFacet.replaceClass(id, aClass, bClass); - } else + for (int i = 0; i < fromLevel; i++) { - rebuildLists(bClass, aClass, getLevel(aClass), this); - bClass.setLevel(getLevel(bClass) + getLevel(aClass), this); + fromClass.doMinusLevelMods(this, fromLevel - i); + } + fromClass.setLevel(0, this); - for (int i = 0; i < getLevel(aClass); ++i) - { - PCClassLevel frompcl = getActiveClassLevel(aClass, i + 1); - Integer hp = getHP(frompcl); - PCClassLevel topcl = getActiveClassLevel(bClass, getLevel(bClass) + i + 1); - setHP(topcl, hp); - } + //Do the class swap + if (bClassNew) + { + classFacet.replaceClass(id, fromClass, toClass); + } + else + { + classFacet.removeClass(id, fromClass); + } + toClass.setLevel(toLevel + fromLevel, this); - classFacet.removeClass(id, aClass); + //Restore capture info to new class + for (int i = 0; i < fromLevel; i++) + { + PCClassLevel topcl = getActiveClassLevel(toClass, i); + setHP(topcl, hpArray[i]); } + for (int i = 0; i < fromLevel; i++) + { + toClass.doPlusLevelMods(toLevel + i + 1, this); + } + // // change all the levelling info to the ex-class as well // @@ -6615,9 +6641,9 @@ { final PCLevelInfo li = levelInfoFacet.get(id, idx); - if (li.getClassKeyName().equals(aClass.getKeyName())) + if (li.getClassKeyName().equals(fromClass.getKeyName())) { - li.setClassKeyName(bClass.getKeyName()); + li.setClassKeyName(toClass.getKeyName()); } } @@ -6627,10 +6653,10 @@ // for (Skill skill : getSkillSet()) { - SkillRankControl.replaceClassRank(this, skill, aClass.getKeyName(), cl.getKeyName()); + SkillRankControl.replaceClassRank(this, skill, fromClass.getKeyName(), cl.getKeyName()); } - setAssoc(bClass, AssociationKey.SKILL_POOL, aClass.getSkillPool(this)); + setAssoc(toClass, AssociationKey.SKILL_POOL, fromClass.getSkillPool(this)); } catch (NumberFormatException nfe) { ShowMessageDelegate @@ -7165,30 +7191,45 @@ return; } - final int iFromLevel = getLevel(fromClass) - iCount; - final int iToLevel = getLevel(toClass); + final int fromLevel = getLevel(fromClass); + final int iFromLevel = fromLevel - iCount; + final int toLevel = getLevel(toClass); - toClass.setLevel(iToLevel + iCount, this); + //Capture necessary information + Integer[] hpArray = new Integer[iCount]; + for (int i = 0; i < iCount; i++) + { + PCClassLevel frompcl = getActiveClassLevel(fromClass, i); + hpArray[i] = getHP(frompcl); + } - for (int i = 0; i < iCount; ++i) + for (int i = 0; i < iCount; i++) { - PCClassLevel frompcl = getActiveClassLevel(fromClass, iFromLevel + i); - Integer hp = getHP(frompcl); - PCClassLevel topcl = getActiveClassLevel(toClass, iToLevel + i); - setHP(topcl, hp); - setHP(frompcl, Integer.valueOf(0)); + fromClass.doMinusLevelMods(this, fromLevel - i); } - rebuildLists(toClass, fromClass, iCount, this); - + //Do the class level swap fromClass.setLevel(iFromLevel, this); + toClass.setLevel(toLevel + iCount, this); + //Restore capture info to new class + for (int i = 0; i < iCount; i++) + { + PCClassLevel topcl = getActiveClassLevel(toClass, i); + setHP(topcl, hpArray[i]); + } + + for (int i = 0; i < iCount; i++) + { + toClass.doPlusLevelMods(toLevel + i + 1, this); + } + // first, change the toClass current PCLevelInfo level for (PCLevelInfo pcl : getLevelInfo()) { if (pcl.getClassKeyName().equals(toClass.getKeyName())) { - final int iTo = (pcl.getClassLevel() + getLevel(toClass)) - iToLevel; + final int iTo = (pcl.getClassLevel() + getLevel(toClass)) - toLevel; pcl.setClassLevel(iTo); } } @@ -8274,20 +8315,6 @@ calcActiveBonuses(); } - private void rebuildLists(final PCClass toClass, final PCClass fromClass, final int iCount, - final PlayerCharacter aPC) - { - final int fromLevel = getLevel(fromClass); - final int toLevel = getLevel(toClass); - - for (int i = 0; i < iCount; ++i) - { - fromClass.doMinusLevelMods(this, fromLevel - i); - - toClass.doPlusLevelMods(toLevel + i + 1, aPC); - } - } - private void removeExcessSkills(final int level) { boolean modified = false; Modified: branches/6.00.x/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java =================================================================== --- branches/6.00.x/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2012-12-30 22:17:47 UTC (rev 18902) +++ branches/6.00.x/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2012-12-30 23:43:25 UTC (rev 18903) @@ -1122,4 +1122,36 @@ assertEquals(30.0, pc.movementOfType("Fly"), 0.1); assertEquals(60.0, pc.movementOfType("Dig"), 0.1); } + + public void testMakeIntoExClass() + { + // Prepare class and ex-class + LoadContext context = Globals.getContext(); + PCClass paladin = new PCClass(); + paladin.setName("Paladin"); + context.ref.importObject(paladin); + PCClass exPaladin = new PCClass(); + exPaladin.setName("exPaladin"); + context.ref.importObject(exPaladin); + paladin.put(ObjectKey.EX_CLASS, context.ref.getCDOMReference(PCClass.class, exPaladin.getKeyName())); + readyToRun(); + + PlayerCharacter pc = getCharacter(); + // Add a level of the class + pc.incrementClassLevel(2, paladin, true, false); + PCClass pcPalClass = pc.getClassKeyed(paladin.getKeyName()); + pc.setHP(pc.getActiveClassLevel(pcPalClass, 0), 10); + pc.setHP(pc.getActiveClassLevel(pcPalClass, 1), 6); + + // Make it into an ex-class + pc.makeIntoExClass(pcPalClass); + + assertNull("Paladin class should not be held", pc.getClassKeyed(paladin.getKeyName())); + PCClass pcExPalClass = pc.getClassKeyed(exPaladin.getKeyName()); + assertNotNull("Ex-Paladin class should be held", pcExPalClass); + PCClassLevel pcLvl1 = pc.getActiveClassLevel(pcExPalClass, 0); + assertNotNull("Level 1 should be Ex-Paladin", pcLvl1); + assertEquals("Should still be level 2 character", 2, pc.getTotalLevels()); + assertEquals("Hp at first level incorrect", 10, (int)pc.getHP(pcLvl1)); + } } Modified: branches/6.00.x/pcgen/code/src/utest/pcgen/cdom/facet/ClassFacetTest.java =================================================================== --- branches/6.00.x/pcgen/code/src/utest/pcgen/cdom/facet/ClassFacetTest.java 2012-12-30 22:17:47 UTC (rev 18902) +++ branches/6.00.x/pcgen/code/src/utest/pcgen/cdom/facet/ClassFacetTest.java 2012-12-30 23:43:25 UTC (rev 18903) @@ -755,6 +755,10 @@ { assertFalse(facet.setClassLevel(id, t1, pcl)); } + catch (IllegalArgumentException e) + { + //Yep okay too! + } catch (CloneNotSupportedException e) { fail(e.getMessage()); @@ -791,7 +795,14 @@ { PCClass cl = new PCClass(); facet.addClass(id, new PCClass()); - assertNull(facet.getClassLevel(id, cl, 1)); + try + { + assertNull(facet.getClassLevel(id, cl, 1)); + } + catch (IllegalArgumentException e) + { + //Yep okay too! + } } @Test This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |