Merge pull request #678 from PlayersCouncil/bug/ketura-bugs

The Empire Strikes Bugs
This commit is contained in:
Christian McCarty
2025-05-08 21:50:45 -05:00
committed by GitHub
15 changed files with 87 additions and 114 deletions

View File

@@ -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)

View File

@@ -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: [

View File

@@ -241,6 +241,10 @@
{
type: activated
phase: skirmish
requires: {
type: CanSpot
filter: self,Zone(SUPPORT)
}
cost: {
type: choice
texts: [

View File

@@ -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: <b>Plains</b>. Until the regroup phase, each minion skirmishing a [rohan] companion loses <b>fierce</b> and cannot gain fierce.

View File

@@ -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

View File

@@ -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: [

View File

@@ -455,6 +455,7 @@
}
filter: site,zone(adventure path)
from: siteYouControl
terrain: true
}
}
]

View File

@@ -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))))
}
}
{

View File

@@ -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

View File

@@ -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),

View File

@@ -12,7 +12,7 @@ public interface LotroFormat {
String PCSummary = """
As a reminder, PC formats incorporate the following changes:
<br/>- <a href="https://wiki.lotrtcgpc.net/wiki/PC_Errata" target="_blank">PC Errata are in effect</a>
<br/>- Set V1 is legal
<br/>- Sets V1 and V2 are legal (where applicable)
<br/>- Discard piles are public information for both sides
<br/>- The game ends after Regroup actions are made (instead of at the start of Regroup)
""";

View File

@@ -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(

View File

@@ -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

View File

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

View File

@@ -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: <b>Plains</b>. Until the regroup phase, each minion skirmishing a [rohan] companion loses <b>fierce</b> and cannot gain fierce.
* Game Text: <b>Plains</b>. Until the regroup phase, each minion skirmishing a [rohan] companion loses
* <b>fierce</b> 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.
* <a href="https://wiki.lotrtcgpc.net/wiki/Legacy_Ruling_4">Wiki LR#4</a>
*/
@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},