From c7afe3ce7a45a7074f0d11565d1da2cd58d858d3 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 16 Dec 2024 12:27:00 +0100 Subject: [PATCH] Some cleanup (#6696) --- .../src/main/java/forge/ai/PlayerControllerAi.java | 1 - .../src/main/java/forge/CardStorageReader.java | 14 ++++++++++---- .../src/main/java/forge/game/GameOutcome.java | 3 ++- .../main/java/forge/game/ability/AbilityUtils.java | 3 ++- .../game/ability/effects/ChaosEnsuesEffect.java | 12 +++++------- .../forge/game/ability/effects/ClashEffect.java | 1 - .../game/ability/effects/RingTemptsYouEffect.java | 3 +-- .../main/java/forge/game/cost/CostGainControl.java | 2 +- .../java/forge/game/mana/ManaRefundService.java | 8 +++----- .../java/forge/game/player/PlayerController.java | 1 - .../forge/game/staticability/StaticAbility.java | 7 ------- forge-gui/res/cardsfolder/c/court_of_vantress.txt | 2 +- forge-gui/res/cardsfolder/f/fall_from_favor.txt | 2 +- forge-gui/res/cardsfolder/r/rhystic_cave.txt | 2 +- forge-gui/res/languages/de-DE.properties | 1 - forge-gui/res/languages/en-US.properties | 1 - forge-gui/res/languages/es-ES.properties | 1 - forge-gui/res/languages/fr-FR.properties | 1 - forge-gui/res/languages/it-IT.properties | 1 - forge-gui/res/languages/ja-JP.properties | 1 - forge-gui/res/languages/pt-BR.properties | 1 - forge-gui/res/languages/zh-CN.properties | 1 - .../java/forge/player/PlayerControllerHuman.java | 3 --- 23 files changed, 27 insertions(+), 45 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 6ea2aa2ccdc..8fc3e496a92 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -965,7 +965,6 @@ public class PlayerControllerAi extends PlayerController { } } return defaultVal != null && defaultVal; - case UntapTimeVault: return false; // TODO Should AI skip his turn for time vault? case LeftOrRight: return brains.chooseDirection(sa); case OddsOrEvens: return brains.chooseEvenOdd(sa); // false is Odd, true is Even default: diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java index ef80ce432a0..299daf39804 100644 --- a/forge-core/src/main/java/forge/CardStorageReader.java +++ b/forge-core/src/main/java/forge/CardStorageReader.java @@ -338,10 +338,16 @@ public class CardStorageReader { final int from = iPart * filesPerPart; final int till = iPart == maxParts - 1 ? totalFiles : from + filesPerPart; tasks.add(() -> { - final List res = loadCardsInRange(allFiles, from, till); - cdl.countDown(); - progressObserver.report(maxParts - (int)cdl.getCount(), maxParts); - return res; + try { + final List res = loadCardsInRange(allFiles, from, till); + return res; + } catch (Exception ex) { + throw ex; + } finally { + // make sure to continue loading when using multiple threads + cdl.countDown(); + progressObserver.report(maxParts - (int)cdl.getCount(), maxParts); + } }); } return tasks; diff --git a/forge-game/src/main/java/forge/game/GameOutcome.java b/forge-game/src/main/java/forge/game/GameOutcome.java index 67bc61a76ac..875d5718b8d 100644 --- a/forge-game/src/main/java/forge/game/GameOutcome.java +++ b/forge-game/src/main/java/forge/game/GameOutcome.java @@ -20,6 +20,7 @@ package forge.game; import java.io.Serializable; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -70,7 +71,7 @@ public final class GameOutcome implements Iterable playerRating = new HashMap<>(); - private final HashMap playerNames = new HashMap<>(); + private final HashMap playerNames = new LinkedHashMap<>(); private final Map anteResult = new HashMap<>(); private GameEndReason winCondition; diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 4e160208267..39ccab82d0b 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1483,7 +1483,7 @@ public class AbilityUtils { if (modifier.startsWith("Minus")) { int max = Integer.parseInt(modifier.substring(5)); if (sa.hasParam("UnlessUpTo") && beforePayment) { // Flash - max = sa.getActivatingPlayer().getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblChooseNumber"), 0, max); + max = sa.getActivatingPlayer().getController().chooseNumberForCostReduction(sa, 0, max); } newCost.decreaseGenericMana(max); } else { @@ -4000,6 +4000,7 @@ public class AbilityUtils { Set types = new HashSet<>(); for (Card c1 : list) { c1.getType().getSubtypes().forEach(types::add); + c1.getType().getCreatureTypes().forEach(types::add); } return types.size(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChaosEnsuesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChaosEnsuesEffect.java index cd9e3cc397a..9af5895556c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChaosEnsuesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChaosEnsuesEffect.java @@ -1,6 +1,7 @@ package forge.game.ability.effects; import com.google.common.collect.Lists; + import forge.game.Game; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; @@ -41,12 +42,9 @@ public class ChaosEnsuesEffect extends SpellAbilityEffect { for (final Card c : AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa)) { for (Trigger t : c.getTriggers()) { if (t.getMode() == TriggerType.ChaosEnsues) { // also allow current zone for any Defined - //String zones = t.getParam("TriggerZones"); - //t.putParam("TriggerZones", zones + "," + c.getZone().getZoneType().toString()); - EnumSet zones = (EnumSet) t.getActiveZone(); - tweakedTrigs.put(t.getId(), zones); + Set zones = t.getActiveZone(); + tweakedTrigs.put(t.getId(), EnumSet.copyOf(zones)); zones.add(c.getZone().getZoneType()); - t.setActiveZone(zones); affected.add(c); game.getTriggerHandler().registerOneTrigger(t); } @@ -58,13 +56,13 @@ public class ChaosEnsuesEffect extends SpellAbilityEffect { } } - game.getTriggerHandler().runTrigger(TriggerType.ChaosEnsues, runParams,false); + game.getTriggerHandler().runTrigger(TriggerType.ChaosEnsues, runParams, false); for (Map.Entry> e : tweakedTrigs.entrySet()) { for (Card c : affected) { for (Trigger t : c.getTriggers()) { if (t.getId() == e.getKey()) { - EnumSet zones = e.getValue(); + EnumSet zones = e.getValue(); t.setActiveZone(zones); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java index c521dcfe034..0af6b6d8b91 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java @@ -51,7 +51,6 @@ public class ClashEffect extends SpellAbilityEffect { } } - // Run triggers final Map runParams = AbilityKey.mapFromPlayer(player); runParams.put(AbilityKey.Won, player.equals(winner) ? "True" : "False"); source.getGame().getTriggerHandler().runTrigger(TriggerType.Clashed, runParams, false); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java index cbff03b400c..6de2bd98662 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RingTemptsYouEffect.java @@ -34,7 +34,7 @@ public class RingTemptsYouEffect extends EffectEffect { // Then choose a ring-bearer (You may keep the same one). Auto pick if <2 choices. CardCollection creatures = p.getCreaturesInPlay(); - Card ringBearer = p.getController().chooseSingleEntityForEffect(creatures, sa, Localizer.getInstance().getMessageorUseDefault("lblChooseRingBearer", "Choose your Ring-bearer"), false, null); + Card ringBearer = p.getController().chooseSingleEntityForEffect(creatures, sa, Localizer.getInstance().getMessage("lblChooseRingBearer"), false, null); p.setRingBearer(ringBearer); // 701.52a That creature becomes your Ring-bearer until another player gains control of it. @@ -52,7 +52,6 @@ public class RingTemptsYouEffect extends EffectEffect { ringBearer.addLeavesPlayCommand(loseCommand); } - // Run triggers final Map runParams = AbilityKey.mapFromPlayer(p); runParams.put(AbilityKey.Card, ringBearer); game.getTriggerHandler().runTrigger(TriggerType.RingTemptsYou, runParams, false); diff --git a/forge-game/src/main/java/forge/game/cost/CostGainControl.java b/forge-game/src/main/java/forge/game/cost/CostGainControl.java index 09fbcee41e3..da3477cfee7 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainControl.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainControl.java @@ -96,7 +96,7 @@ public class CostGainControl extends CostPartWithList { */ @Override public String getHashForLKIList() { - return "ControllGained"; // why the hell double "L"? + return "ControlGained"; } @Override public String getHashForCardList() { diff --git a/forge-game/src/main/java/forge/game/mana/ManaRefundService.java b/forge-game/src/main/java/forge/game/mana/ManaRefundService.java index 5f73179aa6f..7eb83eb00e1 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaRefundService.java +++ b/forge-game/src/main/java/forge/game/mana/ManaRefundService.java @@ -1,9 +1,9 @@ package forge.game.mana; -import com.google.common.collect.Lists; import forge.game.event.EventValueChangeType; import forge.game.event.GameEventZone; import forge.game.player.Player; +import forge.game.player.PlayerCollection; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -20,7 +20,7 @@ public class ManaRefundService { } public void refundManaPaid() { - List payers = Lists.newArrayList(); + PlayerCollection payers = new PlayerCollection(activator); // move non-undoable paying mana back to floating for (Mana mana : sa.getPayingMana()) { @@ -29,9 +29,7 @@ public class ManaRefundService { : mana.getManaAbility().getSourceSA().getActivatingPlayer(); pl.getManaPool().addMana(mana); - if (!payers.contains(pl)) { - payers.add(pl); - } + payers.add(pl); } sa.getPayingMana().clear(); diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 314af0110a8..8479fed70a1 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -60,7 +60,6 @@ public abstract class PlayerController { PlayOrDraw, OddsOrEvens, UntapOrLeaveTapped, - UntapTimeVault, LeftOrRight, AddOrRemove, } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 8f292c2f328..ba6aa45a8b5 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -380,13 +380,6 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone } } - if (hasParam("UnlessDefinedPlayer")) { - List players = AbilityUtils.getDefinedPlayers(hostCard, getParam("UnlessDefinedPlayer"), this); - if (!players.isEmpty()) { - return false; - } - } - if (hasParam("TopCardOfLibraryIs")) { if (controller.getCardsIn(ZoneType.Library).isEmpty()) { return false; diff --git a/forge-gui/res/cardsfolder/c/court_of_vantress.txt b/forge-gui/res/cardsfolder/c/court_of_vantress.txt index 4a6b39c1075..720e7c7d3ed 100644 --- a/forge-gui/res/cardsfolder/c/court_of_vantress.txt +++ b/forge-gui/res/cardsfolder/c/court_of_vantress.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigMonarch:DB$ BecomeMonarch | Defined$ You T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCloneCopy | TriggerDescription$ At the beginning of your upkeep, choose up to one other target enchantment or artifact. If you're the monarch, you may create a token that's a copy of it. If you're not the monarch, you may have CARDNAME become a copy of it, except it has this ability. SVar:TrigCloneCopy:DB$ Clone | Optional$ True | GainThisAbility$ True | AddSVars$ TrigCloneCopy | TgtPrompt$ Select up to one other target enchantment or artifact | ValidTgts$ Artifact.Other,Enchantment.Other | TargetMin$ 0 | TargetMax$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | SubAbility$ DBCopy -SVar:DBCopy:DB$ CopyPermanent | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 +SVar:DBCopy:DB$ CopyPermanent | Optional$ True | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 SVar:X:Count$Monarch.1.0 Oracle:When Court of Vantress enters, you become the monarch.\nAt the beginning of your upkeep, choose up to one other target enchantment or artifact. If you're the monarch, you may create a token that's a copy of it. If you're not the monarch, you may have Court of Vantress become a copy of it, except it has this ability. diff --git a/forge-gui/res/cardsfolder/f/fall_from_favor.txt b/forge-gui/res/cardsfolder/f/fall_from_favor.txt index 023229fcc38..2f12b7f8dc0 100644 --- a/forge-gui/res/cardsfolder/f/fall_from_favor.txt +++ b/forge-gui/res/cardsfolder/f/fall_from_favor.txt @@ -6,5 +6,5 @@ A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ KeepTapped | AITgts$ C T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters, tap enchanted creature and you become the monarch. SVar:TrigTap:DB$ Tap | Defined$ Enchanted | SubAbility$ DBMonarch SVar:DBMonarch:DB$ BecomeMonarch | Defined$ You -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | UnlessDefinedPlayer$ EnchantedController.isMonarch | Description$ Enchanted creature doesn't untap during its controller's untap step unless that player is the monarch. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy+ControlledBy EnchantedController.!isMonarch | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step unless that player is the monarch. Oracle:Enchant creature\nWhen Fall from Favor enters, tap enchanted creature and you become the monarch.\nEnchanted creature doesn't untap during its controller's untap step unless that player is the monarch. diff --git a/forge-gui/res/cardsfolder/r/rhystic_cave.txt b/forge-gui/res/cardsfolder/r/rhystic_cave.txt index e16472bdb12..488714f9305 100644 --- a/forge-gui/res/cardsfolder/r/rhystic_cave.txt +++ b/forge-gui/res/cardsfolder/r/rhystic_cave.txt @@ -2,7 +2,7 @@ Name:Rhystic Cave ManaCost:no cost Types:Land A:AB$ ChooseColor | Cost$ T | AILogic$ MostProminentInComputerDeck | SubAbility$ DBMana | InstantSpeed$ True | SpellDescription$ Choose a color. Add one mana of that color unless any player pays {1}. Activate only as an instant. -SVar:DBMana:DB$ Mana | Produced$ Chosen | UnlessCost$ 1 | UnlessPayer$ Player | SubAbility$ DBCleanup | SpellDescription$ Add one mana of the chosen color. +SVar:DBMana:DB$ Mana | Produced$ Chosen | UnlessCost$ 1 | UnlessPayer$ Player | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenColor$ True AI:RemoveDeck:All Oracle:{T}: Choose a color. Add one mana of that color unless any player pays {1}. Activate only as an instant. diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index b77ef340e59..5f860b802d3 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1378,7 +1378,6 @@ lblUntap=Enttappen lblOdds=Ungerade lblEvens=Gerade lblLeaveTapped=Getappt lassen -lblUntapAndSkipThisTurn=Enttappen (und Zug beenden) lblLeft=Links lblRight=Rechts lblAddCounter=Marke(n) hinzufügen diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 9d611ff73ac..508d76d4922 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1396,7 +1396,6 @@ lblUntap=Untap lblOdds=Odds lblEvens=Evens lblLeaveTapped=Leave tapped -lblUntapAndSkipThisTurn=Untap (and skip this turn) lblLeft=Left lblRight=Right lblAddCounter=Add Counter diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 81a99c21cbc..9d6b31e9c06 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1387,7 +1387,6 @@ lblUntap=Enderezar lblOdds=Impares lblEvens=Pares lblLeaveTapped=Dejar girado -lblUntapAndSkipThisTurn=Enderezar (y saltarse este turno) lblLeft=Izquierda lblRight=Derecha lblAddCounter=Añadir contador diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index f375ab44ef8..641a311bdc4 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -1382,7 +1382,6 @@ lblUntap=Dégager lblOdds=Cote lblEvens=Pairs lblLeaveTapped=Laisser tapé -lblUntapAndSkipThisTurn=Dégager (et sauter ce tour) lblLeft=Gauche lblRight=Droite lblAddCounter=Ajouter un marqueur diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 5358f2c8e2c..ee600e78198 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -1379,7 +1379,6 @@ lblUntap=Stappa lblOdds=Dispari lblEvens=Pari lblLeaveTapped=Lascia tappato -lblUntapAndSkipThisTurn=Stappa (e salta questo turno) lblLeft=Sinistra lblRight=Destra lblAddCounter=Aggiungi un segnalino diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 4c16cee0701..37ccbb15d75 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -1380,7 +1380,6 @@ lblUntap=アンタップ lblOdds=奇数 lblEvens=偶数 lblLeaveTapped=タップしない -lblUntapAndSkipThisTurn=アンタップ(そしてこのターンをスキップ) lblLeft=左 lblRight=右 lblAddCounter=カウンターを追加 diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index 2e6b7175277..160fdbc913c 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -1410,7 +1410,6 @@ lblUntap=Desvirar lblOdds=Ímpares lblEvens=Pares lblLeaveTapped=Deixar virado -lblUntapAndSkipThisTurn=Desvirar (e pular este turno) lblLeft=Esquerda lblRight=Direita lblAddCounter=Adicionar Marcador diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index e2ccfe336f1..ca769793316 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1386,7 +1386,6 @@ lblUntap=重置 lblOdds=赔率 lblEvens=偶数 lblLeaveTapped=轻按一下 -lblUntapAndSkipThisTurn=取消点击(并跳过当前回合) lblLeft=左 lblRight=右 lblAddCounter=增加指示物 diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 5bff9b40e4b..5efe16894b0 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1630,9 +1630,6 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont case UntapOrLeaveTapped: labels = ImmutableList.of(localizer.getMessage("lblUntap"), localizer.getMessage("lblLeaveTapped")); break; - case UntapTimeVault: - labels = ImmutableList.of(localizer.getMessage("lblUntapAndSkipThisTurn"), localizer.getMessage("lblLeaveTapped")); - break; case PlayOrDraw: labels = ImmutableList.of(localizer.getMessage("lblPlay"), localizer.getMessage("lblDraw")); break;