diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson index e4260247a..365a16e2d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Men.hjson @@ -1164,41 +1164,46 @@ vitality: 2 site: 4 effects: [ - { - type: trigger - trigger: { - type: startOfPhase - phase: regroup - } - effect: { - type: preventable - player: shadow - text: Would you like to spot 3 Men to prevent liberating site? - cost: { - type: spot - filter: man - count: 3 - } - effect: { - type: liberateSite - } - } - } - { - type: activated - phase: maneuver - requires: { - type: canSpot - filter: another,culture(men),man - } - cost: { - type: exert - select: self - } - effect: { - type: takeControlOfSite - } - } + { + type: trigger + trigger: { + type: startOfPhase + phase: regroup + } + effect: { + type: Optional + player: freeps + text: Would you like to liberate a site? + effect: { + type: preventable + player: shadow + text: Would you like to spot 3 Men to prevent liberating site? + cost: { + type: spot + filter: man + count: 3 + } + effect: { + type: liberateSite + } + } + } + } + { + type: activated + phase: maneuver + requires: { + type: canSpot + filter: another,culture(men),man + } + cost: { + type: exert + select: self + } + effect: { + type: takeControlOfSite + } + } ] gametext: At the start of the regroup phase, the Free People's player may liberate a site. You may spot 3 Men to prevent this.
Maneuver: Spot another [men] Man and exert this minion to take control of a site. lore: Dunlendings take delight in destruction. 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 599fd9c1d..2de62825a 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 @@ -1493,7 +1493,7 @@ type: trigger optional: true trigger: { - type: takenControlOfSite + type: SiteControlled } requires: { type: canSpot diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Dunland-playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Dunland-playtest.hjson index 3e89cacbd..06fdc0519 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Dunland-playtest.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV02/setv02-Dunland-playtest.hjson @@ -22,18 +22,39 @@ twilight: 1 type: Condition keywords: Support Area - /*requires: { - - } + effects: [ { - + type: ToPlay + requires: { + type: CanSpot + filter: culture(Dunland), minion + } } { - + type: Modifier + modifier: { + type: SkipPhase + phase: Archery + requires: { + type: HaveInitiative + side: Shadow + } + } } - ]*/ - gametext: To play, spot a [Dunland] minion.
While the shadow has initiative, skip the archery phase.
If the Free-Peoples player liberates a site, discard this condition. + { + type: trigger + optional: false + trigger: { + type: SiteLiberated + } + effect: { + type: Discard + select: self + } + } + ] + gametext: To play, spot a [Dunland] minion.
While the shadow has initiative, skip the archery phase.
When the Free-Peoples player liberates a site, discard this condition. lore: "'Not in half a thousand years have they forgotten their grievance that the lords of Gondor gave the Mark to Eorl the Young and made alliance with him.'" promotext: "" alts: { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TakenControlOfSite.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/SiteControlled.java similarity index 85% rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TakenControlOfSite.java rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/SiteControlled.java index fad9d4ce0..cec91292c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TakenControlOfSite.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/SiteControlled.java @@ -7,10 +7,10 @@ import com.gempukku.lotro.cards.build.PlayerSource; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver; import com.gempukku.lotro.logic.timing.EffectResult; -import com.gempukku.lotro.logic.timing.results.TakeControlOfSiteResult; +import com.gempukku.lotro.logic.timing.results.SiteControlledResult; import org.json.simple.JSONObject; -public class TakenControlOfSite implements TriggerCheckerProducer { +public class SiteControlled implements TriggerCheckerProducer { @Override public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(value, "player"); @@ -23,8 +23,8 @@ public class TakenControlOfSite implements TriggerCheckerProducer { public boolean accepts(ActionContext actionContext) { String playerId = playerSource.getPlayer(actionContext); EffectResult effectResult = actionContext.getEffectResult(); - if (effectResult.getType() == EffectResult.Type.TAKE_CONTROL_OF_SITE) { - TakeControlOfSiteResult takeResult = (TakeControlOfSiteResult) effectResult; + if (effectResult.getType() == EffectResult.Type.CONTROL_SITE) { + SiteControlledResult takeResult = (SiteControlledResult) effectResult; return takeResult.getPlayerId().equals(playerId); } return false; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/SiteLiberated.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/SiteLiberated.java new file mode 100644 index 000000000..69c955e52 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/SiteLiberated.java @@ -0,0 +1,32 @@ +package com.gempukku.lotro.cards.build.field.effect.trigger; + +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.PlayerSource; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.results.SiteControlledResult; +import com.gempukku.lotro.logic.timing.results.SiteLiberatedResult; +import org.json.simple.JSONObject; + +public class SiteLiberated implements TriggerCheckerProducer { + @Override + public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value); + + return new TriggerChecker() { + @Override + public boolean accepts(ActionContext actionContext) { + EffectResult effectResult = actionContext.getEffectResult(); + return effectResult.getType() == EffectResult.Type.LIBERATE_SITE; + } + + @Override + public boolean isBefore() { + return false; + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java index 4427de121..e581c1709 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/TriggerCheckerFactory.java @@ -65,9 +65,10 @@ public class TriggerCheckerFactory { triggerCheckers.put("replacessite", new ReplacesSite()); triggerCheckers.put("revealscardfromtopofdrawdeck", new RevealsCardFromTopOfDrawDeck()); triggerCheckers.put("revealedcardfromhand", new RevealedCardFromHand()); + triggerCheckers.put("siteliberated", new SiteLiberated()); + triggerCheckers.put("sitecontrolled", new SiteControlled()); triggerCheckers.put("skirmishabouttoend", new SkirmishAboutToEnd()); triggerCheckers.put("startofskirmishinvolving", new StartOfSkirmishInvolving()); - triggerCheckers.put("takencontrolofsite", new TakenControlOfSite()); triggerCheckers.put("takesoffring", new TakesOffRing()); triggerCheckers.put("takeswound", new TakesWound()); triggerCheckers.put("transferred", new Transferred()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LiberateASiteEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LiberateASiteEffect.java index 627b94634..4ef7502ad 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LiberateASiteEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LiberateASiteEffect.java @@ -8,6 +8,7 @@ import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.Effect; import com.gempukku.lotro.logic.timing.PlayConditions; import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult; +import com.gempukku.lotro.logic.timing.results.SiteLiberatedResult; import java.util.HashSet; import java.util.List; @@ -85,6 +86,7 @@ public class LiberateASiteEffect extends AbstractEffect { game.getGameState().sendMessage(_liberatingPlayer + " liberated a " + GameUtils.getCardLink(siteToLiberate) + " using " + GameUtils.getCardLink(_source)); + game.getActionsEnvironment().emitEffectResult(new SiteLiberatedResult(_liberatingPlayer)); liberatedSiteCallback(siteToLiberate); return new FullEffectResult(true); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TakeControlOfASiteEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TakeControlOfASiteEffect.java index 5c312cad0..ecc134918 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TakeControlOfASiteEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/TakeControlOfASiteEffect.java @@ -7,7 +7,7 @@ import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.Effect; import com.gempukku.lotro.logic.timing.Preventable; -import com.gempukku.lotro.logic.timing.results.TakeControlOfSiteResult; +import com.gempukku.lotro.logic.timing.results.SiteControlledResult; public class TakeControlOfASiteEffect extends AbstractEffect implements Preventable { private final PhysicalCard _source; @@ -69,7 +69,7 @@ public class TakeControlOfASiteEffect extends AbstractEffect implements Preventa if (site != null && !_prevented) { game.getGameState().takeControlOfCard(_playerId, game, site, Zone.SUPPORT); game.getGameState().sendMessage(_playerId + " took control of " + GameUtils.getCardLink(site)); - game.getActionsEnvironment().emitEffectResult(new TakeControlOfSiteResult(_playerId)); + game.getActionsEnvironment().emitEffectResult(new SiteControlledResult(_playerId)); return new FullEffectResult(true); } return new FullEffectResult(false); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/EffectResult.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/EffectResult.java index 2648c2e91..4ec91cde5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/EffectResult.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/EffectResult.java @@ -56,7 +56,7 @@ public abstract class EffectResult { ASSIGNED_AGAINST, ASSIGNED_TO_SKIRMISH, CARD_TRANSFERRED, - REPLACE_SITE, TAKE_CONTROL_OF_SITE, + REPLACE_SITE, CONTROL_SITE, LIBERATE_SITE, FINISHED_PLAYING_FELLOWSHIP, diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/TakeControlOfSiteResult.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/SiteControlledResult.java similarity index 61% rename from gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/TakeControlOfSiteResult.java rename to gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/SiteControlledResult.java index a4f89d0b9..dfbfff447 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/TakeControlOfSiteResult.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/SiteControlledResult.java @@ -2,11 +2,11 @@ package com.gempukku.lotro.logic.timing.results; import com.gempukku.lotro.logic.timing.EffectResult; -public class TakeControlOfSiteResult extends EffectResult { +public class SiteControlledResult extends EffectResult { private final String _playerId; - public TakeControlOfSiteResult(String playerId) { - super(Type.TAKE_CONTROL_OF_SITE); + public SiteControlledResult(String playerId) { + super(Type.CONTROL_SITE); _playerId = playerId; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/SiteLiberatedResult.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/SiteLiberatedResult.java new file mode 100644 index 000000000..b10cf4cf6 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/SiteLiberatedResult.java @@ -0,0 +1,16 @@ +package com.gempukku.lotro.logic.timing.results; + +import com.gempukku.lotro.logic.timing.EffectResult; + +public class SiteLiberatedResult extends EffectResult { + private final String _playerId; + + public SiteLiberatedResult(String playerId) { + super(Type.LIBERATE_SITE); + _playerId = playerId; + } + + public String getPlayerId() { + return _playerId; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java index 2fc2317ae..7e14cf567 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java @@ -37,7 +37,7 @@ public class WinConditionRule { game.playerWon(game.getGameState().getCurrentPlayerId(), "Surviving to Regroup phase on site 9"); } } else if (game.getFormat().winOnControlling5Sites() - && effectResults.getType() == EffectResult.Type.TAKE_CONTROL_OF_SITE) { + && effectResults.getType() == EffectResult.Type.CONTROL_SITE) { for (String opponent : GameUtils.getShadowPlayers(game)) { if (Filters.countActive(game, CardType.SITE, Filters.siteControlled(opponent)) >= 5) game.playerWon(opponent, "Controls 5 sites"); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java index 4393cf9da..6ac7bc7ac 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java @@ -956,6 +956,10 @@ public class GenericCardTestHelper extends AbstractAtTest { } + public Boolean IsSiteControlled(PhysicalCardImpl card) { + return card.getCardController() != null; + } + public void ApplyAdHocModifier(Modifier mod) diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_001_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_001_Tests.java index 123424c15..7f4d0959d 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_001_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v02/Card_V2_001_Tests.java @@ -2,9 +2,12 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.CardNotFoundException; import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import com.gempukku.lotro.logic.modifiers.AddKeywordModifier; +import com.gempukku.lotro.logic.modifiers.HasInitiativeModifier; import org.junit.Test; import java.util.HashMap; @@ -18,8 +21,12 @@ public class Card_V2_001_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "102_1"); - // put other cards in here as needed for the test case + put("driven", "102_1"); + put("madman", "4_12"); + put("freca", "9_2"); + put("hillman", "15_90"); + + put("runner", "1_178"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -46,7 +53,7 @@ public class Card_V2_001_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("driven"); assertEquals("Driven into the Hills", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -58,18 +65,120 @@ public class Card_V2_001_Tests assertEquals(1, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void DrivenintotheHillsTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void DrivenRequiresDunlandMinionToPlay() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var driven = scn.GetShadowCard("driven"); + var runner = scn.GetShadowCard("runner"); + var madman = scn.GetShadowCard("madman"); + scn.ShadowMoveCardToHand(driven, runner, madman); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(1, scn.GetTwilight()); + scn.SetTwilight(50); + scn.FreepsPassCurrentPhaseAction(); + + assertFalse(scn.ShadowPlayAvailable(driven)); + scn.ShadowPlayCard(runner); + assertFalse(scn.ShadowPlayAvailable(driven)); + scn.ShadowPlayCard(madman); + assertTrue(scn.ShadowPlayAvailable(driven)); + } + + @Test + public void DrivenSkipsArcheryPhaseIfShadowHasInitiative() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var driven = scn.GetShadowCard("driven"); + var madman = scn.GetShadowCard("madman"); + scn.ShadowMoveCardToSupportArea(driven); + scn.ShadowMoveCharToTable(madman); + + scn.StartGame(); + + //cheating to give Shadow initiative + scn.ApplyAdHocModifier(new HasInitiativeModifier(null, null, Side.SHADOW)); + + scn.SkipToPhase(Phase.MANEUVER); + + assertTrue(scn.ShadowHasInitiative()); + assertEquals(Phase.MANEUVER, scn.GetCurrentPhase()); + + scn.PassCurrentPhaseActions(); + + //Skipped archery entirely + assertEquals(Phase.ASSIGNMENT, scn.GetCurrentPhase()); + } + + @Test + public void DrivenDoesNotSkipsArcheryPhaseIfFreepsHasInitiative() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var driven = scn.GetShadowCard("driven"); + var madman = scn.GetShadowCard("madman"); + scn.ShadowMoveCardToSupportArea(driven); + scn.ShadowMoveCharToTable(madman); + + scn.StartGame(); + + //cheating to give Freeps initiative, since there are too few cards in hand + scn.ApplyAdHocModifier(new HasInitiativeModifier(null, null, Side.FREE_PEOPLE)); + + scn.SkipToPhase(Phase.MANEUVER); + + assertFalse(scn.ShadowHasInitiative()); + assertEquals(Phase.MANEUVER, scn.GetCurrentPhase()); + + scn.PassCurrentPhaseActions(); + + //Did not skip archery + assertEquals(Phase.ARCHERY, scn.GetCurrentPhase()); + } + + @Test + public void DrivenSelfDiscardsWhenASiteIsLiberated() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var driven = scn.GetShadowCard("driven"); + var madman = scn.GetShadowCard("madman"); + var hillman = scn.GetShadowCard("hillman"); + var freca = scn.GetShadowCard("freca"); + scn.ShadowMoveCardToSupportArea(driven); + + var site1 = scn.GetFreepsSite(1); + + scn.StartGame(); + + //Need to have sites controlled to liberate + scn.SkipToSite(3); + + scn.ShadowMoveCharToTable(hillman, madman); + scn.ShadowMoveCardToHand(freca); + scn.FreepsPassCurrentPhaseAction(); + + scn.ShadowPlayCard(freca); + scn.ShadowAcceptOptionalTrigger(); + + assertTrue(scn.IsSiteControlled(site1)); + + scn.SkipToPhase(Phase.MANEUVER); + + assertTrue(scn.IsSiteControlled(site1)); + assertEquals(Zone.SUPPORT, driven.getZone()); + + scn.SkipToPhase(Phase.REGROUP); + + //Rapt Hillman gives Freeps the opportunity to liberate a site, + // and shadow can stop it (but we choose not to) + scn.FreepsAcceptOptionalTrigger(); + scn.ShadowChooseNo(); + + assertFalse(scn.IsSiteControlled(site1)); + assertEquals(Zone.DISCARD, driven.getZone()); } }