diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/CancelSkirmish.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/CancelSkirmish.java index 27c25f737..c1fed3ea8 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/CancelSkirmish.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/CancelSkirmish.java @@ -38,6 +38,7 @@ public class CancelSkirmish implements EffectAppenderProducer { return game.getGameState().getSkirmish() != null && !game.getGameState().getSkirmish().isCancelled() && (Filters.countActive(game, Filters.and(involving, Filters.inSkirmish)) > 0) + && game.getModifiersQuerying().canCancelSkirmish(game, game.getGameState().getSkirmish().getFellowshipCharacter()) && (game.getFormat().canCancelRingBearerSkirmish() || Filters.countActive(game, Filters.ringBearer, Filters.inSkirmish) == 0); } }; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantCancelSkirmish.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantCancelSkirmish.java new file mode 100644 index 000000000..fa4e0335c --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantCancelSkirmish.java @@ -0,0 +1,27 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.*; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.logic.modifiers.CantCancelSkirmishModifier; +import com.gempukku.lotro.logic.modifiers.CantDiscardFromPlayModifier; +import org.json.simple.JSONObject; + +public class CantCancelSkirmish implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition"); + + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "any"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + return (actionContext) -> { + return new CantCancelSkirmishModifier(actionContext.getSource(), + "Can't cancel skirmish", + new RequirementCondition(requirements, actionContext), + filterableSource.getFilterable(actionContext)); + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java index 4fb11e432..5e3334f82 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java @@ -30,6 +30,7 @@ public class ModifierSourceFactory { modifierProducers.put("cantbeexerted", new CantBeExerted()); modifierProducers.put("cantbeoverwhelmedmultiplier", new CantBeOverwhelmedMultiplier()); modifierProducers.put("cantbetransferred", new CantBeTransferred()); + modifierProducers.put("cantcancelskirmish", new CantCancelSkirmish()); modifierProducers.put("cantdiscardcardsfromhandortopofdrawdeck", new CantDiscardCardsFromHandOrTopOfDrawDeck()); modifierProducers.put("cantheal", new CantHeal()); modifierProducers.put("cantlookorrevealhand", new CantLookOrRevealHand()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/ActivatedTriggerCheckerProducer.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/ActivatedTriggerCheckerProducer.java new file mode 100644 index 000000000..c21d7e295 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/ActivatedTriggerCheckerProducer.java @@ -0,0 +1,46 @@ +package com.gempukku.lotro.cards.build.field.effect.trigger; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.FilterableSource; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.common.Filterable; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.logic.timing.TriggerConditions; +import com.gempukku.lotro.logic.timing.results.PlayCardResult; +import com.gempukku.lotro.logic.timing.results.PlayEventResult; +import org.json.simple.JSONObject; + +public class ActivatedTriggerCheckerProducer implements TriggerCheckerProducer { + @Override + public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value, "filter", "memorize"); + + final String filterString = FieldUtils.getString(value.get("filter"), "filter"); + final String memorize = FieldUtils.getString(value.get("memorize"), "memorize"); + final FilterableSource filter = environment.getFilterFactory().generateFilter(filterString, environment); + return new TriggerChecker() { + @Override + public boolean accepts(ActionContext actionContext) { + final Filterable filterable = filter.getFilterable(actionContext); + boolean activated = TriggerConditions.activated(actionContext.getGame(), actionContext.getEffectResult(), filterable); + + if (activated) { + PlayCardResult playCardResult = (PlayCardResult) actionContext.getEffectResult(); + + if (memorize != null) { + PhysicalCard playedCard = playCardResult.getPlayedCard(); + actionContext.setCardMemory(memorize, playedCard); + } + } + return activated; + } + + @Override + public boolean isBefore() { + return false; + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/FreePlayerStartedAssigning.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/FreePlayerStartedAssigning.java new file mode 100644 index 000000000..55f968b23 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/FreePlayerStartedAssigning.java @@ -0,0 +1,31 @@ +package com.gempukku.lotro.cards.build.field.effect.trigger; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.FilterableSource; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.logic.timing.TriggerConditions; +import org.json.simple.JSONObject; + +public class FreePlayerStartedAssigning implements TriggerCheckerProducer { + @Override + public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value, "filter"); + + String filter = FieldUtils.getString(value.get("filter"), "filter", "any"); + final FilterableSource fpFilter = environment.getFilterFactory().generateFilter(filter, environment); + + return new TriggerChecker() { + @Override + public boolean accepts(ActionContext actionContext) { + return TriggerConditions.freePlayerStartedAssigning(actionContext.getGame(), actionContext.getEffectResult()); + } + + @Override + public boolean isBefore() { + return false; + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java index 3fd23cf3a..21b9f00ac 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java @@ -17,6 +17,7 @@ public class TriggerCheckerFactory { triggerCheckers.put("abouttoexert", new AboutToExert()); triggerCheckers.put("abouttoheal", new AboutToHeal()); triggerCheckers.put("abouttotakewound", new AboutToTakeWound()); + triggerCheckers.put("activated", new ActivatedTriggerCheckerProducer()); triggerCheckers.put("addsburden", new AddsBurden()); triggerCheckers.put("addsthreat", new AddsThreat()); triggerCheckers.put("assignedtoskirmish", new AssignedToSkirmish()); @@ -30,6 +31,7 @@ public class TriggerCheckerFactory { triggerCheckers.put("endofturn", new EndOfTurn()); triggerCheckers.put("exertedby", new ExertedBy()); triggerCheckers.put("exerts", new Exerts()); + triggerCheckers.put("freeplayerstartedassigning", new FreePlayerStartedAssigning()); triggerCheckers.put("heals", new Heals()); triggerCheckers.put("killed", new Killed()); triggerCheckers.put("losesinitiative", new LosesInitiative()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java index 9b5bf93bf..293c98571 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java @@ -138,6 +138,9 @@ public abstract class AbstractModifier implements Modifier { return 0; } + @Override + public boolean canCancelSkirmish(LotroGame game, PhysicalCard physicalCard) { return true; } + @Override public boolean canTakeWounds(LotroGame game, Collection woundSources, PhysicalCard physicalCard, int woundsAlreadyTaken, int woundsToTake) { return true; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantCancelSkirmishModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantCancelSkirmishModifier.java new file mode 100644 index 000000000..3cccf6636 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/CantCancelSkirmishModifier.java @@ -0,0 +1,24 @@ +package com.gempukku.lotro.logic.modifiers; + +import com.gempukku.lotro.common.Filterable; +import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; + +public class CantCancelSkirmishModifier extends AbstractModifier { + private Filter _cardFilter; + + + public CantCancelSkirmishModifier(PhysicalCard source, String text, Condition condition, Filterable affectFilter) { + super(source, text, affectFilter, condition, ModifierEffect.DISCARD_FROM_PLAY_MODIFIER); + _cardFilter = Filters.and(affectFilter); + } + + @Override + public boolean canCancelSkirmish(LotroGame game, PhysicalCard card) { + if (_cardFilter.accepts(game, card)) + return false; + return true; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java index fd315dd65..9ce198e41 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java @@ -57,6 +57,8 @@ public interface Modifier { int getOverwhelmMultiplier(LotroGame game, PhysicalCard physicalCard); + boolean canCancelSkirmish(LotroGame game, PhysicalCard physicalCard); + boolean canTakeWounds(LotroGame game, Collection woundSources, PhysicalCard physicalCard, int woundsAlreadyTakenInPhase, int woundsToTake); boolean canTakeWoundsFromLosingSkirmish(LotroGame game, PhysicalCard physicalCard, Set winners); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java index cc97e5f1b..8ff39b4f9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java @@ -22,5 +22,7 @@ public enum ModifierEffect { REMOVE_KEYWORD_MODIFIER, GIVE_KEYWORD_MODIFIER, CANCEL_KEYWORD_BONUS_TARGET_MODIFIER, LOSE_ALL_KEYWORDS_MODIFIER, - SANCTUARY_HEAL_MODIFIER, POTENTIAL_DISCOUNT_MODIFIER + SANCTUARY_HEAL_MODIFIER, POTENTIAL_DISCOUNT_MODIFIER, + + CANCEL_SKIRMISH_MODIFIER } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java index dbac1beb9..42a348b1d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java @@ -691,6 +691,14 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return true; } + @Override + public boolean canCancelSkirmish(LotroGame game, PhysicalCard card) { + for (Modifier modifier : getModifiers(game, ModifierEffect.CANCEL_SKIRMISH_MODIFIER)) + if (!modifier.canCancelSkirmish(game, card)) + return false; + return true; + } + @Override public boolean canHavePlayedOn(LotroGame game, PhysicalCard playedCard, PhysicalCard target) { for (Modifier modifier : getModifiersAffectingCard(game, ModifierEffect.TARGET_MODIFIER, target)) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java index a3921d1ac..6c57e9a68 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java @@ -88,6 +88,8 @@ public interface ModifiersQuerying { // Assignments public boolean canBeAssignedToSkirmish(LotroGame game, Side playerSide, PhysicalCard card); + boolean canCancelSkirmish(LotroGame game, PhysicalCard card); + public boolean isUnhastyCompanionAllowedToParticipateInSkirmishes(LotroGame game, PhysicalCard card); public boolean isAllyAllowedToParticipateInArcheryFire(LotroGame game, PhysicalCard card); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java index 47b85d1b3..ef5adbdde 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TriggerConditions.java @@ -458,4 +458,9 @@ public class TriggerConditions { } return false; } + + public static boolean freePlayerStartedAssigning(LotroGame game, EffectResult effectResult) { + return effectResult.getType() == EffectResult.Type.FREE_PEOPLE_PLAYER_STARTS_ASSIGNING; + } + }