"Orc Ambusher" Changing how the Roaming penalty works.

This commit is contained in:
marcins78@gmail.com
2011-09-10 20:21:33 +00:00
parent 124ff9e3c6
commit cb890daa59
8 changed files with 139 additions and 23 deletions

View File

@@ -0,0 +1,22 @@
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.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class RoamingPenaltyModifier extends AbstractModifier {
private int _modifier;
public RoamingPenaltyModifier(PhysicalCard source, Filter affectFilter, int modifier) {
super(source, "Roaming penalty " + ((modifier > 0) ? ("+" + modifier) : modifier), affectFilter, new ModifierEffect[]{ModifierEffect.TWILIGHT_COST_MODIFIER});
_modifier = modifier;
}
@Override
public int getRoamingPenalty(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) {
return result + _modifier;
}
}

View File

@@ -0,0 +1,60 @@
package com.gempukku.lotro.cards.set1.sauron;
import com.gempukku.lotro.cards.AbstractMinion;
import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.effects.CancelEffect;
import com.gempukku.lotro.cards.effects.ExertCharacterEffect;
import com.gempukku.lotro.cards.modifiers.RoamingPenaltyModifier;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.DefaultCostToEffectAction;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.timing.Action;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Collections;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Side: Shadow
* Culture: Sauron
* Twilight Cost: 1
* Type: Minion • Orc
* Strength: 5
* Vitality: 2
* Site: 6
* Game Text: Tracker. The roaming penalty for each [SAURON] minion you play is -1. Response: If a Free Peoples regroup
* event is played, exert this minion to cancel that event.
*/
public class Card1_261 extends AbstractMinion {
public Card1_261() {
super(1, 5, 2, 6, Keyword.ORC, Culture.SAURON, "Orc Ambusher");
addKeyword(Keyword.TRACKER);
}
@Override
public Modifier getAlwaysOnEffect(PhysicalCard self) {
return new RoamingPenaltyModifier(self, Filters.and(Filters.owner(self.getOwner()), Filters.culture(Culture.SAURON), Filters.type(CardType.MINION)), -1);
}
@Override
public List<? extends Action> getOptionalBeforeActions(String playerId, LotroGame game, Effect effect, EffectResult effectResult, PhysicalCard self) {
if (PlayConditions.played(game.getGameState(), game.getModifiersQuerying(), effectResult, Filters.and(Filters.side(Side.FREE_PEOPLE), Filters.type(CardType.EVENT), Filters.keyword(Keyword.REGROUP)))
&& PlayConditions.canExert(game.getGameState(), game.getModifiersQuerying(), self)) {
DefaultCostToEffectAction action = new DefaultCostToEffectAction(self, null, "Exert this minion to cancel that event.");
action.addCost(
new ExertCharacterEffect(self));
action.addEffect(
new CancelEffect(effect));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,14 +1,13 @@
package com.gempukku.lotro.cards.set1.site;
import com.gempukku.lotro.cards.AbstractSite;
import com.gempukku.lotro.cards.modifiers.RoamingPenaltyModifier;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.filters.Filters;
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.Modifier;
import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
/**
@@ -25,17 +24,14 @@ public class Card1_328 extends AbstractSite {
@Override
public Modifier getAlwaysOnEffect(final PhysicalCard self) {
return new AbstractModifier(self, "The roaming penalty for each Nazgul you play to Bree Streets is -2.", Filters.and(Filters.keyword(Keyword.ROAMING), Filters.keyword(Keyword.NAZGUL),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return (gameState.getCurrentSite() == self);
}
}), new ModifierEffect[]{ModifierEffect.TWILIGHT_COST_MODIFIER}) {
@Override
public int getTwilightCost(GameState gameState, ModifiersQuerying modifiersLogic, PhysicalCard physicalCard, int result) {
return result - 2;
}
};
return new RoamingPenaltyModifier(self,
Filters.and(
Filters.keyword(Keyword.NAZGUL),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return (gameState.getCurrentSite() == self);
}
}), -2);
}
}

View File

@@ -138,4 +138,9 @@ public abstract class AbstractModifier implements Modifier {
public boolean canBeHealed(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result) {
return result;
}
@Override
public int getRoamingPenalty(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result) {
return result;
}
}

View File

@@ -33,6 +33,8 @@ public interface Modifier {
public int getPlayOnTwilightCost(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, PhysicalCard target, int result);
public int getRoamingPenalty(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int result);
public boolean isOverwhelmedByStrength(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, int strength, int opposingStrength, boolean result);
public boolean canTakeWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, boolean result);

View File

@@ -272,6 +272,20 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
return result;
}
@Override
public int getRoamingPenalty(GameState gameState, PhysicalCard physicalCard) {
int result = 2;
for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result = modifier.getRoamingPenalty(gameState, this, physicalCard, result);
}
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
result = modifier.getRoamingPenalty(gameState, this, physicalCard, result);
}
return result;
}
@Override
public boolean isOverwhelmedByStrength(GameState gameState, PhysicalCard card, int strength, int opposingStrength) {
boolean result = (opposingStrength > strength * 2);

View File

@@ -26,6 +26,8 @@ public interface ModifiersQuerying {
public int getPlayOnTwilightCost(GameState gameState, PhysicalCard physicalCard, PhysicalCard target);
public int getRoamingPenalty(GameState gameState, PhysicalCard physicalCard);
public int getStrength(GameState gameState, PhysicalCard physicalCard);
public int getVitality(GameState gameState, PhysicalCard physicalCard);

View File

@@ -6,10 +6,10 @@ import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.GameState;
import com.gempukku.lotro.logic.modifiers.*;
import java.util.LinkedList;
import java.util.List;
import com.gempukku.lotro.logic.modifiers.AbstractModifier;
import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersLogic;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class RoamingRule {
private ModifiersLogic _modifiersLogic;
@@ -26,11 +26,26 @@ public class RoamingRule {
}
});
List<Modifier> modifiers = new LinkedList<Modifier>();
modifiers.add(new KeywordModifier(null, null, Keyword.ROAMING));
modifiers.add(new TwilightCostModifier(null, null, 2));
_modifiersLogic.addAlwaysOnModifier(
new CompositeModifier(null, roamingFilter, modifiers));
new AbstractModifier(null, "Has Roaming keyword", roamingFilter, new ModifierEffect[]{ModifierEffect.KEYWORD_MODIFIER, ModifierEffect.TWILIGHT_COST_MODIFIER}) {
@Override
public int getKeywordCount(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, Keyword keyword, int result) {
if (keyword == Keyword.ROAMING)
return result + 1;
return result;
}
@Override
public boolean hasKeyword(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, Keyword keyword, boolean result) {
if (keyword == Keyword.ROAMING)
return true;
return result;
}
@Override
public int getTwilightCost(GameState gameState, ModifiersQuerying modifiersLogic, PhysicalCard physicalCard, int result) {
return result + Math.min(0, modifiersLogic.getRoamingPenalty(gameState, physicalCard));
}
});
}
}