diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Onering.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Onering.hjson index 120782762..6616ec0c0 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Onering.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set15/set15-Onering.hjson @@ -31,6 +31,10 @@ { type: ringIsActive } + { + type: Phase + phase: Skirmish + } ] trigger: { type: aboutToTakeWound diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set15/Card_15_001_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set15/Card_15_001_Tests.java index 3f7e6140e..68e4e9177 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set15/Card_15_001_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set15/Card_15_001_Tests.java @@ -2,12 +2,21 @@ package com.gempukku.lotro.cards.official.set15; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.AbstractActionProxy; import com.gempukku.lotro.game.CardNotFoundException; import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import com.gempukku.lotro.logic.effects.PutOnTheOneRingEffect; +import com.gempukku.lotro.logic.modifiers.AddKeywordModifier; +import com.gempukku.lotro.logic.timing.Action; import org.junit.Test; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import static org.junit.Assert.*; @@ -18,17 +27,25 @@ public class Card_15_001_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "15_1"); - // put other cards in here as needed for the test case + //Shadow wounding + put("snuffler", "13_52"); + //Maneuver wounding + put("picket", "6_101"); + //Archery wounding + put("marksman", "1_176"); + //Skirmish wounding + put("soldier", "1_271"); + //Regroup wounding + put("gollum", "9_28"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, - GenericCardTestHelper.RulingRing + "15_1" ); } @Test - public void TheOneRingStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + public void RingOfDoomStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { /** * Set: 15 @@ -46,8 +63,7 @@ public class Card_15_001_Tests var scn = GetScenario(); //Use this once you have set the deck up properly - //var card = scn.GetFreepsRing(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsRing(); assertEquals("The One Ring", card.getBlueprint().getTitle()); assertEquals("The Ring of Doom", card.getBlueprint().getSubtitle()); @@ -56,18 +72,179 @@ public class Card_15_001_Tests assertEquals(2, card.getBlueprint().getVitality()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void TheOneRingTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void RingOfDoomGrantsRBHunter3WhenRingIsWorn() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var frodo = scn.GetRingBearer(); + var ring = scn.GetFreepsRing(); + + //Cheat and add an ability to Frodo which puts on the One Ring + scn.ApplyAdHocAction(new AbstractActionProxy() { + @Override + public List getPhaseActions(String playerId, LotroGame game) { + ActivateCardAction action = new ActivateCardAction(frodo); + action.appendEffect(new PutOnTheOneRingEffect()); + return Collections.singletonList(action); + } + }); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(0, scn.GetTwilight()); + assertEquals(6, scn.GetVitality(frodo)); + assertEquals(3, scn.GetStrength(frodo)); + scn.FreepsUseCardAction(frodo); + assertTrue(scn.RBWearingOneRing()); + assertEquals(3, scn.GetStrength(frodo)); + assertTrue(scn.hasKeyword(frodo, Keyword.HUNTER)); + assertEquals(3, scn.GetKeywordCount(frodo, Keyword.HUNTER)); + } + + @Test + public void RingOfDoomConvertsWoundsOnlyDuringSkirmishPhaseWhenRingIsWorn() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var ring = scn.GetFreepsRing(); + + var marksman = scn.GetShadowCard("marksman"); + var soldier = scn.GetShadowCard("soldier"); + var picket = scn.GetShadowCard("picket"); + var snuffler = scn.GetShadowCard("snuffler"); + var gollum = scn.GetShadowCard("gollum"); + scn.ShadowMoveCharToTable(marksman, soldier, picket, gollum); + scn.ShadowMoveCardToHand(snuffler); + + //Cheat and add an ability to Frodo which puts on the One Ring + scn.ApplyAdHocAction(new AbstractActionProxy() { + @Override + public List getPhaseActions(String playerId, LotroGame game) { + ActivateCardAction action = new ActivateCardAction(frodo); + action.appendEffect(new PutOnTheOneRingEffect()); + return Collections.singletonList(action); + } + }); + + scn.StartGame(); + + scn.FreepsUseCardAction(frodo); + + assertEquals(1, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.FreepsPassCurrentPhaseAction(); + + //Shadow wounds cannot convert to burdens + assertTrue(scn.RBWearingOneRing()); + assertTrue(scn.ShadowPlayAvailable(snuffler)); + scn.ShadowPlayCard(snuffler); + assertEquals(1, scn.GetBurdens()); + assertEquals(1, scn.GetWoundsOn(frodo)); + + scn.ShadowPassCurrentPhaseAction(); + + //Maneuver wounds cannot convert to burdens + assertTrue(scn.RBWearingOneRing()); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(picket); + scn.FreepsDeclineOptionalTrigger(); + assertEquals(1, scn.GetBurdens()); + assertEquals(2, scn.GetWoundsOn(frodo)); + + scn.PassCurrentPhaseActions(); + + //Archery wounds cannot convert to burdens + assertTrue(scn.RBWearingOneRing()); + scn.PassCurrentPhaseActions(); + + assertEquals(1, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + //Assignment phase + scn.PassCurrentPhaseActions(); + scn.FreepsDeclineAssignments(); + scn.ShadowAssignToMinions(frodo, soldier); + + scn.FreepsResolveSkirmish(frodo); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(soldier); + + //We are now in a skirmish phase, so the burden should have gotten converted + assertTrue(scn.RBWearingOneRing()); + assertEquals(2, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + scn.PassCurrentPhaseActions(); + + //Regular skirmish wound converted to burden + assertEquals(3, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + //Got taken off at the start of the regroup phase + assertFalse(scn.RBWearingOneRing()); + scn.FreepsUseCardAction(frodo); + assertTrue(scn.RBWearingOneRing()); + + //Regroup wounds cannot convert to burdens + scn.ShadowChooseAction("wound"); //We want DaD's wounding action, not his 3 twilight action + assertEquals(3, scn.GetBurdens()); + assertEquals(4, scn.GetWoundsOn(frodo)); + } + + @Test + public void RingOfDoomSkirmishAbilityAddsABurdenToWearRingUntilRegroup() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var ring = scn.GetFreepsRing(); + + var soldier = scn.GetShadowCard("soldier"); + scn.ShadowMoveCharToTable(soldier); + + scn.StartGame(); + + //Cheat and make orcs fierce + scn.ApplyAdHocModifier(new AddKeywordModifier(null, Filters.changeToFilter(Race.ORC), null, Keyword.FIERCE)); + + scn.SkipToAssignments(); + + assertEquals(1, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.FreepsAssignToMinions(frodo, soldier); + scn.FreepsResolveSkirmish(frodo); + + assertTrue(scn.FreepsActionAvailable(ring)); + scn.FreepsUseCardAction(ring); + + assertTrue(scn.RBWearingOneRing()); + assertEquals(2, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.ShadowPassCurrentPhaseAction(); + scn.FreepsPassCurrentPhaseAction(); + + //We are now in a skirmish phase, so the burden should have gotten converted + assertEquals(3, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + //Fierce skirmish + scn.PassCurrentPhaseActions(); + + scn.FreepsAssignToMinions(frodo, soldier); + scn.FreepsResolveSkirmish(frodo); + + assertTrue(scn.RBWearingOneRing()); + + scn.PassCurrentPhaseActions(); + assertEquals(4, scn.GetBurdens()); // 1 more from losing skirmish + assertEquals(0, scn.GetWoundsOn(frodo)); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + assertFalse(scn.RBWearingOneRing()); } }