diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Gondor.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Gondor.hjson
index 254b32b87..d0ed245c8 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Gondor.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set05/set05-Gondor.hjson
@@ -85,6 +85,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
@@ -143,6 +147,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
@@ -382,6 +390,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: exert
select: choose(culture(gondor),man)
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Gondor.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Gondor.hjson
index d4127ef63..ac701cdc2 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Gondor.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set07/set07-Gondor.hjson
@@ -709,6 +709,10 @@
{
type: activated
phase: maneuver
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
@@ -2055,6 +2059,10 @@
{
type: activated
phase: maneuver
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
@@ -2113,6 +2121,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: exert
select: choose(culture(gondor),man)
@@ -2402,6 +2414,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Gondor.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Gondor.hjson
index 4b1cd5b98..84fec1b93 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Gondor.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set08/set08-Gondor.hjson
@@ -241,6 +241,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set11/set11-Sites.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set11/set11-Sites.hjson
index 6811abf6e..8343c676e 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set11/set11-Sites.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set11/set11-Sites.hjson
@@ -645,43 +645,24 @@
{
type: Trigger
optional: false
- trigger: [
- {
- type: MovesTo
- filter: self
- }
- {
- type: StartOfPhase
- phase: Fellowship
- }
- ]
+ trigger: {
+ type: StartOfSkirmishInvolving
+ filter: culture(rohan),companion
+ }
requires: {
- type: Location
- filter: self
+ type: canSpot
+ filter: minion,inSkirmishAgainst(culture(rohan),companion)
}
effect: {
- type: addTrigger
- trigger: {
- type: StartOfSkirmishInvolving
- filter: culture(rohan),companion
- }
- requires: {
- type: canSpot
+ type: RemoveKeyword
+ count: {
+ type: ForEachYouCanSpot
filter: minion,inSkirmishAgainst(culture(rohan),companion)
}
- effect: {
- type: RemoveKeyword
- count: {
- type: ForEachYouCanSpot
- filter: minion,inSkirmishAgainst(culture(rohan),companion)
- }
- select: all(minion,inSkirmishAgainst(culture(rohan),companion))
- keyword: fierce
- until: regroup
- }
+ select: all(minion,inSkirmishAgainst(culture(rohan),companion))
+ keyword: fierce
until: regroup
}
- limitPerTurn: 1
}
]
gametext: Plains. Until the regroup phase, each minion skirmishing a [rohan] companion loses fierce and cannot gain fierce.
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Uruk-hai.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Uruk-hai.hjson
index 19b528dc8..bf185b4d4 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Uruk-hai.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set12/set12-Uruk-hai.hjson
@@ -112,6 +112,7 @@
amount: {
type: forEachWound
filter: character,inSkirmish
+ multiplier: 2
}
}
}
@@ -458,17 +459,6 @@
site: 4
keywords: Lurker
effects: [
- {
- type: modifier
- modifier: {
- type: addKeyword
- requires: {
- type: sarumanFirstSentenceActive
- }
- filter: self
- keyword: lurker
- }
- }
{
type: activated
phase: skirmish
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Gondor.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Gondor.hjson
index 55b8df479..eaccd2350 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Gondor.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Gondor.hjson
@@ -232,6 +232,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: exert
select: choose(culture(gondor),man)
@@ -664,6 +668,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
@@ -849,6 +857,10 @@
{
type: activated
phase: skirmish
+ requires: {
+ type: CanSpot
+ filter: self,Zone(SUPPORT)
+ }
cost: {
type: choice
texts: [
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson
index b4bcc8c6d..400320ec2 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set17/set17-Uruk-hai.hjson
@@ -455,6 +455,7 @@
}
filter: site,zone(adventure path)
from: siteYouControl
+ terrain: true
}
}
]
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_moria.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_moria.hjson
index 93c4e3130..f520a6f6f 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_moria.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_moria.hjson
@@ -616,7 +616,7 @@
modifier: {
type: AddKeyword
keyword: marsh
- filter: or(river,and(site,not(or(Battleground,Dwelling,Forest,Mountain,Plains,Sanctuary,River,Underground))))
+ filter: or(river,and(site,not(or(Battleground,Dwelling,Forest,Mountain,Plains,River,Underground))))
}
}
{
diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire.hjson
index 44005a4ac..15fb4b60c 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire.hjson
@@ -197,7 +197,7 @@
text: Would you like to exhaust {chosenMinion} to permit it to skirmish?
cost: {
type: exhaust
- select: memory(chosenMinion)
+ select: choose(CanExert,memory(chosenMinion))
}
effect: {
type: disableSkirmishAssignment
diff --git a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Keyword.java b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Keyword.java
index 82bb81f24..5cb8d196c 100644
--- a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Keyword.java
+++ b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Keyword.java
@@ -20,7 +20,11 @@ public enum Keyword implements Filterable {
FIERCE("Fierce", true, false, false, true),
LURKER("Lurker", true, false, false, true),
MUSTER("Muster", true, false, false, true),
- SANCTUARY("Sanctuary", true, false, true, true),
+ /**
+ * As per Modern Ruling #1, Sanctuary is not considered a terrain keyword.
+ * https://wiki.lotrtcgpc.net/wiki/Modern_Ruling_1
+ */
+ SANCTUARY("Sanctuary", true, false, false, true),
RING_BEARER("Ring-Bearer", true, false, true, true),
UNHASTY("Unhasty", true, false, false, true),
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java
index a9675a762..3677895f1 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java
@@ -12,7 +12,7 @@ public interface LotroFormat {
String PCSummary = """
As a reminder, PC formats incorporate the following changes:
- PC Errata are in effect
-
- Set V1 is legal
+
- Sets V1 and V2 are legal (where applicable)
- Discard piles are public information for both sides
- The game ends after Regroup actions are made (instead of at the start of Regroup)
""";
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/SkirmishPhaseAction.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/SkirmishPhaseAction.java
index 47ce5f158..0224218aa 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/SkirmishPhaseAction.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/SkirmishPhaseAction.java
@@ -41,8 +41,6 @@ public class SkirmishPhaseAction extends SystemQueueAction {
game.getActionsEnvironment().addActionToStack(new SkirmishActionProcedureAction());
}
});
- appendEffect(
- new TriggeringResultEffect(null, new SkirmishAboutToEndResult(fellowshipCharacter, shadowCharacters), "Skirmish about to end"));
appendEffect(
new UnrespondableEffect() {
@Override
@@ -53,7 +51,8 @@ public class SkirmishPhaseAction extends SystemQueueAction {
}
}
});
-
+ appendEffect(
+ new TriggeringResultEffect(null, new SkirmishAboutToEndResult(fellowshipCharacter, shadowCharacters), "Skirmish about to end"));
appendEffect(
new TriggeringResultEffect(null, new EndOfPhaseResult(Phase.SKIRMISH), "End of skirmish phase"));
appendEffect(
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
index 6583e1ed0..7f67e87e1 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
@@ -199,10 +199,10 @@ public class TournamentService {
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
try {
- addRecurringScheduledQueue("fotr_daily_eu", "Daily Gondor Fellowship Block", "2013-01-15 19:30:00", "fotrDailyEu-", "fotr_block");
- addRecurringScheduledQueue("fotr_daily_us", "Daily Rohan Fellowship Block", "2013-01-16 00:30:00", "fotrDailyUS-", "fotr_block");
- addRecurringScheduledQueue("movie_daily_eu", "Daily Gondor Movie Block", "2013-01-16 19:30:00", "movieDailyEu-", "movie");
- addRecurringScheduledQueue("movie_daily_us", "Daily Rohan Movie Block", "2013-01-17 00:30:00", "movieDailyUs-", "movie");
+ addRecurringScheduledQueue("fotr_daily_eu", "Daily Fellowship Block", "2013-01-15 19:30:00", "fotrDailyEu-", "fotr_block");
+ addRecurringScheduledQueue("fotr_daily_us", "Daily Fellowship Block", "2013-01-16 00:30:00", "fotrDailyUS-", "fotr_block");
+ addRecurringScheduledQueue("movie_daily_eu", "Daily Movie Block", "2013-01-16 19:30:00", "movieDailyEu-", "movie");
+ addRecurringScheduledQueue("movie_daily_us", "Daily Movie Block", "2013-01-17 00:30:00", "movieDailyUs-", "movie");
} catch (DateTimeParseException exp) {
// Ignore, can't happen
diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_113_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_113_Tests.java
index 9c940cf97..dae5541d4 100644
--- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_113_Tests.java
+++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set08/Card_08_113_Tests.java
@@ -89,13 +89,14 @@ public class Card_08_113_Tests
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
assertEquals(0, scn.GetThreats());
assertEquals(Zone.SHADOW_CHARACTERS, shelob.getZone());
- scn.FreepsAcceptOptionalTrigger();
+ scn.FreepsDeclineOptionalTrigger(); //Ring converting burdens
+ scn.FreepsAcceptOptionalTrigger(); //Sting
assertEquals(1, scn.GetThreats());
assertEquals(Zone.DISCARD, shelob.getZone());
}
@Test
- public void StingTriggersOnOverwhelm() throws DecisionResultInvalidException, CardNotFoundException {
+ public void Sting_DOESNOT_TriggerOnOverwhelm() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
@@ -117,12 +118,10 @@ public class Card_08_113_Tests
scn.FreepsResolveSkirmish(frodo);
scn.PassCurrentPhaseActions();
- assertTrue(scn.FreepsHasOptionalTriggerAvailable());
+ assertFalse(scn.FreepsHasOptionalTriggerAvailable());
assertEquals(0, scn.GetThreats());
assertEquals(Zone.SHADOW_CHARACTERS, sauron.getZone());
- scn.FreepsAcceptOptionalTrigger();
- assertEquals(1, scn.GetThreats());
- assertEquals(Zone.DISCARD, sauron.getZone());
+
}
}
diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_243_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_243_Tests.java
index 21592c99f..cc11e7ffa 100644
--- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_243_Tests.java
+++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set11/Card_11_243_Tests.java
@@ -6,7 +6,6 @@ import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
-import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
@@ -57,7 +56,8 @@ public class Card_11_243_Tests
* Type: Site
* Subtype:
* Site Number: *
- * Game Text: Plains. Until the regroup phase, each minion skirmishing a [rohan] companion loses fierce and cannot gain fierce.
+ * Game Text: Plains. Until the regroup phase, each minion skirmishing a [rohan] companion loses
+ * fierce and cannot gain fierce.
*/
var scn = GetScenario();
@@ -73,23 +73,14 @@ public class Card_11_243_Tests
assertEquals(3, card.getBlueprint().getTwilightCost());
}
- // Uncomment any @Test markers below once this is ready to be used
- //@Test
- public void HarrowdaleTest1() throws DecisionResultInvalidException, CardNotFoundException {
- //Pre-game setup
- var scn = GetScenario();
-
- var card = scn.GetFreepsCard("card");
- scn.FreepsMoveCardToHand(card);
-
- scn.StartGame();
- scn.FreepsPlayCard(card);
-
- assertEquals(3, scn.GetTwilight());
- }
+ /**
+ * As per Legacy Ruling #4, Harrowdale's text is to be interpreted as only working while the fellowship is at that site.
+ * Thus, if you start at Harrowdale and move away from it, the text does not "follow" the fellowship.
+ * Wiki LR#4
+ */
@Test
- public void MovingFromHarrowdaleRemovesFierceAgainstSkirmishingRohirrim() throws DecisionResultInvalidException, CardNotFoundException {
+ public void MovingFromHarrowdale_DOESNOT_RemoveFierceAgainstSkirmishingRohirrim() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var harrowdale = scn.GetFreepsSite("Harrowdale");
@@ -110,7 +101,6 @@ public class Card_11_243_Tests
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(shadowSite2);
- assertEquals(1, ((DefaultActionsEnvironment) scn._game.getActionsEnvironment()).getUntilStartOfPhaseActionProxies(Phase.REGROUP).size());
assertTrue(scn.hasKeyword(pursuer, Keyword.FIERCE));
assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
@@ -124,7 +114,8 @@ public class Card_11_243_Tests
assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
scn.FreepsResolveSkirmish(eomer);
- assertFalse(scn.hasKeyword(seeker, Keyword.FIERCE));
+ //Fierce was not removed because Harrowdale only works while on it
+ assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
scn.PassCurrentPhaseActions();
scn.FreepsResolveSkirmish(aragorn);
@@ -134,42 +125,9 @@ public class Card_11_243_Tests
assertEquals(Phase.ASSIGNMENT, scn.GetCurrentPhase());
scn.PassCurrentPhaseActions();
- assertFalse(scn.hasKeyword(seeker, Keyword.FIERCE));
+ assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
assertTrue(scn.hasKeyword(pursuer, Keyword.FIERCE));
scn.FreepsAssignToMinions(aragorn, pursuer);
-
- scn.FreepsResolveSkirmish(aragorn);
- assertTrue(scn.hasKeyword(pursuer, Keyword.FIERCE));
- scn.PassCurrentPhaseActions();
-
- //Fierce suppression should have worn off
- assertEquals(Phase.REGROUP, scn.GetCurrentPhase());
- assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
- assertTrue(scn.hasKeyword(pursuer, Keyword.FIERCE));
-
- scn.PassCurrentPhaseActions();
- scn.ShadowDeclineReconciliation();
- scn.FreepsChooseToMove();
- scn.ShadowChooseCardBPFromSelection(shadowSite3);
-
- assertEquals(0, ((DefaultActionsEnvironment) scn._game.getActionsEnvironment()).getUntilStartOfPhaseActionProxies(Phase.REGROUP).size());
-
- scn.SkipToAssignments();
- scn.FreepsAssignToMinions(
- new PhysicalCardImpl[] { eomer, pursuer},
- new PhysicalCardImpl[] { aragorn, seeker}
- );
-
- assertTrue(scn.hasKeyword(pursuer, Keyword.FIERCE));
- assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
-
- scn.FreepsResolveSkirmish(eomer);
- assertTrue(scn.hasKeyword(pursuer, Keyword.FIERCE));
- scn.PassCurrentPhaseActions();
-
- scn.FreepsResolveSkirmish(aragorn);
- assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
- scn.PassCurrentPhaseActions();
}
@Test
@@ -194,7 +152,6 @@ public class Card_11_243_Tests
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(harrowdale);
- assertEquals(1, ((DefaultActionsEnvironment) scn._game.getActionsEnvironment()).getUntilStartOfPhaseActionProxies(Phase.REGROUP).size());
assertTrue(scn.hasKeyword(pursuer, Keyword.FIERCE));
assertTrue(scn.hasKeyword(seeker, Keyword.FIERCE));
@@ -236,8 +193,6 @@ public class Card_11_243_Tests
scn.FreepsChooseToMove();
scn.ShadowChooseCardBPFromSelection(shadowSite3);
- assertEquals(0, ((DefaultActionsEnvironment) scn._game.getActionsEnvironment()).getUntilStartOfPhaseActionProxies(Phase.REGROUP).size());
-
scn.SkipToAssignments();
scn.FreepsAssignToMinions(
new PhysicalCardImpl[] { eomer, pursuer},