"A Shadow Rises"

This commit is contained in:
marcins78@gmail.com
2011-12-06 17:17:44 +00:00
parent 2754a32de1
commit 7dcd68f932
9 changed files with 188 additions and 12 deletions

View File

@@ -0,0 +1,46 @@
package com.gempukku.lotro.cards.effects;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.timing.AbstractEffect;
import com.gempukku.lotro.logic.timing.Effect;
import java.util.Collections;
public class TransferToShadowEffect extends AbstractEffect {
private PhysicalCard _card;
public TransferToShadowEffect(PhysicalCard card) {
_card = card;
}
@Override
public boolean isPlayableInFull(LotroGame game) {
return _card.getZone().isInPlay();
}
@Override
public String getText(LotroGame game) {
return null;
}
@Override
public Effect.Type getType() {
return null;
}
@Override
protected FullEffectResult playEffectReturningResult(LotroGame game) {
if (isPlayableInFull(game)) {
game.getGameState().removeCardsFromZone(_card.getOwner(), Collections.singleton(_card));
game.getGameState().addCardToZone(game, _card, Zone.SHADOW_CHARACTERS);
cardTransferredCallback();
return new FullEffectResult(true, true);
}
return new FullEffectResult(false, false);
}
protected void cardTransferredCallback() {
}
}

View File

@@ -0,0 +1,28 @@
package com.gempukku.lotro.cards.modifiers;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Filterable;
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;
public class IsAdditionalCardTypeModifier extends AbstractModifier {
private CardType _cardType;
public IsAdditionalCardTypeModifier(PhysicalCard source, Filterable affectFilter, CardType cardType) {
this(source, affectFilter, null, cardType);
}
public IsAdditionalCardTypeModifier(PhysicalCard source, Filterable affectFilter, Condition condition, CardType cardType) {
super(source, "Has additional card type - " + cardType.toString(), affectFilter, condition, ModifierEffect.ADDITIONAL_CARD_TYPE);
_cardType = cardType;
}
@Override
public boolean isAdditionalCardTypeModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, CardType cardType) {
return cardType == _cardType;
}
}

View File

@@ -0,0 +1,85 @@
package com.gempukku.lotro.cards.set11.wraith;
import com.gempukku.lotro.cards.AbstractPermanent;
import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.TriggerConditions;
import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.cards.effects.RemoveTwilightEffect;
import com.gempukku.lotro.cards.effects.TransferToShadowEffect;
import com.gempukku.lotro.cards.modifiers.MayNotBearModifier;
import com.gempukku.lotro.common.*;
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.ActivateCardAction;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect;
import com.gempukku.lotro.logic.modifiers.KeywordModifier;
import com.gempukku.lotro.logic.timing.Action;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.UnrespondableEffect;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class Card11_216 extends AbstractPermanent {
public Card11_216() {
super(Side.SHADOW, 0, CardType.CONDITION, Culture.WRAITH, Zone.SUPPORT, "A Shadow Rises");
}
@Override
protected List<? extends Action> getExtraPhaseActions(String playerId, LotroGame game, final PhysicalCard self) {
if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.MANEUVER, self, 5)
&& self.getZone() == Zone.SUPPORT) {
final ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new RemoveTwilightEffect(5));
action.appendEffect(
new DiscardCardsFromPlayEffect(self, Filters.attachedTo(self)));
action.appendEffect(
new TransferToShadowEffect(self) {
@Override
protected void cardTransferredCallback() {
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new KeywordModifier(self, self, Keyword.FIERCE), Phase.MANEUVER));
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new MayNotBearModifier(self, self, Filters.any), Phase.MANEUVER));
}
});
return Collections.singletonList(action);
}
return null;
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, final PhysicalCard self) {
if (TriggerConditions.startOfPhase(game, effectResult, Phase.REGROUP)) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new UnrespondableEffect() {
@Override
protected void doPlayEffect(LotroGame game) {
for (Map.Entry<Token, Integer> tokenCount : game.getGameState().getTokens(self).entrySet()) {
if (tokenCount.getValue() > 0)
game.getGameState().removeTokens(self, tokenCount.getKey(), tokenCount.getValue());
}
}
});
return Collections.singletonList(action);
}
return null;
}
@Override
public int getStrength() {
return 10;
}
@Override
public int getVitality() {
return 3;
}
}

View File

@@ -634,7 +634,8 @@ public class Filters {
return new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return (physicalCard.getBlueprint().getCardType() == cardType);
return (physicalCard.getBlueprint().getCardType() == cardType)
|| modifiersQuerying.isAdditionalCardType(gameState, physicalCard, cardType);
}
};
}

View File

@@ -111,6 +111,11 @@ public abstract class AbstractModifier implements Modifier {
return 0;
}
@Override
public boolean isAdditionalCardTypeModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, CardType cardType) {
return false;
}
@Override
public int getTwilightCostModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, boolean ignoreRoamingPenalty) {
return 0;

View File

@@ -1,9 +1,6 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.common.Signet;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.GameState;
@@ -47,6 +44,8 @@ public interface Modifier {
public int getMinionSiteNumberModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard);
public boolean isAdditionalCardTypeModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, CardType cardType);
public int getTwilightCostModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, boolean ignoreRoamingPenalty);
public int getPlayOnTwilightCostModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, PhysicalCard target);

View File

@@ -10,5 +10,7 @@ public enum ModifierEffect {
SPECIAL_FLAG_MODIFIER,
ADDITIONAL_CARD_TYPE,
REMOVE_KEYWORD_MODIFIER, GIVE_KEYWORD_MODIFIER, CANCEL_KEYWORD_BONUS_MODIFIER
}

View File

@@ -427,6 +427,19 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
}
}
@Override
public boolean isAdditionalCardType(GameState gameState, PhysicalCard card, CardType cardType) {
LoggingThreadLocal.logMethodStart(card, "isAdditionalCardType");
try {
for (Modifier modifier : getModifiersAffectingCard(gameState, ModifierEffect.ADDITIONAL_CARD_TYPE, card))
if (modifier.isAdditionalCardTypeModifier(gameState, this, card, cardType))
return true;
return false;
} finally {
LoggingThreadLocal.logMethodEnd();
}
}
@Override
public boolean canTakeWound(GameState gameState, PhysicalCard card) {
LoggingThreadLocal.logMethodStart(card, "canTakeWound");
@@ -453,9 +466,7 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
return false;
}
return true;
}
finally
} finally
{
LoggingThreadLocal.logMethodEnd();

View File

@@ -1,9 +1,6 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.common.Signet;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.GameState;
@@ -53,6 +50,8 @@ public interface ModifiersQuerying {
public int getOverwhelmMultiplier(GameState gameState, PhysicalCard card);
public boolean isAdditionalCardType(GameState gameState, PhysicalCard card, CardType cardType);
// Wounds/exertions
public boolean canTakeWound(GameState gameState, PhysicalCard card);