From c65aa86f6b54f9b80d9ab003b49abad4440958ed Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 6 Oct 2021 10:10:19 +0200 Subject: [PATCH 1/5] Clean up --- .../java/forge/ai/AiAttackController.java | 2 +- .../src/main/java/forge/ai/ComputerUtil.java | 2 +- .../java/forge/ai/ComputerUtilAbility.java | 2 +- .../main/java/forge/ai/ComputerUtilCard.java | 8 ++--- .../java/forge/ai/ComputerUtilCombat.java | 1 - .../java/forge/ai/PlayerControllerAi.java | 36 ++++++++----------- .../main/java/forge/ai/ability/CharmAi.java | 2 +- .../java/forge/ai/ability/CountersPutAi.java | 6 ++-- .../java/forge/ai/ability/DamageDealAi.java | 9 +++-- .../forge/ai/ability/DelayedTriggerAi.java | 2 +- .../ai/ability/RearrangeTopOfLibraryAi.java | 2 +- .../java/forge/ai/ability/RepeatEachAi.java | 4 +-- .../java/forge/ai/ability/SetStateAi.java | 2 +- .../src/main/java/forge/ai/ability/TapAi.java | 2 +- .../java/forge/game/GameLogFormatter.java | 2 +- .../java/forge/game/ability/AbilityUtils.java | 2 +- .../main/java/forge/game/ability/ApiType.java | 2 +- .../game/ability/effects/AmassEffect.java | 2 +- .../ability/effects/ChangeTargetsEffect.java | 4 +-- .../game/ability/effects/CharmEffect.java | 3 +- .../ability/effects/ChooseCardNameEffect.java | 2 +- .../ability/effects/ControlSpellEffect.java | 2 +- .../effects/CopySpellAbilityEffect.java | 2 +- .../ability/effects/CountersNoteEffect.java | 4 +-- .../game/ability/effects/DamageAllEffect.java | 2 +- .../game/ability/effects/DebuffEffect.java | 6 ++-- .../game/ability/effects/EffectEffect.java | 2 +- .../ability/effects/PeekAndRevealEffect.java | 4 +-- .../ability/effects/PlaneswalkEffect.java | 2 +- .../game/ability/effects/PlayEffect.java | 2 +- .../ability/effects/ProtectAllEffect.java | 2 +- .../game/ability/effects/TwoPilesEffect.java | 2 +- .../src/main/java/forge/game/card/Card.java | 11 +++--- .../java/forge/game/card/CardFactory.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 10 +++--- .../main/java/forge/game/card/CardUtil.java | 2 +- .../java/forge/game/combat/AttackingBand.java | 2 +- .../main/java/forge/game/combat/Combat.java | 2 +- .../java/forge/game/cost/CostPutCounter.java | 2 +- .../java/forge/game/phase/PhaseHandler.java | 6 ++-- .../java/forge/game/player/PlayerView.java | 2 +- .../forge/game/spellability/SpellAbility.java | 2 +- .../SpellAbilityStackInstance.java | 2 +- 43 files changed, 80 insertions(+), 90 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 5d3a0fe5f04..5cf544a3597 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -1468,7 +1468,7 @@ public class AiAttackController { if (artifact != null) { return artifact; } - return null;//should never get here + return null; //should never get here } private void doLightmineFieldAttackLogic(List attackersLeft, int numForcedAttackers, boolean playAggro) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index a8b02bce767..bbf1635052e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -770,7 +770,7 @@ public class ComputerUtil { final int considerSacThreshold = getAIPreferenceParameter(host, "CreatureEvalThreshold", source); if ("OpponentOnly".equals(source.getParam("AILogic"))) { - if(!source.getActivatingPlayer().isOpponentOf(ai)) { + if (!source.getActivatingPlayer().isOpponentOf(ai)) { return sacrificed; // sacrifice none } } else if ("DesecrationDemon".equals(source.getParam("AILogic"))) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index fa8c7d633d9..c9aec6c625f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -72,7 +72,7 @@ public class ComputerUtilAbility { if (!player.getCardsIn(ZoneType.Library).isEmpty()) { all.add(player.getCardsIn(ZoneType.Library).get(0)); } - for(Player p : game.getPlayers()) { + for (Player p : game.getPlayers()) { all.addAll(p.getCardsIn(ZoneType.Exile)); all.addAll(p.getCardsIn(ZoneType.Battlefield)); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index c07e8c86e3d..c7496c1ee7e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -436,7 +436,7 @@ public class ComputerUtilCard { // For ability of Oracle en-Vec, return the first card that are going to attack next turn public static Card getBestCreatureToAttackNextTurnAI(final Player aiPlayer, final Iterable list) { AiController aic = ((PlayerControllerAi)aiPlayer.getController()).getAi(); - for(final Card card : list) { + for (final Card card : list) { if (aic.getPredictedCombatNextTurn().isAttacking(card)) { return card; } @@ -832,7 +832,7 @@ public class ComputerUtilCard { } } // same for Trigger that does make Tokens - for(Trigger t:c.getTriggers()){ + for (Trigger t :c .getTriggers()) { SpellAbility sa = t.ensureAbility(); if (sa != null) { if (sa.getApi() != ApiType.Token || !sa.hasParam("TokenTypes")) { @@ -851,7 +851,7 @@ public class ComputerUtilCard { } } // special rule for Fabricate and Servo - if(c.hasStartOfKeyword(Keyword.FABRICATE.toString())){ + if (c.hasStartOfKeyword(Keyword.FABRICATE.toString())) { Integer count = typesInDeck.get("Servo"); if (count == null) { count = 0; @@ -1694,7 +1694,7 @@ public class ComputerUtilCard { pumped.addHiddenExtrinsicKeywords(timestamp, 0, hiddenKws); } Set types = c.getCounters().keySet(); - for(CounterType ct : types) { + for (CounterType ct : types) { pumped.addCounterFireNoEvents(ct, c.getCounters(ct), ai, sa, true, null); } //Copies tap-state and extra keywords (auras, equipment, etc.) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index ce7fcd65dd9..801dec9319e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -671,7 +671,6 @@ public class ComputerUtilCombat { int flankingMagnitude = 0; if (attacker.hasKeyword(Keyword.FLANKING) && !blocker.hasKeyword(Keyword.FLANKING)) { - flankingMagnitude = attacker.getAmountOfKeyword(Keyword.FLANKING); if (flankingMagnitude >= blocker.getNetToughness()) { diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 3dbea35fb5a..b4e802a46a3 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -220,16 +220,16 @@ public class PlayerControllerAi extends PlayerController { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix()); } - FCollection remaining = new FCollection<>(optionList); - List selecteds = new ArrayList<>(); - T selected; - do { - selected = chooseSingleEntityForEffect(remaining, null, sa, title, selecteds.size()>=min, targetedPlayer, params); - if ( selected != null ) { - remaining.remove(selected); - selecteds.add(selected); - } - } while ( (selected != null ) && (selecteds.size() < max) ); + FCollection remaining = new FCollection<>(optionList); + List selecteds = new ArrayList<>(); + T selected; + do { + selected = chooseSingleEntityForEffect(remaining, null, sa, title, selecteds.size()>=min, targetedPlayer, params); + if ( selected != null ) { + remaining.remove(selected); + selecteds.add(selected); + } + } while ( (selected != null ) && (selecteds.size() < max) ); return selecteds; } @@ -361,8 +361,7 @@ public class PlayerControllerAi extends PlayerController { for (Card c: topN) { if (ComputerUtil.scryWillMoveCardToBottomOfLibrary(player, c)) { toBottom.add(c); - } - else { + } else { toTop.add(c); } } @@ -525,8 +524,7 @@ public class PlayerControllerAi extends PlayerController { if (copySA instanceof Spell) { Spell spell = (Spell) copySA; ((PlayerControllerAi) player.getController()).getAi().canPlayFromEffectAI(spell, true, true); - } - else { + } else { getAi().canPlaySa(copySA); } } @@ -884,9 +882,8 @@ public class PlayerControllerAi extends PlayerController { byte chosenColorMask = MagicColor.fromName(c); if ((colors.getColor() & chosenColorMask) != 0) { return chosenColorMask; - } else { - return Iterables.getFirst(colors, (byte)0); } + return Iterables.getFirst(colors, (byte)0); } @Override @@ -905,9 +902,7 @@ public class PlayerControllerAi extends PlayerController { if ((colors.getColor() & chosenColorMask) != 0) { return chosenColorMask; } - else { - return Iterables.getFirst(colors, MagicColor.WHITE); - } + return Iterables.getFirst(colors, MagicColor.WHITE); } @Override @@ -1370,8 +1365,7 @@ public class PlayerControllerAi extends PlayerController { } @Override - public int chooseNumberForKeywordCost(SpellAbility sa, Cost cost, KeywordInterface keyword, String prompt, - int max) { + public int chooseNumberForKeywordCost(SpellAbility sa, Cost cost, KeywordInterface keyword, String prompt, int max) { // TODO: improve the logic depending on the keyword and the playability of the cost-modified SA (enough targets present etc.) int chosenAmount = 0; diff --git a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java index 2c229c7b7c0..12cee8fdb25 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java @@ -178,7 +178,7 @@ public class CharmAi extends SpellAbilityAi { } else if (ai.canGainLife() && aiLife <= 5) { // critical Life try to gain more chosenList.add(gain); - } else if(!ai.canGainLife() && aiLife == 14 ) { + } else if (!ai.canGainLife() && aiLife == 14 ) { // ai cant gain life, but try to avoid falling to 13 // but if a opponent does control Tainted Remedy its irrelevant chosenList.add(oppTainted ? lose : gain); diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 0fe89ead3a7..00a55dce474 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -419,15 +419,15 @@ public class CountersPutAi extends SpellAbilityAi { oa.setActivatingPlayer(ai); CardCollection targets = CardLists.getTargetableCards(ai.getOpponents().getCreaturesInPlay(), oa); - if (!targets.isEmpty()){ + if (!targets.isEmpty()) { boolean canSurvive = false; for (Card humanCreature : targets) { - if (!FightAi.canKill(humanCreature, source, 0)){ + if (!FightAi.canKill(humanCreature, source, 0)) { canSurvive = true; break; } } - if (!canSurvive){ + if (!canSurvive) { return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index df7ea6ee8ed..06d6144eaaa 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -165,7 +165,7 @@ public class DamageDealAi extends DamageAiBase { dmg = 2; } else if ("OpponentHasCreatures".equals(logic)) { for (Player opp : ai.getOpponents()) { - if (!opp.getCreaturesInPlay().isEmpty()){ + if (!opp.getCreaturesInPlay().isEmpty()) { return true; } } @@ -287,7 +287,7 @@ public class DamageDealAi extends DamageAiBase { } if ((damage.equals("X") && sa.getSVar(damage).equals("Count$xPaid")) || - sourceName.equals("Crater's Claws")){ + sourceName.equals("Crater's Claws")) { // If I can kill my target by paying less mana, do it if (sa.usesTargeting() && !sa.getTargets().isTargetingAnyPlayer() && !sa.isDividedAsYouChoose()) { int actualPay = dmg; @@ -330,7 +330,6 @@ public class DamageDealAi extends DamageAiBase { */ private Card dealDamageChooseTgtC(final Player ai, final SpellAbility sa, final int d, final boolean noPrevention, final Player pl, final boolean mandatory) { - // wait until stack is empty (prevents duplicate kills) if (!sa.isTrigger() && !ai.getGame().getStack().isEmpty()) { //TODO:all removal APIs require a check to prevent duplicate kill/bounce/exile/etc. @@ -345,7 +344,7 @@ public class DamageDealAi extends DamageAiBase { final Player activator = sa.getActivatingPlayer(); final Card source = sa.getHostCard(); final Game game = source.getGame(); - List hPlay = getTargetableCards(ai, sa, pl, tgt, activator, source, game); + List hPlay = getTargetableCards(mandatory ? pl : ai, sa, pl, tgt, activator, source, game); // Filter MustTarget requirements StaticAbilityMustTarget.filterMustTargetCards(ai, hPlay, sa); @@ -531,7 +530,7 @@ public class DamageDealAi extends DamageAiBase { if ("PowerDmg".equals(logic)) { // check if it is better to target the player instead, the original target is already set in PumpAi.pumpTgtAI() - if (tgt.canTgtCreatureAndPlayer() && shouldTgtP(ai, sa, dmg, noPrevention)){ + if (tgt.canTgtCreatureAndPlayer() && shouldTgtP(ai, sa, dmg, noPrevention)) { sa.resetTargets(); sa.getTargets().add(enemy); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java index 3cc8b5a951d..8513849621d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java @@ -94,7 +94,7 @@ public class DelayedTriggerAi extends SpellAbilityAi { } }); - if(count == 0) { + if (count == 0) { return false; } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java index cefac09aaa5..ba7e3614f22 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java @@ -114,7 +114,7 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { if (!top.isLand() && cmc - maxCastable >= uncastableCMCThreshold) { // Can't cast in the foreseeable future. Shuffle if doing it to ourselves or an ally, otherwise keep it return !p.isOpponentOf(player); - } else if (top.isLand() && landsOTB <= minLandsToScryLandsAway){ + } else if (top.isLand() && landsOTB <= minLandsToScryLandsAway) { // We don't want to give the opponent a free land if his land count is low return p.isOpponentOf(player); } diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java index 1cb7766e11f..d11f04bc03c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java @@ -52,14 +52,14 @@ public class RepeatEachAi extends SpellAbilityAi { } } else if ("OpponentHasCreatures".equals(logic)) { //TODO convert this to NeedsToPlayVar for (Player opp : aiPlayer.getOpponents()) { - if (!opp.getCreaturesInPlay().isEmpty()){ + if (!opp.getCreaturesInPlay().isEmpty()) { return true; } } return false; } else if ("OpponentHasMultipleCreatures".equals(logic)) { for (Player opp : aiPlayer.getOpponents()) { - if (opp.getCreaturesInPlay().size() > 1){ + if (opp.getCreaturesInPlay().size() > 1) { return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 2e73a232e34..261658d6292 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -69,7 +69,7 @@ public class SetStateAi extends SpellAbilityAi { final String logic = sa.getParamOrDefault("AILogic", ""); final Game game = source.getGame(); - if("Transform".equals(mode)) { + if ("Transform".equals(mode)) { if (!sa.usesTargeting()) { // no Transform with Defined which is not Self if (!source.canTransform()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAi.java index 52abe9535f0..295cc2f5a9b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAi.java @@ -35,7 +35,7 @@ public class TapAi extends TapAiBase { // Don't tap down after blockers return false; } - } else if (!SpellAbilityAi.playReusable(ai, sa)){ + } else if (!SpellAbilityAi.playReusable(ai, sa)) { // Generally don't want to tap things with an Instant during Players turn outside of combat return false; } diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index 12cd7450824..a05458ec288 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -45,7 +45,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { @Override public GameLogEntry visit(GameEventGameOutcome ev) { - for(String outcome : ev.result.getOutcomeStrings()) { + for (String outcome : ev.result.getOutcomeStrings()) { log.add(GameLogEntryType.GAME_OUTCOME, outcome); } return generateSummary(ev.history); 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 cad9a2ac1e3..bb3c46eaf00 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2550,7 +2550,7 @@ public class AbilityUtils { int colorOcurrencices = 0; byte colorCode = ManaAtom.fromName(sq[1]); for (Card c0 : cards) { - for (ManaCostShard sh : c0.getManaCost()){ + for (ManaCostShard sh : c0.getManaCost()) { if (sh.isColor(colorCode)) colorOcurrencices++; } diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index afbb4b7ab0f..f7a687e37d1 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -192,7 +192,7 @@ public enum ApiType { private static final Map allValues = new HashMap<>(); static { - for(ApiType t : ApiType.values()) { + for (ApiType t : ApiType.values()) { allValues.put(t.name().toLowerCase(), t); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java index 0bfe529c0a5..a402327b376 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java @@ -78,7 +78,7 @@ public class AmassEffect extends TokenEffectBase { tgtCards = pc.chooseCardsForEffect(tgtCards, sa, Localizer.getInstance().getMessage("lblChooseAnArmy"), 1, 1, false, params); GameEntityCounterTable table = new GameEntityCounterTable(); - for(final Card tgtCard : tgtCards) { + for (final Card tgtCard : tgtCards) { tgtCard.addCounter(CounterEnumType.P1P1, amount, activator, sa, true, table); game.updateLastStateForCard(tgtCard); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java index c3a24f2b8ce..bf481bc5493 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java @@ -96,7 +96,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { SpellAbility changingTgtSA = changingTgtSI.getSpellAbility(true); if (changingTgtSA.usesTargeting()) { // random target and DefinedMagnet works on single targets - if (sa.hasParam("RandomTarget")){ + if (sa.hasParam("RandomTarget")) { int div = changingTgtSA.getTotalDividedValue(); changingTgtSA.resetTargets(); List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true); @@ -116,7 +116,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { changingTgtSI.updateTarget(changingTgtSA.getTargets(), sa.getHostCard()); } - else if (sa.hasParam("DefinedMagnet")){ + else if (sa.hasParam("DefinedMagnet")) { GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa, "DefinedMagnet"), null); if (newTarget != null && changingTgtSA.canTarget(newTarget)) { int div = changingTgtSA.getTotalDividedValue(); 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 830cbbd2457..ec348aebae2 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 @@ -222,7 +222,7 @@ public class CharmEffect extends SpellAbilityEffect { }); for (AbilitySub sub : chosen) { - // Clone the chosen, just in case the some subAb gets chosen multiple times + // Clone the chosen, just in case the same subAb gets chosen multiple times AbilitySub clone = (AbilitySub)sub.copy(); // update ActivatingPlayer @@ -250,7 +250,6 @@ public class CharmEffect extends SpellAbilityEffect { // add Clone to Tail of sa sa.appendSubAbility(clone); } - } } 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 743c746ae9f..114d16ace3f 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 @@ -141,7 +141,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { } host.setNamedCard(chosen); - if(!randomChoice) { + if (!randomChoice) { p.getGame().getAction().notifyOfValue(sa, host, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p); p.setNamedCard(chosen); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java index 34aba792dc4..f18b046b1f3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java @@ -28,7 +28,7 @@ public class ControlSpellEffect extends SpellAbilityEffect { sb.append(newController).append(" gains control of "); - for(SpellAbility spell : getTargetSpells(sa)) { + for (SpellAbility spell : getTargetSpells(sa)) { Card c = spell.getHostCard(); sb.append(" "); if (c.isFaceDown()) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index 5af20e90dfc..414e344ef6f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -160,7 +160,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { if (sa.hasParam("MayChooseTarget")) { copy.setMayChooseNewTargets(true); } - if (sa.hasParam("RandomTarget")){ + if (sa.hasParam("RandomTarget")) { List candidates = copy.getTargetRestrictions().getAllCandidates(chosenSA, true); if (sa.hasParam("RandomTargetRestriction")) { candidates.removeIf(new Predicate() { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java index b1cbf040fe7..5c9f92ebede 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersNoteEffect.java @@ -37,7 +37,7 @@ public class CountersNoteEffect extends SpellAbilityEffect { } private void noteCounters(Card notee, Card source) { - for(Entry counter : notee.getCounters().entrySet()) { + for (Entry counter : notee.getCounters().entrySet()) { StringBuilder sb = new StringBuilder(); sb.append(NOTE_COUNTERS).append(counter.getKey().getName()); source.setSVar(sb.toString(), counter.getValue().toString()); @@ -45,7 +45,7 @@ public class CountersNoteEffect extends SpellAbilityEffect { } private void loadCounters(Card notee, Card source, final Player p, final SpellAbility sa, GameEntityCounterTable table) { - for(Entry svar : source.getSVars().entrySet()) { + for (Entry svar : source.getSVars().entrySet()) { String key = svar.getKey(); if (key.startsWith(NOTE_COUNTERS)) { notee.addCounter( diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java index 0725d4e7806..b1ff536f4a9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java @@ -35,7 +35,7 @@ public class DamageAllEffect extends DamageBaseEffect { if (!definedSources.isEmpty() && definedSources.get(0) != sa.getHostCard()) { sb.append(definedSources.get(0).toString()).append(" deals"); - } else if ("ParentTarget".equals(definedStr)){ + } else if ("ParentTarget".equals(definedStr)) { sb.append("Target creature deals"); } else { sb.append("Deals"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java index e0a855ef9e5..74c05ce871a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java @@ -96,7 +96,7 @@ public class DebuffEffect extends SpellAbilityEffect { for (final String kw : kws) { // Check if some of the Keywords are Protection from if (!ProtectionFromColor && kw.startsWith("Protection from ")) { - for(byte col : MagicColor.WUBRG) { + for (byte col : MagicColor.WUBRG) { final String colString = MagicColor.toLongString(col); if (kw.endsWith(colString.toLowerCase())) { ProtectionFromColor = true; @@ -110,7 +110,7 @@ public class DebuffEffect extends SpellAbilityEffect { if (ProtectionFromColor && tgtC.hasKeyword(allColors)) { final List allColorsProtect = Lists.newArrayList(); - for(byte col : MagicColor.WUBRG) { + for (byte col : MagicColor.WUBRG) { allColorsProtect.add("Protection from " + MagicColor.toLongString(col).toLowerCase()); } allColorsProtect.removeAll(kws); @@ -123,7 +123,7 @@ public class DebuffEffect extends SpellAbilityEffect { if (ProtectionFromColor && tgtC.hasKeyword(allColors)) { final List allColorsProtect = Lists.newArrayList(); - for(byte col : MagicColor.WUBRG) { + for (byte col : MagicColor.WUBRG) { final String colString = MagicColor.toLongString(col); if (!kws.contains("Protection from " + colString)) { allColorsProtect.add( diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java index 809c3d775e6..fe82dc1738c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java @@ -330,7 +330,7 @@ public class EffectEffect extends SpellAbilityEffect { } private void noteCounters(Card notee, Card source) { - for(Map.Entry counter : notee.getCounters().entrySet()) { + for (Map.Entry counter : notee.getCounters().entrySet()) { StringBuilder sb = new StringBuilder(); sb.append("NoteCounters").append(counter.getKey().getName()); source.setSVar(sb.toString(), counter.getValue().toString()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java index f2614f45cf0..8e249fc3a66 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java @@ -50,7 +50,7 @@ public class PeekAndRevealEffect extends SpellAbilityEffect { numPeek = Math.min(numPeek, library.size()); CardCollection peekCards = new CardCollection(); - for(int i = 0; i < numPeek; i++) { + for (int i = 0; i < numPeek; i++) { peekCards.add(library.get(i)); } @@ -74,7 +74,7 @@ public class PeekAndRevealEffect extends SpellAbilityEffect { } if (imprintRevealed) { Map cachedMap = Maps.newHashMap(); - for(Card c : revealableCards) { + for (Card c : revealableCards) { source.addImprintedCard(CardUtil.getLKICopy(c, cachedMap)); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java index 76834972a01..dc3bc6970ed 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java @@ -13,7 +13,7 @@ public class PlaneswalkEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { Game game = sa.getActivatingPlayer().getGame(); - for(Player p : game.getPlayers()) { + for (Player p : game.getPlayers()) { p.leaveCurrentPlane(); } if (sa.hasParam("Defined")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index cd3f70d45a5..29f4ec66886 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -103,7 +103,7 @@ public class PlayEffect extends SpellAbilityEffect { } else if (sa.hasParam("AnySupportedCard")) { final String valid = sa.getParam("AnySupportedCard"); List cards = null; - if (valid.startsWith("Names:")){ + if (valid.startsWith("Names:")) { cards = new ArrayList<>(); for (String name : valid.substring(6).split(",")) { name = name.replace(";", ","); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index ead24353032..75e48fe6c60 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -66,7 +66,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { } else if (sa.getParam("Gains").equals("TargetedCardColor")) { for (final Card c : sa.getSATargetingCard().getTargets().getTargetCards()) { ColorSet cs = CardUtil.getColors(c); - for(byte col : MagicColor.WUBRG) { + for (byte col : MagicColor.WUBRG) { if (cs.hasAnyColor(col)) gains.add(MagicColor.toLongString(col).toLowerCase()); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index c684ce10121..d13f4e576f3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -87,7 +87,7 @@ public class TwoPilesEffect extends SpellAbilityEffect { } String title; - if("One".equals(sa.getParamOrDefault("FaceDown", "False"))) { + if ("One".equals(sa.getParamOrDefault("FaceDown", "False"))) { title = Localizer.getInstance().getMessage("lblSelectCardForFaceDownPile"); } else if (isLeftRightPile) { title = Localizer.getInstance().getMessage("lblSelectCardForLeftPile"); 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 49154a187be..df699d12539 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2084,7 +2084,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.equals("Foretell") // for the ones without cost || keyword.equals("Hideaway") || keyword.equals("Ascend") || keyword.equals("Totem armor") || keyword.equals("Battle cry") - || keyword.equals("Devoid") || keyword.equals("Riot")){ + || keyword.equals("Devoid") || keyword.equals("Riot")) { sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Partner:")) { final String[] k = keyword.split(":"); @@ -3580,10 +3580,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return changed; } - public boolean clearChangedCardKeywords() { - return clearChangedCardKeywords(false); - } - public boolean clearChangedCardColors() { boolean changed = false; @@ -3981,7 +3977,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { this.tempBoost = 0; this.bonusFromCounters = 0; } - public StatBreakdown(int currentValue, int tempBoost, int bonusFromCounters){ + public StatBreakdown(int currentValue, int tempBoost, int bonusFromCounters) { this.currentValue = currentValue; this.tempBoost = tempBoost; this.bonusFromCounters = bonusFromCounters; @@ -4268,6 +4264,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return change; } + public boolean clearChangedCardKeywords() { + return clearChangedCardKeywords(false); + } public final boolean clearChangedCardKeywords(final boolean updateView) { if (changedCardKeywords.isEmpty()) { return false; diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index a0e8846bec2..a677a19c483 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -270,7 +270,7 @@ public class CardFactory { original.addNonManaAbilities(card.getCurrentState().getNonManaAbilities()); original.addIntrinsicKeywords(card.getCurrentState().getIntrinsicKeywords()); // Copy 'Fuse' to original side original.getSVars().putAll(card.getCurrentState().getSVars()); // Unfortunately need to copy these to (Effect looks for sVars on execute) - } else if (state != CardStateName.Original){ + } else if (state != CardStateName.Original) { CardFactoryUtil.setupKeywordedAbilities(card); } if (state == CardStateName.Adventure) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 097aebcf786..1a7716df80a 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -538,7 +538,7 @@ public class CardFactoryUtil { landkw.add(k); } else if (k.startsWith("Protection")) { protectionkw.add(k); - for(byte col : MagicColor.WUBRG) { + for (byte col : MagicColor.WUBRG) { final String colString = "Protection from " + MagicColor.toLongString(col).toLowerCase(); if (k.contains(colString)) { protectionColorkw.add(colString); @@ -896,7 +896,7 @@ public class CardFactoryUtil { cascadeTrigger.setOverridingAbility(dig); inst.addTrigger(cascadeTrigger); - } else if (keyword.startsWith("Champion")){ + } else if (keyword.startsWith("Champion")) { final String[] k = keyword.split(":"); final String[] valid = k[1].split(","); String desc = Lang.joinHomogenous(Lists.newArrayList(valid), null, "or"); @@ -1688,7 +1688,7 @@ public class CardFactoryUtil { int idx = 0; int skipId = 0; - for(String ab : abs) { + for (String ab : abs) { idx += 1; if (idx <= skipId) { continue; @@ -1898,7 +1898,7 @@ public class CardFactoryUtil { final List abs = Arrays.asList(keyword.substring("Dungeon:".length()).split(",")); final Map saMap = new LinkedHashMap<>(); - for(String ab : abs) { + for (String ab : abs) { saMap.put(ab, AbilityFactory.getAbility(card, ab)); } for (SpellAbility sa : saMap.values()) { @@ -2956,7 +2956,7 @@ public class CardFactoryUtil { inst.addSpellAbility(abilityMorphDown(card)); inst.addSpellAbility(abilityMorphUp(card, k[1], false)); - } else if (keyword.startsWith("Megamorph")){ + } else if (keyword.startsWith("Megamorph")) { final String[] k = keyword.split(":"); inst.addSpellAbility(abilityMorphDown(card)); 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 397e7c98394..9447ce99f0b 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -354,7 +354,7 @@ public final class CardUtil { if ((combinedColor & color) == 0) { continue; } - for(final Card c : game.getColoredCardsInPlay(MagicColor.toLongString(color))) { + for (final Card c : game.getColoredCardsInPlay(MagicColor.toLongString(color))) { if (!res.contains(c) && !tgts.contains(c) && c.isValid(valid, source.getController(), source, targetSA)) { res.add(c); } diff --git a/forge-game/src/main/java/forge/game/combat/AttackingBand.java b/forge-game/src/main/java/forge/game/combat/AttackingBand.java index 96ca2ad84e2..c2ffa3cb808 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackingBand.java +++ b/forge-game/src/main/java/forge/game/combat/AttackingBand.java @@ -49,7 +49,7 @@ public class AttackingBand { String[] validString = { "Legendary.Creature", "Creature.namedWolves of the Hunt", "Dinosaur" }; Card source = band.get(0); - for(int i = 0; i < bandsWithString.length; i++) { + for (int i = 0; i < bandsWithString.length; i++) { String keyword = bandsWithString[i]; String valid = validString[i]; diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index daf5888ea7a..9ab7719d0ef 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -807,7 +807,7 @@ public class Combat { if (defender instanceof Player && defender.hasKeyword("You assign combat damage of each creature attacking you.")) { assigningPlayer = (Player)defender; } - else if (AttackingBand.isValidBand(orderedBlockers, true)){ + else if (AttackingBand.isValidBand(orderedBlockers, true)) { assigningPlayer = orderedBlockers.get(0).getController(); } diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java index f6f58c8894e..464032de59c 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java @@ -175,7 +175,7 @@ public class CostPutCounter extends CostPartWithList { * @see forge.card.cost.CostPartWithList#executePayment(forge.card.spellability.SpellAbility, forge.Card) */ @Override - protected Card doPayment(SpellAbility ability, Card targetCard){ + protected Card doPayment(SpellAbility ability, Card targetCard) { final Integer i = this.convertAmount(); targetCard.addCounter(this.getCounter(), i, ability.getActivatingPlayer(), null, ability.getRootAbility().isTrigger(), counterTable); return targetCard; diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index d5ad6cc0e12..d69d7f8ba2b 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -394,7 +394,7 @@ public class PhaseHandler implements java.io.Serializable { final CardZoneTable table = new CardZoneTable(); final CardCollection discarded = new CardCollection(); boolean firstDiscarded = playerTurn.getNumDiscardedThisTurn() == 0; - for (Card c : playerTurn.getController().chooseCardsToDiscardToMaximumHandSize(numDiscard)){ + for (Card c : playerTurn.getController().chooseCardsToDiscardToMaximumHandSize(numDiscard)) { if (playerTurn.discard(c, null, table) != null) { discarded.add(c); } @@ -590,7 +590,7 @@ public class PhaseHandler implements java.io.Serializable { "You may exert CARDNAME as it attacks."); if (!possibleExerters.isEmpty()) { - for(Card exerter : whoDeclares.getController().exertAttackers(possibleExerters)) { + for (Card exerter : whoDeclares.getController().exertAttackers(possibleExerters)) { exerter.exert(); } } @@ -1087,7 +1087,7 @@ public class PhaseHandler implements java.io.Serializable { sw.reset(); } } - else if (DEBUG_PHASES){ + else if (DEBUG_PHASES) { System.out.print(" >> (no priority given to " + getPriorityPlayer() + ")\n"); } diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 7531d7c02e2..f812e577c04 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -483,7 +483,7 @@ public class PlayerView extends GameEntityView { if (cards == null) return 0; - for(CardView c : cards) { + for (CardView c : cards) { types.addAll((Collection) c.getCurrentState().getType().getCoreTypes()); } 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 168b9520b54..a142b5d59fe 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -2190,7 +2190,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit @Override public int compareTo(SpellAbility ab) { - if (this.isManaAbility() && ab.isManaAbility()){ + if (this.isManaAbility() && ab.isManaAbility()) { return this.calculateScoreForManaAbility() - ab.calculateScoreForManaAbility(); } return 0; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index cf978a2dfb4..3dcaa5c1ed4 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -318,7 +318,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { SpellAbility compare = sa; SpellAbilityStackInstance sub = this; - if (!compare.equals(sub.ability)){ + if (!compare.equals(sub.ability)) { return false; } From 24f84c283567ca998a9168b81b7d3cfcffdae411 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 6 Oct 2021 10:10:47 +0200 Subject: [PATCH 2/5] Add ReplaceDamageAi --- .../src/main/java/forge/ai/SpellApiToAi.java | 2 +- .../forge/ai/ability/ReplaceDamageAi.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 76669e036fe..acdf96739d3 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -142,7 +142,7 @@ public enum SpellApiToAi { .put(ApiType.Repeat, RepeatAi.class) .put(ApiType.RepeatEach, RepeatEachAi.class) .put(ApiType.ReplaceEffect, AlwaysPlayAi.class) - .put(ApiType.ReplaceDamage, AlwaysPlayAi.class) + .put(ApiType.ReplaceDamage, ReplaceDamageAi.class) .put(ApiType.ReplaceMana, AlwaysPlayAi.class) .put(ApiType.ReplaceSplitDamage, AlwaysPlayAi.class) .put(ApiType.ReplaceToken, AlwaysPlayAi.class) diff --git a/forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java b/forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java new file mode 100644 index 00000000000..99d86c2a554 --- /dev/null +++ b/forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java @@ -0,0 +1,19 @@ +package forge.ai.ability; + +import java.util.Map; + +import com.google.common.collect.Iterables; + +import forge.ai.SpellAbilityAi; +import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; + +public class ReplaceDamageAi extends SpellAbilityAi { + + @Override + protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer, Map params) { + + return Iterables.getFirst(options, null); + } +} From e21871b1e7bbd90009dc62168251a043a52c2feb Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 6 Oct 2021 12:12:03 +0200 Subject: [PATCH 3/5] Clean up --- .../java/forge/ai/AiAttackController.java | 2 +- .../src/main/java/forge/ai/ComputerUtil.java | 2 +- .../main/java/forge/ai/ComputerUtilCard.java | 4 +-- .../java/forge/ai/ComputerUtilCombat.java | 32 +++++++++---------- .../main/java/forge/ai/ability/AnimateAi.java | 3 +- .../forge/ai/ability/ReplaceDamageAi.java | 23 ++++++++++--- .../main/java/forge/ai/ability/TokenAi.java | 3 +- .../src/main/java/forge/game/card/Card.java | 2 -- .../forge/game/keyword/KeywordCollection.java | 1 - .../forge/game/keyword/KeywordsChange.java | 2 +- .../gui/download/GuiDownloadService.java | 17 ++++------ 11 files changed, 47 insertions(+), 44 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 5cf544a3597..75b1566d68e 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -473,7 +473,7 @@ public class AiAttackController { if (totalAttack > 0 && ai.getLife() <= totalAttack && !ai.cantLoseForZeroOrLessLife()) { return true; } - return ai.getPoisonCounters() + totalPoison > 9; + return ai.canReceiveCounters(CounterEnumType.POISON) && ai.getPoisonCounters() + totalPoison > 9; } private boolean doAssault(final Player ai) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index bbf1635052e..b8afd4a4b16 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1719,7 +1719,7 @@ public class ComputerUtil { final Player p = (Player) o; if (source.hasKeyword(Keyword.INFECT)) { - if (ComputerUtilCombat.predictDamageTo(p, dmg, source, false) >= p.getPoisonCounters()) { + if (p.canReceiveCounters(CounterEnumType.POISON) && ComputerUtilCombat.predictDamageTo(p, dmg, source, false) >= 10 - p.getPoisonCounters()) { threatened.add(p); } } else if (ComputerUtilCombat.predictDamageTo(p, dmg, source, false) >= p.getLife()) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index c7496c1ee7e..1573293dae3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -91,7 +91,7 @@ public class ComputerUtilCard { public static void sortByEvaluateCreature(final CardCollection list) { Collections.sort(list, ComputerUtilCard.EvaluateCreatureComparator); } - + // The AI doesn't really pick the best artifact, just the most expensive. /** *

@@ -583,7 +583,7 @@ public class ComputerUtilCard { public static int evaluateCreatureList(final CardCollectionView list) { return Aggregates.sum(list, creatureEvaluator); } - + public static Map evaluateCreatureListByName(final CardCollectionView list) { // Compute value for each possible target Map values = Maps.newHashMap(); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 801dec9319e..20ec0060a27 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -302,28 +302,26 @@ public class ComputerUtilCombat { public static int lifeThatWouldRemain(final Player ai, final Combat combat) { int damage = 0; - final List attackers = combat.getAttackersOf(ai); - final List unblocked = Lists.newArrayList(); + if (ai.canLoseLife()) { + final List attackers = combat.getAttackersOf(ai); + final List unblocked = Lists.newArrayList(); - for (final Card attacker : attackers) { - final List blockers = combat.getBlockers(attacker); + for (final Card attacker : attackers) { + final List blockers = combat.getBlockers(attacker); - if ((blockers.size() == 0) - || attacker.hasKeyword("You may have CARDNAME assign its combat damage " - + "as though it weren't blocked.")) { - unblocked.add(attacker); - } else if (attacker.hasKeyword(Keyword.TRAMPLE) - && (getAttack(attacker) > totalShieldDamage(attacker, blockers))) { - if (!attacker.hasKeyword(Keyword.INFECT)) { - damage += getAttack(attacker) - totalShieldDamage(attacker, blockers); + if ((blockers.size() == 0) + || attacker.hasKeyword("You may have CARDNAME assign its combat damage " + + "as though it weren't blocked.")) { + unblocked.add(attacker); + } else if (attacker.hasKeyword(Keyword.TRAMPLE) + && (getAttack(attacker) > totalShieldDamage(attacker, blockers))) { + if (!attacker.hasKeyword(Keyword.INFECT)) { + damage += getAttack(attacker) - totalShieldDamage(attacker, blockers); + } } } - } - damage += sumDamageIfUnblocked(unblocked, ai); - - if (!ai.canLoseLife()) { - damage = 0; + damage += sumDamageIfUnblocked(unblocked, ai); } return ai.getLife() - damage; diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 6521bbadc11..d35ed6b6c8a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -78,8 +78,7 @@ public class AnimateAi extends SpellAbilityAi { SpellAbility topStack = game.getStack().peekAbility(); if (topStack.getApi() == ApiType.Sacrifice) { final String valid = topStack.getParamOrDefault("SacValid", "Card.Self"); - String num = topStack.getParam("Amount"); - num = (num == null) ? "1" : num; + String num = topStack.getParamOrDefault("Amount", "1"); final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), topStack); diff --git a/forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java b/forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java index 99d86c2a554..10319c4bd51 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ReplaceDamageAi.java @@ -2,10 +2,10 @@ package forge.ai.ability; import java.util.Map; -import com.google.common.collect.Iterables; - +import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.card.Card; +import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -13,7 +13,22 @@ public class ReplaceDamageAi extends SpellAbilityAi { @Override protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer, Map params) { - - return Iterables.getFirst(options, null); + for (Card c : options) { + // TODO check if enough shields to prevent trigger + if (c.hasSVar("MustBeBlocked")) { + return c; + } + // TODO check if target can receive counters + if (c.hasKeyword(Keyword.INFECT)) { + return c; + } + if (c.isCommander()) { + return c; + } + if (c.hasKeyword(Keyword.LIFELINK) || c.hasSVar("LikeLifeLink")) { + return c; + } + } + return ComputerUtilCard.getBestAI(options); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index 3b3a31a953e..13de5478055 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -230,8 +230,7 @@ public class TokenAi extends SpellAbilityAi { } final int nTokens = AbilityUtils.calculateAmount(sa.getHostCard(), tokenAmount, sa); final String valid = topStack.getParamOrDefault("SacValid", "Card.Self"); - String num = sa.getParam("Amount"); - num = (num == null) ? "1" : num; + String num = sa.getParamOrDefault("Amount", "1"); final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), sa); 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 df699d12539..974f971092b 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3541,7 +3541,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final CardTypeView getType() { return getType(currentState); } - public final CardTypeView getType(CardState state) { if (changedCardTypes.isEmpty() && changedCardTypesCharacterDefining.isEmpty()) { return state.getType(); @@ -3644,7 +3643,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final void removeChangedCardTypes(final long timestamp) { removeChangedCardTypes(timestamp, true); } - public final void removeChangedCardTypes(final long timestamp, final boolean updateView) { boolean removed = false; removed |= changedCardTypes.remove(timestamp) != null; diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java index 25f90dd9b5c..26c480299f7 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java @@ -12,7 +12,6 @@ import forge.game.card.Card; public class KeywordCollection implements Iterable { - private transient KeywordCollectionView view; // don't use enumKeys it causes a slow down private final Multimap map = MultimapBuilder.hashKeys() diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java b/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java index 5a8cc8eeebc..8d63055369a 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java @@ -36,7 +36,7 @@ import forge.game.trigger.Trigger; * * @author Forge */ -public class KeywordsChange implements Cloneable { +public class KeywordsChange implements Cloneable { private KeywordCollection keywords = new KeywordCollection(); private List removeKeywordInterfaces = Lists.newArrayList(); private List removeKeywords = Lists.newArrayList(); diff --git a/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java b/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java index 62a1db1c6b1..bf758acf2c1 100644 --- a/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java +++ b/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java @@ -119,8 +119,7 @@ public abstract class GuiDownloadService implements Runnable { }); } }); - } - else { + } else { //handle special case of zip service if (onReadyToStart != null) { onReadyToStart.run(); @@ -147,8 +146,7 @@ public abstract class GuiDownloadService implements Runnable { progressBar.setDescription("All items have been downloaded."); btnStart.setText("OK"); btnStart.setCommand(cmdClose); - } - else { + } else { progressBar.setMaximum(files.size()); progressBar.setDescription(files.size() == 1 ? "1 item found." : files.size() + " items found."); //for(Entry kv : cards.entrySet()) System.out.printf("Will get %s from %s%n", kv.getKey(), kv.getValue()); @@ -223,8 +221,7 @@ public abstract class GuiDownloadService implements Runnable { } sb.append(String.format("%02d remaining.", t2Go / 1000)); - } - else { + } else { sb.append(String.format("%d of %d items finished! Skipped " + skipped + " items. Please close!", count, files.size())); finish(); @@ -303,8 +300,7 @@ public abstract class GuiDownloadService implements Runnable { } // if file is not found and this is a JPG, give PNG a shot... - if ((conn.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) && (url.endsWith(".jpg"))) - { + if ((conn.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) && (url.endsWith(".jpg"))) { fullborder = false; isJPG = false; conn.disconnect(); @@ -342,8 +338,7 @@ public abstract class GuiDownloadService implements Runnable { System.out.println(" Connection failed for url: " + url); break; } - } - else { + } else { System.out.println(" Can't create folder: " + base.getAbsolutePath()); } } @@ -425,7 +420,7 @@ public abstract class GuiDownloadService implements Runnable { String response = HttpUtil.getURL(manifestUrl); - if (response == null) return null; + if (response == null) return null; String[] strings = response.split(" Date: Wed, 6 Oct 2021 18:26:15 +0200 Subject: [PATCH 4/5] Fix NeedsPrevention logic --- forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index 8a71e557d4d..7e2805a9add 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -67,7 +67,7 @@ public class ChooseSourceAi extends SpellAbilityAi { if (sa.getParam("AILogic").equals("NeedsPrevention")) { if (!game.getStack().isEmpty()) { final SpellAbility topStack = game.getStack().peekAbility(); - if (sa.hasParam("Choices") && !topStack.getHostCard().isValid(sa.getParam("Choices"), ai, source, sa)) { + if (sa.hasParam("Choices") && !topStack.matchesValid(topStack.getHostCard(), sa.getParam("Choices").split(","))) { return false; } final ApiType threatApi = topStack.getApi(); @@ -111,8 +111,6 @@ public class ChooseSourceAi extends SpellAbilityAi { return true; } - - @Override public Card chooseSingleCard(final Player aiChoser, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer, Map params) { if ("NeedsPrevention".equals(sa.getParam("AILogic"))) { @@ -178,7 +176,7 @@ public class ChooseSourceAi extends SpellAbilityAi { final Card source = si.getSourceCard(); final SpellAbility abilityOnStack = si.getSpellAbility(true); - if (sa.hasParam("Choices") && !abilityOnStack.getHostCard().isValid(sa.getParam("Choices"), ai, sa.getHostCard(), sa)) { + if (sa.hasParam("Choices") && !abilityOnStack.matchesValid(source, sa.getParam("Choices").split(","))) { continue; } final ApiType threatApi = abilityOnStack.getApi(); From d175f6cb6d1555fe4d34fa0f950f1c71a34390a1 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 6 Oct 2021 19:20:28 +0200 Subject: [PATCH 5/5] Clean up --- .../src/main/java/forge/ai/SpellApiToAi.java | 2 +- .../java/forge/ai/ability/ManaEffectAi.java | 26 ++++++++++++++++--- .../main/java/forge/ai/ability/PumpAi.java | 11 -------- .../game/ability/effects/ManaEffect.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 4 --- .../java/forge/game/phase/PhaseHandler.java | 6 ++--- forge-gui/res/cardsfolder/j/jeskas_will.txt | 5 ++-- .../res/cardsfolder/r/rousing_refrain.txt | 3 +-- 8 files changed, 30 insertions(+), 29 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index acdf96739d3..837f35da618 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -144,7 +144,7 @@ public enum SpellApiToAi { .put(ApiType.ReplaceEffect, AlwaysPlayAi.class) .put(ApiType.ReplaceDamage, ReplaceDamageAi.class) .put(ApiType.ReplaceMana, AlwaysPlayAi.class) - .put(ApiType.ReplaceSplitDamage, AlwaysPlayAi.class) + .put(ApiType.ReplaceSplitDamage, ReplaceDamageAi.class) .put(ApiType.ReplaceToken, AlwaysPlayAi.class) .put(ApiType.RestartGame, RestartGameAi.class) .put(ApiType.Reveal, RevealAi.class) diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index e3554f94aa3..c4abbd58167 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -28,6 +28,8 @@ import forge.game.keyword.Keyword; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerCollection; +import forge.game.player.PlayerPredicates; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Aggregates; @@ -43,7 +45,7 @@ public class ManaEffectAi extends SpellAbilityAi { @Override protected boolean checkAiLogic(Player ai, SpellAbility sa, String aiLogic) { if (aiLogic.startsWith("ManaRitual")) { - return doManaRitualLogic(ai, sa); + return doManaRitualLogic(ai, sa, false); } else if ("Always".equals(aiLogic)) { return true; } @@ -110,14 +112,32 @@ public class ManaEffectAi extends SpellAbilityAi { */ @Override protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { + final String logic = sa.getParamOrDefault("AILogic", ""); + if (logic.startsWith("ManaRitual")) { + return doManaRitualLogic(aiPlayer, sa, true); + } + return true; } // Dark Ritual and other similar instants/sorceries that add mana to mana pool - public static boolean doManaRitualLogic(Player ai, SpellAbility sa) { + public static boolean doManaRitualLogic(Player ai, SpellAbility sa, boolean fromTrigger) { final Card host = sa.getHostCard(); final String logic = sa.getParamOrDefault("AILogic", ""); - + + if (sa.usesTargeting()) { // Rousing Refrain + PlayerCollection targetableOpps = ai.getOpponents().filter(PlayerPredicates.isTargetableBy(sa)); + if (targetableOpps.isEmpty()) { + return false; + } + Player mostCards = targetableOpps.max(PlayerPredicates.compareByZoneSize(ZoneType.Hand)); + sa.resetTargets(); + sa.getTargets().add(mostCards); + if (fromTrigger) { + return true; + } + } + CardCollection manaSources = ComputerUtilMana.getAvailableManaSources(ai, true); int numManaSrcs = manaSources.size(); int manaReceived = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa) : 1; 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 35e7a7b4692..3822c65bcd5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -34,8 +34,6 @@ import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; -import forge.game.player.PlayerCollection; -import forge.game.player.PlayerPredicates; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.staticability.StaticAbility; @@ -512,15 +510,6 @@ public class PumpAi extends PumpAiBase { } return false; - } else if ("ManaRitual".equals(sa.getParam("AILogic"))) { - PlayerCollection targetableOpps = ai.getOpponents().filter(PlayerPredicates.isTargetableBy(sa)); - if (targetableOpps.isEmpty()) { - return false; - } - Player mostCards = targetableOpps.max(PlayerPredicates.compareByZoneSize(ZoneType.Hand)); - sa.resetTargets(); - sa.getTargets().add(mostCards); - return mandatory || ManaEffectAi.doManaRitualLogic(ai, sa.getSubAbility()); } if (isFight) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 123cdcffbff..01bae0efda1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -33,7 +33,7 @@ public class ManaEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); AbilityManaPart abMana = sa.getManaPart(); - final List tgtPlayers = getTargetPlayers(sa); + final List tgtPlayers = getDefinedPlayersOrTargeted(sa); // Spells are not undoable sa.setUndoable(sa.isAbility() && sa.isUndoable() && tgtPlayers.size() < 2); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 1a7716df80a..1c6377cf859 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3197,10 +3197,6 @@ public class CardFactoryUtil { return false; } - if (this.getHostCard().isInstant() || this.getHostCard().hasKeyword(Keyword.FLASH)) { - return true; - } - return this.getHostCard().getFirstSpellAbility().canCastTiming(this.getHostCard(), this.getActivatingPlayer()); } diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index d69d7f8ba2b..8b84e6fc37d 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -342,8 +342,7 @@ public class PhaseHandler implements java.io.Serializable { // no first strikers, skip this step if (!combat.assignCombatDamage(true)) { givePriorityToPlayer = false; - } - else { + } else { combat.dealAssignedDamage(); } break; @@ -355,8 +354,7 @@ public class PhaseHandler implements java.io.Serializable { if (!combat.assignCombatDamage(false)) { givePriorityToPlayer = false; - } - else { + } else { combat.dealAssignedDamage(); } break; diff --git a/forge-gui/res/cardsfolder/j/jeskas_will.txt b/forge-gui/res/cardsfolder/j/jeskas_will.txt index 84b91e5c9b2..1e8f01d8724 100644 --- a/forge-gui/res/cardsfolder/j/jeskas_will.txt +++ b/forge-gui/res/cardsfolder/j/jeskas_will.txt @@ -1,9 +1,8 @@ Name:Jeska's Will ManaCost:2 R Types:Sorcery -A:SP$ Charm | Cost$ 2 R | MinCharmNum$ 1 | CharmNum$ X | Choices$ DBHandTarget,DBExile | AdditionalDescription$ If you control a commander as you cast this spell, you may choose both. -SVar:DBHandTarget:DB$ Pump | ValidTgts$ Opponent | SubAbility$ DBMana | AILogic$ ManaRitual | SpellDescription$ Add {R} for each card in target opponent's hand. -SVar:DBMana:DB$ Mana | Produced$ R | Amount$ Z | StackDescription$ None +A:SP$ Charm | Cost$ 2 R | MinCharmNum$ 1 | CharmNum$ X | Choices$ DBMana,DBExile | AdditionalDescription$ If you control a commander as you cast this spell, you may choose both. +SVar:DBMana:DB$ Mana | Defined$ You | ValidTgts$ Opponent | AILogic$ ManaRitual | Produced$ R | Amount$ Z | SpellDescription$ Add {R} for each card in target opponent's hand. SVar:DBExile:DB$ Dig | Defined$ You | DigNum$ 3 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top three cards of your library. You may play them this turn. SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ForgetOnMoved$ Exile SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play the exiled cards this turn. diff --git a/forge-gui/res/cardsfolder/r/rousing_refrain.txt b/forge-gui/res/cardsfolder/r/rousing_refrain.txt index 194b7b7ce7d..145306015f5 100644 --- a/forge-gui/res/cardsfolder/r/rousing_refrain.txt +++ b/forge-gui/res/cardsfolder/r/rousing_refrain.txt @@ -2,8 +2,7 @@ Name:Rousing Refrain ManaCost:3 R R Types:Sorcery K:Suspend:3:1 R -A:SP$ Pump | Cost$ 3 R R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBMana | AILogic$ ManaRitual | StackDescription$ SpellDescription | SpellDescription$ Add {R} for each card in target opponent's hand. -SVar:DBMana:DB$ Mana | Produced$ R | Amount$ Z | PersistentMana$ True | SubAbility$ DBChange | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, you don't lose this mana as steps and phases end. +A:SP$ Mana | Cost$ 3 R R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBMana | AILogic$ ManaRitual | Produced$ R | Amount$ Z | PersistentMana$ True | Defined$ You | SubAbility$ DBChange | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, you don't lose this mana as steps and phases end. SVar:Z:TargetedPlayer$CardsInHand SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | WithCountersType$ TIME | WithCountersAmount$ 3 | SpellDescription$ Exile CARDNAME with three time counters on it. Oracle:Add {R} for each card in target opponent's hand. Until end of turn, you don't lose this mana as steps and phases end. Exile Rousing Refrain with three time counters on it.\nSuspend 3—{1}{R} (Rather than cast this card from your hand, you may pay {1}{R} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)