Compare commits

...

4 Commits

Author SHA1 Message Date
772668b25d Merge branch 'master' of github.com:PlayersCouncil/gemp-lotr
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-10-26 20:43:21 +00:00
Christian 'ketura' McCarty
d745b4677e fixing card URL 2025-10-05 11:44:58 -05:00
Christian 'ketura' McCarty
27c450befd 2025 pre-WC errata 2025-10-05 11:10:33 -05:00
Christian 'ketura' McCarty
789ebeda27 Fixed Sam GEW FA not being in the art packs 2025-10-02 14:10:10 -05:00
16 changed files with 839 additions and 158 deletions

View File

@@ -962,7 +962,7 @@ var PCCards = {
// Saelbeth, Elven Councilor (3U25) [Errata]
'53_25' : 'https://i.lotrtcgpc.net/errata/LOTR-EN03E025.2_card.jpg',
// Gandalf, Lathspell (V213) [Errata]
'102_13' : 'https://i.lotrtcgpc.net/sets/v02/LOTR-ENV2E013.1_card.jpg',
//'102_13' : 'https://i.lotrtcgpc.net/sets/v02/LOTR-ENV2E013.1_card.jpg',
// Now for Wrath (V251) [Errata]
'102_51' : 'https://i.lotrtcgpc.net/sets/v02/LOTR-ENV2E051.1_card.jpg',
// Demands of the Sackville-Bagginses (2C40) [Errata]
@@ -972,7 +972,7 @@ var PCCards = {
// Rivendell Gateway (V1U59) [Errata]
'101_59' : 'https://i.lotrtcgpc.net/sets/vset1/LOTR-ENV1E059.1_card.jpg',
// Gandalf's Staff, Old Man's Crutch (V2_77)
'102_77' : 'https://i.lotrtcgpc.net/sets/v02/LOTR-ENV2S077.0_card.jpg',
//'102_77' : 'https://i.lotrtcgpc.net/sets/v02/LOTR-ENV2S077.0_card.jpg',
// Goblin Archer (1R172) [Errata]
'51_172' : 'https://i.lotrtcgpc.net/errata/LOTR-EN01E172.1_card.jpg',
// Shadowfax, Greatest of the Mearas (17R24) [Errata]
@@ -987,6 +987,20 @@ var PCCards = {
// FA Sam, Great Elf Warrior
'10_129': 'https://i.lotrtcgpc.net/promos/LOTR-EN10U122.0_card.jpg',
// July 2025 WC Circuit: FA Mumak Commander, GATS
'15_211': 'https://i.lotrtcgpc.net/promos/LOTR-EN15U086.0_card.jpg'
'15_211': 'https://i.lotrtcgpc.net/promos/LOTR-EN15U086.0_card.jpg',
// 2025 Pre-WC Errata
// Foul Creation (1U44) [Errata]
'51_44' : 'https://i.lotrtcgpc.net/errata/LOTR-EN01E044.1_card.jpg',
// Denethor, Lord of Minas Tirith (10R28) [Errata]
'60_28' : 'https://i.lotrtcgpc.net/errata/LOTR-EN10E028.2_card.jpg',
// Merry, Horticulturalist (2C104) [Errata]
'52_104' : 'https://i.lotrtcgpc.net/errata/LOTR-EN02E104.2_card.jpg',
// Uruk Raider (3C74) [Errata]
'53_74' : 'https://i.lotrtcgpc.net/errata/LOTR-EN03E074.2_card.jpg',
// Gandalf, Lathspell (V213) [Errata]
'102_13' : 'https://i.lotrtcgpc.net/sets/v02/LOTR-ENV2E013.2_card.jpg',
// Gandalf's Staff, Old Man's Crutch (V277) [Errata]
'102_77' : 'https://i.lotrtcgpc.net/sets/v02/LOTR-ENV2E077.1_card.jpg'
}

View File

@@ -407,13 +407,33 @@
culture: Rohan
twilight: 0
type: Event
timewords: Regroup
timewords: [
Maneuver
Regroup
]
effects: [
{
type: event
requires: {
type: canSpot
filter: culture(rohan),man
cost: {
type: If
check: {
type: Phase
phase: Maneuver
}
true: [
{
type: Exert
select: choose(Culture(Rohan), Man, MinResistance(3), CanExert)
}
{
type: Spot
filter: culture(Rohan),Man
}
]
false: {
type: Spot
filter: culture(Rohan),Man
}
}
effect: [
{

View File

@@ -291,6 +291,65 @@
}
}
51_44: {
cardInfo: {
//id: 51_44.1
parent: 1_44
variant: ERRATA
variantPath: errata/pc
revision: 1
image: errata/LOTR-EN01E044.1_card.jpg
collInfo: 1U44
rarity: U
}
title: Foul Creation
unique: false
side: Free Peoples
culture: Elven
twilight: 1
type: Event
timewords: Fellowship
effects: {
type: event
cost: {
type: exert
select: choose(elf)
}
effect: [
{
type: revealHand
hand: shadowPlayer
memorize: revealedCards
}
{
type: If
check: {
type: MemoryMatches
memory: revealedCards
filter: culture(isengard),minion
}
true: {
type: optional
text: Would you like to draw 2 cards?
effect: {
type: drawCards
count: 2
}
}
}
]
}
gametext: <b>Fellowship:</b> Exert an Elf to reveal an opponent's hand. You may draw 2 cards if an [isengard] minion was revealed.
lore: "Saruman's Uruk-hai mirrored the singular focus of their master, viewing with contempt and disgust all they encountered."
promotext: ""
alts: {
promos: {
}
errata: {
}
}
}
51_45: {
cardInfo: {
//id: 1_45.1

View File

@@ -48,14 +48,64 @@
}
}
# 52_104: {
# cardInfo: {
# //id: 2_104.1
# parent: 2_104
# variant: ERRATA
# variantPath: errata/pc
# revision: 1
# image: errata/LOTR-EN02E104.1_card.jpg
# collInfo: 2C104
# rarity: C
# }
# title: Merry
# subtitle: Horticulturalist
# unique: true
# side: Free Peoples
# culture: Shire
# twilight: 1
# type: Companion
# race: Hobbit
# strength: 3
# vitality: 4
# signet: Gandalf
# resistance: 6
# effects: {
# type: activated
# limitPerTurn: 1
# phase: fellowship
# cost: {
# type: exert
# select: self
# }
# effect: {
# type: PutCardsFromDeckIntoHand
# select: choose(culture(shire),ally)
# reveal: true
# showAll: true
# shuffle: true
# }
# }
# gametext: <b>Fellowship:</b> Exert Merry to take a [shire] ally into hand from your draw deck (limit once per turn).
# lore: "'Ow... I think I've broken something.'"
# promotext: ""
# alts: {
# promos: {
# }
# errata: {
# }
# }
# }
52_104: {
cardInfo: {
//id: 2_104.1
//id: 52_104.2
parent: 2_104
variant: ERRATA
variantPath: errata/pc
revision: 1
image: errata/LOTR-EN02E104.1_card.jpg
revision: 2
image: errata/LOTR-EN02E104.2_card.jpg
collInfo: 2C104
rarity: C
}
@@ -81,13 +131,13 @@
}
effect: {
type: PutCardsFromDeckIntoHand
select: choose(culture(shire),ally)
select: choose(Hobbit,ally)
reveal: true
showAll: true
shuffle: true
}
}
gametext: <b>Fellowship:</b> Exert Merry to take a [shire] ally into hand from your draw deck (limit once per turn).
gametext: <b>Fellowship:</b> Exert Merry to take a Hobbit ally into hand from your draw deck (limit once per turn).
lore: "'Ow... I think I've broken something.'"
promotext: ""
alts: {

View File

@@ -594,14 +594,97 @@
}
}
# 53_74: {
# cardInfo: {
# //id: 53_74.1
# parent: 3_74
# variant: ERRATA
# variantPath: errata/pc
# revision: 1
# image: errata/LOTR-EN03E074.1_card.jpg
# collInfo: 3C74
# rarity: C
# }
# title: Uruk Raider
# unique: false
# side: Shadow
# culture: Isengard
# twilight: 2
# type: Minion
# race: Uruk-hai
# strength: 6
# vitality: 2
# site: 5
# keywords: [
# Tracker
# Damage+1
# ]
# effects: [
# {
# type: modifier
# modifier: {
# type: modifyStrength
# requires: {
# type: hasCardInDeadPile
# filter: ally
# }
# filter: self
# amount: 3
# }
# }
# {
# type: modifier
# modifier: {
# type: addKeyword
# requires: {
# type: hasCardInDeadPile
# filter: ally
# }
# filter: self
# keyword: fierce
# }
# }
# {
# type: Trigger
# optional: true
# trigger: {
# type: Exerted
# filter: ally
# memorize: exertedAlly
# }
# requires: {
# type: CanSpot
# filter: culture(isengard),another
# }
# cost: {
# type: Exert
# select: self
# }
# effect: {
# type: Wound
# select: memory(exertedAlly)
# }
# }
# ]
# gametext: Tracker. Damage +1.<br>While an ally is in the dead pile, this minion is strength +3 and <b>fierce</b>.<br>Each time an ally exerts, you may spot another [isengard] card and exert this minion to wound that ally.
# lore: "'There is no safety where Saruman's emblem is shown.'"
# promotext: ""
# alts: {
# promos: {
# }
# errata: {
# }
# }
# }
53_74: {
cardInfo: {
//id: 53_74.1
//id: 53_74.2
parent: 3_74
variant: ERRATA
variantPath: errata/pc
revision: 1
image: errata/LOTR-EN03E074.1_card.jpg
revision: 2
image: errata/LOTR-EN03E074.2_card.jpg
collInfo: 3C74
rarity: C
}
@@ -615,10 +698,7 @@
strength: 6
vitality: 2
site: 5
keywords: [
Tracker
Damage+1
]
keywords: Tracker
effects: [
{
type: modifier
@@ -641,7 +721,7 @@
filter: ally
}
filter: self
keyword: fierce
keyword: damage+1
}
}
{
@@ -666,7 +746,7 @@
}
}
]
gametext: Tracker. Damage +1.<br>While an ally is in the dead pile, this minion is strength +3 and <b>fierce</b>.<br>Each time an ally exerts, you may spot another [isengard] card and exert this minion to wound that ally.
gametext: Tracker. <br>While an ally is in the dead pile, this minion is strength +3 and <b>damage +1</b>.<br>Each time an ally exerts, you may spot another [isengard] card and exert this minion to wound that ally.
lore: "'There is no safety where Saruman's emblem is shown.'"
promotext: ""
alts: {
@@ -676,4 +756,5 @@
}
}
}
}

View File

@@ -1,9 +1,85 @@
{
# 60_28: {
# cardInfo: {
# //id: 60_28.1
# revision: 1
# image: errata/LOTR-EN10E028.1_card.jpg
# collInfo: 10R28
# rarity: R
# }
# title: Denethor
# subtitle: Lord of Minas Tirith
# unique: true
# side: Free Peoples
# culture: Gondor
# twilight: 2
# type: Companion
# race: Man
# strength: 5
# vitality: 3
# signet: Aragorn
# resistance: 6
# effects: [
# {
# type: toPlay
# requires: {
# type: canSpot
# filter: culture(gondor),man
# count: 2
# }
# }
# {
# type: activated
# phase: fellowship
# requires: {
# type: location
# filter: sanctuary
# }
# cost: {
# type: exert
# select: self
# }
# effect: [
# {
# type: putCardsFromDeckIntoHand
# select: choose(culture(gondor),or(condition, item))
# reveal: true
# shuffle: true
# showAll: true
# }
# {
# type: optional
# player: shadow
# text: Would you like to draw a card?
# effect: {
# type: drawCards
# player: shadow
# count: 1
# }
# }
# ]
# }
# ]
# gametext: To play, spot 2 [gondor] Men.<br><b>Fellowship:</b> If at a sanctuary, exert Denethor to take a [gondor] condition or item into hand from your draw deck. Choose an opponent who may draw 2 cards.
# lore: "There Denethor sat in a grey gloom, like an old patient spider...."
# promotext: ""
# alts: {
# promos: {
# }
# errata: {
# }
# }
# }
60_28: {
cardInfo: {
//id: 60_28.1
revision: 1
image: errata/LOTR-EN10E028.1_card.jpg
//id: 60_28.2
parent: 10_28
variant: ERRATA
variantPath: errata/pc
revision: 2
image: errata/LOTR-EN10E028.2_card.jpg
collInfo: 10R28
rarity: R
}
@@ -15,7 +91,7 @@
twilight: 2
type: Companion
race: Man
strength: 5
strength: 8
vitality: 3
signet: Aragorn
resistance: 6
@@ -60,7 +136,7 @@
]
}
]
gametext: To play, spot 2 [gondor] Men.<br><b>Fellowship:</b> If at a sanctuary, exert Denethor to take a [gondor] condition or item into hand from your draw deck. Choose an opponent who may draw 2 cards.
gametext: To play, spot 2 [gondor] Men.<br><b>Fellowship:</b> If at a sanctuary, exert Denethor to take a [gondor] item or condition into hand from your draw deck. Choose an opponent who may draw a card.
lore: "There Denethor sat in a grey gloom, like an old patient spider...."
promotext: ""
alts: {

View File

@@ -77,11 +77,88 @@
# }
# }
# 102_13: {
# cardInfo: {
# //id: 102_13
# image: sets/V2/LOTR-ENV2S013.1_card.jpg
# collInfo: V2_13
# rarity: _
# }
# title: Gandalf
# subtitle: Lathspell
# unique: true
# side: Free Peoples
# culture: Gandalf
# twilight: 4
# type: Companion
# race: Wizard
# strength: 7
# vitality: 4
# signet: Theoden
# resistance: 6
# effects: [
# {
# type: Modifier
# modifier: {
# type: AddKeyword
# keyword: valiant
# filter: companion,mounted
# }
# }
# {
# type: Trigger
# optional: true
# trigger: {
# type: UsesSpecialAbility
# filter: minion
# memorize: activatedMinion
# }
# requires: {
# type: not
# requires: {
# type: phase
# phase: skirmish
# }
# }
# cost: [
# {
# type: Spot
# count: 3
# filter: valiant, companion
# }
# {
# type: Exert
# select: self
# times: 1
# }
# ]
# effect: [
# {
# type: cancelSpecialAbility
# }
# ]
# }
# ]
# gametext: Each mounted companion gains <b>valiant</b>.<br>Response: If a minion's special ability is used (except during a skirmish), spot 3 valiant companions and exert Gandalf to prevent that.
# lore: "'No counsel have I to give to those that despair. Yet counsel I could give, and words I could speak to you.'"
# promotext: ""
# alts: {
# promos: {
# }
# errata: {
# }
# }
# }
102_13: {
cardInfo: {
//id: 102_13
image: sets/V2/LOTR-ENV2S013.0_card.jpg
collInfo: V2_13
//id: 102_13.2
parent: 102_13
variant: ERRATA
variantPath: errata/pc
revision: 2
image: sets/V2/LOTR-ENV2E013.2_card.jpg
collInfo: V213
rarity: _
}
title: Gandalf
@@ -129,17 +206,22 @@
{
type: Exert
select: self
times: 1
times: 2
}
]
effect: [
{
type: cancelSpecialAbility
}
{
type: Exert
select: memory(activatedMinion)
times: 1
}
]
}
]
gametext: Each mounted companion gains <b>valiant</b>.<br>Response: If a minion's special ability is used (except during a skirmish), spot 3 valiant companions and exert Gandalf to prevent that.
gametext: Each mounted companion gains <b>valiant</b>.<br>Response: If a minion's special ability is used, spot 3 valiant companions and exert Gandalf twice to prevent that and exert that minion.
lore: "'No counsel have I to give to those that despair. Yet counsel I could give, and words I could speak to you.'"
promotext: ""
alts: {
@@ -199,14 +281,81 @@
}
}
# 102_77: {
# cardInfo: {
# //id: 102_77.0
# parent: 102_77
# variant: ERRATA
# variantPath: errata/pc
# revision: 0
# image: sets/V2/LOTR-ENV2S077.0_card.jpg
# collInfo: V277
# rarity: _
# }
# title: Gandalf's Staff
# subtitle: Old Man's Crutch
# unique: true
# side: Free Peoples
# culture: Gandalf
# twilight: 2
# type: Artifact
# vitality: 1
# itemclass: Staff
# target: title(Gandalf)
# effects: [
# {
# type: Trigger
# optional: false
# trigger: {
# type: ConstantlyCheck
# requires: [
# {
# type: canSpot
# filter: weapon,attachedTo(bearer)
# }
# ]
# }
# effect: {
# type: discard
# select: all(weapon,attachedTo(bearer))
# }
# }
# {
# type: Trigger
# optional: true
# limitPerPhase: 1
# trigger: {
# type: Exerted
# filter: bearer
# source: side(freeps)
# }
# effect: [
# {
# type: Wound
# select: choose(minion)
# }
# ]
# }
# ]
# gametext: Bearer must be Gandalf.<br>Discard any weapon he bears.<br>Each time Gandalf is exerted by a Free Peoples card, you may wound a minion (limit once per phase).
# lore: "'The staff in the hand of a wizard may be more than a prop for age.'"
# promotext: ""
# alts: {
# promos: {
# }
# errata: {
# }
# }
# }
102_77: {
cardInfo: {
//id: 102_77.0
//id: 102_77.1
parent: 102_77
variant: ERRATA
variantPath: errata/pc
revision: 0
image: sets/V2/LOTR-ENV2S077.0_card.jpg
revision: 1
image: sets/V2/LOTR-ENV2E077.1_card.jpg
collInfo: V277
rarity: _
}
@@ -241,7 +390,7 @@
{
type: Trigger
optional: true
limitPerPhase: 1
limitPerTurn: 1
trigger: {
type: Exerted
filter: bearer
@@ -249,13 +398,13 @@
}
effect: [
{
type: Wound
select: choose(minion)
type: Heal
select: bearer
}
]
}
]
gametext: Bearer must be Gandalf.<br>Discard any weapon he bears.<br>Each time Gandalf is exerted by a Free Peoples card, you may wound a minion (limit once per phase).
gametext: Bearer must be Gandalf.<br>Discard any weapon he bears.<br>Response: If Gandalf is exerted by a Free Peoples card, heal him (limit once per turn).
lore: "'The staff in the hand of a wizard may be more than a prop for age.'"
promotext: ""
alts: {

View File

@@ -167,11 +167,11 @@
hall: false
# Fill this up with the current batch of errata for it to show up on the playtest server.
valid: [
"51_172",
"52_40",
"53_14", "53_20", "53_25", "53_74", "53_85",
"101_59",
"102_13", "102_51", "102_77"
"51_44",
"52_104",
"53_74",
"60_28",
"102_13", "102_77"
]
sets: [
100

View File

@@ -184,7 +184,7 @@
// V2 Saruman FA
1x102_100
#FA Sam, Great Elf Warrior
#1x10_129
1x10_129
#July 2025 WC Circuit: FA Mumak Commander, GATS
1x15_211
#August 2025 WC Circuit: Ringwraith in Twilight
@@ -295,7 +295,7 @@
// V2 Saruman FA
1x102_100
#FA Sam, Great Elf Warrior
#1x10_129
1x10_129
#July 2025 WC Circuit: FA Mumak Commander, GATS
1x15_211
#August 2025 WC Circuit: Ringwraith in Twilight

View File

@@ -0,0 +1,85 @@
package com.gempukku.lotro.cards.unofficial.pc.errata.set01;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.common.Timeword;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static org.junit.Assert.*;
public class Card_01_044_ErrataTests
{
protected VirtualTableScenario GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
return new VirtualTableScenario(
new HashMap<>()
{{
put("card", "51_44");
// put other cards in here as needed for the test case
}},
VirtualTableScenario.FellowshipSites,
VirtualTableScenario.FOTRFrodo,
VirtualTableScenario.RulingRing
);
}
@Test
public void FoulCreationStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
* Set: 1
* Name: Foul Creation
* Unique: false
* Side: Free Peoples
* Culture: Elven
* Twilight Cost: 1
* Type: Event
* Subtype: Fellowship
* Game Text: <b>Fellowship:</b> Exert an Elf to reveal an opponent's hand. If an [isengard] minion was revealed, you may draw 2 cards.
*/
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
assertEquals("Foul Creation", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
assertFalse(card.getBlueprint().isUnique());
assertEquals(Side.FREE_PEOPLE, card.getBlueprint().getSide());
assertEquals(Culture.ELVEN, card.getBlueprint().getCulture());
assertEquals(CardType.EVENT, card.getBlueprint().getCardType());
assertTrue(scn.HasTimeword(card, Timeword.FELLOWSHIP));
assertEquals(1, card.getBlueprint().getTwilightCost());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void FoulCreationTest1() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.MoveCardsToHand(card);
//scn.MoveCompanionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
//var card = scn.GetShadowCard("card");
scn.MoveCardsToHand(card);
scn.MoveMinionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
scn.StartGame();
assertFalse(true);
}
}

View File

@@ -1,9 +1,8 @@
package com.gempukku.lotro.cards.unofficial.pc.errata.set02;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
@@ -33,7 +32,7 @@ public class Card_02_104_ErrataTests
/**
* Set: 2
* Name: Merry, Horticulturalist
* Unique: True
* Unique: true
* Side: Free Peoples
* Culture: Shire
* Twilight Cost: 1
@@ -43,7 +42,7 @@ public class Card_02_104_ErrataTests
* Vitality: 4
* Resistance: 6
* Signet: Gandalf
* Game Text: <b>Fellowship:</b> Exert Merry to take a [shire] ally into hand from your draw deck (limit once per turn).
* Game Text: <b>Fellowship:</b> Exert Merry to take a Hobbit ally into hand from your draw deck (limit once per turn).
*/
var scn = GetScenario();
@@ -72,10 +71,20 @@ public class Card_02_104_ErrataTests
var card = scn.GetFreepsCard("card");
scn.MoveCardsToHand(card);
//scn.MoveCompanionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
//var card = scn.GetShadowCard("card");
scn.MoveCardsToHand(card);
scn.MoveMinionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(1, scn.GetTwilight());
assertFalse(true);
}
}

View File

@@ -1,7 +1,7 @@
package com.gempukku.lotro.cards.unofficial.pc.errata.set03;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
@@ -34,7 +34,7 @@ public class Card_03_074_ErrataTests
/**
* Set: 3
* Name: Uruk Raider
* Unique: False
* Unique: false
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 2
@@ -43,8 +43,8 @@ public class Card_03_074_ErrataTests
* Strength: 6
* Vitality: 2
* Site Number: 5
* Game Text: Tracker. Damage +1.
* While an ally is in the dead pile, this minion is strength +3 and <b>fierce</b>.
* Game Text: Tracker.
* While an ally is in the dead pile, this minion is strength +3 and <b>damage +1</b>.
* Each time an ally exerts, you may spot another [isengard] card and exert this minion to wound that ally.
*/
@@ -60,8 +60,6 @@ public class Card_03_074_ErrataTests
assertEquals(CardType.MINION, card.getBlueprint().getCardType());
assertEquals(Race.URUK_HAI, card.getBlueprint().getRace());
assertTrue(scn.HasKeyword(card, Keyword.TRACKER));
assertTrue(scn.HasKeyword(card, Keyword.DAMAGE));
assertEquals(1, scn.GetKeywordCount(card, Keyword.DAMAGE));
assertEquals(2, card.getBlueprint().getTwilightCost());
assertEquals(6, card.getBlueprint().getStrength());
assertEquals(2, card.getBlueprint().getVitality());
@@ -83,13 +81,13 @@ public class Card_03_074_ErrataTests
assertEquals(Zone.HAND, rosie.getZone());
assertEquals(6, scn.GetStrength(raider));
assertFalse(scn.HasKeyword(raider, Keyword.FIERCE));
assertFalse(scn.HasKeyword(raider, Keyword.DAMAGE));
scn.MoveCardsToDeadPile(rosie);
assertEquals(Zone.DEAD, rosie.getZone());
assertEquals(9, scn.GetStrength(raider));
assertTrue(scn.HasKeyword(raider, Keyword.FIERCE));
assertTrue(scn.HasKeyword(raider, Keyword.DAMAGE));
}
@Test
@@ -171,30 +169,4 @@ public class Card_03_074_ErrataTests
assertEquals(Zone.DEAD, rosie.getZone());
assertEquals(1, scn.GetWoundsOn(raider));
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void UrukRaiderTest1() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
// var card = scn.GetFreepsCard("card");
// scn.MoveCardsToHand(card);
// scn.MoveCompanionToTable(card);
// scn.MoveCardsToSupportArea(card);
// scn.MoveCardToDiscard(card);
// scn.MoveCardsToTopOfDeck(card);
var card = scn.GetShadowCard("card");
scn.MoveCardsToHand(card);
scn.MoveMinionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(2, scn.GetTwilight());
}
}

View File

@@ -0,0 +1,201 @@
package com.gempukku.lotro.cards.unofficial.pc.errata.set03;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static org.junit.Assert.*;
public class Card_03_074_ErrataTests
{
protected VirtualTableScenario GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
return new VirtualTableScenario(
new HashMap<>()
{{
put("raider", "53_74");
put("demands", "2_40");
put("rosie", "1_309");
}},
VirtualTableScenario.FellowshipSites,
VirtualTableScenario.FOTRFrodo,
VirtualTableScenario.RulingRing
);
}
@Test
public void UrukRaiderStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
* Set: 3
* Name: Uruk Raider
* Unique: False
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 2
* Type: Minion
* Subtype: Uruk-hai
* Strength: 6
* Vitality: 2
* Site Number: 5
* Game Text: Tracker. Damage +1.
* While an ally is in the dead pile, this minion is strength +3 and <b>fierce</b>.
* Each time an ally exerts, you may spot another [isengard] card and exert this minion to wound that ally.
*/
var scn = GetScenario();
var card = scn.GetFreepsCard("raider");
assertEquals("Uruk Raider", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
assertFalse(card.getBlueprint().isUnique());
assertEquals(Side.SHADOW, card.getBlueprint().getSide());
assertEquals(Culture.ISENGARD, card.getBlueprint().getCulture());
assertEquals(CardType.MINION, card.getBlueprint().getCardType());
assertEquals(Race.URUK_HAI, card.getBlueprint().getRace());
assertTrue(scn.HasKeyword(card, Keyword.TRACKER));
assertTrue(scn.HasKeyword(card, Keyword.DAMAGE));
assertEquals(1, scn.GetKeywordCount(card, Keyword.DAMAGE));
assertEquals(2, card.getBlueprint().getTwilightCost());
assertEquals(6, card.getBlueprint().getStrength());
assertEquals(2, card.getBlueprint().getVitality());
assertEquals(5, card.getBlueprint().getSiteNumber());
}
@Test
public void UrukRaiderIsStrengthPlus3AndFierceWhileAllyIsInDeadPile() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var rosie = scn.GetFreepsCard("rosie");
scn.MoveCardsToHand(rosie);
var raider = scn.GetShadowCard("raider");
scn.MoveMinionsToTable(raider);
scn.StartGame();
assertEquals(Zone.HAND, rosie.getZone());
assertEquals(6, scn.GetStrength(raider));
assertFalse(scn.HasKeyword(raider, Keyword.FIERCE));
scn.MoveCardsToDeadPile(rosie);
assertEquals(Zone.DEAD, rosie.getZone());
assertEquals(9, scn.GetStrength(raider));
assertTrue(scn.HasKeyword(raider, Keyword.FIERCE));
}
@Test
public void UrukRaiderCannotRespondToAllyExertionIfNoOtherIsengardCard() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var rosie = scn.GetFreepsCard("rosie");
scn.MoveCardsToSupportArea(rosie);
var raider = scn.GetShadowCard("raider");
scn.MoveMinionsToTable(raider);
scn.StartGame();
assertEquals(0, scn.GetWoundsOn(raider));
assertEquals(0, scn.GetWoundsOn(rosie));
assertEquals(Zone.SUPPORT, rosie.getZone());
scn.FreepsUseCardAction(rosie);
assertFalse(scn.ShadowHasOptionalTriggerAvailable());
assertEquals(Zone.SUPPORT, rosie.getZone());
assertEquals(0, scn.GetWoundsOn(raider));
assertEquals(1, scn.GetWoundsOn(rosie));
}
@Test
public void UrukRaiderCannotRespondToAllyExertionIfSpotsOtherIsengardCardButCannotExert() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var rosie = scn.GetFreepsCard("rosie");
scn.MoveCardsToSupportArea(rosie);
var raider = scn.GetShadowCard("raider");
var demands = scn.GetShadowCard("demands");
scn.MoveMinionsToTable(raider);
scn.MoveCardsToSupportArea(demands);
scn.AddWoundsToChar(raider, 1);
scn.StartGame();
assertEquals(1, scn.GetWoundsOn(raider));
assertEquals(0, scn.GetWoundsOn(rosie));
assertEquals(Zone.SUPPORT, rosie.getZone());
scn.FreepsUseCardAction(rosie);
assertFalse(scn.ShadowHasOptionalTriggerAvailable());
assertEquals(Zone.SUPPORT, rosie.getZone());
assertEquals(1, scn.GetWoundsOn(raider));
assertEquals(1, scn.GetWoundsOn(rosie));
}
@Test
public void UrukRaiderCanSpotAnotherIsengardCardAndExertToWoundExertingAlly() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var rosie = scn.GetFreepsCard("rosie");
scn.MoveCardsToSupportArea(rosie);
var raider = scn.GetShadowCard("raider");
var demands = scn.GetShadowCard("demands");
scn.MoveMinionsToTable(raider);
scn.MoveCardsToSupportArea(demands);
scn.StartGame();
assertEquals(0, scn.GetWoundsOn(raider));
assertEquals(0, scn.GetWoundsOn(rosie));
assertEquals(Zone.SUPPORT, rosie.getZone());
scn.FreepsUseCardAction(rosie);
assertTrue(scn.ShadowHasOptionalTriggerAvailable());
scn.ShadowAcceptOptionalTrigger();
assertEquals(Zone.DEAD, rosie.getZone());
assertEquals(1, scn.GetWoundsOn(raider));
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void UrukRaiderTest1() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
// var card = scn.GetFreepsCard("card");
// scn.MoveCardsToHand(card);
// scn.MoveCompanionToTable(card);
// scn.MoveCardsToSupportArea(card);
// scn.MoveCardToDiscard(card);
// scn.MoveCardsToTopOfDeck(card);
var card = scn.GetShadowCard("card");
scn.MoveCardsToHand(card);
scn.MoveMinionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(2, scn.GetTwilight());
}
}

View File

@@ -1,15 +1,14 @@
package com.gempukku.lotro.cards.unofficial.pc.errata.set10;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.framework.VirtualTableScenario;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.*;
public class Card_10_028_ErrataTests
{
@@ -33,13 +32,13 @@ public class Card_10_028_ErrataTests
/**
* Set: 10
* Name: Denethor, Lord of Minas Tirith
* Unique: True
* Unique: true
* Side: Free Peoples
* Culture: Gondor
* Twilight Cost: 2
* Type: Companion
* Subtype: Man
* Strength: 5
* Strength: 8
* Vitality: 3
* Resistance: 6
* Signet: Aragorn
@@ -58,7 +57,7 @@ public class Card_10_028_ErrataTests
assertEquals(CardType.COMPANION, card.getBlueprint().getCardType());
assertEquals(Race.MAN, card.getBlueprint().getRace());
assertEquals(2, card.getBlueprint().getTwilightCost());
assertEquals(5, card.getBlueprint().getStrength());
assertEquals(8, card.getBlueprint().getStrength());
assertEquals(3, card.getBlueprint().getVitality());
assertEquals(6, card.getBlueprint().getResistance());
assertEquals(Signet.ARAGORN, card.getBlueprint().getSignet());
@@ -72,10 +71,20 @@ public class Card_10_028_ErrataTests
var card = scn.GetFreepsCard("card");
scn.MoveCardsToHand(card);
//scn.MoveCompanionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
//var card = scn.GetShadowCard("card");
scn.MoveCardsToHand(card);
scn.MoveMinionsToTable(card);
scn.MoveCardsToSupportArea(card);
scn.MoveCardsToDiscard(card);
scn.MoveCardsToTopOfDeck(card);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(2, scn.GetTwilight());
assertFalse(true);
}
}

View File

@@ -41,7 +41,7 @@ public class Card_V2_013_Tests
/**
* Set: V2
* Name: Gandalf, Lathspell
* Unique: True
* Unique: true
* Side: Free Peoples
* Culture: Gandalf
* Twilight Cost: 4
@@ -52,7 +52,7 @@ public class Card_V2_013_Tests
* Resistance: 6
* Signet: Theoden
* Game Text: Each mounted companion gains <b>valiant</b>.
* Response: If a minion's special ability is used (except during a skirmish), spot 3 valiant companions and exert Gandalf to prevent that.
* Response: If a minion's special ability is used, spot 3 valiant companions and exert Gandalf twice to prevent that and exert that minion.
*/
var scn = GetScenario();
@@ -146,9 +146,9 @@ public class Card_V2_013_Tests
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
assertEquals(0, scn.GetWoundsOn(valiant1));
assertEquals(1, scn.GetWoundsOn(gandalf));
//Lathspell's retribution no longer wounds, just blocks
assertEquals(1, scn.GetWoundsOn(shotgun));
assertEquals(2, scn.GetWoundsOn(gandalf));
//Lathspell's retribution exerts and blocks
assertEquals(2, scn.GetWoundsOn(shotgun));
}
@Test
@@ -193,7 +193,7 @@ public class Card_V2_013_Tests
}
@Test
public void GandalfCanBlockGrishnakhIf3ValiantCompanions() throws DecisionResultInvalidException, CardNotFoundException {
public void GandalfCanBlockGrishnakhAndExertHimIf3ValiantCompanions() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
@@ -221,7 +221,7 @@ public class Card_V2_013_Tests
assertEquals(2, scn.GetWoundsOn(grishnakh));
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
assertEquals(1, scn.GetWoundsOn(gandalf));
assertEquals(2, scn.GetWoundsOn(gandalf));
//Lathspell's retribution no longer wounds
assertEquals(Zone.SHADOW_CHARACTERS, grishnakh.getZone());
assertEquals(2, scn.GetWoundsOn(grishnakh));
@@ -229,51 +229,6 @@ public class Card_V2_013_Tests
assertEquals(7, scn.GetShadowDeckCount());
}
@Test
public void GandalfCanBlockGrishnakhAndWoundHimIf3ValiantCompanionsAndBearingNewStaff() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var gandalf = scn.GetFreepsCard("gandalf");
var crutch = scn.GetFreepsCard("crutch");
var valiant1 = scn.GetFreepsCard("valiant1");
scn.MoveCompanionToTable(gandalf);
scn.AttachCardsTo(gandalf, crutch);
scn.MoveCompanionToTable("valiant1", "valiant2", "valiant3");
var grishnakh = scn.GetShadowCard("grishnakh");
scn.MoveMinionsToTable(grishnakh);
scn.MoveMinionsToTable("marauder");
scn.StartGame();
scn.FreepsPassCurrentPhaseAction();
assertTrue(scn.ShadowActionAvailable(grishnakh));
assertEquals(0, scn.GetWoundsOn(gandalf));
assertEquals(0, scn.GetWoundsOn(grishnakh));
assertEquals(0, scn.GetShadowHandCount());
assertEquals(7, scn.GetShadowDeckCount());
scn.ShadowUseCardAction(grishnakh);
//Grishnakh's own exertions
assertEquals(2, scn.GetWoundsOn(grishnakh));
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
assertEquals(1, scn.GetWoundsOn(gandalf));
//Lathspell's retribution no longer wounds
assertEquals(Zone.SHADOW_CHARACTERS, grishnakh.getZone());
assertEquals(2, scn.GetWoundsOn(grishnakh));
assertEquals(0, scn.GetShadowHandCount());
assertEquals(7, scn.GetShadowDeckCount());
//The staff makes up for it tho
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
scn.FreepsChooseCard(grishnakh);
assertEquals(Zone.DISCARD, grishnakh.getZone());
}
@Test
public void GandalfCannotBlockSkirmishAbilityEvenWith3ValiantCompanions() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup

View File

@@ -37,7 +37,7 @@ public class Card_V2_077_Tests
/**
* Set: V2
* Name: Gandalf's Staff, Old Man's Crutch
* Unique: True
* Unique: true
* Side: Free Peoples
* Culture: Gandalf
* Twilight Cost: 2
@@ -46,7 +46,7 @@ public class Card_V2_077_Tests
* Vitality: 1
* Game Text: Bearer must be Gandalf.
* Discard any weapon he bears.
* Each time Gandalf is exerted by a Free Peoples card, you may wound a minion (limit once per phase).
* Response: If Gandalf is exerted by a Free Peoples card, heal him (limit once per turn).
*/
var scn = GetScenario();
@@ -92,7 +92,7 @@ public class Card_V2_077_Tests
}
@Test
public void GandalfsStaffCanWoundAMinionWhenExertingOncePerPhase() throws DecisionResultInvalidException, CardNotFoundException {
public void GandalfsStaffCanHealBearerWhenExertingOncePerTurn() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
@@ -121,14 +121,15 @@ public class Card_V2_077_Tests
assertEquals(0, scn.GetWoundsOn(shotgun));
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
assertEquals(1, scn.GetWoundsOn(shotgun));
assertEquals(0, scn.GetWoundsOn(gandalf));
scn.ShadowPassCurrentPhaseAction();
//Staff doesn't trigger a second time
assertEquals(0, scn.GetWoundsOn(gandalf));
scn.FreepsUseCardAction(betrayal);
assertEquals(2, scn.GetWoundsOn(gandalf));
assertEquals(1, scn.GetWoundsOn(shotgun));
assertEquals(1, scn.GetWoundsOn(gandalf));
assertEquals(0, scn.GetWoundsOn(shotgun));
assertFalse(scn.FreepsHasOptionalTriggerAvailable());
}
}