Search in sources :

Example 36 with PCStat

use of pcgen.core.PCStat in project pcgen by PCGen.

the class DefineStatLst method parseToken.

@Override
public ParseResult parseToken(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);
    }
    ParsingSeparator sep = new ParsingSeparator(value, '|');
    sep.addGroupingPair('[', ']');
    sep.addGroupingPair('(', ')');
    if (!sep.hasNext()) {
        return new ParseResult.Fail(getTokenName() + " may not be empty", context);
    }
    String firstItem = sep.next();
    DefineStatSubToken subToken;
    try {
        subToken = DefineStatSubToken.valueOf(firstItem);
    } catch (IllegalArgumentException e1) {
        return new ParseResult.Fail("Found unexpected sub tag " + firstItem + " in " + getTokenName() + Constants.COLON + value + ". Must be one of " + StringUtils.join(DefineStatSubToken.values(), ", ") + Constants.DOT, context);
    }
    if (!sep.hasNext()) {
        return new ParseResult.Fail(getTokenName() + Constants.COLON + subToken + "| must be followed by a stat.", context);
    }
    String statKey = sep.next();
    CDOMSingleRef<PCStat> stat = context.getReferenceContext().getCDOMReference(PCSTAT_CLASS, statKey);
    Formula f = null;
    if (subToken == DefineStatSubToken.LOCK || subToken == DefineStatSubToken.MINVALUE || subToken == DefineStatSubToken.MAXVALUE) {
        if (!sep.hasNext()) {
            return new ParseResult.Fail(getTokenName() + Constants.COLON + subToken + "| must be followed by both a stat and a value.", context);
        }
        String formula = sep.next();
        f = FormulaFactory.getFormulaFor(formula);
        if (!f.isValid()) {
            return new ParseResult.Fail("Formula in " + getTokenName() + " was not valid: " + f.toString(), context);
        }
    }
    if (sep.hasNext()) {
        return new ParseResult.Fail(getTokenName() + Constants.COLON + value + " has too many pipe separated item.", context);
    }
    switch(subToken) {
        case LOCK:
            context.getObjectContext().addToList(obj, ListKey.STAT_LOCKS, new StatLock(stat, f));
            break;
        case UNLOCK:
            context.getObjectContext().addToList(obj, ListKey.UNLOCKED_STATS, stat);
            break;
        case NONSTAT:
            context.getObjectContext().addToList(obj, ListKey.NONSTAT_STATS, stat);
            break;
        case STAT:
            context.getObjectContext().addToList(obj, ListKey.NONSTAT_TO_STAT_STATS, stat);
            break;
        case MINVALUE:
            context.getObjectContext().addToList(obj, ListKey.STAT_MINVALUE, new StatLock(stat, f));
            break;
        case MAXVALUE:
            context.getObjectContext().addToList(obj, ListKey.STAT_MAXVALUE, new StatLock(stat, f));
            break;
    }
    return ParseResult.SUCCESS;
}
Also used : Formula(pcgen.base.formula.Formula) ParsingSeparator(pcgen.base.text.ParsingSeparator) ParseResult(pcgen.rules.persistence.token.ParseResult) PCStat(pcgen.core.PCStat) Ungranted(pcgen.cdom.base.Ungranted) StatLock(pcgen.cdom.helper.StatLock)

Example 37 with PCStat

use of pcgen.core.PCStat in project pcgen by PCGen.

the class StatToken method parseTokenWithSeparator.

@Override
protected ParseResult parseTokenWithSeparator(LoadContext context, KitStat kitStat, String value) {
    StringTokenizer st = new StringTokenizer(value, Constants.PIPE);
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        int equalLoc = token.indexOf('=');
        if (equalLoc == -1) {
            return new ParseResult.Fail("Illegal " + getTokenName() + " did not have Stat=X format: " + value, context);
        }
        if (equalLoc != token.lastIndexOf('=')) {
            return new ParseResult.Fail("Illegal " + getTokenName() + " had two equal signs, is not Stat=X format: " + value, context);
        }
        String statName = token.substring(0, equalLoc);
        if (statName.isEmpty()) {
            return new ParseResult.Fail("Illegal " + getTokenName() + " had no stat, is not Stat=X format: " + value, context);
        }
        CDOMSingleRef<PCStat> stat = context.getReferenceContext().getCDOMReference(PCStat.class, statName);
        String formula = token.substring(equalLoc + 1);
        if (formula.isEmpty()) {
            return new ParseResult.Fail("Unable to find STAT value: " + value, context);
        }
        Formula statValue = FormulaFactory.getFormulaFor(formula);
        if (!statValue.isValid()) {
            return new ParseResult.Fail("StatValue in " + getTokenName() + " was not valid: " + statValue.toString(), context);
        }
        kitStat.addStat(stat, statValue);
    }
    return ParseResult.SUCCESS;
}
Also used : Formula(pcgen.base.formula.Formula) StringTokenizer(java.util.StringTokenizer) PCStat(pcgen.core.PCStat)

Example 38 with PCStat

use of pcgen.core.PCStat in project pcgen by PCGen.

the class StatBonusToken method parseToken.

@Override
public ParseResult parseToken(LoadContext context, EquipmentModifier obj, String value) {
    if (value == null) {
        return new ParseResult.Fail("CHOOSE:" + getTokenName() + " requires additional arguments", context);
    }
    if (value.indexOf('[') != -1) {
        return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments may not contain [] : " + value, context);
    }
    if (value.charAt(0) == '|') {
        return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments may not start with | : " + value, context);
    }
    if (value.charAt(value.length() - 1) == '|') {
        return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments may not end with | : " + value, context);
    }
    if (value.indexOf("||") != -1) {
        return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments uses double separator || : " + value, context);
    }
    int pipeLoc = value.indexOf(Constants.PIPE);
    if (pipeLoc == -1) {
        return new ParseResult.Fail("CHOOSE:" + getTokenName() + " must have two or more | delimited arguments : " + value, context);
    }
    StringTokenizer tok = new StringTokenizer(value, Constants.PIPE);
    Collection<PCStat> list = context.getReferenceContext().getConstructedCDOMObjects(PCStat.class);
    Integer min = null;
    Integer max = null;
    while (tok.hasMoreTokens()) {
        String tokString = tok.nextToken();
        if (tokString.startsWith("MIN=")) {
            min = Integer.valueOf(tokString.substring(4));
        // OK
        } else if (tokString.startsWith("MAX=")) {
            max = Integer.valueOf(tokString.substring(4));
        // OK
        } else if (tokString.startsWith("TITLE=")) {
        // OK
        } else if (tokString.startsWith("INCREMENT=")) {
            // OK
            Integer.parseInt(tokString.substring(4));
        } else {
            // Ensure this is a primitive STAT
            boolean found = false;
            for (PCStat stat : list) {
                if (tokString.equals(stat.getKeyName())) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                return new ParseResult.Fail("Did not find STAT: " + tokString + " used in CHOOSE:STATBONUS " + value, context);
            }
        }
    }
    if (max == null) {
        if (min != null) {
            return new ParseResult.Fail("Cannot have MIN=n without MAX=m in CHOOSE:STATBONUS: " + value, context);
        }
    } else {
        if (min == null) {
            return new ParseResult.Fail("Cannot have MAX=n without MIN=m in CHOOSE:STATBONUS: " + value, context);
        }
        if (max < min) {
            return new ParseResult.Fail("Cannot have MAX= less than MIN= in CHOOSE:STATBONUS: " + value, context);
        }
    }
    StringBuilder sb = new StringBuilder(value.length() + 20);
    sb.append(getTokenName()).append('|').append(value);
    context.getObjectContext().put(obj, StringKey.CHOICE_STRING, sb.toString());
    return ParseResult.SUCCESS;
}
Also used : StringTokenizer(java.util.StringTokenizer) ParseResult(pcgen.rules.persistence.token.ParseResult) PCStat(pcgen.core.PCStat)

Example 39 with PCStat

use of pcgen.core.PCStat in project pcgen by PCGen.

the class StatFacetTest method getObject.

@Override
protected PCStat getObject() {
    PCStat t = new PCStat();
    t.setName("Stat" + n++);
    return t;
}
Also used : PCStat(pcgen.core.PCStat)

Example 40 with PCStat

use of pcgen.core.PCStat in project pcgen by PCGen.

the class ObjectKeyActorTest method testWrappedObjectKeyActor.

public void testWrappedObjectKeyActor() {
    Deity d = new Deity();
    d.setName("Bob");
    PCStat str = new PCStat();
    str.setName("Strength");
    BigDecimal expectedResult = new BigDecimal("4.063");
    str.put(ObjectKey.COST, expectedResult);
    df.set(id, d);
    d.put(ObjectKey.SPELL_STAT, CDOMDirectSingleRef.getRef(str));
    ObjectKeyActor<BigDecimal> oka_cost = new ObjectKeyActor<>(ObjectKey.COST);
    CDOMObjectWrapper.load(dsid, str.getClass(), "cost", oka_cost);
    ObjectKeyActor<CDOMSingleRef<PCStat>> oka_stat = new ObjectKeyActor<>(ObjectKey.SPELL_STAT);
    CDOMObjectWrapper.load(dsid, d.getClass(), "stat", oka_stat);
    processThroughFreeMarker("${deity.stat}", str.getDisplayName());
    processThroughFreeMarker("${deity.stat.cost}", expectedResult.toString());
}
Also used : Deity(pcgen.core.Deity) PCStat(pcgen.core.PCStat) CDOMSingleRef(pcgen.cdom.reference.CDOMSingleRef) BigDecimal(java.math.BigDecimal)

Aggregations

PCStat (pcgen.core.PCStat)78 CDOMObject (pcgen.cdom.base.CDOMObject)10 GameMode (pcgen.core.GameMode)10 Before (org.junit.Before)9 Race (pcgen.core.Race)9 PCClass (pcgen.core.PCClass)7 PlayerCharacter (pcgen.core.PlayerCharacter)7 AbstractReferenceContext (pcgen.rules.context.AbstractReferenceContext)7 CDOMSingleRef (pcgen.cdom.reference.CDOMSingleRef)6 PCTemplate (pcgen.core.PCTemplate)6 Skill (pcgen.core.Skill)6 ArrayList (java.util.ArrayList)5 StatLock (pcgen.cdom.helper.StatLock)5 BonusObj (pcgen.core.bonus.BonusObj)5 Test (org.junit.Test)4 Formula (pcgen.base.formula.Formula)4 CharID (pcgen.cdom.enumeration.CharID)4 LoadContext (pcgen.rules.context.LoadContext)4 StringTokenizer (java.util.StringTokenizer)3 Type (pcgen.cdom.enumeration.Type)3