From 2f91f702a65a34918b3dd528e3befa303c6155ed Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Tue, 28 May 2024 02:51:17 -0500 Subject: [PATCH] Added some extra existence checks to card parsing. Sorted EffectFieldProcessor items alphabetically. --- .../lotro/cards/build/field/EffectFieldProcessor.java | 6 +++--- .../gempukku/lotro/cards/build/field/effect/AidCost.java | 4 ++++ .../lotro/cards/build/field/effect/AssignmentCost.java | 3 +++ .../gempukku/lotro/cards/build/field/effect/CopyCard.java | 4 ++++ .../gempukku/lotro/cards/build/field/effect/ExtraCost.java | 3 +++ .../lotro/cards/build/field/effect/PlayedInOtherPhase.java | 3 +++ .../cards/build/field/effect/ResponseEffectProcessor.java | 3 +++ .../build/field/effect/ResponseEventEffectProcessor.java | 3 +++ 8 files changed, 26 insertions(+), 3 deletions(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java index c1bcd52fd..277c6c4cf 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java @@ -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()); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AidCost.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AidCost.java index de3af37ce..c28ead3d8 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AidCost.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AidCost.java @@ -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 diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AssignmentCost.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AssignmentCost.java index 972347fc5..a998baea2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AssignmentCost.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/AssignmentCost.java @@ -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 diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/CopyCard.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/CopyCard.java index ec738dd9a..e357a760e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/CopyCard.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/CopyCard.java @@ -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 diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ExtraCost.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ExtraCost.java index 6b92c09fb..eb13472df 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ExtraCost.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ExtraCost.java @@ -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); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PlayedInOtherPhase.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PlayedInOtherPhase.java index a723f9ca5..6da49992c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PlayedInOtherPhase.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PlayedInOtherPhase.java @@ -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"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEffectProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEffectProcessor.java index bbb56f238..fe88bc69f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEffectProcessor.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEffectProcessor.java @@ -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"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEventEffectProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEventEffectProcessor.java index 181562762..bc94db797 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEventEffectProcessor.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/ResponseEventEffectProcessor.java @@ -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) {