From: <th...@us...> - 2010-06-16 02:52:51
|
Revision: 12169 http://pcgen.svn.sourceforge.net/pcgen/?rev=12169&view=rev Author: thpr Date: 2010-06-16 02:52:44 +0000 (Wed, 16 Jun 2010) Log Message: ----------- Vision Facet Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/facet/FacetInitialization.java Trunk/pcgen/code/src/java/pcgen/cdom/inst/ObjectCache.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java Trunk/pcgen/code/src/java/pcgen/core/term/PCCountVisionTermEvaluator.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreVisionTester.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/facet/VisionFacet.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/facet/FacetInitialization.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/facet/FacetInitialization.java 2010-06-16 02:51:49 UTC (rev 12168) +++ Trunk/pcgen/code/src/java/pcgen/cdom/facet/FacetInitialization.java 2010-06-16 02:52:44 UTC (rev 12169) @@ -86,6 +86,7 @@ .getFacet(ActiveAbilityFacet.class); ShieldProfFacet spFacet = FacetLibrary.getFacet(ShieldProfFacet.class); ArmorProfFacet apFacet = FacetLibrary.getFacet(ArmorProfFacet.class); + VisionFacet visionFacet = FacetLibrary.getFacet(VisionFacet.class); FollowerOptionFacet foFacet = FacetLibrary.getFacet(FollowerOptionFacet.class); FollowerLimitFacet flFacet = FacetLibrary.getFacet(FollowerLimitFacet.class); CharacterSpellResistanceFacet srFacet = FacetLibrary @@ -155,6 +156,7 @@ cdomObjectFacet.addDataFacetChangeListener(srFacet); cdomObjectFacet.addDataFacetChangeListener(apFacet); cdomObjectFacet.addDataFacetChangeListener(qualifyFacet); + cdomObjectFacet.addDataFacetChangeListener(visionFacet); cdomObjectFacet.addDataFacetChangeListener(foFacet); cdomObjectFacet.addDataFacetChangeListener(flFacet); } Added: Trunk/pcgen/code/src/java/pcgen/cdom/facet/VisionFacet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/facet/VisionFacet.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/facet/VisionFacet.java 2010-06-16 02:52:44 UTC (rev 12169) @@ -0,0 +1,230 @@ +/* + * Copyright (c) Thomas Parker, 2009. + * + * This program 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 program 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package pcgen.cdom.facet; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import pcgen.base.formula.Formula; +import pcgen.cdom.base.AssociatedPrereqObject; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.CharID; +import pcgen.core.QualifiedObject; +import pcgen.core.Vision; +import pcgen.core.prereq.Prerequisite; +import pcgen.util.enumeration.VisionType; + +/** + * ShieldProfFacet is a Facet that tracks the ShieldProfs that have been granted + * to a Player Character. + */ +public class VisionFacet extends + AbstractSourcedListFacet<QualifiedObject<Vision>> implements + DataFacetChangeListener<CDOMObject> +{ + + private FormulaResolvingFacet resolveFacet = FacetLibrary + .getFacet(FormulaResolvingFacet.class); + + private BonusCheckingFacet bonusFacet = FacetLibrary + .getFacet(BonusCheckingFacet.class); + + private PrerequisiteFacet prereqFacet = FacetLibrary + .getFacet(PrerequisiteFacet.class); + + /** + * Triggered when one of the Facets to which ShieldProfFacet listens fires a + * DataFacetChangeEvent to indicate a ShieldProf was added to a Player + * Character. + * + * @param dfce + * The DataFacetChangeEvent containing the information about the + * change + * + * @see pcgen.cdom.facet.DataFacetChangeListener#dataAdded(pcgen.cdom.facet.DataFacetChangeEvent) + */ + public void dataAdded(DataFacetChangeEvent<CDOMObject> dfce) + { + CDOMObject cdo = dfce.getCDOMObject(); + Collection<CDOMReference<Vision>> mods = cdo + .getListMods(Vision.VISIONLIST); + if (mods != null) + { + CharID id = dfce.getCharID(); + for (CDOMReference<Vision> ref : mods) + { + Collection<AssociatedPrereqObject> assoc = cdo + .getListAssociations(Vision.VISIONLIST, ref); + for (AssociatedPrereqObject apo : assoc) + { + List<Prerequisite> prereqs = apo.getPrerequisiteList(); + for (Vision v : ref.getContainedObjects()) + { + add(id, new QualifiedObject<Vision>(v, prereqs), cdo); + } + } + } + } + } + + /** + * Triggered when one of the Facets to which ShieldProfFacet listens fires a + * DataFacetChangeEvent to indicate a ShieldProf was removed from a Player + * Character. + * + * @param dfce + * The DataFacetChangeEvent containing the information about the + * change + * + * @see pcgen.cdom.facet.DataFacetChangeListener#dataRemoved(pcgen.cdom.facet.DataFacetChangeEvent) + */ + public void dataRemoved(DataFacetChangeEvent<CDOMObject> dfce) + { + removeAll(dfce.getCharID(), dfce.getCDOMObject()); + } + + public Collection<Vision> getActiveVision(CharID id) + { + Map<QualifiedObject<Vision>, Set<Object>> componentMap = getCachedMap(id); + if (componentMap == null) + { + return Collections.emptyList(); + } + Map<VisionType, Integer> map = new HashMap<VisionType, Integer>(); + for (Map.Entry<QualifiedObject<Vision>, Set<Object>> me : componentMap + .entrySet()) + { + QualifiedObject<Vision> qo = me.getKey(); + for (Object source : me.getValue()) + { + if (prereqFacet.qualifies(id, qo, source)) + { + String sourceString = (source instanceof CDOMObject) ? ((CDOMObject) source) + .getQualifiedKey() + : ""; + Vision v = qo.getRawObject(); + String distanceString = v.getDistance(); + Formula distance = FormulaFactory + .getFormulaFor(distanceString); + int a = resolveFacet.resolve(id, distance, sourceString) + .intValue(); + VisionType visType = v.getType(); + Integer current = map.get(visType); + if (current == null || current < a) + { + map.put(visType, a); + } + } + } + } + + /* + * parse through the global list of vision tags and see if this PC has + * any BONUS:VISION tags which will create a new visionMap entry, and + * add any BONUS to existing entries in the map + */ + for (VisionType vType : VisionType.getAllVisionTypes()) + { + int aVal = (int) bonusFacet + .getBonus(id, "VISION", vType.toString()); + + if (aVal > 0) + { + Integer current = map.get(vType); + map.put(vType, aVal + (current == null ? 0 : current)); + } + } + TreeSet<Vision> returnSet = new TreeSet<Vision>(); + for (Map.Entry<VisionType, Integer> me : map.entrySet()) + { + returnSet.add(new Vision(me.getKey(), me.getValue().toString())); + } + return returnSet; + } + + public Vision getActiveVision(CharID id, VisionType type) + { + Map<QualifiedObject<Vision>, Set<Object>> componentMap = getCachedMap(id); + if (componentMap == null) + { + return null; + } + Integer i = null; + for (Map.Entry<QualifiedObject<Vision>, Set<Object>> me : componentMap + .entrySet()) + { + QualifiedObject<Vision> qo = me.getKey(); + Vision v = qo.getRawObject(); + VisionType visType = v.getType(); + if (type.equals(visType)) + { + for (Object source : me.getValue()) + { + if (prereqFacet.qualifies(id, qo, source)) + { + String sourceString = (source instanceof CDOMObject) ? ((CDOMObject) source) + .getQualifiedKey() + : ""; + String distanceString = v.getDistance(); + Formula distance = FormulaFactory + .getFormulaFor(distanceString); + int a = resolveFacet + .resolve(id, distance, sourceString).intValue(); + if (i == null || i < a) + { + i = a; + } + } + } + } + } + + /* + * parse through the global list of vision tags and see if this PC has + * any BONUS:VISION tags which will create a new visionMap entry, and + * add any BONUS to existing entries in the map + */ + int a = (int) bonusFacet.getBonus(id, "VISION", type.toString()); + + if (a > 0) + { + if (i == null || i < a) + { + i = a; + } + } + if (i == null) + { + return null; + } + return new Vision(type, i.toString()); + } + + public int getVisionCount(CharID id) + { + //Slow method for now... + return getActiveVision(id).size(); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/inst/ObjectCache.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/inst/ObjectCache.java 2010-06-16 02:51:49 UTC (rev 12168) +++ Trunk/pcgen/code/src/java/pcgen/cdom/inst/ObjectCache.java 2010-06-16 02:52:44 UTC (rev 12169) @@ -17,24 +17,13 @@ */ package pcgen.cdom.inst; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.TreeSet; - import pcgen.base.util.DoubleKeyMap; -import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; -import pcgen.cdom.base.CDOMReference; -import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.SkillCost; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; -import pcgen.core.Vision; import pcgen.core.analysis.SkillCostCalc; -import pcgen.core.prereq.PrereqHandler; -import pcgen.util.enumeration.VisionType; /** * An ObjectCache is a CDOMObject designed to serve as a cahce of information @@ -54,73 +43,6 @@ } /** - * Initializes the Vision cache for the given PlayerCharacter. - * - * @param pc - * The PlayerCharacter to be used to initialize the Vision cache. - */ - public void initializeVisionCache(PlayerCharacter pc) - { - listChar.initializeListFor(ListKey.VISION_CACHE); - Map<VisionType, Integer> map = new HashMap<VisionType, Integer>(); - for (CDOMObject cdo : pc.getCDOMObjectList()) - { - Collection<CDOMReference<Vision>> mods = cdo - .getListMods(Vision.VISIONLIST); - if (mods == null) - { - continue; - } - for (CDOMReference<Vision> ref : mods) - { - Collection<AssociatedPrereqObject> assoc = cdo - .getListAssociations(Vision.VISIONLIST, ref); - for (AssociatedPrereqObject apo : assoc) - { - if (PrereqHandler.passesAll(apo.getPrerequisiteList(), pc, - null)) - { - for (Vision v : ref.getContainedObjects()) - { - VisionType visType = v.getType(); - int a = pc.getVariableValue(v.getDistance(), "") - .intValue(); - Integer current = map.get(visType); - if (current == null || current < a) - { - map.put(visType, a); - } - } - } - } - } - } - - /* - * parse through the global list of vision tags and see if this PC has - * any BONUS:VISION tags which will create a new visionMap entry, and - * add any BONUS to existing entries in the map - */ - for (VisionType vType : VisionType.getAllVisionTypes()) - { - final int aVal = (int) pc.getTotalBonusTo("VISION", vType - .toString()); - - if (aVal > 0) - { - Integer current = map.get(vType); - map.put(vType, aVal + (current == null ? 0 : current)); - } - } - TreeSet<Vision> set = new TreeSet<Vision>(); - for (Map.Entry<VisionType, Integer> me : map.entrySet()) - { - set.add(new Vision(me.getKey(), me.getValue().toString())); - } - addAllToListFor(ListKey.VISION_CACHE, set); - } - - /** * Stores a cache of the cost of each Skill based on the Skill's key and * PCClass */ Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2010-06-16 02:51:49 UTC (rev 12168) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2010-06-16 02:52:44 UTC (rev 12169) @@ -145,6 +145,7 @@ import pcgen.cdom.facet.StatFacet; import pcgen.cdom.facet.SubRaceFacet; import pcgen.cdom.facet.TemplateFacet; +import pcgen.cdom.facet.VisionFacet; import pcgen.cdom.facet.WeightFacet; import pcgen.cdom.facet.XPFacet; import pcgen.cdom.facet.ClassFacet.ClassInfo; @@ -203,6 +204,7 @@ import pcgen.util.enumeration.AttackType; import pcgen.util.enumeration.Load; import pcgen.util.enumeration.Visibility; +import pcgen.util.enumeration.VisionType; /** * <code>PlayerCharacter</code>. @@ -285,6 +287,7 @@ private XPFacet xpFacet = FacetLibrary.getFacet(XPFacet.class); private FactFacet factFacet = FacetLibrary.getFacet(FactFacet.class); private QualifyFacet qualifyFacet = FacetLibrary.getFacet(QualifyFacet.class); + private VisionFacet visionFacet = FacetLibrary.getFacet(VisionFacet.class); private FollowerOptionFacet foFacet = FacetLibrary.getFacet(FollowerOptionFacet.class); private FollowerLimitFacet followerLimitFacet = FacetLibrary.getFacet(FollowerLimitFacet.class); @@ -6410,28 +6413,16 @@ return bonusManager.getSpellBonusType(bonusType, bonusName); } - public List<Vision> getVisionList() + public Collection<Vision> getVisionList() { - /* - * TODO This is a temporary hack until a better cache dirty method - * is established - the problem is that initializeVisionCache triggers - * cache reset, which is a problem for getting back the right value - * from this method unless the cache is maintained :P - */ - ObjectCache myCache = cache; - if (!myCache.containsListFor(ListKey.VISION_CACHE)) - { - myCache.initializeVisionCache(this); - } - return myCache.getListFor(ListKey.VISION_CACHE); + return visionFacet.getActiveVision(id); } public String getVision() { final StringBuffer visionString = new StringBuffer(); - final List<Vision> visionList = getVisionList(); - for (Vision vision : visionList) + for (Vision vision : getVisionList()) { if (visionString.length() > 0) { @@ -14868,6 +14859,16 @@ wpBonusFacet.remove(id, choice, owner); } + public Vision getVision(VisionType type) + { + return visionFacet.getActiveVision(id, type); + } + + public int getVisionCount() + { + return visionFacet.getVisionCount(id); + } + public double getLoadMultForSize() { SizeAdjustment sadj = getSizeAdjustment(); Modified: Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java 2010-06-16 02:51:49 UTC (rev 12168) +++ Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java 2010-06-16 02:52:44 UTC (rev 12169) @@ -30,6 +30,7 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.ConcretePrereqObject; +import pcgen.cdom.base.QualifyingObject; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.prereq.PreParserFactory; @@ -41,7 +42,7 @@ * @author Aaron Divinsky <boo...@ya...> * @param <T> */ -public class QualifiedObject<T> extends ConcretePrereqObject +public class QualifiedObject<T> extends ConcretePrereqObject implements QualifyingObject { private T theObject = null; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/PCCountVisionTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/PCCountVisionTermEvaluator.java 2010-06-16 02:51:49 UTC (rev 12168) +++ Trunk/pcgen/code/src/java/pcgen/core/term/PCCountVisionTermEvaluator.java 2010-06-16 02:52:44 UTC (rev 12169) @@ -39,7 +39,7 @@ @Override public Float resolve(PlayerCharacter pc) { - return (float) pc.getVisionList().size(); + return (float) pc.getVisionCount(); } public boolean isSourceDependant() Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreVisionTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreVisionTester.java 2010-06-16 02:51:49 UTC (rev 12168) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreVisionTester.java 2010-06-16 02:52:44 UTC (rev 12169) @@ -53,41 +53,31 @@ VisionType requiredVisionType = VisionType.getVisionType(prereq.getKey()); int runningTotal = 0; - boolean found = false; if (range.equals("ANY")) { - for (Vision charVision : character.getVisionList()) + Vision v = character.getVision(requiredVisionType); + if (v == null) { - if (charVision.getType().equals(requiredVisionType)) - { - runningTotal += prereq.getOperator().compare(1, 0); - found = true; - break; - } + runningTotal += prereq.getOperator().compare(0, 1); } - if (!found) + else { - runningTotal += prereq.getOperator().compare(0, 1); + runningTotal += prereq.getOperator().compare(1, 0); } } else { int requiredRange = Integer.parseInt(range); - for (Vision charVision : character.getVisionList()) + Vision v = character.getVision(requiredVisionType); + if (v == null) { - if (charVision.getType().equals(requiredVisionType)) - { - int visionRange = Integer.parseInt(charVision.getDistance()); - runningTotal += - prereq.getOperator() - .compare(visionRange, requiredRange); - found = true; - break; - } + runningTotal += prereq.getOperator().compare(0, requiredRange); } - if (!found) + else { - runningTotal += prereq.getOperator().compare(0, requiredRange); + int visionRange = Integer.parseInt(v.getDistance()); + runningTotal += prereq.getOperator().compare(visionRange, + requiredRange); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |