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:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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));
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user