From d5c8aa765f6b5f0b08199d39f95941f19e5a62a3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 6 Apr 2019 07:08:36 +0300 Subject: [PATCH] - A little bit more AmassAi logic: check if the token will survive, also check if the counters will actually be placed on the Army. --- .../main/java/forge/ai/ability/AmassAi.java | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java index 22d626a8ca3..33a1a97fcb9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java @@ -2,16 +2,22 @@ package forge.ai.ability; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; +import forge.game.Game; +import forge.game.ability.AbilityUtils; import forge.game.card.*; +import forge.game.card.token.TokenInfo; +import forge.game.phase.PhaseHandler; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; public class AmassAi extends SpellAbilityAi { @Override protected boolean checkApiLogic(Player ai, final SpellAbility sa) { CardCollection aiArmies = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army")); + Card host = sa.getHostCard(); if (!aiArmies.isEmpty()) { boolean canAcceptCounters = false; @@ -26,12 +32,50 @@ public class AmassAi extends SpellAbilityAi { return false; } } else { - // TODO: treat this as a Token creation logic, check in the AI will actually get a living token + final String tokenScript = "b_0_0_zombie_army"; + final int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Num", "1"), sa); + + Card result = TokenInfo.getProtoType(tokenScript, sa); + + if (result == null) { + return false; + } + + result.setController(ai, 0); + + host.getGame().getTriggerHandler().suppressMode(TriggerType.CounterAdded); + host.getGame().getTriggerHandler().suppressMode(TriggerType.CounterAddedOnce); + result.addCounter(CounterType.P1P1, amount, ai, true); + host.getGame().getTriggerHandler().clearSuppression(TriggerType.CounterAdded); + host.getGame().getTriggerHandler().clearSuppression(TriggerType.CounterAddedOnce); + + final Game game = ai.getGame(); + ComputerUtilCard.applyStaticContPT(game, result, null); + if (result.isCreature() && result.getNetToughness() < 1) { + return false; + } else { + return true; + } } return true; } + @Override + protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { + // TODO: Special check for instant speed logic? Something like Lazotep Plating. + /* + boolean isInstant = sa.getRestrictions().isInstantSpeed(); + CardCollection aiArmies = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army")); + + if (isInstant) { + + } + */ + + return true; + } + @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { return mandatory || checkApiLogic(ai, sa);