Search in sources :

Example 26 with CDOMSingleRef

use of pcgen.cdom.reference.CDOMSingleRef in project pcgen by PCGen.

the class AbilityLst method unparse.

@Override
public String[] unparse(LoadContext context, CDOMObject obj) {
    Collection<CDOMReference<? extends CDOMList<?>>> changedLists = context.getListContext().getChangedLists(obj, AbilityList.class);
    Changes<ListKey<ChooseSelectionActor<?>>> actors = context.getObjectContext().getListChanges(obj, ListKey.GA_CAKEYS);
    Set<String> returnSet = new TreeSet<>();
    TripleKeyMapToList<Nature, CDOMSingleRef<AbilityCategory>, List<Prerequisite>, CDOMReference<Ability>> m = new TripleKeyMapToList<>();
    TripleKeyMapToList<Nature, CDOMSingleRef<AbilityCategory>, List<Prerequisite>, CDOMReference<Ability>> clear = new TripleKeyMapToList<>();
    Changes<ChooseSelectionActor<?>> listChanges = context.getObjectContext().getListChanges(obj, ListKey.NEW_CHOOSE_ACTOR);
    Collection<ChooseSelectionActor<?>> listAdded = listChanges.getAdded();
    if (listAdded != null && !listAdded.isEmpty()) {
        for (ChooseSelectionActor<?> csa : listAdded) {
            if (csa.getSource().equals(getTokenName())) {
                try {
                    AbilitySelector as = (AbilitySelector) csa;
                    StringBuilder sb = new StringBuilder();
                    sb.append(as.getAbilityCategory().getLSTformat(false)).append(Constants.PIPE);
                    sb.append(as.getNature()).append(Constants.PIPE);
                    sb.append(as.getLstFormat());
                    returnSet.add(sb.toString());
                } catch (PersistenceLayerException e) {
                    context.addWriteMessage(getTokenName() + " encountered error: " + e.getMessage());
                    return null;
                }
            }
        }
    }
    for (CDOMReference ref : changedLists) {
        AssociatedChanges<CDOMReference<Ability>> changes = context.getListContext().getChangesInList(getTokenName(), obj, ref);
        if (changes.includesGlobalClear()) {
            CDOMDirectSingleRef<AbilityList> dr = (CDOMDirectSingleRef<AbilityList>) ref;
            AbilityList al = dr.get();
            StringBuilder sb = new StringBuilder();
            sb.append(al.getCategory().getLSTformat(false)).append(Constants.PIPE);
            sb.append(al.getNature()).append(Constants.PIPE);
            sb.append(Constants.LST_DOT_CLEAR);
            returnSet.add(sb.toString());
        }
        MapToList<CDOMReference<Ability>, AssociatedPrereqObject> mtl = changes.getAddedAssociations();
        if (mtl != null) {
            for (CDOMReference<Ability> ab : mtl.getKeySet()) {
                for (AssociatedPrereqObject assoc : mtl.getListFor(ab)) {
                    Nature nature = assoc.getAssociation(AssociationKey.NATURE);
                    CDOMSingleRef<AbilityCategory> cat = assoc.getAssociation(AssociationKey.CATEGORY);
                    m.addToListFor(nature, cat, assoc.getPrerequisiteList(), ab);
                }
            }
        }
        mtl = changes.getRemovedAssociations();
        if (mtl != null) {
            for (CDOMReference<Ability> ab : mtl.getKeySet()) {
                for (AssociatedPrereqObject assoc : mtl.getListFor(ab)) {
                    Nature nature = assoc.getAssociation(AssociationKey.NATURE);
                    CDOMSingleRef<AbilityCategory> cat = assoc.getAssociation(AssociationKey.CATEGORY);
                    clear.addToListFor(nature, cat, assoc.getPrerequisiteList(), ab);
                }
            }
        }
    }
    for (Nature nature : m.getKeySet()) {
        for (CDOMSingleRef<AbilityCategory> category : m.getSecondaryKeySet(nature)) {
            for (List<Prerequisite> prereqs : m.getTertiaryKeySet(nature, category)) {
                StringBuilder sb = new StringBuilder();
                sb.append(category.getLSTformat(false)).append(Constants.PIPE);
                sb.append(nature);
                List<CDOMReference<Ability>> clearList = clear.removeListFor(nature, category, prereqs);
                if (clearList != null && !clearList.isEmpty()) {
                    sb.append(Constants.PIPE);
                    sb.append(Constants.LST_DOT_CLEAR_DOT);
                    sb.append(ReferenceUtilities.joinLstFormat(clearList, Constants.PIPE + Constants.LST_DOT_CLEAR_DOT));
                }
                sb.append(Constants.PIPE);
                sb.append(ReferenceUtilities.joinLstFormat(m.getListFor(nature, category, prereqs), Constants.PIPE));
                if (prereqs != null && !prereqs.isEmpty()) {
                    sb.append(Constants.PIPE);
                    sb.append(getPrerequisiteString(context, prereqs));
                }
                returnSet.add(sb.toString());
            }
        }
    }
    for (Nature nature : clear.getKeySet()) {
        for (CDOMSingleRef<AbilityCategory> category : clear.getSecondaryKeySet(nature)) {
            for (List<Prerequisite> prereqs : clear.getTertiaryKeySet(nature, category)) {
                StringBuilder sb = new StringBuilder();
                sb.append(category.getLSTformat(false)).append(Constants.PIPE);
                sb.append(nature).append(Constants.PIPE).append(Constants.LST_DOT_CLEAR_DOT);
                sb.append(ReferenceUtilities.joinLstFormat(clear.getListFor(nature, category, prereqs), Constants.PIPE + Constants.LST_DOT_CLEAR_DOT));
                if (prereqs != null && !prereqs.isEmpty()) {
                    sb.append(Constants.PIPE);
                    sb.append(getPrerequisiteString(context, prereqs));
                }
                returnSet.add(sb.toString());
            }
        }
    }
    Collection<ListKey<ChooseSelectionActor<?>>> addedActors = actors.getAdded();
    if (addedActors != null) {
        for (ListKey<ChooseSelectionActor<?>> lk : addedActors) {
            Changes<ChooseSelectionActor<?>> cras = context.getObjectContext().getListChanges(obj, lk);
            for (ChooseSelectionActor<?> cra : cras.getAdded()) {
                if (getTokenName().equals(cra.getSource())) {
                    try {
                        AbilityTargetSelector ats = (AbilityTargetSelector) cra;
                        StringBuilder sb = new StringBuilder();
                        sb.append(ats.getAbilityCategory().getLSTformat(false)).append(Constants.PIPE);
                        sb.append(ats.getNature()).append(Constants.PIPE).append(cra.getLstFormat());
                        List<Prerequisite> prereqs = ats.getPrerequisiteList();
                        if (prereqs != null && !prereqs.isEmpty()) {
                            sb.append(Constants.PIPE);
                            sb.append(getPrerequisiteString(context, prereqs));
                        }
                        returnSet.add(sb.toString());
                    } catch (PersistenceLayerException e) {
                        context.addWriteMessage(getTokenName() + " encountered error: " + e.getMessage());
                        return null;
                    }
                }
            }
        }
    }
    if (returnSet.isEmpty()) {
        return null;
    }
    return returnSet.toArray(new String[returnSet.size()]);
}
Also used : ChooseSelectionActor(pcgen.cdom.base.ChooseSelectionActor) AbilitySelector(pcgen.cdom.helper.AbilitySelector) ListKey(pcgen.cdom.enumeration.ListKey) TreeSet(java.util.TreeSet) ArrayList(java.util.ArrayList) TripleKeyMapToList(pcgen.base.util.TripleKeyMapToList) CDOMList(pcgen.cdom.base.CDOMList) List(java.util.List) MapToList(pcgen.base.util.MapToList) AbilityList(pcgen.cdom.list.AbilityList) AssociatedPrereqObject(pcgen.cdom.base.AssociatedPrereqObject) Nature(pcgen.cdom.enumeration.Nature) Ability(pcgen.core.Ability) AbilityTargetSelector(pcgen.cdom.helper.AbilityTargetSelector) CDOMDirectSingleRef(pcgen.cdom.reference.CDOMDirectSingleRef) AbilityList(pcgen.cdom.list.AbilityList) CDOMSingleRef(pcgen.cdom.reference.CDOMSingleRef) PersistenceLayerException(pcgen.persistence.PersistenceLayerException) TripleKeyMapToList(pcgen.base.util.TripleKeyMapToList) CDOMList(pcgen.cdom.base.CDOMList) CDOMReference(pcgen.cdom.base.CDOMReference) AbilityCategory(pcgen.core.AbilityCategory) Prerequisite(pcgen.core.prereq.Prerequisite)

Example 27 with CDOMSingleRef

use of pcgen.cdom.reference.CDOMSingleRef in project pcgen by PCGen.

the class AbilityLst method parseTokenWithSeparator.

@Override
protected ParseResult parseTokenWithSeparator(LoadContext context, CDOMObject obj, String value) {
    if (obj instanceof Ungranted) {
        return new ParseResult.Fail("Cannot use " + getTokenName() + " on an Ungranted object type: " + obj.getClass().getSimpleName(), context);
    }
    StringTokenizer tok = new StringTokenizer(value, Constants.PIPE);
    String cat = tok.nextToken();
    CDOMSingleRef<AbilityCategory> acRef = context.getReferenceContext().getCDOMReference(ABILITY_CATEGORY_CLASS, cat);
    if (!tok.hasMoreTokens()) {
        return new ParseResult.Fail(getTokenName() + " must have a Nature, " + "Format is: CATEGORY|NATURE|AbilityName: " + value, context);
    }
    final String natureKey = tok.nextToken();
    Nature nature;
    try {
        nature = Nature.valueOf(natureKey);
    } catch (IllegalArgumentException iae) {
        return new ParseResult.Fail(getTokenName() + " refers to invalid Ability Nature: " + natureKey, context);
    }
    if (Nature.ANY.equals(nature)) {
        return new ParseResult.Fail(getTokenName() + " refers to ANY Ability Nature, cannot be used in " + getTokenName() + ": " + value, context);
    }
    if (!tok.hasMoreTokens()) {
        return new ParseResult.Fail(getTokenName() + " must have abilities, Format is: " + "CATEGORY|NATURE|AbilityName: " + value, context);
    }
    String token = tok.nextToken();
    if (looksLikeAPrerequisite(token)) {
        return new ParseResult.Fail("Cannot have only PRExxx subtoken in " + getTokenName() + ": " + value, context);
    }
    String lkString = "GA_CA_" + cat + '_' + natureKey;
    ListKey glk = ListKey.getKeyFor(ChooseSelectionActor.class, lkString);
    ListKey<ChooseSelectionActor<?>> lk = glk;
    ArrayList<PrereqObject> edgeList = new ArrayList<>();
    CDOMReference<AbilityList> abilList = AbilityList.getAbilityListReference(acRef, nature);
    boolean first = true;
    boolean removed = false;
    ReferenceManufacturer<Ability> rm = context.getReferenceContext().getManufacturer(ABILITY_CLASS, ABILITY_CATEGORY_CLASS, cat);
    if (rm == null) {
        return new ParseResult.Fail("Could not get Reference Manufacturer for Category: " + cat, context);
    }
    boolean prereqsAllowed = true;
    while (true) {
        if (Constants.LST_DOT_CLEAR.equals(token)) {
            if (!first) {
                return new ParseResult.Fail("  Non-sensical " + getTokenName() + ": .CLEAR was not the first list item: " + value, context);
            }
            context.getListContext().removeAllFromList(getTokenName(), obj, abilList);
            context.getObjectContext().removeFromList(obj, ListKey.GA_CAKEYS, lk);
            context.getObjectContext().removeList(obj, lk);
            removed = true;
        } else if (token.startsWith(Constants.LST_DOT_CLEAR_DOT)) {
            String clearText = token.substring(7);
            CDOMReference<Ability> ref = TokenUtilities.getTypeOrPrimitive(rm, clearText);
            if (ref == null) {
                return ParseResult.INTERNAL_ERROR;
            }
            AssociatedPrereqObject assoc = context.getListContext().removeFromList(getTokenName(), obj, abilList, ref);
            assoc.setAssociation(AssociationKey.NATURE, nature);
            assoc.setAssociation(AssociationKey.CATEGORY, acRef);
            removed = true;
        } else if (Constants.LST_PERCENT_LIST.equals(token)) {
            prereqsAllowed = false;
            AbilitySelector as = new AbilitySelector(getTokenName(), acRef, nature);
            context.getObjectContext().addToList(obj, ListKey.NEW_CHOOSE_ACTOR, as);
        } else {
            CDOMReference<Ability> ability = TokenUtilities.getTypeOrPrimitive(rm, token);
            if (ability == null) {
                return ParseResult.INTERNAL_ERROR;
            }
            ability.setRequiresTarget(true);
            boolean loadList = true;
            List<String> choices = null;
            if (token.indexOf('(') != -1) {
                choices = new ArrayList<>();
                AbilityUtilities.getUndecoratedName(token, choices);
                if (choices.size() == 1) {
                    if (Constants.LST_PERCENT_LIST.equals(choices.get(0)) && (ability instanceof CDOMSingleRef)) {
                        CDOMSingleRef<Ability> ref = (CDOMSingleRef<Ability>) ability;
                        AbilityTargetSelector ats = new AbilityTargetSelector(getTokenName(), acRef, ref, nature);
                        context.getObjectContext().addToList(obj, ListKey.GA_CAKEYS, lk);
                        context.getObjectContext().addToList(obj, lk, ats);
                        edgeList.add(ats);
                        loadList = false;
                    }
                }
            }
            if (loadList) {
                AssociatedPrereqObject assoc = context.getListContext().addToList(getTokenName(), obj, abilList, ability);
                assoc.setAssociation(AssociationKey.NATURE, nature);
                assoc.setAssociation(AssociationKey.CATEGORY, acRef);
                if (choices != null) {
                    assoc.setAssociation(AssociationKey.ASSOC_CHOICES, choices);
                }
                edgeList.add(assoc);
            }
        }
        if (!tok.hasMoreTokens()) {
            // No prereqs, so we're done
            return ParseResult.SUCCESS;
        }
        first = false;
        token = tok.nextToken();
        if (looksLikeAPrerequisite(token)) {
            break;
        }
    }
    if (removed || !prereqsAllowed) {
        return new ParseResult.Fail("Cannot use PREREQs when using .CLEAR, .CLEAR., or %LIST in " + getTokenName(), context);
    }
    while (true) {
        Prerequisite prereq = getPrerequisite(token);
        if (prereq == null) {
            return new ParseResult.Fail("   (Did you put feats after the " + "PRExxx tags in " + getTokenName() + ":?)", context);
        }
        for (PrereqObject edge : edgeList) {
            edge.addPrerequisite(prereq);
        }
        if (!tok.hasMoreTokens()) {
            break;
        }
        token = tok.nextToken();
    }
    return ParseResult.SUCCESS;
}
Also used : ChooseSelectionActor(pcgen.cdom.base.ChooseSelectionActor) ArrayList(java.util.ArrayList) Ungranted(pcgen.cdom.base.Ungranted) AbilitySelector(pcgen.cdom.helper.AbilitySelector) ListKey(pcgen.cdom.enumeration.ListKey) AssociatedPrereqObject(pcgen.cdom.base.AssociatedPrereqObject) Nature(pcgen.cdom.enumeration.Nature) Ability(pcgen.core.Ability) AbilityTargetSelector(pcgen.cdom.helper.AbilityTargetSelector) ParseResult(pcgen.rules.persistence.token.ParseResult) AbilityList(pcgen.cdom.list.AbilityList) CDOMSingleRef(pcgen.cdom.reference.CDOMSingleRef) PrereqObject(pcgen.cdom.base.PrereqObject) AssociatedPrereqObject(pcgen.cdom.base.AssociatedPrereqObject) StringTokenizer(java.util.StringTokenizer) AbilityCategory(pcgen.core.AbilityCategory) CDOMReference(pcgen.cdom.base.CDOMReference) Prerequisite(pcgen.core.prereq.Prerequisite)

Example 28 with CDOMSingleRef

use of pcgen.cdom.reference.CDOMSingleRef in project pcgen by PCGen.

the class DefineStatLst method unparse.

@Override
public String[] unparse(LoadContext context, CDOMObject obj) {
    Changes<StatLock> lockChanges = context.getObjectContext().getListChanges(obj, ListKey.STAT_LOCKS);
    Changes<CDOMSingleRef<PCStat>> ulchanges = context.getObjectContext().getListChanges(obj, ListKey.UNLOCKED_STATS);
    Changes<CDOMSingleRef<PCStat>> nonStatChanges = context.getObjectContext().getListChanges(obj, ListKey.NONSTAT_STATS);
    Changes<CDOMSingleRef<PCStat>> nonStatToStatChanges = context.getObjectContext().getListChanges(obj, ListKey.NONSTAT_TO_STAT_STATS);
    Changes<StatLock> minValueChanges = context.getObjectContext().getListChanges(obj, ListKey.STAT_MINVALUE);
    Changes<StatLock> maxValueChanges = context.getObjectContext().getListChanges(obj, ListKey.STAT_MAXVALUE);
    TreeSet<String> set = new TreeSet<>();
    if (lockChanges != null && !lockChanges.isEmpty()) {
        if (lockChanges.includesGlobalClear()) {
            context.addWriteMessage("DEFINE:LOCK does not support .CLEAR");
            return null;
        }
        if (lockChanges.hasAddedItems()) {
            for (StatLock sl : lockChanges.getAdded()) {
                set.add("LOCK|" + sl.getLSTformat() + Constants.PIPE + sl.getLockValue());
            }
        }
    }
    if (ulchanges != null && !ulchanges.isEmpty()) {
        if (ulchanges.includesGlobalClear()) {
            context.addWriteMessage("DEFINE:UNLOCK " + "does not support .CLEAR");
            return null;
        }
        if (ulchanges.hasAddedItems()) {
            for (CDOMSingleRef<PCStat> st : ulchanges.getAdded()) {
                set.add("UNLOCK|" + st.getLSTformat(false));
            }
        }
    }
    if (nonStatChanges != null && !nonStatChanges.isEmpty()) {
        if (nonStatChanges.hasAddedItems()) {
            for (CDOMSingleRef<PCStat> st : nonStatChanges.getAdded()) {
                set.add("NONSTAT|" + st.getLSTformat(false));
            }
        }
    }
    if (nonStatToStatChanges != null && !nonStatToStatChanges.isEmpty()) {
        if (nonStatToStatChanges.hasAddedItems()) {
            for (CDOMSingleRef<PCStat> st : nonStatToStatChanges.getAdded()) {
                set.add("STAT|" + st.getLSTformat(false));
            }
        }
    }
    if (minValueChanges != null && !minValueChanges.isEmpty()) {
        if (minValueChanges.hasAddedItems()) {
            for (StatLock sl : minValueChanges.getAdded()) {
                set.add("MINVALUE|" + sl.getLSTformat() + Constants.PIPE + sl.getLockValue());
            }
        }
    }
    if (maxValueChanges != null && !maxValueChanges.isEmpty()) {
        if (maxValueChanges.hasAddedItems()) {
            for (StatLock sl : maxValueChanges.getAdded()) {
                set.add("MAXVALUE|" + sl.getLSTformat() + Constants.PIPE + sl.getLockValue());
            }
        }
    }
    if (set.isEmpty()) {
        return null;
    }
    return set.toArray(new String[set.size()]);
}
Also used : TreeSet(java.util.TreeSet) PCStat(pcgen.core.PCStat) CDOMSingleRef(pcgen.cdom.reference.CDOMSingleRef) StatLock(pcgen.cdom.helper.StatLock)

Example 29 with CDOMSingleRef

use of pcgen.cdom.reference.CDOMSingleRef in project pcgen by PCGen.

the class ClassDomainBracketToken method parseTokenWithSeparator.

@Override
protected ParseResult parseTokenWithSeparator(LoadContext context, PCClass pcc, String value) {
    Logging.deprecationPrint(getMessage(pcc, value));
    StringTokenizer pipeTok = new StringTokenizer(value, Constants.PIPE);
    boolean first = true;
    while (pipeTok.hasMoreTokens()) {
        String tok = pipeTok.nextToken();
        if (Constants.LST_DOT_CLEAR.equals(tok)) {
            if (!first) {
                return new ParseResult.Fail("  Non-sensical " + getTokenName() + ": .CLEAR was not the first list item", context);
            }
            context.getObjectContext().removeList(pcc, ListKey.DOMAIN);
            continue;
        }
        // Note: May contain PRExxx
        String domainKey;
        Prerequisite prereq = null;
        int openBracketLoc = tok.indexOf('[');
        if (openBracketLoc == -1) {
            if (tok.indexOf(']') != -1) {
                return new ParseResult.Fail("Invalid " + getTokenName() + " must have '[' if it contains a PREREQ tag", context);
            }
            domainKey = tok;
        } else {
            if (tok.lastIndexOf(']') != tok.length() - 1) {
                return new ParseResult.Fail("Invalid " + getTokenName() + " must end with ']' if it contains a PREREQ tag", context);
            }
            domainKey = tok.substring(0, openBracketLoc);
            String prereqString = tok.substring(openBracketLoc + 1, tok.length() - 1);
            if (prereqString.isEmpty()) {
                return new ParseResult.Fail(getTokenName() + " cannot have empty prerequisite : " + value, context);
            }
            prereq = getPrerequisite(prereqString);
            if (prereq == null) {
                return new ParseResult.Fail(getTokenName() + " had invalid prerequisite : " + prereqString, context);
            }
        }
        CDOMSingleRef<Domain> domain = context.getReferenceContext().getCDOMReference(DOMAIN_CLASS, domainKey);
        QualifiedObject<CDOMSingleRef<Domain>> qo = new QualifiedObject<>(domain);
        if (prereq != null) {
            qo.addPrerequisite(prereq);
        }
        context.getObjectContext().addToList(pcc, ListKey.DOMAIN, qo);
        first = false;
    }
    return ParseResult.SUCCESS;
}
Also used : StringTokenizer(java.util.StringTokenizer) QualifiedObject(pcgen.core.QualifiedObject) Domain(pcgen.core.Domain) CDOMSingleRef(pcgen.cdom.reference.CDOMSingleRef) Prerequisite(pcgen.core.prereq.Prerequisite)

Example 30 with CDOMSingleRef

use of pcgen.cdom.reference.CDOMSingleRef in project pcgen by PCGen.

the class PObjectLoaderTest method testUnlockDefineStat.

public void testUnlockDefineStat() throws Exception {
    LoadContext context = Globals.getContext();
    AbstractReferenceContext ref = context.getReferenceContext();
    ref.importObject(BuildUtilities.createStat("Constitution", "CON"));
    ref.importObject(BuildUtilities.createStat("Intelligence", "INT"));
    Ability feat = new Ability();
    is(context.processToken(feat, "DEFINESTAT", "UNLOCK|INT"), eq(true), "Parse fails for unlock");
    context.commit();
    assertTrue(context.getReferenceContext().resolveReferences(null));
    Logging.clearParseMessages();
    List<CDOMSingleRef<PCStat>> statList = feat.getListFor(ListKey.UNLOCKED_STATS);
    assertEquals(1, statList.size());
    assertEquals("INT", statList.get(0).get().getKeyName());
}
Also used : Ability(pcgen.core.Ability) AbstractReferenceContext(pcgen.rules.context.AbstractReferenceContext) LoadContext(pcgen.rules.context.LoadContext) CDOMSingleRef(pcgen.cdom.reference.CDOMSingleRef)

Aggregations

CDOMSingleRef (pcgen.cdom.reference.CDOMSingleRef)38 ArrayList (java.util.ArrayList)13 Ability (pcgen.core.Ability)10 Domain (pcgen.core.Domain)10 Prerequisite (pcgen.core.prereq.Prerequisite)10 StringTokenizer (java.util.StringTokenizer)9 QualifiedObject (pcgen.core.QualifiedObject)9 PCStat (pcgen.core.PCStat)6 List (java.util.List)4 Map (java.util.Map)4 TreeSet (java.util.TreeSet)4 CDOMObject (pcgen.cdom.base.CDOMObject)4 CDOMReference (pcgen.cdom.base.CDOMReference)4 KnownSpellIdentifier (pcgen.cdom.content.KnownSpellIdentifier)4 CharID (pcgen.cdom.enumeration.CharID)4 AbilityCategory (pcgen.core.AbilityCategory)4 PCClass (pcgen.core.PCClass)4 ParseResult (pcgen.rules.persistence.token.ParseResult)4 HashMap (java.util.HashMap)3 Formula (pcgen.base.formula.Formula)3