Fixed Fanatic not triggering

This commit is contained in:
Christian 'ketura' McCarty
2024-12-06 19:09:49 -06:00
parent 714809f528
commit 9096476b73
5 changed files with 96 additions and 14 deletions

View File

@@ -139,9 +139,10 @@
{
type: KilledTrigger
optional: true
player: owner
requires: {
type: CanSpot
filter: self,InSkirmish
filter: RecentlyInSkirmishAgainst(self)
}
cost: {
type: RemoveCultureTokens
@@ -151,7 +152,7 @@
}
effect: {
type: wound
select: choose(companion,inSkirmishAgainst(self))
select: choose(companion,RecentlyInSkirmishAgainst(self))
}
}
]

View File

@@ -3,18 +3,27 @@ package com.gempukku.lotro.cards.build.field.effect;
import com.gempukku.lotro.cards.build.BuiltLotroCardBlueprint;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.PlayerSource;
import com.gempukku.lotro.cards.build.field.EffectProcessor;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver;
import org.json.simple.JSONObject;
public class KilledTriggerEffectProcessor implements EffectProcessor {
@Override
public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(value, "optional", "requires", "cost", "effect");
FieldUtils.validateAllowedFields(value, "optional", "player", "requires", "cost", "effect");
final boolean optional = FieldUtils.getBoolean(value.get("optional"), "optional", false);
final String player = FieldUtils.getString(value.get("player"), "player");
PlayerSource playerSource = (player != null) ? PlayerResolver.resolvePlayer(player) : null;
DefaultActionSource triggerActionSource = new DefaultActionSource();
if (playerSource != null) {
triggerActionSource.setPlayingPlayer(playerSource);
}
EffectUtils.processRequirementsCostsAndEffects(value, environment, triggerActionSource);
if (optional)
blueprint.setKilledOptionalTriggerAction(triggerActionSource);

View File

@@ -414,6 +414,11 @@ public class FilterFactory {
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment);
return (actionContext) -> Filters.inSkirmishAgainst(filterableSource.getFilterable(actionContext));
});
parameterFilters.put("recentlyinskirmishagainst",
(parameter, environment) -> {
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(parameter, environment);
return (actionContext) -> Filters.recentlyInSkirmishAgainst(filterableSource.getFilterable(actionContext));
});
parameterFilters.put("inskirmishagainstatleast",
(parameter, environment) -> {
String[] split = parameter.split(",", 2);

View File

@@ -317,6 +317,18 @@ public class Filters {
};
}
public static Filter recentlyInSkirmishAgainst(final Filterable... againstFilter) {
return (game, physicalCard) -> {
Skirmish skirmish = game.getGameState().getSkirmish();
if (skirmish != null && skirmish.getFellowshipCharacter() != null) {
return (skirmish.getFellowshipCharacter() == physicalCard && (Filters.acceptsAny(game, skirmish.getShadowCharacters(), Filters.and(againstFilter)) || Filters.acceptsAny(game, skirmish.getRemovedFromSkirmish(), Filters.and(againstFilter))))
|| (skirmish.getShadowCharacters().contains(physicalCard) && Filters.and(againstFilter).accepts(game, skirmish.getFellowshipCharacter()));
}
return false;
};
}
public static Filter canBeReturnedToHand(final PhysicalCard source) {
return (game, physicalCard) -> game.getModifiersQuerying().canBeReturnedToHand(game, physicalCard, source);
}

View File

@@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
@@ -18,8 +17,11 @@ public class Card_V2_020_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "102_20");
// put other cards in here as needed for the test case
put("fanatic", "102_20");
put("savage", "1_151");
put("machine", "5_60");
put("treebeard", "10_18");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -49,7 +51,7 @@ public class Card_V2_020_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("fanatic");
assertEquals("Berserk Fanatic", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
@@ -66,18 +68,71 @@ public class Card_V2_020_Tests
assertEquals(5, card.getBlueprint().getSiteNumber());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void BerserkFanaticTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void BerserkFanaticIsStrenghtPlus1ForEachWoundOnEachCharacterInSkirmish() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var fanatic = scn.GetShadowCard("fanatic");
var savage = scn.GetShadowCard("savage");
var machine = scn.GetShadowCard("machine");
scn.ShadowMoveCharToTable(fanatic, savage);
scn.ShadowMoveCardToSupportArea(machine);
var frodo = scn.GetRingBearer();
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(3, scn.GetTwilight());
scn.addWounds(frodo, 1);
scn.addWounds(fanatic, 1);
scn.addWounds(savage, 1);
//not in skirmish, should be base
assertEquals(8, scn.getStrength(fanatic));
scn.SkipToAssignments();
scn.FreepsDeclineAssignments();
scn.ShadowAssignToMinions(frodo, fanatic, savage);
scn.FreepsResolveSkirmish(frodo);
//Base strength of 8, +1 strength for the single wound on each of itself, the savage, and frodo
assertEquals(11, scn.getStrength(fanatic));
}
@Test
public void BerserkFanaticDyingInSkirmishCanRemove2TokensFromMachineToWoundSkirmisher() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var fanatic = scn.GetShadowCard("fanatic");
var machine = scn.GetShadowCard("machine");
scn.ShadowMoveCharToTable(fanatic);
scn.ShadowMoveCardToSupportArea(machine);
var treebeard = scn.GetFreepsCard("treebeard");
scn.FreepsMoveCharToTable(treebeard);
scn.StartGame();
scn.addWounds(fanatic, 2);
scn.AddTokensToCard(machine, 2);
scn.SkipToAssignments();
scn.FreepsAssignToMinions(treebeard, fanatic);
scn.FreepsResolveSkirmish(treebeard);
assertEquals(1, scn.GetVitality(fanatic));
assertEquals(0, scn.GetWoundsOn(treebeard));
assertEquals(2, scn.GetCultureTokensOn(machine));
assertEquals(Zone.SHADOW_CHARACTERS, fanatic.getZone());
scn.PassCurrentPhaseActions();
assertTrue(scn.ShadowHasOptionalTriggerAvailable());
scn.ShadowAcceptOptionalTrigger();
assertEquals(1, scn.GetWoundsOn(treebeard));
assertEquals(0, scn.GetCultureTokensOn(machine));
assertEquals(Zone.DISCARD, fanatic.getZone());
}
}