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);
}
}