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/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/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), 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-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 new file mode 100644 index 00000000000..295814ce308 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/miss_highwater.txt @@ -0,0 +1,14 @@ +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<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$ 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.