From 8ebbeef8f4722d80f03196f4797a2ec5e466733c Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 23 Sep 2023 20:16:55 +0400 Subject: [PATCH] Choose triggers order dialog - fixed game error on remember of multiple instances of the trigger (fixes #11194) --- .../src/mage/player/human/HumanPlayer.java | 24 +++++++++---------- .../src/mage/cards/b/BasilicaScreecher.java | 2 +- .../src/mage/cards/s/SyndicateEnforcer.java | 2 +- .../main/java/mage/players/net/UserData.java | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 1254cdaa50c9..2a5c90aaeaef 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -1317,7 +1317,7 @@ public TriggeredAbility chooseTriggeredAbility(java.util.List while (canRespond()) { // try to set trigger auto order java.util.List abilitiesWithNoOrderSet = new ArrayList<>(); - TriggeredAbility abilityOrderLast = null; + java.util.List abilitiesOrderLast = new ArrayList<>(); for (TriggeredAbility ability : abilities) { if (triggerAutoOrderAbilityFirst.contains(ability.getOriginalId())) { return ability; @@ -1328,20 +1328,20 @@ public TriggeredAbility chooseTriggeredAbility(java.util.List return ability; } if (triggerAutoOrderAbilityLast.contains(ability.getOriginalId())) { - abilityOrderLast = ability; + // multiple instances of same trigger has same originalId, no need to select order for it + abilitiesOrderLast.add(ability); continue; } if (triggerAutoOrderNameLast.contains(rule)) { - if (abilityOrderLast != null) { - throw new IllegalArgumentException("Wrong code usage. Only one last ability allows by name"); - } - abilityOrderLast = ability; + abilitiesOrderLast.add(ability); continue; } if (autoOrderUse) { + // multiple triggers with same rule text will be auto-ordered if (autoOrderRuleText == null) { autoOrderRuleText = rule; } else if (!rule.equals(autoOrderRuleText)) { + // diff triggers, so must use choose dialog autoOrderUse = false; } } @@ -1349,7 +1349,8 @@ public TriggeredAbility chooseTriggeredAbility(java.util.List } if (abilitiesWithNoOrderSet.isEmpty()) { - return abilityOrderLast; + // user can send diff abilities to the last, will be selected by "first" like first ordered ability above + return abilitiesOrderLast.stream().findFirst().orElse(null); } if (abilitiesWithNoOrderSet.size() == 1 @@ -1359,13 +1360,12 @@ public TriggeredAbility chooseTriggeredAbility(java.util.List // runtime check: lost triggers for GUI List processingAbilities = new ArrayList<>(abilitiesWithNoOrderSet); - if (abilityOrderLast != null) { - processingAbilities.add(abilityOrderLast); - } + processingAbilities.addAll(abilitiesOrderLast); + if (abilities.size() != processingAbilities.size()) { throw new IllegalStateException(String.format("Choose dialog lost some of the triggered abilities:\n" - + "Must %d:\n%s\n" - + "Has %d:\n%s", + + "Must %d:\n%s\n" + + "Has %d:\n%s", abilities.size(), abilities.stream().map(Ability::getRule).collect(Collectors.joining("\n")), processingAbilities.size(), diff --git a/Mage.Sets/src/mage/cards/b/BasilicaScreecher.java b/Mage.Sets/src/mage/cards/b/BasilicaScreecher.java index 848ed8ebe126..a536e58d977a 100644 --- a/Mage.Sets/src/mage/cards/b/BasilicaScreecher.java +++ b/Mage.Sets/src/mage/cards/b/BasilicaScreecher.java @@ -26,7 +26,7 @@ public BasilicaScreecher(UUID ownerId, CardSetInfo setInfo) { // Flying this.addAbility(FlyingAbility.getInstance()); - // Extort (Whenever you cast a spell, you pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) + // Extort (Whenever you cast a spell, you may pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) this.addAbility(new ExtortAbility()); } diff --git a/Mage.Sets/src/mage/cards/s/SyndicateEnforcer.java b/Mage.Sets/src/mage/cards/s/SyndicateEnforcer.java index 8b6b1575054f..16c0979f8cbf 100644 --- a/Mage.Sets/src/mage/cards/s/SyndicateEnforcer.java +++ b/Mage.Sets/src/mage/cards/s/SyndicateEnforcer.java @@ -23,7 +23,7 @@ public SyndicateEnforcer(UUID ownerId, CardSetInfo setInfo) { this.power = new MageInt(3); this.toughness = new MageInt(2); - // Extort (Whenever you cast a spell, you pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) + // Extort (Whenever you cast a spell, you may pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) this.addAbility(new ExtortAbility()); } diff --git a/Mage/src/main/java/mage/players/net/UserData.java b/Mage/src/main/java/mage/players/net/UserData.java index 679840526d4f..1b99b4d2c593 100644 --- a/Mage/src/main/java/mage/players/net/UserData.java +++ b/Mage/src/main/java/mage/players/net/UserData.java @@ -22,7 +22,7 @@ public class UserData implements Serializable { protected boolean manaPoolAutomaticRestricted; protected boolean passPriorityCast; protected boolean passPriorityActivation; - protected boolean autoOrderTrigger; + protected boolean autoOrderTrigger; // auto-order triggers with same rule text protected int autoTargetLevel; protected boolean useSameSettingsForReplacementEffects; protected boolean useFirstManaAbility = false;