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},