Fixed Morgul Balde

This commit is contained in:
marcin.sciesinski
2020-04-08 23:21:07 -07:00
parent 6139c377f5
commit 6a55160610
4 changed files with 398 additions and 4 deletions

View File

@@ -0,0 +1,282 @@
{
"2_49": {
"side": "shadow",
"site": 4,
"cost": 4,
"race": "Orc",
"strength": 8,
"culture": "Moria",
"vitality": 2,
"title": "*Archer Commander",
"type": "minion",
"keyword": "Archer",
"effects": {
"type": "modifier",
"modifier": {
"type": "modifyStrength",
"filter": "another,culture(moria),archer",
"amount": 2
}
}
},
"2_50": {
"side": "shadow",
"cost": 1,
"strength": 3,
"culture": "Moria",
"possession": "Hand Weapon",
"title": "*The Balrog's Sword",
"type": "artifact",
"target": "name(The Balrog)",
"effects": [
{
"type": "modifier",
"modifier": {
"type": "addKeyword",
"filter": "bearer",
"keyword": "damage+1"
}
},
{
"type": "extraPossessionClass"
}
]
},
"2_51": {
"side": "shadow",
"site": 4,
"cost": 12,
"race": "Balrog",
"strength": 17,
"culture": "Moria",
"vitality": 5,
"subtitle": "Durin's Bane",
"title": "*The Balrog",
"type": "minion",
"keyword": [
"Damage",
"Fierce"
],
"effects": [
{
"type": "trigger",
"trigger": {
"type": "condition",
"condition": {
"type": "canSpot",
"filter": "another,minion"
}
},
"effect": {
"type": "discard",
"filter": "all(another,minion)"
}
},
{
"type": "modifier",
"modifier": {
"type": "skipPhase",
"phase": "archery"
}
},
{
"type": "trigger",
"trigger": {
"type": "condition",
"condition": {
"type": "not",
"condition": {
"type": "location",
"filter": "underground"
}
}
},
"effect": {
"type": "discard",
"filter": "self"
}
}
]
},
"2_52": {
"side": "shadow",
"site": 4,
"cost": 14,
"race": "Balrog",
"strength": 17,
"culture": "Moria",
"vitality": 5,
"subtitle": "Flame of Udun",
"title": "*The Balrog",
"type": "minion",
"keyword": [
"Damage",
"Fierce"
],
"condition": {
"type": "canSpot",
"filter": "culture(moria),orc"
},
"effects": [
{
"type": "trigger",
"trigger": {
"type": "condition",
"condition": {
"type": "not",
"condition": {
"type": "location",
"filter": "underground"
}
}
},
"effect": {
"type": "discard",
"filter": "self"
}
},
{
"type": "activated",
"phase": "shadow",
"cost": [
{
"type": "exert",
"filter": "self"
},
{
"type": "removeTwilight",
"amount": 2
}
],
"effect": {
"type": "playCardFromDiscard",
"filter": "choose(culture(moria),orc)"
}
}
]
},
"2_53": {
"side": "shadow",
"cost": 1,
"strength": 2,
"culture": "Moria",
"title": "*Cave Troll's Chain",
"type": "possession",
"target": "name(Cave Troll of Moria)",
"effects": [
{
"type": "trigger",
"trigger": {
"type": "endOfPhase",
"phase": "maneuver"
},
"effect": [
{
"type": "chooseYesOrNo",
"player": "fp",
"text": "Would you like to skip the Archery phase?",
"memorize": "choice"
},
{
"type": "conditional",
"condition": {
"type": "memoryIs",
"memory": "choice",
"value": "yes"
},
"effect": {
"type": "addModifier",
"until": "start(regroup)",
"modifier": {
"type": "skipPhase",
"phase": "archery"
}
}
}
]
},
{
"type": "trigger",
"trigger": {
"type": "takesWound",
"filter": "bearer"
},
"condition": {
"type": "phase",
"phase": "archery"
},
"optional": true,
"effect": {
"type": "wound",
"filter": "choose(archer,companion)"
}
}
]
},
"2_54": {
"side": "shadow",
"cost": 1,
"strength": -2,
"culture": "Moria",
"title": "Dark Fire",
"type": "condition",
"condition": {
"type": "canSpot",
"filter": "name(The Balrog)"
},
"target": "name(Gandalf)",
"effects": {
"type": "trigger",
"trigger": {
"type": "moves"
},
"effect": {
"type": "exert",
"filter": "all(name(Gandalf))"
}
}
},
"2_55": {
"side": "shadow",
"cost": 1,
"culture": "Moria",
"title": "Dark Places",
"type": "condition",
"keyword": "Support Area",
"effects": [
{
"type": "modifier",
"modifier": {
"type": "modifyStrength",
"filter": "unique,culture(moria),minion",
"amount": 1
}
},
{
"type": "activated",
"phase": "shadow",
"condition": {
"type": "canSpot",
"filter": "not(your),site"
},
"effect": [
{
"type": "chooseActiveCards",
"text": "Choose opponent's site",
"filter": "choose(not(your),site)",
"memorize": "chosenSite"
},
{
"type": "playSite",
"block": "fellowship",
"number": {
"type": "siteNumberInMemory",
"memory": "chosenSite"
},
"filter": "or(marsh,underground)"
}
]
}
]
}
}

View File

@@ -2,12 +2,16 @@ 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.FilterableSource;
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.cards.build.field.effect.appender.resolver.CardResolver;
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver;
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.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.effects.TransferPermanentEffect;
@@ -31,7 +35,7 @@ public class Transfer implements EffectAppenderProducer {
result.addEffectAppender(
CardResolver.resolveCard(filter, "_temp1", "you", "Choose card to transfer", environment));
result.addEffectAppender(
CardResolver.resolveCard(where,
CardResolver.resolveCards(where,
actionContext -> (Filter) (game, physicalCard) -> {
final Collection<? extends PhysicalCard> transferCard = actionContext.getCardsFromMemory("_temp1");
if (transferCard.isEmpty())
@@ -41,7 +45,8 @@ public class Transfer implements EffectAppenderProducer {
if (transferredCard.getAttachedTo() == physicalCard)
return false;
return actionContext.getGame().getModifiersQuerying().canHaveTransferredOn(game, transferredCard, physicalCard);
}, "_temp2", "you", "Choose cards to transfer to", environment));
}, actionContext -> Filters.any,
ValueResolver.resolveEvaluator(1, environment), "_temp2", "you", "Choose cards to transfer to", environment));
result.addEffectAppender(
new DelayedAppender() {
@Override

View File

@@ -2,12 +2,16 @@ 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.FilterableSource;
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.cards.build.field.effect.appender.resolver.CardResolver;
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver;
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.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.effects.TransferPermanentNotFromPlayEffect;
@@ -32,7 +36,7 @@ public class TransferFromDiscard implements EffectAppenderProducer {
result.addEffectAppender(
CardResolver.resolveCardsInDiscard(filter, new ConstantEvaluator(1), "_temp1", "you", "Choose card to transfer", environment));
result.addEffectAppender(
CardResolver.resolveCard(where,
CardResolver.resolveCards(where,
actionContext -> (Filter) (game, physicalCard) -> {
final Collection<? extends PhysicalCard> transferCard = actionContext.getCardsFromMemory("_temp1");
if (transferCard.isEmpty())
@@ -42,7 +46,8 @@ public class TransferFromDiscard implements EffectAppenderProducer {
if (transferredCard.getAttachedTo() == physicalCard)
return false;
return actionContext.getGame().getModifiersQuerying().canHaveTransferredOn(game, transferredCard, physicalCard);
}, "_temp2", "you", "Choose cards to transfer to", environment));
}, actionContext -> Filters.any,
ValueResolver.resolveEvaluator(1, environment), "_temp2", "you", "Choose cards to transfer to", environment));
result.addEffectAppender(
new DelayedAppender() {
@Override

View File

@@ -1308,4 +1308,106 @@ public class IndividualCardAtTest extends AbstractAtTest {
assertEquals(burdens, _game.getGameState().getBurdens());
}
@Test
public void morgulBladeTransferFromSupportArea() throws DecisionResultInvalidException, CardNotFoundException {
initializeSimplestGame();
PhysicalCardImpl nelya = createCard(P2, "2_84");
PhysicalCardImpl morgulBlade = createCard(P2, "1_216");
PhysicalCardImpl bladeTip = createCard(P2, "1_209");
_game.getGameState().addCardToZone(_game, nelya, Zone.SHADOW_CHARACTERS);
_game.getGameState().addCardToZone(_game, bladeTip, Zone.SUPPORT);
_game.getGameState().attachCard(_game, morgulBlade, nelya);
skipMulligans();
// End fellowship phase
playerDecided(P1, "");
// End shadow phase
playerDecided(P2, "");
// End maneuver phase
playerDecided(P1, "");
playerDecided(P2, "");
// End archery phase
playerDecided(P1, "");
playerDecided(P2, "");
// End assignment phase
playerDecided(P1, "");
playerDecided(P2, "");
// Assign Frodo to Nelya
PhysicalCard frodo = _game.getGameState().getRingBearer(P1);
playerDecided(P1, frodo.getCardId() + " " + nelya.getCardId());
// Start skirmish
playerDecided(P1, String.valueOf(frodo.getCardId()));
// P1 Passes
playerDecided(P1, "");
// Use Morgul Blade
playerDecided(P2, "0");
assertEquals(Zone.DISCARD, morgulBlade.getZone());
assertEquals(Zone.ATTACHED, bladeTip.getZone());
System.out.println();
}
@Test
public void morgulBladeTransferFromDiscard() throws DecisionResultInvalidException, CardNotFoundException {
initializeSimplestGame();
PhysicalCardImpl nelya = createCard(P2, "2_84");
PhysicalCardImpl morgulBlade = createCard(P2, "1_216");
PhysicalCardImpl bladeTip = createCard(P2, "1_209");
_game.getGameState().addCardToZone(_game, nelya, Zone.SHADOW_CHARACTERS);
_game.getGameState().addCardToZone(_game, bladeTip, Zone.DISCARD);
_game.getGameState().attachCard(_game, morgulBlade, nelya);
skipMulligans();
// End fellowship phase
playerDecided(P1, "");
// End shadow phase
playerDecided(P2, "");
// End maneuver phase
playerDecided(P1, "");
playerDecided(P2, "");
// End archery phase
playerDecided(P1, "");
playerDecided(P2, "");
// End assignment phase
playerDecided(P1, "");
playerDecided(P2, "");
// Assign Frodo to Nelya
PhysicalCard frodo = _game.getGameState().getRingBearer(P1);
playerDecided(P1, frodo.getCardId() + " " + nelya.getCardId());
// Start skirmish
playerDecided(P1, String.valueOf(frodo.getCardId()));
// P1 Passes
playerDecided(P1, "");
// Use Morgul Blade
playerDecided(P2, "0");
assertEquals(Zone.DISCARD, morgulBlade.getZone());
assertEquals(Zone.ATTACHED, bladeTip.getZone());
System.out.println();
}
}