From 6c2c23a08d510ff5f852b8823c7cbfdd507f4c0e Mon Sep 17 00:00:00 2001 From: TRT <> Date: Tue, 26 Aug 2025 15:08:41 +0200 Subject: [PATCH 1/2] Saga ETB counters aren't intrinsic --- .../src/main/java/forge/game/GameView.java | 21 +++++++-------- .../main/java/forge/game/card/CardState.java | 11 ++++---- .../main/java/forge/game/zone/MagicStack.java | 27 +++++++------------ 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameView.java b/forge-game/src/main/java/forge/game/GameView.java index 2c5540db3ddb..f0aa904af13a 100644 --- a/forge-game/src/main/java/forge/game/GameView.java +++ b/forge-game/src/main/java/forge/game/GameView.java @@ -214,19 +214,18 @@ public String getDependencies() { return get(TrackableProperty.Dependencies); } public void setDependencies(Table> dependencies) { - if (dependencies.isEmpty()) { - return; - } StringBuilder sb = new StringBuilder(); - StaticAbilityLayer layer = null; - for (StaticAbilityLayer sal : StaticAbilityLayer.CONTINUOUS_LAYERS_WITH_DEPENDENCY) { - for (Cell> dep : dependencies.cellSet()) { - if (dep.getValue().contains(sal)) { - if (layer != sal) { - layer = sal; - sb.append("Layer " + layer.num).append(": "); + if (!dependencies.isEmpty()) { + StaticAbilityLayer layer = null; + for (StaticAbilityLayer sal : StaticAbilityLayer.CONTINUOUS_LAYERS_WITH_DEPENDENCY) { + for (Cell> dep : dependencies.cellSet()) { + if (dep.getValue().contains(sal)) { + if (layer != sal) { + layer = sal; + sb.append("Layer " + layer.num).append(": "); + } + sb.append(dep.getColumnKey().getHostCard().toString()).append(" <- ").append(dep.getRowKey().getHostCard().toString()).append("\n"); } - sb.append(dep.getColumnKey().getHostCard().toString()).append(" <- ").append(dep.getRowKey().getHostCard().toString()).append("\n"); } } } diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index d0bb304503be..20dc321ba44e 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -605,18 +605,18 @@ public FCollectionView getReplacementEffects() { result.add(loyaltyRep); } if (type.isBattle()) { - // TODO This is currently breaking for Battle/Defense - // Going to script the cards to work but ideally it would happen here if (defenseRep == null) { defenseRep = CardFactoryUtil.makeEtbCounter("etbCounter:DEFENSE:" + this.baseDefense, this, true); } result.add(defenseRep); - - // TODO add Siege "Choose a player to protect it" } + + card.updateReplacementEffects(result, this); + + // below are global rules if (type.hasSubtype("Saga") && !hasKeyword(Keyword.READ_AHEAD)) { if (sagaRep == null) { - sagaRep = CardFactoryUtil.makeEtbCounter("etbCounter:LORE:1", this, true); + sagaRep = CardFactoryUtil.makeEtbCounter("etbCounter:LORE:1", this, false); } result.add(sagaRep); } @@ -633,7 +633,6 @@ public FCollectionView getReplacementEffects() { result.add(omenRep); } - card.updateReplacementEffects(result, this); return result; } public boolean addReplacementEffect(final ReplacementEffect replacementEffect) { diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 0c76a6394d02..b024dce4438b 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -847,35 +847,26 @@ public final void addSimultaneousStackEntry(final SpellAbility sa) { } public boolean addAllTriggeredAbilitiesToStack() { - boolean result = false; - Player playerTurn = game.getPhaseHandler().getPlayerTurn(); + if (!hasSimultaneousStackEntries()) { + return false; + } + Player playerTurn = game.getPhaseHandler().getPlayerTurn(); if (playerTurn == null) { // caused by DevTools before first turn return false; } - if (!hasSimultaneousStackEntries()) { - return false; - } - if (!playerTurn.isInGame()) { playerTurn = game.getNextPlayerAfter(playerTurn); } - - // Grab players in turn order starting with the active player List players = game.getPlayersInTurnOrder(playerTurn); + boolean result = false; + // CR 603.3b for (Player p : players) { - if (p.hasLost()) { - continue; - } result |= chooseOrderOfSimultaneousStackEntry(p, false); } - for (Player p : players) { - if (p.hasLost()) { - continue; - } result |= chooseOrderOfSimultaneousStackEntry(p, true); } @@ -883,10 +874,12 @@ public boolean addAllTriggeredAbilitiesToStack() { } private boolean chooseOrderOfSimultaneousStackEntry(final Player activePlayer, boolean isAbilityTriggered) { - if (simultaneousStackEntryList.isEmpty()) { + if (!activePlayer.isInGame()) { + return false; + } + if (!hasSimultaneousStackEntries()) { return false; } - activePlayerSAs.clear(); for (SpellAbility sa : simultaneousStackEntryList) { if (isAbilityTriggered != (sa.isTrigger() && sa.getTrigger().getMode() == TriggerType.AbilityTriggered)) { From a696e877c069e0eae9d37ce4bbe4ca1a121bf2e0 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Tue, 26 Aug 2025 15:25:27 +0200 Subject: [PATCH 2/2] style change --- .../src/main/java/forge/game/GameView.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameView.java b/forge-game/src/main/java/forge/game/GameView.java index f0aa904af13a..db597afa820a 100644 --- a/forge-game/src/main/java/forge/game/GameView.java +++ b/forge-game/src/main/java/forge/game/GameView.java @@ -214,18 +214,20 @@ public String getDependencies() { return get(TrackableProperty.Dependencies); } public void setDependencies(Table> dependencies) { + if (dependencies.isEmpty()) { + set(TrackableProperty.Dependencies, ""); + return; + } StringBuilder sb = new StringBuilder(); - if (!dependencies.isEmpty()) { - StaticAbilityLayer layer = null; - for (StaticAbilityLayer sal : StaticAbilityLayer.CONTINUOUS_LAYERS_WITH_DEPENDENCY) { - for (Cell> dep : dependencies.cellSet()) { - if (dep.getValue().contains(sal)) { - if (layer != sal) { - layer = sal; - sb.append("Layer " + layer.num).append(": "); - } - sb.append(dep.getColumnKey().getHostCard().toString()).append(" <- ").append(dep.getRowKey().getHostCard().toString()).append("\n"); + StaticAbilityLayer layer = null; + for (StaticAbilityLayer sal : StaticAbilityLayer.CONTINUOUS_LAYERS_WITH_DEPENDENCY) { + for (Cell> dep : dependencies.cellSet()) { + if (dep.getValue().contains(sal)) { + if (layer != sal) { + layer = sal; + sb.append("Layer " + layer.num).append(": "); } + sb.append(dep.getColumnKey().getHostCard().toString()).append(" <- ").append(dep.getRowKey().getHostCard().toString()).append("\n"); } } }