diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Dwarven-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Dwarven-errata.hjson index de35d387f..e443fd87d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Dwarven-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Dwarven-errata.hjson @@ -335,6 +335,74 @@ } } + 71_17: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN01E017.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 1_17 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 1U17 + rarity: U + setNum: "1" + cardNum: 17 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Grimir + subtitle: Dwarven Elder + unique: true + culture: dwarven + twilight: 1 + type: ally + allyHome: fellowship,3 + race: dwarf + strength: 3 + vitality: 3 + effects: { + type: activated + phase: fellowship + cost: [ + { + type: exert + filter: self + } + { + type: discardTopCardsFromDeck + deck: freeps + count: 1 + forced: false + } + ] + effect: { + type: PutCardsFromDiscardOnTopOfDeck + filter: choose(culture(dwarven),event) + count: 1 + } + } + gametext: Fellowship: Exert Grimir and discard the top card of your draw deck to place a [dwarven] event from your discard pile on top of your draw deck. + lore: Old and grey after many years spent in exile before the Lonely Mountain was reclaimed, Grimir can still wield his axe with strength. + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + 71_23: { cardInfo: { //Either a full URL, or a subpath for the PC image server diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Isengard-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Isengard-errata.hjson index 3c87e58bc..fe2c532e3 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Isengard-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Isengard-errata.hjson @@ -86,6 +86,67 @@ } } + 72_44: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN02E044.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 2_44 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 2C44 + rarity: C + setNum: "2" + cardNum: 44 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + side: shadow + twilight: 3 + culture: Isengard + title: No Business of Ours + type: condition + keyword: Support Area + effects: [ + { + type: ModifyOwnCost + requires: { + type: canSpot + filter: culture(isengard),minion + } + amount: -3 + } + { + type: modifier + modifier: { + type: cantLookOrRevealHand + player: fp + hand: shadowPlayer + } + } + ] + gametext: While you can spot an [isengard] minion, this card is twilight cost -3.\The Free Peoples player may not look at or reveal cards in any Shadow player's hand. + lore: "'Goblins? Cobblers! Far-off tales and children's stories, that's all that is!'" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + 72_45: { cardInfo: { //Either a full URL, or a subpath for the PC image server diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Shire-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Shire-errata.hjson index 0f557ae71..e127ff2ac 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Shire-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set02/set02-Shire-errata.hjson @@ -62,6 +62,68 @@ } } } + + 72_107: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN02E107.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 2_107 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 2U107 + rarity: U + setNum: "2" + cardNum: 107 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Not Feared in Sunlight + unique: false + culture: shire + twilight: 1 + type: condition + keyword: support area + requires: { + type: CanSpot + filter: Hobbit + count: 2 + } + effects: { + type: activated + phase: fellowship + cost: { + type: discard + filter: self + } + effect: { + type: modifyStrength + filter: all(Nazgul) + amount: -4 + until: start(regroup) + } + } + gametext: To play, spot 2 Hobbits.\Fellowship: Discard this condition to make each Nazgûl strength -4 until the regroup phase. + lore: "'...our shapes cast shadows in their minds, which only the noon sun destroys....'" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } 52_108: { cardInfo: { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Dwarven-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Dwarven-errata.hjson new file mode 100644 index 000000000..daa8c7570 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Dwarven-errata.hjson @@ -0,0 +1,89 @@ +{ + 73_4: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN03E004.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 3_4 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 3U4 + rarity: U + setNum: "3" + cardNum: 4 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: A Royal Welcome + unique: false + culture: dwarven + twilight: 2 + type: condition + keyword: support area + effects: [ + { + type: activated + phase: fellowship + cost: { + type: exert + filter: choose(culture(dwarven),companion) + } + effect: { + type: heal + filter: choose(culture(dwarven),ally) + } + } + { + type: activated + phase: skirmish + requires: { + type: CanSpot + filter: culture(dwarven),companion,InSkirmishAgainst(minion,StrengthMoreThan(9)) + } + cost: { + type: exert + filter: choose(culture(dwarven),ally) + } + effect: { + type: ModifyStrength + filter: choose(culture(dwarven),companion,InSkirmishAgainst(minion,StrengthMoreThan(9))) + amount: 2 + } + } + { + type: activated + phase: regroup + cost: { + type: exert + filter: choose(culture(dwarven),ally) + } + effect: { + type: heal + filter: choose(culture(dwarven),companion) + } + } + ] + gametext: Fellowship: Exert a [dwarven] companion to heal a [dwarven] ally.\Skirmish: Spot a [dwarven] companion skirmishing a minion of strength 10 or more and exert a [dwarven] ally to make that companion strength +2. \Regroup: Exert a [dwarven] ally to heal a [dwarven] companion. + lore: "" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + + +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Moria-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Moria-errata.hjson new file mode 100644 index 000000000..875e77f68 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Moria-errata.hjson @@ -0,0 +1,90 @@ +{ + 3_79: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN03E079.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 3_79 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 3U79 + rarity: U + setNum: "3" + cardNum: 79 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Malice + culture: moria + twilight: 0 + type: event + keyword: archery + requires: [ + { + type: CanSpot + filter: culture(moria),Orc + } + { + type: CanSpot + filter: culture(sauron),Orc + } + ] + effects: { + type: event + effect: [ + { + type: playCardFromDiscard + filter: choose(item,or(culture(sauron),culture(moria))) + memorize: item1 + } + { + type: playCardFromDiscard + filter: choose(item,or(culture(sauron),culture(moria))) + memorize: item2 + } + { + type: repeat + amount: { + type: sum + source: [ + { + type: ForEachInMemory + memory: item1 + } + { + type: ForEachInMemory + memory: item2 + } + ] + } + effect: { + type: wound + filter: choose(side(Free Peoples),archer) + } + } + ] + } + gametext: Spot a [moria] Orc and a [sauron] Orc to play up to 2 [sauron] or [moria] items from your discard pile. Wound a Free Peoples archer for each item played. + lore: Fueled by Sauron's hatred of living things, Orcs searched for the Ring of Power. + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + + +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Ringwraith-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Ringwraith-errata.hjson new file mode 100644 index 000000000..3cafc9aa4 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Ringwraith-errata.hjson @@ -0,0 +1,95 @@ +{ + 3_82: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN03E082.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 3_82 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 3U82 + rarity: U + setNum: "3" + cardNum: 82 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: News of Mordor + culture: wraith + twilight: 1 + type: event + keyword: maneuver + effects: { + type: event + effect: [ + { + type: choice + texts: [ + Exert an ISENGARD minion to make a Nazgul damage +1 until the regroup phase + Exert a Nazgul to prevent all wounds to an ISENGARD minion until the regroup phase + ] + effects: [ + { + type: costToEffect + cost: { + type: Exert + filter: choose(culture(isengard),minion) + } + effect: { + type: addKeyword + filter: choose(Nazgul) + keyword: damage+1 + } + } + { + type: costToEffect + cost: { + type: Exert + filter: choose(Nazgul) + } + effect: [ + { + type: ChooseActiveCards + count: 1 + filter: choose(culture(isengard),minion) + memorize: chosenMinion + text: Choose an ISENGARD minion to make unwoundable + } + { + type: AddModifier + until: start(regroup) + modifier: { + type: CantTakeWounds + filter: memory(chosenMinion) + } + } + ] + } + ] + } + ] + } + gametext: Choose one: exert an [isengard] minion to make a Nazgul damage +1 until the regroup phase, or exert a Nazgul to prevent all wounds to an [isengard] minion until the regroup phase. + lore: "'Build me an army worthy of Mordor.'" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + + +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Sauron-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Sauron-errata.hjson index a4be62d4c..e9952ba5c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Sauron-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set03/set03-Sauron-errata.hjson @@ -437,6 +437,130 @@ } } + 73_103: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN03E103.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 3_103 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 3R103 + rarity: R + setNum: "3" + cardNum: 103 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Terrible as the Dawn + unique: false + culture: sauron + twilight: 0 + type: event + keyword: [ + maneuver + ] + effects: { + type: event + effect: { + type: conditional + requires: [ + { + type: CanSpot + filter: culture(Sauron),minion + } + ] + effect: { + type: choice + texts: [ + Ring-bound Galadriel + Unbound/Ally Galadriel + ] + effects: [ + { + type: conditional + requires: { + type: CanSpot + filter: title(Galadriel),Ring-bound + } + effect: { + type: preventable + player: freeps + cost: { + type: choice + texts: [ + Discard 2 Elves + Add 2 burdens + ] + effects: [ + { + type: discard + filter: choose(Elf) + count: 2 + } + { + type: AddBurdens + amount: 2 + } + ] + } + text: Discard 2 Elves or add 2 burdens to prevent wounding Galadriel 3 times + effect: { + type: wound + times: 3 + filter: choose(title(Galadriel)) + } + } + } + { + type: conditional + requires: { + type: CantSpot + filter: title(Galadriel),Ring-bound + } + effect: { + type: preventable + player: freeps + cost: { + type: discard + filter: choose(Elf) + count: 2 + } + text: Discard 2 Elves to prevent wounding Galadriel 3 times + effect: { + type: wound + times: 3 + filter: choose(title(Galadriel)) + } + } + } + ] + } + } + } + gametext: Maneuver: Spot a [sauron] minion to wound Galadriel 3 times. The Free Peoples player may discard 2 Elves to prevent this. If Galadriel is Ring-bound, 2 burdens may be added instead. + lore: "'In the place of the Dark Lord, you would have a Queen... All shall love me and despair!'" + + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + 73_104: { cardInfo: { //Either a full URL, or a subpath for the PC image server diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set04/set04-Isengard-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set04/set04-Isengard-errata.hjson index 9a9f0e668..e3a5cad13 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set04/set04-Isengard-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set04/set04-Isengard-errata.hjson @@ -1,4 +1,105 @@ { + + 54_146: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN04E146.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 4_146 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 4R146 + rarity: R + setNum: "4" + cardNum: 146 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Come Down + culture: isengard + twilight: 0 + type: condition + keyword: [ + support area + ] + effects: [ + { + type: activated + phase: maneuver + effect: [ + { + type: ChooseActiveCards + filter: choose(fortification) + memorize: targetFort + text: Select a fortification to assault + } + { + type: Repeat + amount: { + type: Sum + source: [ + 1 + { + type: TwilightCostInMemory + memory: targetFort + } + ] + } + effect: { + type: Wound + player: freeps + filter: choose(culture(isengard),minion) + } + } + ] + } + { + type: activated + phase: archery + requires: { + type: CanSpot + filter: culture(Isengard),archer + count: 2 + } + effect: [ + { + type: AddModifier + modifier: { + type: AllyCanParticipateInArcheryFire + filter: Ally + } + } + { + type: AddModifier + modifier: { + type: CantTakeArcheryWounds + filter: Companion + } + } + ] + } + ] + gametext: Maneuver: Spot a fortification. Make the Free Peoples player distribute X + 1 wounds among your [isengard] minions to discard that fortification, where X is its twilight cost.\Archery: Spot 2 [isengard] archers to make allies take wounds from archery fire instead of companions. + lore: "" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } 54_192: { cardInfo: { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set05/set05-Dwarven-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set05/set05-Dwarven-errata.hjson new file mode 100644 index 000000000..121e2e172 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set05/set05-Dwarven-errata.hjson @@ -0,0 +1,88 @@ +{ + 55_8: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN05E008.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 5_8 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 5U8 + rarity: U + setNum: "5" + cardNum: 8 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Horn of Helm + unique: true + culture: dwarven + twilight: 2 + type: possession + keyword: support area + effects: [ + { + type: modifier + modifier: { + type: FPCultureSpot + requires: [ + { + type: CanSpot + filter: your,Man + } + { + type: CanSpot + filter: your,Elf + } + { + type: CanSpot + filter: your,Dwarf + } + ] + amount: -1 + } + } + { + type: activated + phase: maneuver + cost: { + type: exert + filter: choose(Dwarf,companion) + } + effect: { + type: addModifier + modifier: { + type: RemoveKeyword + requires: { + type: location + filter: battleground + } + filter: minion + keyword: damage + } + } + } + ] + + gametext: While you can spot your Man, Elf, and Dwarf, the number of Free Peoples cultures that can be spotted is -1.\Maneuver: Exert a Dwarf companion to make each minion at a battleground lose all damage bonuses until the regroup phase. + lore: "...the sound of the great horn of Helm rang out." + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set05/set05-Isengard-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set05/set05-Isengard-errata.hjson new file mode 100644 index 000000000..f2cd03bc8 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set05/set05-Isengard-errata.hjson @@ -0,0 +1,91 @@ +{ + 55_57: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN05E057.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 5_57 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 5U57 + rarity: U + setNum: "5" + cardNum: 57 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Scaling Ladder + unique: false + culture: isengard + twilight: 0 + type: condition + keyword: [ + support area + machine + ] + effects: [ + { + type: activated + phase: shadow + cost: { + type: exert + filter: choose(Uruk-hai) + } + effect: { + type: AddTokens + amount: 1 + culture: isengard + filter: self + } + } + { + type: activated + phase: skirmish + cost: [ + { + type: MemorizeNumber + amount: { + type: ForEachToken + filter: self + culture: isengard + } + memory: tokenCount + } + { + type: discard + filter: self + } + ] + effect: { + type: Heal + count: { + type: FromMemory + memory: tokenCount + } + filter: choose(Uruk-hai) + } + } + ] + + gametext: Machine.\Shadow: Exert an Uruk-hai to place an [isengard] token on this card (limit 2).\Skirmish: Discard this condition to heal an Uruk-hai for each [isengard] token on this card. + lore: "Hundreds of long ladders were lifted up. Many were cast down in ruin, but many more replaced them...." + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set07/set07-Rohan-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set07/set07-Rohan-errata.hjson new file mode 100644 index 000000000..0d9df27da --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set07/set07-Rohan-errata.hjson @@ -0,0 +1,82 @@ +{ + 77_256: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN07E256.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 7_256 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 7C256 + rarity: C + setNum: "7" + cardNum: 256 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: They Sang as They Slew + culture: rohan + twilight: 1 + type: event + keyword: regroup + effects: { + type: event + cost: { + type: Exert + filter: choose(mounted,companion) + count: { + type: range + from: 0 + to: { + type: max + first: { + type: ForEachBurden + } + second: { + type: ForEachYouCanSpot + filter: minion + } + } + } + memorize: exertedComps + } + effect: [ + { + type: Wound + filter: choose(minion) + count: { + type: FromMemory + memory: exertedComps + } + } + { + type: RemoveBurdens + amount: { + type: FromMemory + memory: exertedComps + } + } + ] + } + gametext: Exert X mounted companions to wound X minions and remove X burdens. + lore: "...for the joy of battle was on them, and the sound of their singing that was fair and terrible came even to the City." + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set08/set08-Gondor-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set08/set08-Gondor-errata.hjson new file mode 100644 index 000000000..b50777bed --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set08/set08-Gondor-errata.hjson @@ -0,0 +1,103 @@ +{ + 78_48: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN08E048.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 8_48 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 8C48 + rarity: C + setNum: "8" + cardNum: 48 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Swept Away + unique: false + culture: gondor + twilight: 0 + type: condition + keyword: [ + support area + ] + effects: [ + { + type: trigger + optional: true + trigger: { + type: moves + } + effect: { + type: choice + texts: [ + Add a threat + Discard this condition + ] + effects: [ + { + type: AddThreats + amount: 1 + } + { + type: discard + filter: self + } + ] + } + } + { + type: Modifier + modifier: { + type: CantTakeWounds + filter: exhausted,culture(gondor),wraith + requires: { + type: HaveInitiative + side: freeps + } + } + } + { + type: ActivatedTrigger + trigger: { + type: AboutToDiscard + filter: self + source: side(Shadow) + } + cost: { + type: DiscardFromHand + count: 2 + forced: false + } + effect: { + type: PreventDiscard + filter: self + } + } + ] + gametext: Each time the fellowship moves, add a threat or discard this condition.
While you have initiative, exhausted [gondor] Wraiths cannot take wounds.\Response: If a Shadow card is about to discard this condition, discard 2 cards from hand to prevent that. + lore: "" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + + + +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set08/set08-Rohan-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set08/set08-Rohan-errata.hjson new file mode 100644 index 000000000..72e7129f8 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set08/set08-Rohan-errata.hjson @@ -0,0 +1,69 @@ +{ + 78_91: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN08E091.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 8_91 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 8R91 + rarity: R + setNum: "8" + cardNum: 91 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Rohirrim Army + unique: true + culture: elven + twilight: 5 + type: companion + race: man + strength: 9 + vitality: 3 + requires: { + type: CanSpot + filter: culture(Rohan),companion + count: 2 + } + effects: [ + { + type: PlayedInOtherPhase + phase: regroup + } + { + type: trigger + trigger: { + type: played + filter: self + } + effect: { + type: discard + filter: choose(minion) + count: 0-1 + } + } + ] + gametext: To play, spot 2 [rohan] companions.
You may play Rohirrim Army any time you could play a regroup event.
When you play Rohirrim Army, you may discard a minion. + lore: "'Begone, foul dwimmerlaik, lord of carrion!'" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set10/set10-Elven-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set10/set10-Elven-errata.hjson index a680df523..df21dd97c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set10/set10-Elven-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set10/set10-Elven-errata.hjson @@ -103,7 +103,7 @@ //Versioning differentiates releases within a particular alt path, such as PC errata // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. //Top-level cards should always be version 0. - version: 1? + version: 1 collInfo: 10R11 rarity: R setNum: "10" @@ -161,4 +161,77 @@ } } } + + 80_12: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN10E012.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 10_12 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 10U12 + rarity: U + setNum: "10" + cardNum: 12 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Glimpse of Fate + unique: true + culture: elven + twilight: 0 + type: condition + keyword: support area + requires: { + type: CanSpot + filter: Elf + count: 2 + } + effects: { + type: trigger + trigger: { + type: losesInitiative + side: free peoples + } + requires: { + type: perTurnLimit + limit: 1 + } + effect: [ + { + type: incrementPerTurnLimit + limit: 1 + } + { + type: modifyStrength + filter: choose(minion) + amount: -3 + until: start(regroup) + } + ] + } + gametext: To play, spot 2 Elves.
When you lose initiative, you may make a minion strength –3 until the regroup phase (limit once per turn). + lore: "'The uttermost choice is before you: to repent and go to the Havens... or else to abide the Doom of Men.'" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + + } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set10/set10-Rohan-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set10/set10-Rohan-errata.hjson new file mode 100644 index 000000000..71c8054d3 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set10/set10-Rohan-errata.hjson @@ -0,0 +1,93 @@ +{ + 80_72: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN10E072.1.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 10_72 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 1 + collInfo: 10R72 + rarity: R + setNum: "10" + cardNum: 72 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Éowyn + subtitle: Lady of Ithilien + unique: true + culture: elven + twilight: 2 + type: companion + race: man + strength: 6 + vitality: 3 + signet: gandalf + effects: [ + { + type: activated + phase: skirmish + requires: { + type: or + requires: [ + { + type: CanSpot + filter: another,culture(Rohan),man + } + { + type: perTurnLimit + limit: 1 + } + ] + } + cost: { + type: exert + filter: self + } + effect: [ + { + type: ChooseOpponent + memorize: opp + } + { + type: Repeat + amount: { + type: ForEachVitality + filter: minion,InSkirmishAgainst(self) + } + effect: { + type: Wound + player: FromMemory(opp) + filter: choose(minion) + } + } + { + type: incrementPerTurnLimit + limit: 1 + } + ] + } + ] + gametext: Skirmish: Exert Eowyn to choose an opponent. That opponent must wound a minion for each wound on each minion skirmishing Eowyn (limit once per turn unless you can spot another [rohan] Man). + lore: "'Yet now that I have leave to depart, I would remain. For this House has become to me of all dwellings the most blessed.'" + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } +} \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java index 7108eeacd..7ef0a1a4c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java @@ -44,6 +44,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("choosecardsfromdrawdeck", new ChooseCardsFromDrawDeck()); effectAppenderProducers.put("choosehowmanyburdenstospot", new ChooseHowManyBurdensToSpot()); effectAppenderProducers.put("choosehowmanytospot", new ChooseHowManyToSpot()); + effectAppenderProducers.put("chooseopponent", new ChooseOpponent()); effectAppenderProducers.put("chooseyesorno", new ChooseYesOrNo()); effectAppenderProducers.put("conditional", new ConditionalEffect()); effectAppenderProducers.put("corruptringbearer", new CorruptRingBearer()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseOpponent.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseOpponent.java new file mode 100644 index 000000000..54c667030 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ChooseOpponent.java @@ -0,0 +1,34 @@ +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.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.choose.ChooseOpponentEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +public class ChooseOpponent implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "memorize"); + + final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize"); + + return new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + return new ChooseOpponentEffect(actionContext.getPerformingPlayer()) { + @Override + protected void opponentChosen(String opponentId) { + actionContext.setValueToMemory(memorize, opponentId); + } + }; + } + }; + } + +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java index 8cb10bd5d..5abeb4cac 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/PlayerResolver.java @@ -33,6 +33,10 @@ public class PlayerResolver { return actionContext.getPerformingPlayer(); }; } + else if (type.toLowerCase(Locale.ROOT).startsWith("frommemory(") && type.endsWith(")")) { + String memory = type.substring(type.indexOf("(") + 1, type.lastIndexOf(")")); + return (actionContext) -> actionContext.getValueFromMemory(memory); + } throw new InvalidCardDefinitionException("Unable to resolve player resolver of type: " + type); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java index 559c0d968..879895c2d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java @@ -423,6 +423,26 @@ public class ValueResolver { return result; }; + } else if (type.equalsIgnoreCase("max")) { + FieldUtils.validateAllowedFields(object, "first", "second"); + ValueSource first = resolveEvaluator(object.get("first"), environment); + ValueSource second = resolveEvaluator(object.get("second"), environment); + + return actionContext -> (game, cardAffected) -> + Math.max( + first.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null), + second.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null) + ); + } else if (type.equalsIgnoreCase("min")) { + FieldUtils.validateAllowedFields(object, "first", "second"); + ValueSource first = resolveEvaluator(object.get("first"), environment); + ValueSource second = resolveEvaluator(object.get("second"), environment); + + return actionContext -> (game, cardAffected) -> + Math.min( + first.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null), + second.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), null) + ); } else if (type.equalsIgnoreCase("forEachToken")) { FieldUtils.validateAllowedFields(object, "filter", "culture"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AllyCanParticipateInArcheryFire.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AllyCanParticipateInArcheryFire.java new file mode 100644 index 000000000..9d36d8d0f --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AllyCanParticipateInArcheryFire.java @@ -0,0 +1,20 @@ +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.AllyParticipatesInArcheryFireModifier; +import org.json.simple.JSONObject; + +public class AllyCanParticipateInArcheryFire implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter"); + + final String filter = FieldUtils.getString(object.get("filter"), "filter"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + + return actionContext -> new AllyParticipatesInArcheryFireModifier(actionContext.getSource(), + filterableSource.getFilterable(actionContext)); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantTakeArcheryWounds.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantTakeArcheryWounds.java new file mode 100644 index 000000000..099a5be07 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantTakeArcheryWounds.java @@ -0,0 +1,23 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +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.ModifierSource; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.logic.modifiers.CantTakeArcheryWoundsModifier; +import org.json.simple.JSONObject; + +public class CantTakeArcheryWounds implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter"); + + final String filter = FieldUtils.getString(object.get("filter"), "filter"); + + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + + return actionContext -> new CantTakeArcheryWoundsModifier(actionContext.getSource(), + filterableSource.getFilterable(actionContext)); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureSpot.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureSpot.java new file mode 100644 index 000000000..2c920bd3e --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/FPCultureSpot.java @@ -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.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.logic.modifiers.FPCulturesSpotCountModifier; +import org.json.simple.JSONObject; + +public class FPCultureSpot implements ModifierSourceProducer { + @Override + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "requires", "amount"); + + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("requires"), "requires"); + final ValueSource amount = ValueResolver.resolveEvaluator(object.get("amount"), environment); + + final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); + + return actionContext -> new FPCulturesSpotCountModifier(actionContext.getSource(), + new RequirementCondition(requirements, actionContext), + amount.getEvaluator(actionContext)); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java index 05e8b260a..9be3964d0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java @@ -18,6 +18,7 @@ public class ModifierSourceFactory { modifierProducers.put("addnotwilightforcompanionmove", new AddNoTwilightForCompanionMove()); modifierProducers.put("addsignet", new AddSignet()); modifierProducers.put("allycanparticipateinarcheryfireandskirmishes", new AllyCanParticipateInArcheryFireAndSkirmishes()); + modifierProducers.put("allycanparticipateinarcheryfire", new AllyCanParticipateInArcheryFire()); modifierProducers.put("allycanparticipateinskirmishes", new AllyCanParticipateInSkirmishes()); modifierProducers.put("archerytotal", new ArcheryTotal()); modifierProducers.put("cancelkeywordbonusfrom", new CancelKeywordBonusFrom()); @@ -40,11 +41,13 @@ public class ModifierSourceFactory { modifierProducers.put("cantpreventwounds", new CantPreventWounds()); modifierProducers.put("cantremoveburdens", new CantRemoveBurdens()); modifierProducers.put("cantreplacesite", new CantReplaceSite()); + modifierProducers.put("canttakearcherywounds", new CantTakeArcheryWounds()); modifierProducers.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan()); modifierProducers.put("canttakewounds", new CantTakeWounds()); modifierProducers.put("cantusespecialabilities", new CantUseSpecialAbilities()); modifierProducers.put("classspot", new ClassSpot()); modifierProducers.put("extracosttoplay", new ExtraCostToPlay()); + modifierProducers.put("fpculturespot", new FPCultureSpot()); modifierProducers.put("fpusesresinsteadofstr", new FPUsesResInsteadOfStr()); modifierProducers.put("fpusesvitinsteadofstr", new FPUsesVitInsteadOfStr()); modifierProducers.put("hastomoveifable", new HasToMoveIfAble()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HaveInitiative.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HaveInitiative.java index 7a65fa3cb..4586ff139 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HaveInitiative.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HaveInitiative.java @@ -13,7 +13,7 @@ public class HaveInitiative implements RequirementProducer { public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(object, "side"); - Side side = FieldUtils.getEnum(Side.class, object.get("side"), "side"); + Side side = FieldUtils.getSide(object.get("side"), "side"); return (actionContext) -> PlayConditions.hasInitiative(actionContext.getGame(), side); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/LosesInitiative.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/LosesInitiative.java index bf0225783..2e80a71c1 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/LosesInitiative.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/LosesInitiative.java @@ -12,7 +12,7 @@ public class LosesInitiative implements TriggerCheckerProducer { @Override public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(value, "side"); - final Side side = FieldUtils.getEnum(Side.class, value.get("side"), "side"); + final Side side = FieldUtils.getSide(value.get("side"), "side"); return new TriggerChecker() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/FPCulturesSpotCountModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/FPCulturesSpotCountModifier.java index 17c899969..57611d1b6 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/FPCulturesSpotCountModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/FPCulturesSpotCountModifier.java @@ -2,25 +2,27 @@ package com.gempukku.lotro.logic.modifiers; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator; +import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; public class FPCulturesSpotCountModifier extends AbstractModifier { - private final String _playerId; - private final int _modifier; + private final Evaluator _valueEvaluator; - public FPCulturesSpotCountModifier(PhysicalCard source, String playerId, int modifier) { - this(source, playerId, null, modifier); + public FPCulturesSpotCountModifier(PhysicalCard source, int value) { + this(source, null, new ConstantEvaluator(value)); } - public FPCulturesSpotCountModifier(PhysicalCard source, String playerId, Condition condition, int modifier) { + public FPCulturesSpotCountModifier(PhysicalCard source, Condition condition, int value) { + this(source, condition, new ConstantEvaluator(value)); + } + + public FPCulturesSpotCountModifier(PhysicalCard source, Condition condition, Evaluator value) { super(source, "Modifies FP culture count", null, condition, ModifierEffect.SPOT_MODIFIER); - _playerId = playerId; - _modifier = modifier; + _valueEvaluator = value; } @Override public int getFPCulturesSpotCountModifier(LotroGame game, String playerId) { - if (playerId.equals(_playerId)) - return _modifier; - return 0; + return _valueEvaluator.evaluateExpression(game, null); } }