ComputerUtilCombat: add better look for ReplacementDamage

This commit is contained in:
Hanmac
2017-05-15 05:10:48 +00:00
parent 8c7ec20556
commit e277be4191

View File

@@ -17,8 +17,13 @@
*/ */
package forge.ai; package forge.ai;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.CardTraitBase; import forge.game.CardTraitBase;
import forge.game.Game; import forge.game.Game;
@@ -40,6 +45,7 @@ import forge.game.cost.CostPayment;
import forge.game.phase.Untap; import forge.game.phase.Untap;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementLayer;
import forge.game.spellability.AbilityActivated; import forge.game.spellability.AbilityActivated;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.staticability.StaticAbility; import forge.game.staticability.StaticAbility;
@@ -49,11 +55,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.collect.FCollection; import forge.util.collect.FCollection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
@@ -189,10 +190,8 @@ public class ComputerUtilCombat {
} }
if (!attacked.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { if (!attacked.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) {
if (attacker.hasKeyword("Prevent all damage that would be dealt by CARDNAME.") // ask ReplacementDamage directly
|| attacker.hasKeyword("Prevent all damage that would be dealt to and by CARDNAME.") if (ComputerUtilCombat.isCombatDamagePrevented(attacker, attacked, damage)) {
|| attacker.hasKeyword("Prevent all combat damage that would be dealt by CARDNAME.")
|| attacker.hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) {
return 0; return 0;
} }
} }
@@ -288,7 +287,7 @@ public class ComputerUtilCombat {
int damage = 0; int damage = 0;
final List<Card> attackers = combat.getAttackersOf(ai); final List<Card> attackers = combat.getAttackersOf(ai);
final List<Card> unblocked = new ArrayList<Card>(); final List<Card> unblocked = Lists.newArrayList();
for (final Card attacker : attackers) { for (final Card attacker : attackers) {
@@ -330,7 +329,7 @@ public class ComputerUtilCombat {
int poison = 0; int poison = 0;
final List<Card> attackers = combat.getAttackersOf(ai); final List<Card> attackers = combat.getAttackersOf(ai);
final List<Card> unblocked = new ArrayList<Card>(); final List<Card> unblocked = Lists.newArrayList();
for (final Card attacker : attackers) { for (final Card attacker : attackers) {
@@ -357,7 +356,7 @@ public class ComputerUtilCombat {
} }
public static List<Card> getLifeThreateningCommanders(final Player ai, final Combat combat) { public static List<Card> getLifeThreateningCommanders(final Player ai, final Combat combat) {
List<Card> res = new ArrayList<Card>(); List<Card> res = Lists.newArrayList();
for (Card c : combat.getAttackers()) { for (Card c : combat.getAttackers()) {
if (c.isCommander()) { if (c.isCommander()) {
int currentCommanderDamage = ai.getCommanderDamage(c); int currentCommanderDamage = ai.getCommanderDamage(c);
@@ -1267,7 +1266,7 @@ public class ComputerUtilCombat {
} }
} }
List<Card> list = new ArrayList<Card>(); List<Card> list = Lists.newArrayList();
if (!abilityParams.containsKey("ValidCards")) { if (!abilityParams.containsKey("ValidCards")) {
list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null); list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null);
} }
@@ -1479,7 +1478,7 @@ public class ComputerUtilCombat {
} }
} }
List<Card> list = new ArrayList<Card>(); List<Card> list = Lists.newArrayList();
if (!abilityParams.containsKey("ValidCards")) { if (!abilityParams.containsKey("ValidCards")) {
list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null); list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null);
} }
@@ -2034,7 +2033,7 @@ public class ComputerUtilCombat {
*/ */
public static Map<Card, Integer> distributeAIDamage(final Card attacker, final CardCollectionView block, int dmgCanDeal, GameEntity defender, boolean overrideOrder) { public static Map<Card, Integer> distributeAIDamage(final Card attacker, final CardCollectionView block, int dmgCanDeal, GameEntity defender, boolean overrideOrder) {
// TODO: Distribute defensive Damage (AI controls how damage is dealt to own cards) for Banding and Defensive Formation // TODO: Distribute defensive Damage (AI controls how damage is dealt to own cards) for Banding and Defensive Formation
Map<Card, Integer> damageMap = new HashMap<Card, Integer>(); Map<Card, Integer> damageMap = Maps.newHashMap();
boolean isAttacking = defender != null; boolean isAttacking = defender != null;
@@ -2317,10 +2316,7 @@ public class ComputerUtilCombat {
} }
if (!withoutAbilities) { if (!withoutAbilities) {
List<String> keywords = new ArrayList<String>(); return canGainKeyword(combatant, Lists.newArrayList("Double Strike", "First Strike"), combat);
keywords.add("Double Strike");
keywords.add("First Strike");
return canGainKeyword(combatant, keywords, combat);
} }
return false; return false;
@@ -2339,9 +2335,7 @@ public class ComputerUtilCombat {
return true; return true;
} }
if (!withoutAbilities) { if (!withoutAbilities) {
List<String> keywords = new ArrayList<String>(); return canGainKeyword(combatant, Lists.newArrayList(keyword), combat);
keywords.add(keyword);
return canGainKeyword(combatant, keywords, combat);
} else { } else {
return false; return false;
} }
@@ -2406,6 +2400,25 @@ public class ComputerUtilCombat {
} }
return original; return original;
} }
private final static boolean isCombatDamagePrevented(final Card attacker, final GameEntity target, final int damage) {
final Game game = attacker.getGame();
// first try to replace the damage
final Map<String, Object> repParams = Maps.newHashMap();
repParams.put("Event", "DamageDone");
repParams.put("Affected", target);
repParams.put("DamageSource", attacker);
repParams.put("DamageAmount", damage);
repParams.put("IsCombat", true);
repParams.put("Prevention", true);
// repParams.put("PreventMap", preventMap);
List<ReplacementEffect> list = game.getReplacementHandler().getReplacementList(repParams,
ReplacementLayer.None);
return !list.isEmpty();
}
} }