mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user