AI: Fix counters calculation for Wildborn Preserver activation (#3119)

* - Remove legacy hacky code that's apparently not needed anymore.

* - Fix imports.

* - Restore the original code but tweak it to hopefully accomodate for Wildborn Preserver.

* - Clean up / clarify.

* Remove fake SVar

---------

Co-authored-by: tool4EvEr <tool4EvEr@192.168.0.59>
This commit is contained in:
Agetian
2023-05-16 21:42:48 +03:00
committed by GitHub
parent 5067d207a5
commit 6753ad23ad
6 changed files with 13 additions and 63 deletions

View File

@@ -1,43 +1,18 @@
package forge.ai.ability;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.AiCardMemory;
import forge.ai.AiProps;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilAbility;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCombat;
import forge.ai.ComputerUtilCost;
import forge.ai.PlayerControllerAi;
import forge.ai.SpecialAiLogic;
import forge.ai.SpecialCardAi;
import forge.ai.SpellAbilityAi;
import forge.card.CardStateName;
import forge.ai.*;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.card.*;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.Cost;
import forge.game.cost.CostPart;
import forge.game.cost.CostPutCounter;
import forge.game.cost.CostRemoveCounter;
import forge.game.cost.CostSacrifice;
import forge.game.cost.*;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -54,6 +29,10 @@ import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.MyRandom;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class CountersPutAi extends CountersAi {
/*
@@ -774,38 +753,17 @@ public class CountersPutAi extends CountersAi {
}
if (!sa.usesTargeting()) {
// No target. So must be defined
list = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
// No target. So must be defined. (Unused at the moment)
// list = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
if (amountStr.equals("X")
&& root.getXManaCostPaid() == null
&& source.getXManaCostPaid() == 0 /* SubAbility on something that already had set PayX, e.g. Endless One ETB counters */
&& source.getXManaCostPaid() == 0 // SubAbility on something that already had set PayX, e.g. Endless One ETB counters
&& amount == 0 // And counter amount wasn't set previously by something (e.g. Wildborn Preserver)
&& sa.hasSVar(amountStr) && sa.getSVar(amountStr).equals("Count$xPaid")) {
// detect if there's more than one X in the cost (Hangarback Walker, Walking Ballista, etc.)
SpellAbility testSa = sa;
int countX = 0;
int nonXGlyphs = 0;
while (testSa != null && countX == 0) {
countX = testSa.getPayCosts().getTotalMana().countX();
nonXGlyphs = testSa.getPayCosts().getTotalMana().getGlyphCount() - countX;
testSa = testSa.getSubAbility();
}
if (countX == 0) {
// try determining it from the card itself if neither SA has "X" in the cost
countX = source.getState(CardStateName.Original).getManaCost().countX();
nonXGlyphs = source.getState(CardStateName.Original).getManaCost().getGlyphCount() - countX;
}
// Spend all remaining mana to add X counters (eg. Hero of Leina Tower)
int payX = ComputerUtilCost.getMaxXValue(sa, ai, true);
// Account for the possible presence of additional glyphs in cost (e.g. Mikaeus, the Lunarch; Primordial Hydra)
payX -= nonXGlyphs;
// Account for the multiple X in cost
if (countX > 1) { payX /= countX; }
root.setXManaCostPaid(payX);
}

View File

@@ -36,17 +36,11 @@ public class ImmediateTriggerAi extends SpellAbilityAi {
return true;
}
String logic = sa.getParamOrDefault("AILogic", "");
SpellAbility trigsa = sa.getAdditionalAbility("Execute");
if (trigsa == null) {
return false;
}
if (logic.equals("MaxX")) {
sa.setXManaCostPaid(ComputerUtilCost.getMaxXValue(sa, ai, true));
}
AiController aic = ((PlayerControllerAi)ai.getController()).getAi();
trigsa.setActivatingPlayer(ai, true);