From 468c73f14508ee8b86bd600d2199ac4d9ae19a13 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:20:14 +0200 Subject: [PATCH 1/7] Create miss_highwater.txt --- .../res/cardsfolder/upcoming/miss_highwater.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/miss_highwater.txt diff --git a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt new file mode 100644 index 00000000000..4be454a9fed --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt @@ -0,0 +1,12 @@ +Name:Miss Highwater +ManaCost:2 B B +Types:Legendary Creature Demon Advisor +PT:5/3 +K:Menace +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player.counters_EQ0_Contract | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. +SVar:TrigDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 7 | UnlessCost$ Discard<0/Hand> | UnlessPayer$ TriggeredTarget | UnlessSwitched$ True | UnlessResolveSubs$ WhenPaid | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredTarget | CounterType$ Contract | CounterNum$ 1 | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger | ForgetOnMoved$ Battlefield | ForgetCounter$ Contract | Duration$ Permanent +SVar:LoseGameTrigger:Mode$ LosesGame | ValidPlayer$ Player.IsRemembered | Execute$ TrigCopy | TriggerDescription$ When that player loses the game, for each artifact and creature they controlled, create a token that's a copy of it. +SVar:TrigCopy:DB$ CopyPermanent | Defined$ Valid Artifact.ControlledBy Player.IsRemembered,Creature.ControlledBy Player.IsRemembered +Oracle:Menace\nWhenever Miss Highwater deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. From c207b1b32dc214bdbb98b72283f0fd52ddcbafc1 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:22:01 +0200 Subject: [PATCH 2/7] Update CounterEnumType.java --- forge-game/src/main/java/forge/game/card/CounterEnumType.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java index 60bcb455547..ac51ebefd8a 100644 --- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java +++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java @@ -487,6 +487,8 @@ public enum CounterEnumType implements CounterType { // Player Counters + CONTRACT("CTRCT", CounterAiCategory.Neutral), + ENERGY("ENRGY", CounterAiCategory.Positive), EXPERIENCE("EXP", CounterAiCategory.Positive), From 708d56213fe9d13309a61aca6b403049e36af8b5 Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:34:35 +0200 Subject: [PATCH 3/7] Update miss_highwater.txt --- forge-gui/res/cardsfolder/upcoming/miss_highwater.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt index 4be454a9fed..167a045a31d 100644 --- a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt +++ b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt @@ -6,7 +6,9 @@ K:Menace T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player.counters_EQ0_Contract | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. SVar:TrigDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 7 | UnlessCost$ Discard<0/Hand> | UnlessPayer$ TriggeredTarget | UnlessSwitched$ True | UnlessResolveSubs$ WhenPaid | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredTarget | CounterType$ Contract | CounterNum$ 1 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger | ForgetOnMoved$ Battlefield | ForgetCounter$ Contract | Duration$ Permanent +SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger,ExileEffect | ForgetOnMoved$ Battlefield | ForgetCounter$ Contract | Duration$ Permanent SVar:LoseGameTrigger:Mode$ LosesGame | ValidPlayer$ Player.IsRemembered | Execute$ TrigCopy | TriggerDescription$ When that player loses the game, for each artifact and creature they controlled, create a token that's a copy of it. SVar:TrigCopy:DB$ CopyPermanent | Defined$ Valid Artifact.ControlledBy Player.IsRemembered,Creature.ControlledBy Player.IsRemembered +SVar:ExileEffect:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Player.IsRemembered+counters_EQ0_Contract | Execute$ RemoveEffect | Static$ True +SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self Oracle:Menace\nWhenever Miss Highwater deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. From f98116d36681b513e6187f4f2535ac5f06c0abfb Mon Sep 17 00:00:00 2001 From: Fulgur14 <54345051+Fulgur14@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:45:20 +0200 Subject: [PATCH 4/7] Update miss_highwater.txt --- forge-gui/res/cardsfolder/upcoming/miss_highwater.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt index 167a045a31d..5399b8fb118 100644 --- a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt +++ b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt @@ -6,9 +6,9 @@ K:Menace T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player.counters_EQ0_Contract | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. SVar:TrigDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 7 | UnlessCost$ Discard<0/Hand> | UnlessPayer$ TriggeredTarget | UnlessSwitched$ True | UnlessResolveSubs$ WhenPaid | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredTarget | CounterType$ Contract | CounterNum$ 1 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger,ExileEffect | ForgetOnMoved$ Battlefield | ForgetCounter$ Contract | Duration$ Permanent +SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger,ExileEffect | Duration$ Permanent SVar:LoseGameTrigger:Mode$ LosesGame | ValidPlayer$ Player.IsRemembered | Execute$ TrigCopy | TriggerDescription$ When that player loses the game, for each artifact and creature they controlled, create a token that's a copy of it. SVar:TrigCopy:DB$ CopyPermanent | Defined$ Valid Artifact.ControlledBy Player.IsRemembered,Creature.ControlledBy Player.IsRemembered -SVar:ExileEffect:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Player.IsRemembered+counters_EQ0_Contract | Execute$ RemoveEffect | Static$ True +SVar:ExileEffect:Mode$ Always | TriggerZones$ Battlefield | PresentDefined$ Remembered | IsPresent$ Player.counters_EQ0_Contract | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self Oracle:Menace\nWhenever Miss Highwater deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. From 0e3ac68574c5980ff2431cf3d675c644ea9f2e85 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 6 Aug 2026 12:01:10 +0200 Subject: [PATCH 5/7] Add support --- forge-game/src/main/java/forge/game/Game.java | 1 + .../src/main/java/forge/game/trigger/TriggerLosesGame.java | 2 +- forge-gui/res/cardsfolder/upcoming/miss_highwater.txt | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 5b38d6ce397..c09b9910bf7 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -1005,6 +1005,7 @@ public void onPlayerLost(Player p) { } final Map runParams = AbilityKey.mapFromPlayer(p); + runParams.put(AbilityKey.LastStateBattlefield, triggerList.getLastStateBattlefield()); getTriggerHandler().runTrigger(TriggerType.LosesGame, runParams, false); getTriggerHandler().onPlayerLost(p); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java index 25b940ab894..ff4f2f4bcee 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java @@ -42,7 +42,7 @@ public final boolean performTest(final Map runParams) { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { - sa.setTriggeringObjectsFrom(runParams, AbilityKey.Player); + sa.setTriggeringObjectsFrom(runParams, AbilityKey.Player, AbilityKey.LastStateBattlefield); } @Override diff --git a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt index 5399b8fb118..0f2d984da40 100644 --- a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt +++ b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt @@ -8,7 +8,7 @@ SVar:TrigDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 7 | UnlessCost$ Di SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredTarget | CounterType$ Contract | CounterNum$ 1 | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger,ExileEffect | Duration$ Permanent SVar:LoseGameTrigger:Mode$ LosesGame | ValidPlayer$ Player.IsRemembered | Execute$ TrigCopy | TriggerDescription$ When that player loses the game, for each artifact and creature they controlled, create a token that's a copy of it. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ Valid Artifact.ControlledBy Player.IsRemembered,Creature.ControlledBy Player.IsRemembered +SVar:TrigCopy:DB$ CopyPermanent | Defined$ TriggeredLastStateBattlefield SVar:ExileEffect:Mode$ Always | TriggerZones$ Battlefield | PresentDefined$ Remembered | IsPresent$ Player.counters_EQ0_Contract | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self Oracle:Menace\nWhenever Miss Highwater deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. From 6ee64e8a9edcc8b1e49c640a852c890cc9c7b995 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 7 Aug 2026 20:44:30 +0200 Subject: [PATCH 6/7] Add support --- .../src/main/java/forge/game/card/CardProperty.java | 3 +-- .../main/java/forge/game/player/PlayerProperty.java | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/miss_highwater.txt | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index f79932d7a45..60e8973074f 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1472,8 +1472,7 @@ else if (prop.isEmpty() && dmgSource.equalsWithGameTimestamp(source)) { if (!card.hasCounters()) { return false; } - } - else if (property.startsWith("counters")) { + } else if (property.startsWith("counters")) { // syntax example: counters_GE9_P1P1 or counters_LT12_TIME final String[] splitProperty = property.split("_"); final String strNum = splitProperty[1].substring(2); diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 0a450ea2fe3..22c95f0ec11 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -9,6 +9,7 @@ import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; +import forge.game.card.CounterType; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Expressions; @@ -497,6 +498,15 @@ else if (kind.startsWith("Type")) { } } return false; + } else if (property.startsWith("counters")) { + final String[] splitProperty = property.split("_"); + final String strNum = splitProperty[1].substring(2); + final String comparator = splitProperty[1].substring(0, 2); + final int number = AbilityUtils.calculateAmount(source, strNum, spellAbility); + final int actualNumber = player.getCounters(CounterType.getType(splitProperty[2])); + if (!Expressions.compare(actualNumber, comparator, number)) { + return false; + } } else { // could print error msg for unknown property here, though it'd need to check that it's not "Any" case return false; diff --git a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt index 0f2d984da40..085f32e8302 100644 --- a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt +++ b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt @@ -4,11 +4,11 @@ Types:Legendary Creature Demon Advisor PT:5/3 K:Menace T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player.counters_EQ0_Contract | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. -SVar:TrigDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 7 | UnlessCost$ Discard<0/Hand> | UnlessPayer$ TriggeredTarget | UnlessSwitched$ True | UnlessResolveSubs$ WhenPaid | SubAbility$ DBPutCounter +SVar:TrigDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 7 | UnlessCost$ Discard<1/Hand> | UnlessPayer$ TriggeredTarget | UnlessSwitched$ True | UnlessResolveSubs$ WhenPaid | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredTarget | CounterType$ Contract | CounterNum$ 1 | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger,ExileEffect | Duration$ Permanent SVar:LoseGameTrigger:Mode$ LosesGame | ValidPlayer$ Player.IsRemembered | Execute$ TrigCopy | TriggerDescription$ When that player loses the game, for each artifact and creature they controlled, create a token that's a copy of it. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ TriggeredLastStateBattlefield +SVar:TrigCopy:DB$ CopyPermanent | Defined$ TriggeredLastStateBattlefieldLKICopy.Creature+ControlledBy TriggeredPlayer,Artifact+ControlledBy TriggeredPlayer | SubAbility$ RemoveEffect SVar:ExileEffect:Mode$ Always | TriggerZones$ Battlefield | PresentDefined$ Remembered | IsPresent$ Player.counters_EQ0_Contract | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self Oracle:Menace\nWhenever Miss Highwater deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it. From d103b2e790a45ea4abfef5d5f68014f569c72eaa Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 7 Aug 2026 20:57:54 +0200 Subject: [PATCH 7/7] Add support --- forge-gui/res/cardsfolder/upcoming/miss_highwater.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt index 085f32e8302..295814ce308 100644 --- a/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt +++ b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt @@ -8,7 +8,7 @@ SVar:TrigDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 7 | UnlessCost$ Di SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredTarget | CounterType$ Contract | CounterNum$ 1 | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ TriggeredTarget | Triggers$ LoseGameTrigger,ExileEffect | Duration$ Permanent SVar:LoseGameTrigger:Mode$ LosesGame | ValidPlayer$ Player.IsRemembered | Execute$ TrigCopy | TriggerDescription$ When that player loses the game, for each artifact and creature they controlled, create a token that's a copy of it. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ TriggeredLastStateBattlefieldLKICopy.Creature+ControlledBy TriggeredPlayer,Artifact+ControlledBy TriggeredPlayer | SubAbility$ RemoveEffect -SVar:ExileEffect:Mode$ Always | TriggerZones$ Battlefield | PresentDefined$ Remembered | IsPresent$ Player.counters_EQ0_Contract | Execute$ RemoveEffect | Static$ True +SVar:TrigCopy:DB$ CopyPermanent | Defined$ TriggeredLastStateBattlefieldLKICopy.Creature+ControlledBy TriggeredPlayer,Artifact+ControlledBy TriggeredPlayer +SVar:ExileEffect:Mode$ Always | TriggerZones$ Battlefield | CheckDefinedPlayer$ Player.IsRemembered+counters_EQ0_Contract | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self Oracle:Menace\nWhenever Miss Highwater deals combat damage to a player who doesn't have a contract counter, they may discard their hand. If they do, they draw seven cards and get a contract counter. For as long as they have a contract counter, when they lose the game, for each artifact and creature they controlled, create a token that's a copy of it.