"Forests of Ithilien"
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
package com.gempukku.lotro.cards.modifiers;
|
||||
|
||||
import com.gempukku.lotro.filters.Filter;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.state.GameState;
|
||||
import com.gempukku.lotro.logic.modifiers.AbstractModifier;
|
||||
import com.gempukku.lotro.logic.modifiers.Condition;
|
||||
import com.gempukku.lotro.logic.modifiers.ModifierEffect;
|
||||
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
|
||||
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
|
||||
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
|
||||
|
||||
public class MinionSiteNumberModifier extends AbstractModifier {
|
||||
private Evaluator _evaluator;
|
||||
|
||||
public MinionSiteNumberModifier(PhysicalCard source, Filter affectFilter, Condition condition, int modifier) {
|
||||
this(source, affectFilter, condition, new ConstantEvaluator(modifier));
|
||||
}
|
||||
|
||||
public MinionSiteNumberModifier(PhysicalCard source, Filter affectFilter, Condition condition, Evaluator evaluator) {
|
||||
super(source, null, affectFilter, condition, new ModifierEffect[]{ModifierEffect.SITE_NUMBER_MODIFIER});
|
||||
_evaluator = evaluator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard self) {
|
||||
final int value = _evaluator.evaluateExpression(gameState, modifiersQuerying, self);
|
||||
if (value >= 0)
|
||||
return "Site number +" + value;
|
||||
else
|
||||
return "Site number " + value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinionSiteNumber(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) {
|
||||
return result + _evaluator.evaluateExpression(gameState, modifiersQuerying, physicalCard);
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,6 @@ public class Card1_352 extends AbstractSite {
|
||||
|
||||
@Override
|
||||
public Modifier getAlwaysOnModifier(PhysicalCard self) {
|
||||
return new StrengthModifier(self, Filters.and(Filters.type(CardType.ALLY), Filters.siteNumber(6)), 3);
|
||||
return new StrengthModifier(self, Filters.and(Filters.type(CardType.ALLY), Filters.siteNumber(6), Filters.siteBlock(Block.FELLOWSHIP)), 3);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.gempukku.lotro.cards.set4.gondor;
|
||||
|
||||
import com.gempukku.lotro.cards.AbstractPermanent;
|
||||
import com.gempukku.lotro.cards.PlayConditions;
|
||||
import com.gempukku.lotro.cards.effects.ChooseAndExertCharactersEffect;
|
||||
import com.gempukku.lotro.cards.effects.LiberateASiteEffect;
|
||||
import com.gempukku.lotro.cards.modifiers.MinionSiteNumberModifier;
|
||||
import com.gempukku.lotro.common.*;
|
||||
import com.gempukku.lotro.filters.Filters;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.state.GameState;
|
||||
import com.gempukku.lotro.game.state.LotroGame;
|
||||
import com.gempukku.lotro.logic.actions.ActivateCardAction;
|
||||
import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect;
|
||||
import com.gempukku.lotro.logic.modifiers.Condition;
|
||||
import com.gempukku.lotro.logic.modifiers.Modifier;
|
||||
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
|
||||
import com.gempukku.lotro.logic.timing.Action;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Set: The Two Towers
|
||||
* Side: Free
|
||||
* Culture: Gondor
|
||||
* Twilight Cost: 0
|
||||
* Type: Condition
|
||||
* Game Text: Plays to your support area. While the fellowship is at site 5T, the site number of each Man in
|
||||
* a skirmish is +2. Regroup: Discard this condition and exert a Ring-bound Man to liberate a site.
|
||||
*/
|
||||
public class Card4_121 extends AbstractPermanent {
|
||||
public Card4_121() {
|
||||
super(Side.FREE_PEOPLE, 0, CardType.CONDITION, Culture.GONDOR, Zone.SUPPORT, "Forests of Ithilien", true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Modifier> getAlwaysOnModifiers(PhysicalCard self) {
|
||||
return Collections.singletonList(
|
||||
new MinionSiteNumberModifier(self, Filters.and(Filters.race(Race.MAN), Filters.inSkirmish()),
|
||||
new Condition() {
|
||||
@Override
|
||||
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
|
||||
return gameState.getCurrentSiteNumber() == 5 && gameState.getCurrentSiteBlock() == Block.TWO_TOWERS;
|
||||
}
|
||||
}, 2));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<? extends Action> getExtraPhaseActions(String playerId, LotroGame game, PhysicalCard self) {
|
||||
if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.REGROUP, self)
|
||||
&& PlayConditions.canExert(self, game.getGameState(), game.getModifiersQuerying(), Filters.race(Race.MAN), Filters.keyword(Keyword.RING_BOUND))) {
|
||||
ActivateCardAction action = new ActivateCardAction(self, Keyword.REGROUP);
|
||||
action.appendCost(
|
||||
new DiscardCardsFromPlayEffect(self, self));
|
||||
action.appendCost(
|
||||
new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Filters.race(Race.MAN), Filters.keyword(Keyword.RING_BOUND)));
|
||||
action.appendEffect(
|
||||
new LiberateASiteEffect(self));
|
||||
return Collections.singletonList(action);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -90,6 +90,11 @@ public abstract class AbstractModifier implements Modifier {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinionSiteNumber(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTwilightCost(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) {
|
||||
return result;
|
||||
|
||||
@@ -36,6 +36,8 @@ public interface Modifier {
|
||||
|
||||
public int getResistance(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result);
|
||||
|
||||
public int getMinionSiteNumber(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result);
|
||||
|
||||
public int getTwilightCost(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result);
|
||||
|
||||
public int getPlayOnTwilightCost(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, PhysicalCard target, int result);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.gempukku.lotro.logic.modifiers;
|
||||
|
||||
public enum ModifierEffect {
|
||||
KEYWORD_MODIFIER, STRENGTH_MODIFIER, VITALITY_MODIFIER, RESISTANCE_MODIFIER, TWILIGHT_COST_MODIFIER, OVERWHELM_MODIFIER,
|
||||
KEYWORD_MODIFIER, STRENGTH_MODIFIER, VITALITY_MODIFIER, RESISTANCE_MODIFIER, SITE_NUMBER_MODIFIER, TWILIGHT_COST_MODIFIER, OVERWHELM_MODIFIER,
|
||||
WOUND_MODIFIER,
|
||||
PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_MODIFIER,
|
||||
LOOK_OR_REVEAL_MODIFIER, SPOT_MODIFIER, TARGET_MODIFIER
|
||||
|
||||
@@ -257,6 +257,16 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinionSiteNumber(GameState gameState, PhysicalCard physicalCard) {
|
||||
int result = physicalCard.getBlueprint().getSiteNumber();
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.SITE_NUMBER_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getMinionSiteNumber(gameState, this, physicalCard, result);
|
||||
}
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTwilightCost(GameState gameState, PhysicalCard physicalCard) {
|
||||
int result = physicalCard.getBlueprint().getTwilightCost();
|
||||
|
||||
@@ -42,6 +42,8 @@ public interface ModifiersQuerying {
|
||||
|
||||
public int getResistance(GameState gameState, PhysicalCard physicalCard);
|
||||
|
||||
public int getMinionSiteNumber(GameState gameState, PhysicalCard physicalCard);
|
||||
|
||||
public boolean isOverwhelmedByStrength(GameState gameState, PhysicalCard card, int strength, int opposingStrength);
|
||||
|
||||
// Wounds/exertions
|
||||
|
||||
@@ -39,17 +39,15 @@ public class ArcheryFireGameProcess implements GameProcess {
|
||||
Filters.and(
|
||||
Filters.type(CardType.ALLY),
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
Filters.siteNumber(_game.getGameState().getCurrentSiteNumber()),
|
||||
Filters.siteBlock(_game.getGameState().getCurrentSiteBlock()))
|
||||
),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard);
|
||||
}
|
||||
}
|
||||
)));
|
||||
Filters.isAllyAtHome(),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard);
|
||||
}
|
||||
})
|
||||
)
|
||||
));
|
||||
|
||||
_fellowshipArcheryTotal = _game.getModifiersQuerying().getArcheryTotal(gameState, Side.FREE_PEOPLE, _fellowshipArcheryTotal);
|
||||
|
||||
|
||||
@@ -34,16 +34,13 @@ public class FellowshipPlayerAssignsArcheryDamageGameProcess implements GameProc
|
||||
Filters.and(
|
||||
Filters.type(CardType.ALLY),
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
Filters.siteNumber(_game.getGameState().getCurrentSiteNumber()),
|
||||
Filters.siteBlock(_game.getGameState().getCurrentSiteBlock()))
|
||||
),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard);
|
||||
}
|
||||
}
|
||||
Filters.isAllyAtHome(),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return modifiersQuerying.isAllyParticipateInArcheryFire(gameState, physicalCard);
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -47,10 +47,7 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess {
|
||||
Filters.and(
|
||||
Filters.type(CardType.ALLY),
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
Filters.siteNumber(gameState.getCurrentSiteNumber()),
|
||||
Filters.siteBlock(gameState.getCurrentSiteBlock())
|
||||
),
|
||||
Filters.isAllyAtHome(),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
|
||||
@@ -50,10 +50,7 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess {
|
||||
Filters.and(
|
||||
Filters.type(CardType.ALLY),
|
||||
Filters.or(
|
||||
Filters.and(
|
||||
Filters.siteNumber(gameState.getCurrentSiteNumber()),
|
||||
Filters.siteBlock(gameState.getCurrentSiteBlock())
|
||||
),
|
||||
Filters.isAllyAtHome(),
|
||||
new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
|
||||
@@ -19,7 +19,7 @@ public class RoamingRule {
|
||||
Filter roamingFilter = Filters.and(Filters.type(CardType.MINION), new Filter() {
|
||||
@Override
|
||||
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
|
||||
return (physicalCard.getBlueprint().getSiteNumber() > gameState.getCurrentSiteNumber());
|
||||
return (modifiersQuerying.getMinionSiteNumber(gameState, physicalCard) > gameState.getCurrentSiteNumber());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user