mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
- The AI will no longer kill itself with Ankh of Mishra and similar cards.
This commit is contained in:
@@ -781,6 +781,9 @@ public class AiController {
|
|||||||
|
|
||||||
while(landsWannaPlay != null && !landsWannaPlay.isEmpty() && player.canPlayLand(null)) {
|
while(landsWannaPlay != null && !landsWannaPlay.isEmpty() && player.canPlayLand(null)) {
|
||||||
Card land = chooseBestLandToPlay(landsWannaPlay);
|
Card land = chooseBestLandToPlay(landsWannaPlay);
|
||||||
|
if (ComputerUtil.damageFromETB(player, land) >= player.getLife()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
landsWannaPlay.remove(land);
|
landsWannaPlay.remove(land);
|
||||||
player.playLand(land, false);
|
player.playLand(land, false);
|
||||||
game.getPhaseHandler().setPriority(player);
|
game.getPhaseHandler().setPriority(player);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
@@ -38,6 +39,7 @@ import forge.CardUtil;
|
|||||||
import forge.ITargetable;
|
import forge.ITargetable;
|
||||||
import forge.card.CardType;
|
import forge.card.CardType;
|
||||||
import forge.card.MagicColor;
|
import forge.card.MagicColor;
|
||||||
|
import forge.card.ability.AbilityFactory;
|
||||||
import forge.card.ability.AbilityUtils;
|
import forge.card.ability.AbilityUtils;
|
||||||
import forge.card.ability.ApiType;
|
import forge.card.ability.ApiType;
|
||||||
import forge.card.ability.effects.CharmEffect;
|
import forge.card.ability.effects.CharmEffect;
|
||||||
@@ -51,6 +53,8 @@ import forge.card.spellability.SpellAbility;
|
|||||||
import forge.card.spellability.SpellAbilityStackInstance;
|
import forge.card.spellability.SpellAbilityStackInstance;
|
||||||
import forge.card.spellability.TargetRestrictions;
|
import forge.card.spellability.TargetRestrictions;
|
||||||
import forge.card.staticability.StaticAbility;
|
import forge.card.staticability.StaticAbility;
|
||||||
|
import forge.card.trigger.Trigger;
|
||||||
|
import forge.card.trigger.TriggerType;
|
||||||
import forge.error.BugReporter;
|
import forge.error.BugReporter;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.combat.Combat;
|
import forge.game.combat.Combat;
|
||||||
@@ -1711,8 +1715,60 @@ public class ComputerUtil {
|
|||||||
});
|
});
|
||||||
return safeCards;
|
return safeCards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int damageFromETB(final Player player, final Card permanent) {
|
||||||
|
int damage = 0;
|
||||||
|
final Game game = player.getGame();
|
||||||
|
final ArrayList<Trigger> theTriggers = new ArrayList<Trigger>();
|
||||||
|
|
||||||
|
for (Card card : game.getCardsIn(ZoneType.Battlefield)) {
|
||||||
|
theTriggers.addAll(card.getTriggers());
|
||||||
|
}
|
||||||
|
for (Trigger trigger : theTriggers) {
|
||||||
|
HashMap<String, String> trigParams = trigger.getMapParams();
|
||||||
|
final Card source = trigger.getHostCard();
|
||||||
|
|
||||||
|
|
||||||
|
if (!trigger.zonesCheck(game.getZoneOf(source))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!trigger.requirementsCheck(game)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TriggerType mode = trigger.getMode();
|
||||||
|
if (mode != TriggerType.ChangesZone) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!"Battlefield".equals(trigParams.get("Destination"))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (trigParams.containsKey("ValidCard")) {
|
||||||
|
if (!permanent.isValid(trigParams.get("ValidCard"), source.getController(), source)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String ability = source.getSVar(trigParams.get("Execute"));
|
||||||
|
if (ability.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Map<String, String> abilityParams = AbilityFactory.getMapParams(ability);
|
||||||
|
// Destroy triggers
|
||||||
|
if ((abilityParams.containsKey("AB") && abilityParams.get("AB").equals("DealDamage"))
|
||||||
|
|| (abilityParams.containsKey("DB") && abilityParams.get("DB").equals("DealDamage"))) {
|
||||||
|
if (!"TriggeredCardController".equals(abilityParams.get("Defined"))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!abilityParams.containsKey("NumDmg")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
damage += AbilityUtils.calculateAmount(source, abilityParams.get("NumDmg"), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return damage;
|
||||||
|
}
|
||||||
|
|
||||||
// although this should be in AI's code
|
// although this should be in AI's code
|
||||||
public static boolean isNegativeCounter(CounterType type, Card c) {
|
public static boolean isNegativeCounter(CounterType type, Card c) {
|
||||||
return type == CounterType.AGE || type == CounterType.BLAZE || type == CounterType.BRIBERY || type == CounterType.DOOM
|
return type == CounterType.AGE || type == CounterType.BLAZE || type == CounterType.BRIBERY || type == CounterType.DOOM
|
||||||
|
|||||||
Reference in New Issue
Block a user