Added CantCancelSkirmish modifier with appropriate handling, and hooked it into json. Added Activated trigger hooks for json. Added trigger hooks for freeps beginning assignments.

This commit is contained in:
Christian 'ketura' McCarty
2021-12-18 01:53:29 -06:00
parent 76c73f5420
commit e35d30f514
13 changed files with 155 additions and 1 deletions

View File

@@ -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);
}
};

View File

@@ -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));
};
}
}

View File

@@ -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());

View File

@@ -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;
}
};
}
}

View File

@@ -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;
}
};
}
}

View File

@@ -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());

View File

@@ -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<PhysicalCard> woundSources, PhysicalCard physicalCard, int woundsAlreadyTaken, int woundsToTake) {
return true;

View File

@@ -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;
}
}

View File

@@ -57,6 +57,8 @@ public interface Modifier {
int getOverwhelmMultiplier(LotroGame game, PhysicalCard physicalCard);
boolean canCancelSkirmish(LotroGame game, PhysicalCard physicalCard);
boolean canTakeWounds(LotroGame game, Collection<PhysicalCard> woundSources, PhysicalCard physicalCard, int woundsAlreadyTakenInPhase, int woundsToTake);
boolean canTakeWoundsFromLosingSkirmish(LotroGame game, PhysicalCard physicalCard, Set<PhysicalCard> winners);

View File

@@ -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
}

View File

@@ -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))

View File

@@ -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);

View File

@@ -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;
}
}