Added some extra existence checks to card parsing. Sorted EffectFieldProcessor items alphabetically.

This commit is contained in:
Christian 'ketura' McCarty
2024-05-28 02:51:17 -05:00
parent bb30c6c6b4
commit 2f91f702a6
8 changed files with 26 additions and 3 deletions

View File

@@ -21,8 +21,8 @@ public class EffectFieldProcessor implements FieldProcessor {
effectProcessors.put("assignmentcost", new AssignmentCost());
effectProcessors.put("copycard", new CopyCard());
effectProcessors.put("deckbuildingrestriction", new DeckBuildingRestrictionGameTextProcessor());
effectProcessors.put("displayableinformation", new DisplayableInformationEffectProcessor());
effectProcessors.put("discardedfromplaytrigger", new DiscardedFromPlayTriggerEffectProcessor());
effectProcessors.put("displayableinformation", new DisplayableInformationEffectProcessor());
effectProcessors.put("discount", new PotentialDiscount());
effectProcessors.put("event", new EventEffectProcessor());
effectProcessors.put("exerttargetextracost", new ExertTargetExtraCost());
@@ -30,14 +30,14 @@ public class EffectFieldProcessor implements FieldProcessor {
effectProcessors.put("extrapossessionclass", new ExtraPossessionClassEffectProcessor());
effectProcessors.put("inhandtrigger", new InHandTriggerEffectProcessor());
effectProcessors.put("killedtrigger", new KilledTriggerEffectProcessor());
effectProcessors.put("stackedonmodifier", new StackedOnModifier());
effectProcessors.put("modifier", new Modifier());
effectProcessors.put("modifierindiscard", new ModifierInDiscard());
effectProcessors.put("permanentsitemodifier", new PermanentSiteModifier());
effectProcessors.put("modifyowncost", new ModifyOwnCost());
effectProcessors.put("permanentsitemodifier", new PermanentSiteModifier());
effectProcessors.put("playedinotherphase", new PlayedInOtherPhase());
effectProcessors.put("response", new ResponseEffectProcessor());
effectProcessors.put("responseevent", new ResponseEventEffectProcessor());
effectProcessors.put("stackedonmodifier", new StackedOnModifier());
effectProcessors.put("trigger", new TriggerEffectProcessor());
effectProcessors.put("toplay", new ToPlay());
}

View File

@@ -4,6 +4,7 @@ import com.gempukku.lotro.cards.build.*;
import com.gempukku.lotro.cards.build.field.EffectProcessor;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
public class AidCost implements EffectProcessor {
@@ -15,6 +16,9 @@ public class AidCost implements EffectProcessor {
final EffectAppender[] costAppenders = environment.getEffectAppenderFactory().getEffectAppenders(costArray, environment);
if (costAppenders.length == 0)
throw new InvalidCardDefinitionException("At least one cost is required on AidCost effects.");
blueprint.setAidCostSource(
new AidCostSource() {
@Override

View File

@@ -37,6 +37,9 @@ public class AssignmentCost implements EffectProcessor {
final EffectAppender[] costAppenders = environment.getEffectAppenderFactory().getEffectAppenders(costArray, environment);
final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment);
if (costAppenders.length == 0)
throw new InvalidCardDefinitionException("At least one cost is required on AssignmentCost effects.");
blueprint.appendInPlayModifier(
new ModifierSource() {
@Override

View File

@@ -7,6 +7,7 @@ import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.field.EffectProcessor;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.cards.build.field.effect.trigger.TriggerChecker;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
public class CopyCard implements EffectProcessor {
@@ -16,6 +17,9 @@ public class CopyCard implements EffectProcessor {
final String filter = FieldUtils.getString(value.get("filter"), "filter");
if (StringUtils.isEmpty(filter))
throw new InvalidCardDefinitionException("Filter is required on CopyCard effects.");
final String autoRefreshTriggerString = """
{
type: trigger

View File

@@ -27,6 +27,9 @@ public class ExtraCost implements EffectProcessor {
final JSONObject[] costArray = FieldUtils.getObjectArray(value.get("cost"), "cost");
final EffectAppender[] costAppenders = environment.getEffectAppenderFactory().getEffectAppenders(costArray, environment);
if (costAppenders.length == 0)
throw new InvalidCardDefinitionException("At least one cost is required on ExtraCost effects.");
blueprint.appendExtraPlayCost(
(actionContext) -> new ExtraPlayCost() {
private Condition condition = RequirementCondition.createCondition(requirements, actionContext);

View File

@@ -12,6 +12,9 @@ public class PlayedInOtherPhase implements EffectProcessor {
FieldUtils.validateAllowedFields(value, "phase", "requires", "cost");
final Phase phase = FieldUtils.getEnum(Phase.class, value.get("phase"), "phase");
if (phase == null)
throw new InvalidCardDefinitionException("Phase is required on PlayedInOtherPhase effects.");
final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("requires"), "requires");
final JSONObject[] costArray = FieldUtils.getObjectArray(value.get("cost"), "cost");

View File

@@ -22,6 +22,9 @@ public class ResponseEffectProcessor implements EffectProcessor {
final JSONObject[] triggerArray = FieldUtils.getObjectArray(value.get("trigger"), "trigger");
if (triggerArray.length == 0)
throw new InvalidCardDefinitionException("At least one trigger is required on Response effects.");
final String text = FieldUtils.getString(value.get("text"), "text");
final Phase phase = FieldUtils.getEnum(Phase.class, value.get("phase"), "phase");

View File

@@ -14,6 +14,9 @@ public class ResponseEventEffectProcessor implements EffectProcessor {
FieldUtils.validateAllowedFields(value, "trigger", "requires", "cost", "effect", "text");
final JSONObject[] triggerArray = FieldUtils.getObjectArray(value.get("trigger"), "trigger");
if (triggerArray.length == 0)
throw new InvalidCardDefinitionException("At least one trigger is required on ResponseEvent effects.");
final String text = FieldUtils.getString(value.get("text"), "text");
for (JSONObject trigger : triggerArray) {