From bdf09485a2467f8944f0534d463dcea3a61aa434 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Mon, 5 Dec 2022 19:43:56 +0100 Subject: [PATCH] Clean up (#2025) --- .../src/main/java/forge/ai/ComputerUtil.java | 6 +++--- .../java/forge/ai/ability/CopyPermanentAi.java | 2 +- .../main/java/forge/ai/ability/DebuffAi.java | 6 +----- .../src/main/java/forge/ai/ability/PlayAi.java | 10 +++++----- .../src/main/java/forge/ai/ability/PumpAi.java | 2 +- .../java/forge/game/ability/AbilityUtils.java | 3 +-- .../game/ability/effects/CharmEffect.java | 5 +---- .../ability/effects/ChooseCardNameEffect.java | 5 ++--- .../ability/effects/ChooseColorEffect.java | 5 ++--- .../ability/effects/ChooseEvenOddEffect.java | 5 ++--- .../ability/effects/ChooseGenericEffect.java | 5 ++--- .../ability/effects/ChooseNumberEffect.java | 6 +++--- .../ability/effects/MultiplePilesEffect.java | 7 +++---- .../game/ability/effects/SacrificeEffect.java | 2 +- .../main/java/forge/game/card/CardUtil.java | 18 +++++++++--------- .../forge/game/spellability/SpellAbility.java | 2 +- .../t/tomik_distinguished_advokist.txt | 2 +- 17 files changed, 39 insertions(+), 52 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 3e7def1b3a1..bd12ad6c7e0 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2961,7 +2961,7 @@ public class ComputerUtil { return false; } - public static boolean targetPlayableSpellCard(final Player ai, CardCollection options, final SpellAbility sa, final boolean withoutPayingManaCost, boolean mandatory) { + public static boolean targetPlayableSpellCard(final Player ai, Iterable options, final SpellAbility sa, final boolean withoutPayingManaCost, boolean mandatory) { // determine and target a card with a SA that the AI can afford and will play AiController aic = ((PlayerControllerAi) ai.getController()).getAi(); sa.resetTargets(); @@ -2993,8 +2993,8 @@ public class ComputerUtil { } if (targets.isEmpty()) { - if (mandatory && !options.isEmpty()) { - targets = options; + if (mandatory && !Iterables.isEmpty(options)) { + targets.addAll(options); } else { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index 2577673a7ad..ee1b5284616 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -131,7 +131,7 @@ public class CopyPermanentAi extends SpellAbilityAi { if (sa.usesTargeting()) { sa.resetTargets(); - CardCollection list = new CardCollection(CardUtil.getValidCardsToTarget(sa.getTargetRestrictions(), sa)); + List list = CardUtil.getValidCardsToTarget(sa.getTargetRestrictions(), sa); //Nothing to target if (list.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index 64b553adb90..119d4cb3e5c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -68,7 +68,6 @@ public class DebuffAi extends SpellAbilityAi { if (!sa.usesTargeting()) { List cards = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); - final Combat combat = game.getCombat(); return Iterables.any(cards, new Predicate() { @Override @@ -121,7 +120,6 @@ public class DebuffAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); sa.resetTargets(); CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.newArrayList() : kws); - list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); // several uses here: // 1. make human creatures lose evasion when they are attacking @@ -205,9 +203,7 @@ public class DebuffAi extends SpellAbilityAi { } // Remove anything that's already been targeted - for (final Card c : sa.getTargets().getTargetCards()) { - list.remove(c); - } + list.removeAll(sa.getTargets().getTargetCards()); final CardCollection pref = CardLists.filterControlledBy(list, ai.getOpponents()); final CardCollection forced = CardLists.filterControlledBy(list, ai); diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index 379109fce7e..f1dc48ad8b8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -40,7 +40,7 @@ public class PlayAi extends SpellAbilityAi { return false; // prevent infinite loop } - CardCollection cards = getPlayableCards(sa, ai); + List cards = getPlayableCards(sa, ai); if (cards.isEmpty()) { return false; } @@ -188,14 +188,14 @@ public class PlayAi extends SpellAbilityAi { }); return ComputerUtilCard.getBestAI(tgtCards); } - - private static CardCollection getPlayableCards(SpellAbility sa, Player ai) { - CardCollection cards = new CardCollection(); + + private static List getPlayableCards(SpellAbility sa, Player ai) { + List cards = null; final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); if (tgt != null) { - cards = CardLists.getValidCards(ai.getGame().getCardsIn(tgt.getZone()), tgt.getValidTgts(), ai, source, sa); + cards = CardUtil.getValidCardsToTarget(tgt, sa); } else if (!sa.hasParam("Valid")) { cards = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 36a79cf0f22..e9223b1b708 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -518,7 +518,7 @@ public class PumpAi extends PumpAiBase { } } - list = CardLists.getValidCards(list, tgt.getValidTgts(), ai, source, sa); + list = CardLists.getTargetableCards(list, sa); if (game.getStack().isEmpty()) { // If the cost is tapping, don't activate before declare attack/block if (sa.getPayCosts().hasTapCost()) { 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 acaf4a7b769..ce4a7a784d0 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2918,8 +2918,7 @@ public class AbilityUtils { sas.add(s); } } else { - final Spell newSA = (Spell) s.copy(); - newSA.setActivatingPlayer(controller); + final Spell newSA = (Spell) s.copy(controller); SpellAbilityRestriction res = new SpellAbilityRestriction(); // timing restrictions still apply res.setPlayerTurn(s.getRestrictions().getPlayerTurn()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index ae965c8982b..bd5b134ccda 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -237,10 +237,7 @@ public class CharmEffect extends SpellAbilityEffect { for (AbilitySub sub : chosen) { // Clone the chosen, just in case the same subAb gets chosen multiple times - AbilitySub clone = (AbilitySub)sub.copy(); - - // update ActivatingPlayer - clone.setActivatingPlayer(sa.getActivatingPlayer()); + AbilitySub clone = (AbilitySub)sub.copy(sa.getActivatingPlayer()); // make StackDescription be the SpellDescription if it doesn't already have one if (!clone.hasParam("StackDescription")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index 44ade4d4d8d..5e29f1ff194 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -20,6 +20,7 @@ import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Aggregates; +import forge.util.Lang; import forge.util.Localizer; public class ChooseCardNameEffect extends SpellAbilityEffect { @@ -28,9 +29,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - for (final Player p : getTargetPlayers(sa)) { - sb.append(p).append(" "); - } + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))); sb.append("names a card."); return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java index 74154447d4f..289a4bcfa80 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java @@ -21,9 +21,8 @@ public class ChooseColorEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - for (final Player p : getTargetPlayers(sa)) { - sb.append(p).append(" "); - } + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))); + sb.append("chooses a color"); if (sa.hasParam("OrColors")) { sb.append(" or colors"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseEvenOddEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseEvenOddEffect.java index f61336dceae..8f5e0a8594a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseEvenOddEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseEvenOddEffect.java @@ -6,6 +6,7 @@ import forge.game.card.Card; import forge.game.player.Player; import forge.game.player.PlayerController.BinaryChoiceType; import forge.game.spellability.SpellAbility; +import forge.util.Lang; import forge.util.Localizer; public class ChooseEvenOddEffect extends SpellAbilityEffect { @@ -17,9 +18,7 @@ public class ChooseEvenOddEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - for (final Player p : getTargetPlayers(sa)) { - sb.append(p).append(" "); - } + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))); sb.append("chooses even or odd."); return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java index 12ad3e3d16a..622653a228f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java @@ -13,6 +13,7 @@ import forge.game.event.GameEventCardModeChosen; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Aggregates; +import forge.util.Lang; public class ChooseGenericEffect extends SpellAbilityEffect { @@ -20,9 +21,7 @@ public class ChooseGenericEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - for (final Player p : getTargetPlayers(sa)) { - sb.append(p).append(" "); - } + sb.append(Lang.joinHomogenous(getDefinedPlayersOrTargeted(sa))); sb.append("chooses from a list."); return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java index f7734aad013..178c61bbc29 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java @@ -12,6 +12,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.util.Lang; import forge.util.Localizer; import forge.util.MyRandom; @@ -24,9 +25,8 @@ public class ChooseNumberEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - for (final Player p : getTargetPlayers(sa)) { - sb.append(p).append(" "); - } + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))); + sb.append("chooses a number."); return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java index bc5f14882ea..5239f6db691 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java @@ -18,6 +18,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import forge.util.Lang; import forge.util.Localizer; public class MultiplePilesEffect extends SpellAbilityEffect { @@ -29,15 +30,13 @@ public class MultiplePilesEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final List tgtPlayers = getTargetPlayers(sa); String piles = sa.getParam("Piles"); final String valid = sa.getParamOrDefault("ValidCards", ""); sb.append("Separate all ").append(valid).append(" cards "); - for (final Player p : tgtPlayers) { - sb.append(p).append(" "); - } + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))); + sb.append("controls into ").append(piles).append(" piles."); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java index f1a47cf5e83..8c819811153 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java @@ -153,7 +153,7 @@ public class SacrificeEffect extends SpellAbilityEffect { boolean isStrict = sa.hasParam("StrictAmount"); int minTargets = optional && !isStrict ? 0 : amount; - boolean notEnoughTargets = validTargets.size() < minTargets; + boolean notEnoughTargets = isStrict && validTargets.size() < minTargets; if (sa.hasParam("Random")) { choosenToSacrifice = new CardCollection(Aggregates.random(validTargets, Math.min(amount, validTargets.size()))); diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index b9492342cee..69b82092c81 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -243,21 +243,21 @@ public final class CardUtil { newCopy.setDamageHistory(in.getDamageHistory()); newCopy.setDamageReceivedThisTurn(in.getDamageReceivedThisTurn()); - for (Card c : in.getBlockedThisTurn()) { - newCopy.addBlockedThisTurn(c); - } - for (Card c : in.getBlockedByThisTurn()) { - newCopy.addBlockedByThisTurn(c); - } + + // these are LKI already + newCopy.getBlockedThisTurn().addAll(in.getBlockedThisTurn()); + newCopy.getBlockedByThisTurn().addAll(in.getBlockedByThisTurn()); newCopy.setAttachedCards(getLKICopyList(in.getAttachedCards(), cachedMap)); newCopy.setEntityAttachedTo(getLKICopy(in.getEntityAttachedTo(), cachedMap)); - newCopy.setHaunting(in.getHaunting()); newCopy.setCopiedPermanent(in.getCopiedPermanent()); + + newCopy.setHaunting(in.getHaunting()); for (final Card haunter : in.getHauntedBy()) { newCopy.addHauntedBy(haunter, false); } + newCopy.addRemembered(in.getRemembered()); newCopy.addImprintedCards(in.getImprintedCards()); newCopy.setChosenCards(new CardCollection(in.getChosenCards())); @@ -278,6 +278,8 @@ public final class CardUtil { newCopy.copyChangedTextFrom(in); + newCopy.setTimestamp(in.getTimestamp()); + newCopy.setBestowTimestamp(in.getBestowTimestamp()); newCopy.setForetold(in.isForetold()); @@ -286,8 +288,6 @@ public final class CardUtil { newCopy.setMeldedWith(getLKICopy(in.getMeldedWith(), cachedMap)); - newCopy.setTimestamp(in.getTimestamp()); - // update keyword cache on all states for (CardStateName s : newCopy.getStates()) { newCopy.updateKeywordsCache(newCopy.getState(s)); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 333973aee70..5c78d7b099f 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1141,7 +1141,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit clone.payingMana.addAll(payingMana); } clone.paidAbilities = Lists.newArrayList(); - clone.setPaidHash(Maps.newHashMap(getPaidHash())); + clone.setPaidHash(getPaidHash()); // copy last chapter flag for Trigger clone.lastChapter = this.lastChapter; diff --git a/forge-gui/res/cardsfolder/t/tomik_distinguished_advokist.txt b/forge-gui/res/cardsfolder/t/tomik_distinguished_advokist.txt index bc71140cb2b..d3b1b2c154d 100644 --- a/forge-gui/res/cardsfolder/t/tomik_distinguished_advokist.txt +++ b/forge-gui/res/cardsfolder/t/tomik_distinguished_advokist.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Human Advisor PT:2/3 K:Flying S:Mode$ CantTarget | AffectedZone$ Battlefield,Graveyard | ValidCard$ Land | Activator$ Opponent | Description$ Lands on the battlefield and land cards in graveyards can't be the targets of spells or abilities your opponents control. -S:Mode$ CantPlayLand | ValidCard$ Land.OppCtrl | Origin$ Graveyard | Description$ Your opponents can't play land cards from graveyards. +S:Mode$ CantPlayLand | ValidCard$ Land | Player$ Opponent | Origin$ Graveyard | Description$ Your opponents can't play land cards from graveyards. Oracle:Flying\nLands on the battlefield and land cards in graveyards can't be the targets of spells or abilities your opponents control.\nYour opponents can't play land cards from graveyards.