From d3a24a93cef3135cff0dbd8e0ec78e4dad60a786 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 8 Oct 2021 09:42:29 +0200 Subject: [PATCH 1/2] Improve mandatory targeting with stuff like Fury, so AI less masochistic --- .../java/forge/ai/ability/DamageDealAi.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 06d6144eaaa..fcaf46a2528 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -344,7 +344,7 @@ public class DamageDealAi extends DamageAiBase { final Player activator = sa.getActivatingPlayer(); final Card source = sa.getHostCard(); final Game game = source.getGame(); - List hPlay = getTargetableCards(mandatory ? pl : ai, sa, pl, tgt, activator, source, game); + List hPlay = getTargetableCards(ai, sa, pl, tgt, activator, source, game); // Filter MustTarget requirements StaticAbilityMustTarget.filterMustTargetCards(ai, hPlay, sa); @@ -381,15 +381,20 @@ public class DamageDealAi extends DamageAiBase { return null; } + // try unfiltered now + hPlay = getTargetableCards(pl, sa, pl, tgt, activator, source, game); + List controlledByOpps = CardLists.filterControlledBy(hPlay, ai.getOpponents()); + if (!hPlay.isEmpty()) { if (pl.isOpponentOf(ai) && activator.equals(ai)) { if (sa.getTargetRestrictions().canTgtPlaneswalker()) { - targetCard = ComputerUtilCard.getBestPlaneswalkerAI(hPlay); + targetCard = ComputerUtilCard.getBestPlaneswalkerAI(controlledByOpps); } if (targetCard == null) { - targetCard = ComputerUtilCard.getBestCreatureAI(hPlay); + targetCard = ComputerUtilCard.getBestCreatureAI(controlledByOpps); } - } else { + } + if (targetCard == null) { targetCard = ComputerUtilCard.getWorstCreatureAI(hPlay); } @@ -714,7 +719,6 @@ public class DamageDealAi extends DamageAiBase { break; } } - } else if (tgt.canTgtCreature() || tgt.canTgtPlaneswalker()) { final Card c = dealDamageChooseTgtC(ai, sa, dmg, noPrevention, enemy, mandatory); if (c != null) { @@ -726,7 +730,13 @@ public class DamageDealAi extends DamageAiBase { } tcs.add(c); if (divided) { - final int assignedDamage = ComputerUtilCombat.getEnoughDamageToKill(c, dmg, source, false, noPrevention); + // if only other legal targets hurt own stuff just dump all dmg into this + final Card nextTarget = dealDamageChooseTgtC(ai, sa, dmg, noPrevention, enemy, mandatory); + boolean dump = false; + if (nextTarget != null && nextTarget.getController().equals(ai)) { + dump = true; + } + final int assignedDamage = dump ? dmg : ComputerUtilCombat.getEnoughDamageToKill(c, dmg, source, false, noPrevention); if (assignedDamage <= dmg) { sa.addDividedAllocation(c, assignedDamage); } else { From 5b99cea173ec543b01c73e50f535dbd03c6b2420 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Fri, 8 Oct 2021 11:21:25 +0200 Subject: [PATCH 2/2] Clean up --- forge-game/src/main/java/forge/game/card/Card.java | 6 +++--- forge-game/src/main/java/forge/game/card/CardView.java | 8 +++----- forge-game/src/main/java/forge/game/player/Player.java | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 15a5668717d..92774c17086 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2539,7 +2539,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.equals("Split second")) { sbBefore.append(keyword).append(" (").append(inst.getReminderText()).append(")"); sbBefore.append("\r\n"); - } else if(keyword.equals("Conspire") || keyword.equals("Epic") + } else if (keyword.equals("Conspire") || keyword.equals("Epic") || keyword.equals("Suspend") || keyword.equals("Jump-start") || keyword.equals("Fuse")) { sbAfter.append(keyword).append(" (").append(inst.getReminderText()).append(")"); @@ -5906,9 +5906,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { if (sa.isSpell()) { // TODO replace with Static Ability - for(KeywordInterface inst : source.getKeywords()) { + for (KeywordInterface inst : source.getKeywords()) { String kw = inst.getOriginal(); - if(!kw.startsWith("SpellCantTarget")) { + if (!kw.startsWith("SpellCantTarget")) { continue; } final String[] k = kw.split(":"); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index fd05135334f..2fc4104c5e7 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -259,8 +259,7 @@ public class CardView extends GameEntityView { //store alternate type for oathbreaker or signature spell for display in card text if (c.getPaperCard().getRules().canBeSignatureSpell()) { set(TrackableProperty.CommanderAltType, "Signature Spell"); - } - else { + } else { set(TrackableProperty.CommanderAltType, "Oathbreaker"); } } else { @@ -768,7 +767,7 @@ public class CardView extends GameEntityView { Set cantHaveKeyword = this.getCantHaveKeyword(); if (cantHaveKeyword != null && !cantHaveKeyword.isEmpty()) { sb.append("\r\n\r\n"); - for(String k : cantHaveKeyword) { + for (String k : cantHaveKeyword) { sb.append("CARDNAME can't have or gain ".replaceAll("CARDNAME", getName())); sb.append(k); sb.append("."); @@ -945,8 +944,7 @@ public class CardView extends GameEntityView { if (alternateState == null) { set(TrackableProperty.AlternateState, null); - } - else { + } else { CardStateView alternateStateView = alternateState.getView(); if (getAlternateState() != alternateStateView) { set(TrackableProperty.AlternateState, alternateStateView); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 59c266db866..87854f290b5 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2890,7 +2890,7 @@ public class Player extends GameEntity implements Comparable { // Vanguard if (registeredPlayer.getVanguardAvatars() != null) { - for(PaperCard avatar:registeredPlayer.getVanguardAvatars()) { + for (PaperCard avatar:registeredPlayer.getVanguardAvatars()) { com.add(Card.fromPaperCard(avatar, this)); } }