From a1964eb75e45f764e2bccd37ae02a648398e5b03 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 8 Jul 2021 16:13:41 +0200 Subject: [PATCH] Fix assignGenericAmount dialog when no targets (Lathiel) --- .../ability/effects/ChooseNumberEffect.java | 3 +- .../ability/effects/CountersPutEffect.java | 2 +- .../ability/effects/DamageEachEffect.java | 1 - .../game/ability/effects/GameDrawEffect.java | 1 - .../game/ability/effects/LifeLoseEffect.java | 1 - .../game/ability/effects/PoisonEffect.java | 87 +++++++++---------- .../game/ability/effects/TwoPilesEffect.java | 8 -- .../game/ability/effects/VentureEffect.java | 2 +- .../screens/match/VAssignGenericAmount.java | 2 +- .../l/lathiel_the_bounteous_dawn.txt | 2 +- .../match/input/InputSelectTargets.java | 12 +-- .../forge/player/PlayerControllerHuman.java | 14 ++- 12 files changed, 65 insertions(+), 70 deletions(-) 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 d8a21d239c1..ae677e85f7c 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 @@ -36,8 +36,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); - //final int min = sa.containsKey("Min") ? Integer.parseInt(sa.get("Min")) : 0; - //final int max = sa.containsKey("Max") ? Integer.parseInt(sa.get("Max")) : 99; + final boolean random = sa.hasParam("Random"); final boolean anyNumber = sa.hasParam("ChooseAnyNumber"); final boolean secretlyChoose = sa.hasParam("SecretlyChoose"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index cd5dbe0c895..e845cc1d8ae 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -278,7 +278,7 @@ public class CountersPutEffect extends SpellAbilityEffect { params.put("Target", obj); params.put("CounterType", counterType); divrem++; - if ((divrem == tgtObjects.size()) || (counterRemain == 1)) { counterAmount = counterRemain; } + if (divrem == tgtObjects.size() || counterRemain == 1) { counterAmount = counterRemain; } else { counterAmount = pc.chooseNumber(sa, Localizer.getInstance().getMessage ("lblHowManyCountersThis", CardTranslation.getTranslatedName(gameCard.getName())), diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java index 1871bea5b8e..2418d638416 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java @@ -92,7 +92,6 @@ public class DamageEachEffect extends DamageBaseEffect { // TODO shouldn't that be using Num or something first? final int dmg = AbilityUtils.calculateAmount(source, "X", sa); - // System.out.println(source+" deals "+dmg+" damage to "+o.toString()); if (o instanceof Card) { final Card c = (Card) o; if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/GameDrawEffect.java b/forge-game/src/main/java/forge/game/ability/effects/GameDrawEffect.java index ca97d0e409c..ab6ed5a4a05 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/GameDrawEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/GameDrawEffect.java @@ -24,4 +24,3 @@ public class GameDrawEffect extends SpellAbilityEffect { } } - diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java index 39693308a68..a73d03c59ca 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java @@ -33,7 +33,6 @@ public class LifeLoseEffect extends SpellAbilityEffect { */ @Override public void resolve(SpellAbility sa) { - int lifeLost = 0; final int lifeAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java index d8502b8f679..ae278ce2f34 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java @@ -17,54 +17,53 @@ import forge.util.Lang; * */ - public class PoisonEffect extends SpellAbilityEffect { +public class PoisonEffect extends SpellAbilityEffect { - /* (non-Javadoc) - * @see forge.game.ability.SpellAbilityEffect#resolve(forge.game.spellability.SpellAbility) - */ - @Override - public void resolve(SpellAbility sa) { - final Card host = sa.getHostCard(); - final Game game = host.getGame(); - final int amount = AbilityUtils.calculateAmount(host, sa.getParam("Num"), sa); + /* (non-Javadoc) + * @see forge.game.ability.SpellAbilityEffect#resolve(forge.game.spellability.SpellAbility) + */ + @Override + public void resolve(SpellAbility sa) { + final Card host = sa.getHostCard(); + final Game game = host.getGame(); + final int amount = AbilityUtils.calculateAmount(host, sa.getParam("Num"), sa); - GameEntityCounterTable table = new GameEntityCounterTable(); - for (final Player p : getTargetPlayers(sa)) { - if ((!sa.usesTargeting()) || p.canBeTargetedBy(sa)) { - if (amount >= 0) { - p.addPoisonCounters(amount, host, table); - } else { - p.removePoisonCounters(-amount, host); - } + GameEntityCounterTable table = new GameEntityCounterTable(); + for (final Player p : getTargetPlayers(sa)) { + if ((!sa.usesTargeting()) || p.canBeTargetedBy(sa)) { + if (amount >= 0) { + p.addPoisonCounters(amount, host, table); + } else { + p.removePoisonCounters(-amount, host); } } - table.triggerCountersPutAll(game); } - - /* (non-Javadoc) - * @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility) - */ - @Override - protected String getStackDescription(SpellAbility sa) { - final StringBuilder sb = new StringBuilder(); - final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Num"), sa); - - final List tgtPlayers = getTargetPlayers(sa); - - sb.append(Lang.joinHomogenous(tgtPlayers)); - sb.append(" "); - - sb.append("get"); - if (tgtPlayers.size() < 2) { - sb.append("s"); - } - - String type = CounterEnumType.POISON.getName() + " counter"; - - sb.append(" ").append(Lang.nounWithAmount(amount, type)).append("."); - - return sb.toString(); - } - + table.triggerCountersPutAll(game); } + /* (non-Javadoc) + * @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility) + */ + @Override + protected String getStackDescription(SpellAbility sa) { + final StringBuilder sb = new StringBuilder(); + final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Num"), sa); + + final List tgtPlayers = getTargetPlayers(sa); + + sb.append(Lang.joinHomogenous(tgtPlayers)); + sb.append(" "); + + sb.append("get"); + if (tgtPlayers.size() < 2) { + sb.append("s"); + } + + String type = CounterEnumType.POISON.getName() + " counter"; + + sb.append(" ").append(Lang.nounWithAmount(amount, type)).append("."); + + return sb.toString(); + } + +} 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 5bd8ad4edef..c684ce10121 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 @@ -17,10 +17,6 @@ import forge.util.Localizer; public class TwoPilesEffect extends SpellAbilityEffect { - // ************************************************************************* - // ***************************** TwoPiles ********************************** - // ************************************************************************* - /* (non-Javadoc) * @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility) */ @@ -106,10 +102,6 @@ public class TwoPilesEffect extends SpellAbilityEffect { final CardCollection pile2 = new CardCollection(pool); pile2.removeAll(pile1); - //System.out.println("Pile 1:" + pile1); - //System.out.println("Pile 2:" + pile2); - - if (isLeftRightPile) { pile1WasChosen = true; } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java b/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java index 33fb9613ce2..6c17181028d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java @@ -42,7 +42,7 @@ public class VentureEffect extends SpellAbilityEffect { } } - // Create a new dugeon card chosen by player in command zone. + // Create a new dungeon card chosen by player in command zone. List dungeonCards = StaticData.instance().getVariantCards().getAllCards( Predicates.compose(CardRulesPredicates.Presets.IS_DUNGEON, PaperCard.FN_GET_RULES)); List faces = new ArrayList<>(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignGenericAmount.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignGenericAmount.java index 6e140c7575c..26b5aa5a97c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignGenericAmount.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignGenericAmount.java @@ -175,7 +175,7 @@ public class VAssignGenericAmount { btnReset.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { resetAssignedAmount(); initialAssignAmount(); } }); - // Final UI layout + // Final UI layout pnlMain.setLayout(new MigLayout("insets 0, gap 0, wrap 2, ax center")); pnlMain.add(pnlSource, "w 125px!, h 160px!, gap 50px 0 0 15px"); pnlMain.add(pnlInfo, "gap 20px 0 0 15px"); diff --git a/forge-gui/res/cardsfolder/l/lathiel_the_bounteous_dawn.txt b/forge-gui/res/cardsfolder/l/lathiel_the_bounteous_dawn.txt index 8c5349649ca..3f5fd792ac2 100755 --- a/forge-gui/res/cardsfolder/l/lathiel_the_bounteous_dawn.txt +++ b/forge-gui/res/cardsfolder/l/lathiel_the_bounteous_dawn.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Unicorn PT:2/2 K:Lifelink T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each end step, if you gained life this turn, distribute up to that many +1/+1 counters among any number of other target creatures. -SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other | TgtPrompt$ Select any number of other target creatures to distribute counters to | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ X | DividedAsYouChoose$ X +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other | TgtPrompt$ Select any number of other target creatures to distribute counters to | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ X | DividedAsYouChoose$ X | DividedUpTo$ True SVar:X:Count$LifeYouGainedThisTurn DeckHints:Ability$LifeGain DeckHas:Ability$Counters & Ability$LifeGain diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputSelectTargets.java index 8ab0d742dae..0453e296a91 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputSelectTargets.java @@ -98,15 +98,15 @@ public final class InputSelectTargets extends InputSyncronizedBase { sb.append(sa.getHostCard()).append(" - ").append(tgt.getVTSelection()); } if (!targetDepth.entrySet().isEmpty()) { - sb.append("\nTargeted: "); + sb.append("\nTargeted: "); } for (final Entry o : targetDepth.entrySet()) { //if it's not in gdx port landscape mode, append the linebreak - if(!ForgeConstants.isGdxPortLandscape) + if (!ForgeConstants.isGdxPortLandscape) sb.append("\n"); sb.append(o.getKey()); //if it's in gdx port landscape mode, instead append the comma with space... - if(ForgeConstants.isGdxPortLandscape) + if (ForgeConstants.isGdxPortLandscape) sb.append(", "); if (o.getValue() > 1) { sb.append(TextUtil.concatNoSpace(" (", String.valueOf(o.getValue()), " times)")); @@ -128,7 +128,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { "(Targeting ERROR)", ""); showMessage(message, sa.getView()); - if ((divisionValues != null && !divisionValues.isEmpty()) && sa.getMinTargets() == 0 && sa.getTargets().size() == 0) { + if (divisionValues != null && !divisionValues.isEmpty() && sa.getMinTargets() == 0 && sa.getTargets().size() == 0) { // extra logic for Divided with min targets = 0, should only work if num targets are 0 too getController().getGui().updateButtons(getOwner(), true, true, false); } else if (!sa.isMinTargetChosen() || (divisionValues != null && !divisionValues.isEmpty())){ @@ -279,7 +279,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { return false; } - if ((divisionValues != null && !divisionValues.isEmpty())) { + if (divisionValues != null && !divisionValues.isEmpty()) { Boolean val = onDividedAsYouChoose(card); if (val != null) { return val; @@ -321,7 +321,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { return; } - if ((divisionValues != null && !divisionValues.isEmpty())) { + if (divisionValues != null && !divisionValues.isEmpty()) { Boolean val = onDividedAsYouChoose(player); if (val != null) { return; diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 652ecb0547c..7a7e894c172 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1972,16 +1972,24 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont boolean result = select.chooseTargets(null, null, null, false, canFilterMustTarget); + final List targets = currentAbility.getTargets().getTargetEntities(); + int amount = currentAbility.getStillToDivide(); + // assign divided as you choose values - if (result && currentAbility.isDividedAsYouChoose() && currentAbility.getStillToDivide() > 0) { - int amount = currentAbility.getStillToDivide(); - final List targets = currentAbility.getTargets().getTargetEntities(); + if (result && targets.size() > 0 && amount > 0) { + if (currentAbility.hasParam("DividedUpTo")) { + amount = chooseNumber(currentAbility, localizer.getMessage("lblHowMany"), targets.size(), amount); + } if (targets.size() == 1) { currentAbility.addDividedAllocation(targets.get(0), amount); } else if (targets.size() == amount) { for (GameEntity e : targets) { currentAbility.addDividedAllocation(e, 1); } + } else if (amount == 0) { + for (GameEntity e : targets) { + currentAbility.addDividedAllocation(e, 0); + } } else if (targets.size() > amount) { return false; } else {