Merge branch 'master' into 'master'

Basic AI logic for Sigrid, God Favored.

See merge request core-developers/forge!3561
This commit is contained in:
Michael Kamensky
2021-01-06 10:24:58 +00:00
2 changed files with 53 additions and 3 deletions

View File

@@ -1445,10 +1445,14 @@ public class ChangeZoneAi extends SpellAbilityAi {
* @return a boolean. * @return a boolean.
*/ */
private static boolean knownOriginTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) { private static boolean knownOriginTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
if ("DeathgorgeScavenger".equals(sa.getParam("AILogic"))) { final String logic = sa.getParamOrDefault("AILogic", "");
if ("DeathgorgeScavenger".equals(logic)) {
return SpecialCardAi.DeathgorgeScavenger.consider(ai, sa); return SpecialCardAi.DeathgorgeScavenger.consider(ai, sa);
} else if ("ExtraplanarLens".equals(sa.getParam("AILogic"))) { } else if ("ExtraplanarLens".equals(logic)) {
return SpecialCardAi.ExtraplanarLens.consider(ai, sa); return SpecialCardAi.ExtraplanarLens.consider(ai, sa);
} else if ("ExileCombatThreat".equals(logic)) {
return doExileCombatThreatLogic(ai, sa);
} }
if (sa.getTargetRestrictions() == null) { if (sa.getTargetRestrictions() == null) {
@@ -1821,6 +1825,51 @@ public class ChangeZoneAi extends SpellAbilityAi {
return true; return true;
} }
public static boolean doExileCombatThreatLogic(final Player aiPlayer, final SpellAbility sa) {
final Combat combat = aiPlayer.getGame().getCombat();
if (combat == null) {
return false;
}
Card choice = null;
int highestEval = -1;
if (combat.getAttackingPlayer().isOpponentOf(aiPlayer)) {
for (Card attacker : combat.getAttackers()) {
if (sa.canTarget(attacker) && attacker.canBeTargetedBy(sa)) {
int eval = ComputerUtilCard.evaluateCreature(attacker);
if (combat.isUnblocked(attacker)) {
eval += 100; // TODO: make this smarter
}
if (eval > highestEval) {
highestEval = eval;
choice = attacker;
}
}
}
} else {
// either the current AI player or one of its teammates is attacking, the opponent(s) are blocking
for (Card blocker : combat.getAllBlockers()) {
if (sa.canTarget(blocker) && blocker.canBeTargetedBy(sa)) {
if (blocker.getController().isOpponentOf(aiPlayer)) { // TODO: unnecessary sanity check?
int eval = ComputerUtilCard.evaluateCreature(blocker);
if (eval > highestEval) {
highestEval = eval;
choice = blocker;
}
}
}
}
}
if (choice != null) {
sa.getTargets().add(choice);
return true;
} else {
return false;
}
}
private static CardCollection getSafeTargetsIfUnlessCostPaid(Player ai, SpellAbility sa, Iterable<Card> potentialTgts) { private static CardCollection getSafeTargetsIfUnlessCostPaid(Player ai, SpellAbility sa, Iterable<Card> potentialTgts) {
// Determines if the controller of each potential target can negate the ChangeZone effect // Determines if the controller of each potential target can negate the ChangeZone effect
// by paying the Unless cost. Returns the list of targets that can be saved that way. // by paying the Unless cost. Returns the list of targets that can be saved that way.

View File

@@ -6,9 +6,10 @@ K:Flash
K:First Strike K:First Strike
K:Protection:Creature.God:Protection from God creatures K:Protection:Creature.God:Protection from God creatures
T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, exile up to one target attacking or blocking creature until NICKNAME leaves the battlefield. T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, exile up to one target attacking or blocking creature until NICKNAME leaves the battlefield.
SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.attacking,Creature.blocking | AITgts$ Creature.OppCtrl+attacking,Creature.OppCtrl+blocking | TgtPrompt$ Select target attacking or blocking creature | TargetMin$ 0 | TargetMax$ 1 | ConditionPresent$ Card.Self | SubAbility$ DBEffect SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.attacking,Creature.blocking | AITgts$ Creature.OppCtrl+attacking,Creature.OppCtrl+blocking | TgtPrompt$ Select target attacking or blocking creature | TargetMin$ 0 | TargetMax$ 1 | ConditionPresent$ Card.Self | AILogic$ ExileCombatThreat | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Targeted | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Targeted | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile
SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ Target creature is exiled until EFFECTSOURCE leaves the battlefield. SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ Target creature is exiled until EFFECTSOURCE leaves the battlefield.
SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf
SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self
SVar:AmbushAI:True
Oracle:Flash\nFirst strike, protection from God creatures\nWhen Sigrid, God-Favored enters the battlefield, exile up to one target attacking or blocking creature until Sigrid leaves the battlefield. Oracle:Flash\nFirst strike, protection from God creatures\nWhen Sigrid, God-Favored enters the battlefield, exile up to one target attacking or blocking creature until Sigrid leaves the battlefield.