"Forests of Ithilien"

This commit is contained in:
marcins78@gmail.com
2011-10-08 15:18:43 +00:00
parent 0cafce0e3b
commit 3703878577
13 changed files with 142 additions and 32 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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