Fixes for the last Hobbit Draft Game expansion

This commit is contained in:
Phallen Cassidy
2021-12-06 13:04:08 -05:00
parent 314391bde0
commit 9e25f84173
14 changed files with 435 additions and 161 deletions

View File

@@ -175,14 +175,10 @@
"culture": "dwarven",
"filter": "self"
},
"limitPerPhase": 1,
"effect": {
"type": "putCardsFromDiscardIntoHand",
"filter": "choose(culture(dwarven),event,maxTwilight(1),minTwilight(1))",
"count": {
"type": "cardPhaseLimit",
"limit": 1,
"amount": 1
}
"filter": "choose(culture(dwarven),event,minTwilight(1),maxTwilight(1))",
}
}
]
@@ -215,7 +211,8 @@
},
"effect": {
"type": "putCardsFromHandOnBottomOfDeck"
}
},
"limitPerTurn": 1
}
]
},
@@ -821,7 +818,7 @@
}
},
"33_53": {
"title": "*Master Worryword",
"title": "*Master Worrywort",
"subtitle": "Hobbit Farmer",
"culture": "shire",
"cost": 1,

View File

@@ -220,7 +220,7 @@
"type": "modifier",
"modifier": {
"type": "cancelStrengthBonusTo",
"filter": "companion,culture(dwarven),inSkirmishAgainst(self)",
"filter": "companion,culture(dwarven)",
"from": "weapon"
}
}
@@ -311,6 +311,10 @@
"type": "endOfPhase",
"phase": "shadow"
},
"condition": {
"type": "canSpot",
"filter": "culture(gundabad),orc"
},
"effect": {
"type": "heal",
"filter": "choose(culture(gundabad),orc)"
@@ -319,28 +323,51 @@
{
"type": "activated",
"phase": "assignment",
"condition": {
"type": "location",
"filter": "forest"
},
"condition": [
{
"type": "location",
"filter": "forest"
},
{
"type": "canSpot",
"filter": "culture(gundabad),orc"
}
],
"effect": [
{
"type": "chooseActiveCards",
"filter": "choose(culture(gundabad),orc,assignableToSkirmishAgainst(name(Bilbo)))",
"text": "Choose minion to assign to Bilbo",
"filter": "choose(culture(gundabad),orc,assignableToSkirmishAgainst(name(Bilbo)))",
"memorize": "chosenMinion"
},
{
"type": "optional",
"player": "fp",
"text": "Would you like to add a doubt to assign {chosenMinion} to a companion?",
"effect": [
{
"type": "addBurdens"
},
{
"type": "assignFpCharacterToSkirmish",
"player": "fp",
"fpCharacter": "choose(companion)",
"against": "choose(memory(chosenMinion))"
}
]
},
{
"type": "preventable",
"player": "fp",
"text": "Would you like to add a doubt to assign {chosenMinion} to a companion?",
"text": "assignFpCharacterToSkirmish doesn't work here for some reason, so this cost registers as unable to be attempted and the effect assigns the minion if the FP passed on the optional above",
"cost": [
{
"type": "addBurdens"
},
{
"type": "assignFpCharacterToSkirmish",
"fpCharacter": "choose(companion,notAssignedToSkirmish)",
"player": "shadowPlayer",
"fpCharacter": "choose(companion)",
"against": "choose(memory(chosenMinion))"
}
],
@@ -396,17 +423,6 @@
"type": "condition",
"keyword": "support area",
"effects": [
{
"type": "trigger",
"trigger": {
"type": "aboutToDiscard",
"filter": "self"
},
"effect": {
"type": "putStackedCardsIntoHand",
"on": "self"
}
},
{
"type": "activated",
"phase": "regroup",
@@ -425,6 +441,46 @@
"filter": "choose(lowestStrength(culture(dwarven),companion))",
"where": "self"
}
},
{
"type": "trigger",
"trigger": {
"type": "aboutToDiscard",
"filter": "self"
},
"effect": [
{
"type": "memorizeStacked",
"on": "self",
"memory": "jailedCards"
},
{
"type": "addTrigger",
"trigger": {
"type": "discarded",
"filter": "self"
},
"effect": [
{
"type": "choice",
"player": "fp",
"texts": [
"The Free Peoples player takes stacked cards into hand"
],
"effects": [
{
"type": "putCardsFromDiscardIntoHand",
"filter": "choose(memory(jailedCards))",
"count": {
"type": "forEachInMemory",
"memory": "jailedCards"
}
}
]
}
]
}
]
}
]
},
@@ -446,9 +502,13 @@
"type": "modifyStrength",
"filter": "choose(minion)",
"amount": {
"type": "forEachYouCanSpot",
"filter": "culture(elven)",
"limit": 3
"type": "cardAffectedLimitPerPhase",
"limit": 3,
"source": {
"type": "forEachYouCanSpot",
"filter": "culture(elven)",
"limit": 3
}
}
}
},
@@ -515,6 +575,7 @@
"trigger": {
"type": "aboutToDiscard",
"filter": "another,condition,or(culture(gundabad),culture(mirkwood))",
"source": "side(free people)"
},
"cost": {
"type": "discard",
@@ -533,7 +594,41 @@
"cost": 1,
"type": "possession",
"vitality": 1,
"target": "or(troll,giant)"
"target": "or(troll,giant)",
"effects": {
"type": "activated",
"phase": "archery",
"cost": {
"type": "discard",
"filter": "self"
},
"effect": [
{
"type": "chooseANumber",
"from": 0,
"to": 3,
"memorize": "chosenNumber"
},
{
"type": "revealRandomCardsFromHand",
"forced": false,
"count": {
"type": "fromMemory",
"memory": "chosenNumber"
},
"memorize": "revealedCards"
},
{
"type": "modifyArcheryTotal",
"side": "shadow",
"amount": {
"type": "forEachMatchingInMemory",
"memory": "revealedCards",
"filter": "side(shadow)"
}
}
]
}
},
"33_36": {
"title": "Bridging Troll",
@@ -587,10 +682,18 @@
"count": 1,
"memorize": "revealedCard"
},
{
"type": "memorizeNumber",
"memory": "cardTwilight",
"amount": {
"type": "twilightCostInMemory",
"memory": "revealedCard"
}
}
{
"type": "discard",
"player": "fp",
"filter": "choose(side(free people),minTwilight(memory(revealedCard)),maxTwilight(memory(revealedCard)),not(companion))"
"filter": "choose(side(free people),minTwilight(memory(cardTwilight)),maxTwilight(memory(cardTwilight)),not(companion))"
}
]
}
@@ -667,11 +770,11 @@
"33_40": {
"title": "Goblin Bow",
"culture": "moria",
"cost": 1,
"cost": 0,
"type": "possession",
"possession": "ranged weapon",
"vitality": 1,
"target": "orc",
"target": "culture(moria),orc",
"effects": [
{
"type": "modifier",
@@ -703,10 +806,7 @@
"type": "playCardFromDiscard",
"filter": "choose(culture(moria),archer)"
},
"condition": {
"type": "perTurnLimit",
"limit": 1
}
"limitPerTurn": 1
}
]
},
@@ -738,7 +838,7 @@
"culture": "moria",
"cost": 5,
"type": "minion",
"race": "dragon",
"race": "giant",
"strength": 11,
"vitality": 3,
"site": 4,
@@ -807,7 +907,7 @@
"culture": "moria",
"cost": 7,
"type": "minion",
"race": "dragon",
"race": "giant",
"strength": 14,
"vitality": 4,
"site": 4,
@@ -839,6 +939,7 @@
{
"type": "revealrandomcardsfromhand",
"forced": false,
"hand": "fp",
"memorize": "revealedCard",
},
{
@@ -909,7 +1010,7 @@
"effect": {
"type": "preventable",
"player": "fp",
"text": "Would you like to prevent adding a doubt to prevent wound to character skirmishing The Great Goblin?",
"text": "Would you like to add a doubt to prevent a wound to the character skirmishing The Great Goblin?",
"cost": {
"type": "addBurdens"
},
@@ -965,7 +1066,7 @@
"phase": "shadow"
},
"effect": {
"type": "putCardsFromDeckIntoHand",
"type": "putCardsFromDiscardIntoHand",
"filter": "choose(or(culture(gundabad),culture(sauron)),event)"
}
}
@@ -1002,9 +1103,12 @@
"effect": {
"type": "drawCards",
"count": {
"type": "forEachYouCanSpot",
"filter": "ally",
"limit": 3
"type": "cardPhaseLimit",
"limit": 3,
"amount": {
"type": "forEachYouCanSpot",
"filter": "ally"
}
}
}
}
@@ -1042,9 +1146,13 @@
"effect": {
"type": "drawCards",
"count": {
"type": "forEachYouCanSpot",
"filter": "unique,minion",
"limit": 3
"type": "cardPhaseLimit",
"limit": 3,
"amount": {
"type": "forEachYouCanSpot",
"filter": "unique,minion",
"limit": 3
}
}
}
}
@@ -1180,6 +1288,7 @@
},
{
"type": "optional",
"player": "fp",
"text": "Would you like to take a Dwarven or Shire event into hand from discard?",
"effect": {
"type": "putCardsFromDiscardIntoHand",

View File

@@ -12,13 +12,17 @@
"type": "startOfPhase",
"phase": "fellowship"
},
"condition": {
"type": "isSide",
"side": "free people"
},
"cost": {
"type": "addTwilight",
"amount": 2
},
"effect": {
"type": "putCardsFromDeckIntoHand",
"filter": "choose(culture(shire))"
"filter": "choose(or(culture(gandalf),culture(shire)))"
}
}
},
@@ -36,6 +40,10 @@
"type": "startOfPhase",
"phase": "fellowship"
},
"condition": {
"type": "isSide",
"side": "free people"
},
"effect": {
"type": "playCardFromDrawDeck",
"filter": "choose(or(possession,artifact))"
@@ -77,56 +85,82 @@
"effect": [
{
"type": "chooseYesOrNo",
"player": "fp",
"text": "Would you like to transfer a Dwarven follower to a Dwarven companion for free?",
"memorize": "choice"
},
{
"type": "conditional",
"condition": {
"type": "memoryIs",
"memory": "choice",
"value": "yes"
},
"effect": [
"type": "choice",
"player": "fp",
"texts": [
"This is just a hack to allow this card to break the rules"
],
"effects": [
{
"type": "transfer",
"filter": "choose(culture(dwarven),follower,zone(support))",
"where": "choose(culture(dwarven),companion)"
},
{
"type": "duplicate",
"amount": {
"type": "forEachYouCanSpot",
"filter": "follower,culture(dwarven),zone(support)",
"type": "conditional",
"condition": {
"type": "memoryIs",
"memory": "choice",
"value": "yes"
},
"effect": {
"type": "conditional",
"condition": {
"type": "memoryIs",
"memory": "choice",
"value": "yes"
"effect": [
{
"type": "transfer",
"filter": "choose(culture(dwarven),follower)",
"where": "choose(culture(dwarven),companion)",
"memorizeTransferred": "transferredFollowers"
},
"effect": [
{
"type": "chooseYesOrNo",
"text": "Would you like to transfer another follower for free?",
"memorize": "choice"
{
"type": "duplicate",
"amount": {
"type": "forEachYouCanSpot",
"filter": "follower,culture(dwarven),not(memory(transferredFollowers))",
},
{
"effect": {
"type": "conditional",
"condition": {
"type": "memoryIs",
"memory": "choice",
"value": "yes"
},
"effect": {
"type": "transfer",
"filter": "choose(culture(dwarven),follower,zone(support))",
"where": "choose(culture(dwarven),companion)"
}
"effect": [
{
"type": "chooseYesOrNo",
"text": "Would you like to transfer another follower for free?",
"memorize": "choice"
},
{
"type": "conditional",
"condition": {
"type": "memoryIs",
"memory": "choice",
"value": "yes"
},
"effect": [
{
"type": "transfer",
"filter": "choose(culture(dwarven),follower,not(memory(transferredFollowers)))",
"where": "choose(culture(dwarven),companion)",
"memorizeTransferred": "anotherTransferredFollower"
},
{
"type": "memorize",
"filter": "or(memory(transferredFollowers),memory(anotherTransferredFollower))",
"memory": "transferredFollowers"
}
]
}
]
}
]
}
},
{
"type": "addModifier",
"modifier": {
"type": "cantBeTransferred",
"filter": "memory(transferredFollowers)"
}
}
]
}
]
}

View File

@@ -109,7 +109,7 @@ var CardFilter = Class.extend({
this.setSelect = $("<select style='width: 130px; font-size: 80%;'>"
+ "<option value='0-32'>All Sets</option>"
+ "<option value='0-19'>Official Sets</option>"
+ "<option value='30-32'>The Hobbit Sets</option>"
+ "<option value='30-33'>The Hobbit Sets</option>"
+ "<option value='50-69'>Player's Council Errata</option>"
+ "<option value='101-150'>Player's Council VSets</option>"
+ "<option value='50-69,101-150'>All Player's Council Cards</option>"
@@ -167,6 +167,7 @@ var CardFilter = Class.extend({
+ "<option value='30'>30 - The Hobbit: Main Deck</option>"
+ "<option value='31'>31 - The Hobbit: Expansion 1</option>"
+ "<option value='32'>32 - The Hobbit: Expansion 2</option>"
+ "<option value='33'>33 - The Hobbit: Expansion 3</option>"
+ "<option disabled>----------</option>"
+ "<option value='71-73'>PLAYTEST - Fellowship Block (PC)</option>"
+ "<option value='71-80'>PLAYTEST - Movie Block (PC)</option>"
@@ -320,6 +321,7 @@ var CardFilter = Class.extend({
+ "<option value='WRAITH'>Wraith</option>"
+ "<option value='DRAGON'>Dragon</option>"
+ "<option value='EAGLE'>Eagle</option>"
+ "<option value='GIANT'>Giant</option>"
+ "<option value='WARG'>Warg</option>"
+ "</select>");
combos.append(" <select id ='itemClass' style='font-size: 80%'>"

View File

@@ -41,10 +41,10 @@ var hobbit = {
'30_40': 'https://lotrtcgwiki.com/images/HDG30040.jpg',
'30_41': 'https://lotrtcgwiki.com/images/HDG30041.jpg',
'30_42': 'https://lotrtcgwiki.com/images/HDG30042.jpg',
'30_43': 'https://lotrtcgwiki.com/images/HDG30043.jpg',
'30_44': 'https://lotrtcgwiki.com/images/HDG30044.jpg',
'30_45': 'https://lotrtcgwiki.com/images/HDG30045.jpg',
'30_46': 'https://lotrtcgwiki.com/images/HDG30046.jpg',
'30_43': 'http://hobbitdraftgame.free.fr/Cards_Good_def/New_Bilbo.png',
'30_44': 'http://hobbitdraftgame.free.fr/Cards_Good_def/New_Bilbo_Collector_of_Treasures.png',
'30_45': 'http://hobbitdraftgame.free.fr/Cards_Good_def/New_Bilbo_Master_in_Riddles.png',
'30_46': 'http://hobbitdraftgame.free.fr/Cards_Good_def/New_Bilbo_Reliable_Companion.png',
'30_47': 'https://lotrtcgwiki.com/images/HDG30047.jpg',
'30_48': 'https://lotrtcgwiki.com/images/HDG30048.jpg',
'30_49': 'https://lotrtcgwiki.com/images/HDG30049.jpg',

View File

@@ -1,61 +1,61 @@
33S1
33S2
33S3
33S4
33S5
33S6
33S7
33S8
33S9
33S10
33S11
33S12
33S13
33S14
33S15
33S16
33S17
33S18
33S19
33S20
33S21
33S22
33S23
33S24
33S25
33S26
33S27
33S28
33S29
33S30
33S31
33S32
33S33
33S34
33S35
33S36
33S37
33S38
33S39
33S40
33S41
33S42
33S43
33S44
33S45
33S46
33S47
33S48
33S49
33S50
33S51
33S52
33S53
33S54
33S55
33S56
33S57
33S58
33S59
33S60
33S61
33X1
33X2
33R3
33X4
33R5
33R6
33X7
33X8
33R9
33R10
33R11
33X12
33R13
33R14
33X15
33X16
33R17
33X18
33X19
33X20
33X21
33X22
33R23
33U24
33U25
33U26
33U27
33U28
33U29
33U30
33U31
33U32
33R33
33U34
33U35
33R36
33R37
33C38
33C39
33U40
33U41
33C42
33X43
33U44
33C45
33U46
33C47
33U48
33C49
33U50
33U51
33R52
33R53
33R54
33X55
33X56
33X57
33X58
33X59
33X60
33R61

View File

@@ -34,10 +34,11 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("choice", new Choice());
effectAppenderProducers.put("chooseactivecards", new ChooseActiveCards());
effectAppenderProducers.put("chooseakeyword", new ChooseAKeyword());
effectAppenderProducers.put("chooseanumber", new ChooseANumber());
effectAppenderProducers.put("choosearace", new ChooseARace());
effectAppenderProducers.put("chooseandaddtwilight", new ChooseAndAddTwilight());
effectAppenderProducers.put("chooseandremovetokens", new ChooseAndRemoveTokens());
effectAppenderProducers.put("chooseandremovetwilight", new ChooseAndRemoveTwilight());
effectAppenderProducers.put("choosearace", new ChooseARace());
effectAppenderProducers.put("choosecardsfromdiscard", new ChooseCardsFromDiscard());
effectAppenderProducers.put("choosehowmanyburdenstospot", new ChooseHowManyBurdensToSpot());
effectAppenderProducers.put("choosehowmanytospot", new ChooseHowManyToSpot());
@@ -72,6 +73,7 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("makeselfringbearer", new MakeSelfRingBearer());
effectAppenderProducers.put("memorize", new MemorizeActive());
effectAppenderProducers.put("memorizenumber", new MemorizeNumber());
effectAppenderProducers.put("memorizestacked", new MemorizeStacked());
effectAppenderProducers.put("modifyarcherytotal", new ModifyArcheryTotal());
effectAppenderProducers.put("modifysitenumber", new ModifySiteNumber());
effectAppenderProducers.put("modifystrength", new ModifyStrength());

View File

@@ -0,0 +1,47 @@
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.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.PlayerSource;
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.PlayerResolver;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import com.gempukku.lotro.logic.decisions.IntegerAwaitingDecision;
import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect;
import com.gempukku.lotro.logic.timing.Effect;
import org.json.simple.JSONObject;
public class ChooseANumber implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "player", "text", "from", "to", "memorize");
final String player = FieldUtils.getString(effectObject.get("player"), "player", "you");
final String displayText = FieldUtils.getString(effectObject.get("text"), "text", "Choose a number");
final int from = FieldUtils.getInteger(effectObject.get("from"), "from", 0);
final int to = FieldUtils.getInteger(effectObject.get("to"), "to", 1);
final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize");
final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment);
if (memorize == null)
throw new InvalidCardDefinitionException("ChooseANumber requires a field to memorize the value");
return new DelayedAppender() {
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
return new PlayoutDecisionEffect(actionContext.getPerformingPlayer(),
new IntegerAwaitingDecision(1, displayText, from, to) {
@Override
public void decisionMade(String result) throws DecisionResultInvalidException {
actionContext.setValueToMemory(memorize, String.valueOf(getValidatedResult(result)));
}
});
}
};
}
}

View File

@@ -0,0 +1,55 @@
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.common.Filterable;
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.CostToEffectAction;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.UnrespondableEffect;
import org.json.simple.JSONObject;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class MemorizeStacked implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "filter", "on", "memory");
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "any");
final String on = FieldUtils.getString(effectObject.get("on"), "on");
final String memory = FieldUtils.getString(effectObject.get("memory"), "memory");
final FilterableSource filterSource = environment.getFilterFactory().generateFilter(filter, environment);
final FilterableSource onFilterSource = environment.getFilterFactory().generateFilter(on, environment);
return new DelayedAppender() {
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
return new UnrespondableEffect() {
@Override
protected void doPlayEffect(LotroGame game) {
final Filterable filterable = filterSource.getFilterable(actionContext);
final Filterable onFilterable = onFilterSource.getFilterable(actionContext);
final Collection<PhysicalCard> cardsWithStack = Filters.filterActive(game, onFilterable);
List<PhysicalCard> cardsToMemorize = new LinkedList<PhysicalCard>();
for (PhysicalCard cardWithStack : cardsWithStack)
cardsToMemorize.addAll(Filters.filter(game.getGameState().getStackedCards(cardWithStack), game, filterable));
actionContext.setCardMemory(memory, cardsToMemorize);
}
};
}
};
}
}

View File

@@ -32,7 +32,7 @@ public class PutCardsFromPlayOnBottomOfDeck implements EffectAppenderProducer {
MultiEffectAppender result = new MultiEffectAppender();
result.addEffectAppender(
CardResolver.resolveCardsInHand(filter, valueSource, "_temp", player, player, "Choose cards in play", environment));
CardResolver.resolveCards(filter, valueSource, "_temp", player, "Choose cards in play", environment));
result.addEffectAppender(
new DelayedAppender() {
@Override

View File

@@ -26,20 +26,22 @@ import java.util.List;
public class Transfer implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "filter", "where", "checkTarget");
FieldUtils.validateAllowedFields(effectObject, "filter", "where", "checkTarget", "memorizeTransferred", "memorizeTarget");
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter");
final String where = FieldUtils.getString(effectObject.get("where"), "where");
final boolean checkTarget = FieldUtils.getBoolean(effectObject.get("checkTarget"), "checkTarget", false);
final String memorizeTransferred = FieldUtils.getString(effectObject.get("memorizeTransferred"), "memorizeTransferred", "_temp1");
final String memorizeTarget = FieldUtils.getString(effectObject.get("memorizeTarget"), "memorizeTarget", "_temp2");
MultiEffectAppender result = new MultiEffectAppender();
result.addEffectAppender(
CardResolver.resolveCard(filter, "_temp1", "you", "Choose card to transfer", environment));
CardResolver.resolveCard(filter, memorizeTransferred, "you", "Choose card to transfer", environment));
result.addEffectAppender(
CardResolver.resolveCards(where,
actionContext -> (Filter) (game, physicalCard) -> {
final Collection<? extends PhysicalCard> transferCard = actionContext.getCardsFromMemory("_temp1");
final Collection<? extends PhysicalCard> transferCard = actionContext.getCardsFromMemory(memorizeTransferred);
if (transferCard.isEmpty())
return false;
final PhysicalCard transferredCard = transferCard.iterator().next();
@@ -52,16 +54,16 @@ public class Transfer implements EffectAppenderProducer {
return actionContext.getGame().getModifiersQuerying().canHaveTransferredOn(game, transferredCard, physicalCard);
}, actionContext -> Filters.any,
ValueResolver.resolveEvaluator(1, environment), "_temp2", "you", "Choose cards to transfer to", environment));
ValueResolver.resolveEvaluator(1, environment), memorizeTarget, "you", "Choose cards to transfer to", environment));
result.addEffectAppender(
new DelayedAppender() {
@Override
protected List<? extends Effect> createEffects(boolean cost, CostToEffectAction action, ActionContext actionContext) {
final Collection<? extends PhysicalCard> transferCard = actionContext.getCardsFromMemory("_temp1");
final Collection<? extends PhysicalCard> transferCard = actionContext.getCardsFromMemory(memorizeTransferred);
if (transferCard.isEmpty())
return null;
final Collection<? extends PhysicalCard> transferredToCard = actionContext.getCardsFromMemory("_temp2");
final Collection<? extends PhysicalCard> transferredToCard = actionContext.getCardsFromMemory(memorizeTarget);
if (transferredToCard.isEmpty())
return null;

View File

@@ -178,9 +178,11 @@ public class FilterFactory {
return actionContext -> {
final Filterable sourceFilterable = filterableSource.getFilterable(actionContext);
return (Filter) (game, physicalCard) -> {
for (PhysicalCard cardToCompareTo : Filters.filterActive(game, sourceFilterable)) {
if (cardToCompareTo.getBlueprint().getTitle().equals(physicalCard.getBlueprint().getTitle()))
return true;
for (PhysicalCard cardWithStack : Filters.filterActive(game, sourceFilterable)) {
for (PhysicalCard stackedCard : game.getGameState().getStackedCards(cardWithStack)) {
if (stackedCard.getBlueprint().getTitle().equals(physicalCard.getBlueprint().getTitle()))
return true;
}
}
return false;
};

View File

@@ -0,0 +1,23 @@
package com.gempukku.lotro.cards.build.field.effect.modifier;
import com.gempukku.lotro.cards.build.*;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.logic.modifiers.CantBeTransferredModifier;
import org.json.simple.JSONObject;
public class CantBeTransferred implements ModifierSourceProducer {
@Override
public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(object, "filter", "condition");
final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition");
final String filter = FieldUtils.getString(object.get("filter"), "filter");
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment);
return (actionContext) -> {
return new CantBeTransferredModifier(actionContext.getSource(), filterableSource.getFilterable(actionContext), new RequirementCondition(requirements, actionContext));
};
}
}

View File

@@ -29,6 +29,7 @@ public class ModifierSourceFactory {
modifierProducers.put("cantbediscarded", new CantBeDiscarded());
modifierProducers.put("cantbeexerted", new CantBeExerted());
modifierProducers.put("cantbeoverwhelmedmultiplier", new CantBeOverwhelmedMultiplier());
modifierProducers.put("cantbetransferred", new CantBeTransferred());
modifierProducers.put("cantdiscardcardsfromhandortopofdrawdeck", new CantDiscardCardsFromHandOrTopOfDrawDeck());
modifierProducers.put("cantheal", new CantHeal());
modifierProducers.put("cantlookorrevealhand", new CantLookOrRevealHand());