Continued cleanup and fixes

This commit is contained in:
MarcinSc
2024-05-30 15:17:41 +07:00
parent b7d21879af
commit 4508d89ff3
21 changed files with 92 additions and 205 deletions

View File

@@ -163,6 +163,7 @@
optional: true
trigger: {
type: discardFromHandBy
player: you
by: side(shadow)
forced: true
}

View File

@@ -178,6 +178,9 @@
select: choose(minion,notAssignedToSkirmish)
}
}
{
type: consumeSurplusDamage
}
]
}
gametext: If a Dwarf kills a minion in a skirmish and that minion did not take all wounds caused by that Dwarf's damage bonus, assign those remaining wounds to minions not assigned to a skirmish.

View File

@@ -168,13 +168,9 @@
keywords: Plains
effects: [
{
type: modifier
type: controlledSiteModifier
modifier: {
type: modifyStrength
requires: {
type: canSpot
filter: self,controlledByShadowPlayer
}
filter: hunter,minion
amount: 1
}

View File

@@ -19,6 +19,7 @@ public class EffectFieldProcessor implements FieldProcessor {
effectProcessors.put("activatedindiscard", new ActivatedInDiscardEffectProcessor());
effectProcessors.put("aidcost", new AidCost());
effectProcessors.put("assignmentcost", new AssignmentCost());
effectProcessors.put("controlledsitemodifier", new ControlledSiteModifier());
effectProcessors.put("copycard", new CopyCard());
effectProcessors.put("deckbuildingrestriction", new DeckBuildingRestrictionGameTextProcessor());
effectProcessors.put("discardedfromplaytrigger", new DiscardedFromPlayTriggerEffectProcessor());

View File

@@ -14,8 +14,8 @@ import com.gempukku.lotro.logic.decisions.YesNoDecision;
import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect;
import com.gempukku.lotro.logic.effects.StackActionEffect;
import com.gempukku.lotro.logic.modifiers.CantBeAssignedToSkirmishModifier;
import com.gempukku.lotro.logic.modifiers.Condition;
import com.gempukku.lotro.logic.modifiers.FreePeoplePlayerMayNotAssignCharacterModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.PaidAssignmentCostModifier;
import com.gempukku.lotro.logic.modifiers.condition.AndCondition;
@@ -44,7 +44,7 @@ public class AssignmentCost implements EffectProcessor {
new ModifierSource() {
@Override
public Modifier getModifier(ActionContext actionContext) {
return new FreePeoplePlayerMayNotAssignCharacterModifier(actionContext.getSource(),
return new CantBeAssignedToSkirmishModifier(actionContext.getSource(),
new AndCondition(
RequirementCondition.createCondition(requirements, actionContext),
new Condition() {
@@ -53,7 +53,7 @@ public class AssignmentCost implements EffectProcessor {
return !game.getModifiersQuerying().assignmentCostWasPaid(game, actionContext.getSource());
}
}
), actionContext.getSource());
), actionContext.getGame().getGameState().getCurrentPlayerId(), actionContext.getSource());
}
});

View File

@@ -0,0 +1,21 @@
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.ModifierSource;
import com.gempukku.lotro.cards.build.field.EffectProcessor;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import org.json.simple.JSONObject;
public class ControlledSiteModifier implements EffectProcessor {
@Override
public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(value, "modifier");
JSONObject jsonObject = (JSONObject) value.get("modifier");
final ModifierSource modifier = environment.getModifierSourceFactory().getModifier(jsonObject, environment);
blueprint.appendControlledSiteModifier(modifier);
}
}

View File

@@ -45,6 +45,7 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("choosehowmanytwilighttokenstospot", new ChooseHowManyTwilightTokensToSpot());
effectAppenderProducers.put("chooseyesorno", new ChooseYesOrNo());
effectAppenderProducers.put("conditional", new ConditionalEffect());
effectAppenderProducers.put("consumesurplusdamage", new ConsumeSurplusDamage());
effectAppenderProducers.put("corruptringbearer", new CorruptRingBearer());
effectAppenderProducers.put("costtoeffect", new CostToEffect());
effectAppenderProducers.put("disablearcherytotalcontribution", new DisableArcheryTotalContribution());

View File

@@ -0,0 +1,36 @@
package com.gempukku.lotro.cards.build.field.effect.appender;
import com.gempukku.lotro.cards.build.ActionContext;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.cards.build.field.effect.EffectAppender;
import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.actions.ResolveSkirmishDamageAction;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.UnrespondableEffect;
import org.json.simple.JSONObject;
public class ConsumeSurplusDamage implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject);
return new DelayedAppender() {
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
return new UnrespondableEffect() {
@Override
protected void doPlayEffect(LotroGame game) {
final ResolveSkirmishDamageAction resolveSkirmishDamageAction = game.getActionsEnvironment().findTopmostActionOfType(ResolveSkirmishDamageAction.class);
if (resolveSkirmishDamageAction != null
&& resolveSkirmishDamageAction.getRemainingDamage() > 0) {
resolveSkirmishDamageAction.consumeRemainingDamage();
}
}
};
}
};
}
}

View File

@@ -8,7 +8,7 @@ import com.gempukku.lotro.cards.build.field.effect.EffectAppender;
import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.effects.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.logic.modifiers.PlayersCantPlayPhaseEventsOrPhaseSpecialAbilitiesModifier;
import com.gempukku.lotro.logic.modifiers.CantPlayPhaseEventsOrphaseSpecialAbilitiesModifier;
import com.gempukku.lotro.logic.timing.Effect;
import org.json.simple.JSONObject;
@@ -21,7 +21,7 @@ public class EndPhase implements EffectAppenderProducer {
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
return new AddUntilEndOfPhaseModifierEffect(
new PlayersCantPlayPhaseEventsOrPhaseSpecialAbilitiesModifier(actionContext.getSource(), null, actionContext.getGame().getGameState().getCurrentPhase()));
new CantPlayPhaseEventsOrphaseSpecialAbilitiesModifier(actionContext.getSource(), null, actionContext.getGame().getGameState().getCurrentPhase(), null));
}
};
}

View File

@@ -6,8 +6,6 @@ import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResol
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.logic.modifiers.CantUseSpecialAbilitiesModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.PlayerCantUseCardSpecialAbilitiesModifier;
import com.gempukku.lotro.logic.modifiers.PlayersCantUseCardSpecialAbilitiesModifier;
import org.json.simple.JSONObject;
public class CantUseSpecialAbilities implements ModifierSourceProducer {

View File

@@ -39,8 +39,8 @@ public class DiscardFromHandBy implements TriggerCheckerProducer {
}
if (result && playerSource != null) {
// Need to check if it was that player discarding the card
final String performingPlayer = ((DiscardCardFromHandResult) actionContext.getEffectResult()).getSource().getOwner();
if (performingPlayer == null || !performingPlayer.equals(playerSource.getPlayer(actionContext)))
final String handPlayerId = ((DiscardCardFromHandResult) actionContext.getEffectResult()).getHandPlayerId();
if (handPlayerId == null || !handPlayerId.equals(playerSource.getPlayer(actionContext)))
result = false;
}
if (result && memorize != null) {

View File

@@ -1,30 +0,0 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
public class FPSkirmishResistanceStrengthOverrideModifier extends AbstractModifier {
private static final Evaluator _resistanceEvaluator =
new Evaluator() {
@Override
public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) {
return game.getModifiersQuerying().getResistance(game, cardAffected);
}
};
public FPSkirmishResistanceStrengthOverrideModifier(PhysicalCard source, Filterable affectFilter, Condition condition) {
super(source, null, affectFilter, condition, ModifierEffect.SKIRMISH_STRENGTH_EVALUATOR_MODIFIER);
}
@Override
public String getText(LotroGame game, PhysicalCard self) {
return "Uses resistance instead of strength when resolving skirmish";
}
@Override
public Evaluator getFpSkirmishStrengthOverrideEvaluator(LotroGame game, PhysicalCard fpCharacter) {
return _resistanceEvaluator;
}
}

View File

@@ -1,25 +0,0 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
public class FPSkirmishVitalityStrengthOverrideModifier extends AbstractModifier {
private static final Evaluator _vitalityEvaluator =
(game, cardAffected) -> game.getModifiersQuerying().getVitality(game, cardAffected);
public FPSkirmishVitalityStrengthOverrideModifier(PhysicalCard source, Filterable affectFilter, Condition condition) {
super(source, null, affectFilter, condition, ModifierEffect.SKIRMISH_STRENGTH_EVALUATOR_MODIFIER);
}
@Override
public String getText(LotroGame game, PhysicalCard self) {
return "Uses vitality instead of strength when resolving skirmish";
}
@Override
public Evaluator getFpSkirmishStrengthOverrideEvaluator(LotroGame game, PhysicalCard fpCharacter) {
return _vitalityEvaluator;
}
}

View File

@@ -1,19 +0,0 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
public class FreePeoplePlayerMayNotAssignCharacterModifier extends AbstractModifier {
public FreePeoplePlayerMayNotAssignCharacterModifier(PhysicalCard source, Condition condition, Filterable affectFilter) {
super(source, "Free people player may not assign character to skirmish", affectFilter, condition, ModifierEffect.ASSIGNMENT_MODIFIER);
}
@Override
public boolean isPreventedFromBeingAssignedToSkirmish(LotroGame game, Side sidePlayer, PhysicalCard card) {
if (sidePlayer == Side.FREE_PEOPLE)
return true;
return false;
}
}

View File

@@ -1,28 +0,0 @@
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;
import com.gempukku.lotro.logic.timing.Action;
public class PlayerCantUseCardSpecialAbilitiesModifier extends AbstractModifier {
private final String playerId;
private final Filter _sourceFilters;
public PlayerCantUseCardSpecialAbilitiesModifier(PhysicalCard source, String playerId, Condition condition, Filterable... sourceFilters) {
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
this.playerId = playerId;
_sourceFilters = Filters.and(sourceFilters);
}
@Override
public boolean canPlayAction(LotroGame game, String performingPlayer, Action action) {
if (action.getType() == Action.Type.SPECIAL_ABILITY
&& _sourceFilters.accepts(game, action.getActionSource())
&& performingPlayer.equals(playerId))
return false;
return true;
}
}

View File

@@ -1,23 +0,0 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.timing.Action;
public class PlayersCantPlayPhaseEventsOrPhaseSpecialAbilitiesModifier extends AbstractModifier {
private final Phase _phase;
public PlayersCantPlayPhaseEventsOrPhaseSpecialAbilitiesModifier(PhysicalCard source, Condition condition, Phase phase) {
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
_phase = phase;
}
@Override
public boolean canPlayAction(LotroGame game, String performingPlayer, Action action) {
if ((action.getType() == Action.Type.PLAY_CARD || action.getType() == Action.Type.SPECIAL_ABILITY)
&& action.getActionTimeword() == _phase)
return false;
return true;
}
}

View File

@@ -1,25 +0,0 @@
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;
import com.gempukku.lotro.logic.timing.Action;
public class PlayersCantUseCardSpecialAbilitiesModifier extends AbstractModifier {
private final Filter _sourceFilters;
public PlayersCantUseCardSpecialAbilitiesModifier(PhysicalCard source, Condition condition, Filterable... sourceFilters) {
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
_sourceFilters = Filters.and(sourceFilters);
}
@Override
public boolean canPlayAction(LotroGame game, String performingPlayer, Action action) {
if (action.getType() == Action.Type.SPECIAL_ABILITY
&& _sourceFilters.accepts(game, action.getActionSource()))
return false;
return true;
}
}

View File

@@ -1,25 +0,0 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
public class ShadowSkirmishVitalityStrengthOverrideModifier extends AbstractModifier {
private static final Evaluator _vitalityEvaluator =
(game, cardAffected) -> game.getModifiersQuerying().getVitality(game, cardAffected);
public ShadowSkirmishVitalityStrengthOverrideModifier(PhysicalCard source, Filterable affectFilter, Condition condition) {
super(source, null, affectFilter, condition, ModifierEffect.SKIRMISH_STRENGTH_EVALUATOR_MODIFIER);
}
@Override
public String getText(LotroGame game, PhysicalCard self) {
return "Uses vitality instead of strength when resolving skirmish";
}
@Override
public Evaluator getShadowSkirmishStrengthOverrideEvaluator(LotroGame game, PhysicalCard fpCharacter) {
return _vitalityEvaluator;
}
}

View File

@@ -15,12 +15,12 @@ import java.util.Objects;
public class TriggerConditions {
public static boolean startOfPhase(LotroGame game, EffectResult effectResult, Phase phase) {
return (effectResult.getType() == EffectResult.Type.START_OF_PHASE
&& game.getGameState().getCurrentPhase() == phase);
&& ((StartOfPhaseResult) effectResult).getPhase() == phase || phase == null);
}
public static boolean endOfPhase(LotroGame game, EffectResult effectResult, Phase phase) {
return (effectResult.getType() == EffectResult.Type.END_OF_PHASE
&& (game.getGameState().getCurrentPhase() == phase || phase == null));
&& ((EndOfPhaseResult) effectResult).getPhase() == phase || phase == null);
}
public static boolean startOfTurn(LotroGame game, EffectResult effectResult) {

View File

@@ -9,7 +9,8 @@ import org.junit.Test;
import java.util.HashMap;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class Card_01_311_Tests
{
@@ -64,18 +65,22 @@ public class Card_01_311_Tests
assertEquals(Signet.ARAGORN, card.getBlueprint().getSignet());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void SamTest1() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
@Test
public void samPicksUpTheRing() throws DecisionResultInvalidException, CardNotFoundException {
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var sam = scn.GetFreepsCard("card");
scn.FreepsMoveCharToTable(sam);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(2, scn.GetTwilight());
PhysicalCardImpl frodo = scn.GetRingBearer();
scn.AddWoundsToChar(frodo, 4);
scn.FreepsPassCurrentPhaseAction();
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
assertEquals(scn.GetRingBearer(), sam);
assertEquals(Zone.DEAD, frodo.getZone());
}
}

View File

@@ -1,15 +1,15 @@
package com.gempukku.lotro.cards.official.set04;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class Card_04_001_Tests
{
@@ -23,7 +23,7 @@ public class Card_04_001_Tests
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
GenericCardTestHelper.RulingRing
"4_1"
);
}