From a4cb0924f3d23f1042e36096722588d227fbb9c3 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 14 Apr 2025 16:59:51 +0200 Subject: [PATCH] Fix World rule (#7397) --- .../src/main/java/forge/game/GameAction.java | 4 ++-- .../forge/game/ability/effects/CloneEffect.java | 3 ++- .../src/main/java/forge/game/card/Card.java | 15 +++++++++++++++ .../main/java/forge/game/card/CardZoneTable.java | 6 ++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index b724470f806..369a146e0da 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -2024,7 +2024,7 @@ public class GameAction { } private boolean handleWorldRule(CardCollection noRegCreats) { - final List worlds = CardLists.getType(game.getCardsIn(ZoneType.Battlefield), "World"); + final List worlds = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), c -> c.getType().hasSupertype(Supertype.World)); if (worlds.size() <= 1) { return false; } @@ -2033,7 +2033,7 @@ public class GameAction { long ts = 0; for (final Card crd : worlds) { - long crdTs = crd.getGameTimestamp(); + long crdTs = crd.getWorldTimestamp(); if (crdTs > ts) { ts = crdTs; toKeep.clear(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index c997c0c76d9..dc82aa3b2ab 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -129,6 +129,8 @@ public class CloneEffect extends SpellAbilityEffect { cloneTargets.remove(cardToCopy); } + final long ts = game.getNextTimestamp(); + for (Card tgtCard : cloneTargets) { if (sa.hasParam("CloneZone") && !tgtCard.isInZone(ZoneType.smartValueOf(sa.getParam("CloneZone")))) { @@ -141,7 +143,6 @@ public class CloneEffect extends SpellAbilityEffect { game.getTriggerHandler().clearActiveTriggers(tgtCard, null); - final long ts = game.getNextTimestamp(); tgtCard.addCloneState(CardFactory.getCloneStates(cardToCopy, tgtCard, sa), ts); tgtCard.updateRooms(); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 41353930229..5d863c0af43 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -23,6 +23,7 @@ import forge.GameCommand; import forge.StaticData; import forge.card.*; import forge.card.CardDb.CardArtPreference; +import forge.card.CardType.Supertype; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; import forge.game.*; @@ -251,6 +252,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr private PlayerCollection targetedFromThisTurn = new PlayerCollection(); + private long worldTimestamp = -1; private long bestowTimestamp = -1; private long transformedTimestamp = 0; private long prototypeTimestamp = -1; @@ -4484,11 +4486,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr public final void addCloneState(CardCloneStates states, final long timestamp) { clonedStates.put(timestamp, states); updateCloneState(true); + updateWorldTimestamp(timestamp); } public final boolean removeCloneState(final long timestamp) { if (clonedStates.remove(timestamp) != null) { updateCloneState(true); + updateWorldTimestamp(timestamp); return true; } return false; @@ -6958,6 +6962,17 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr return equals(c) && c.getGameTimestamp() == gameTimestamp; } + public long getWorldTimestamp() { + return worldTimestamp; + } + public void updateWorldTimestamp(long ts) { + if (!getType().hasSupertype(Supertype.World)) { + worldTimestamp = -1; + } else if (worldTimestamp == -1) { + worldTimestamp = ts; + } + } + public String getProtectionKey() { String protectKey = ""; boolean pR = false; boolean pG = false; boolean pB = false; boolean pU = false; boolean pW = false; diff --git a/forge-game/src/main/java/forge/game/card/CardZoneTable.java b/forge-game/src/main/java/forge/game/card/CardZoneTable.java index 6b1c73d2b0c..2b15d96fc7e 100644 --- a/forge-game/src/main/java/forge/game/card/CardZoneTable.java +++ b/forge-game/src/main/java/forge/game/card/CardZoneTable.java @@ -104,6 +104,12 @@ public class CardZoneTable extends ForwardingTable