- More improvements in AttachAI.

This commit is contained in:
Sloth
2013-03-16 10:52:10 +00:00
parent 50799c4f9d
commit 9c4c2328ec

View File

@@ -15,7 +15,6 @@ import forge.CardLists;
import forge.CardPredicates; import forge.CardPredicates;
import forge.CardUtil; import forge.CardUtil;
import forge.Singletons; import forge.Singletons;
import forge.CardPredicates.Presets;
import forge.card.ability.AbilityUtils; import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType; import forge.card.ability.ApiType;
import forge.card.ability.SpellAbilityAi; import forge.card.ability.SpellAbilityAi;
@@ -786,10 +785,11 @@ public class AttachAi extends SpellAbilityAi {
//only add useful keywords unless P/T bonus is significant //only add useful keywords unless P/T bonus is significant
if (totToughness + totPower < 4 && !keywords.isEmpty()) { if (totToughness + totPower < 4 && !keywords.isEmpty()) {
final int pow = totPower;
prefList = CardLists.filter(prefList, new Predicate<Card>() { prefList = CardLists.filter(prefList, new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
return containsUsefulKeyword(keywords, c, sa); return containsUsefulKeyword(keywords, c, sa, pow);
} }
}); });
} }
@@ -962,9 +962,9 @@ public class AttachAi extends SpellAbilityAi {
* @param sa SpellAbility * @param sa SpellAbility
* @return true, if successful * @return true, if successful
*/ */
private static boolean containsUsefulKeyword(final ArrayList<String> keywords, final Card card, final SpellAbility sa) { private static boolean containsUsefulKeyword(final ArrayList<String> keywords, final Card card, final SpellAbility sa, final int powerBonus) {
for (final String keyword : keywords) { for (final String keyword : keywords) {
if (isUsefulAttachKeyword(keyword, card, sa)) { if (isUsefulAttachKeyword(keyword, card, sa, powerBonus)) {
return true; return true;
} }
} }
@@ -1000,7 +1000,7 @@ public class AttachAi extends SpellAbilityAi {
* @param sa SpellAbility * @param sa SpellAbility
* @return true, if is useful keyword * @return true, if is useful keyword
*/ */
private static boolean isUsefulAttachKeyword(final String keyword, final Card card, final SpellAbility sa) { private static boolean isUsefulAttachKeyword(final String keyword, final Card card, final SpellAbility sa, final int powerBonus) {
final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler();
if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) {
return false; return false;
@@ -1013,14 +1013,14 @@ public class AttachAi extends SpellAbilityAi {
|| keyword.equals("CARDNAME can't be blocked by more than one creature.")); || keyword.equals("CARDNAME can't be blocked by more than one creature."));
// give evasive keywords to creatures that can attack and deal damage // give evasive keywords to creatures that can attack and deal damage
if (evasive) { if (evasive) {
if (card.getNetCombatDamage() <= 0 if (card.getNetCombatDamage() + powerBonus <= 0
|| !CombatUtil.canAttackNextTurn(card) || !CombatUtil.canAttackNextTurn(card)
|| !CombatUtil.canBeBlocked(card)) { || !CombatUtil.canBeBlocked(card)) {
return false; return false;
} }
} else if (keyword.equals("Haste")) { } else if (keyword.equals("Haste")) {
if (!card.hasSickness() || !ph.isPlayerTurn(sa.getActivatingPlayer()) || card.isTapped() if (!card.hasSickness() || !ph.isPlayerTurn(sa.getActivatingPlayer()) || card.isTapped()
|| card.getNetCombatDamage() <= 0 || card.getNetCombatDamage() + powerBonus <= 0
|| card.hasKeyword("CARDNAME can attack as though it had haste.") || card.hasKeyword("CARDNAME can attack as though it had haste.")
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)
|| !CombatUtil.canAttackNextTurn(card)) { || !CombatUtil.canAttackNextTurn(card)) {
@@ -1029,22 +1029,22 @@ public class AttachAi extends SpellAbilityAi {
} else if (keyword.endsWith("Indestructible")) { } else if (keyword.endsWith("Indestructible")) {
return true; return true;
} else if (keyword.endsWith("Deathtouch") || keyword.endsWith("Wither")) { } else if (keyword.endsWith("Deathtouch") || keyword.endsWith("Wither")) {
if (card.getNetCombatDamage() <= 0 if (card.getNetCombatDamage() + powerBonus <= 0
|| ((!CombatUtil.canBeBlocked(card) || !CombatUtil.canAttackNextTurn(card)) || ((!CombatUtil.canBeBlocked(card) || !CombatUtil.canAttackNextTurn(card))
&& !CombatUtil.canBlock(card, true))) { && !CombatUtil.canBlock(card, true))) {
return false; return false;
} }
} else if (keyword.equals("Double Strike") || keyword.equals("Lifelink")) { } else if (keyword.equals("Double Strike") || keyword.equals("Lifelink")) {
if (card.getNetCombatDamage() <= 0 if (card.getNetCombatDamage() + powerBonus <= 0
|| (!CombatUtil.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) { || (!CombatUtil.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) {
return false; return false;
} }
} else if (keyword.equals("First Strike")) { } else if (keyword.equals("First Strike")) {
if (card.getNetCombatDamage() <= 0 || card.hasKeyword("Double Strike")) { if (card.getNetCombatDamage() + powerBonus <= 0 || card.hasKeyword("Double Strike")) {
return false; return false;
} }
} else if (keyword.startsWith("Flanking")) { } else if (keyword.startsWith("Flanking")) {
if (card.getNetCombatDamage() <= 0 if (card.getNetCombatDamage() + powerBonus <= 0
|| !CombatUtil.canAttackNextTurn(card) || !CombatUtil.canAttackNextTurn(card)
|| !CombatUtil.canBeBlocked(card)) { || !CombatUtil.canBeBlocked(card)) {
return false; return false;
@@ -1055,18 +1055,18 @@ public class AttachAi extends SpellAbilityAi {
return false; return false;
} }
} else if (keyword.equals("Trample")) { } else if (keyword.equals("Trample")) {
if (card.getNetCombatDamage() <= 1 if (card.getNetCombatDamage() + powerBonus <= 1
|| !CombatUtil.canBeBlocked(card) || !CombatUtil.canBeBlocked(card)
|| !CombatUtil.canAttackNextTurn(card)) { || !CombatUtil.canAttackNextTurn(card)) {
return false; return false;
} }
} else if (keyword.equals("Infect")) { } else if (keyword.equals("Infect")) {
if (card.getNetCombatDamage() <= 0 if (card.getNetCombatDamage() + powerBonus <= 0
|| !CombatUtil.canAttackNextTurn(card)) { || !CombatUtil.canAttackNextTurn(card)) {
return false; return false;
} }
} else if (keyword.equals("Vigilance")) { } else if (keyword.equals("Vigilance")) {
if (card.getNetCombatDamage() <= 0 if (card.getNetCombatDamage() + powerBonus <= 0
|| !CombatUtil.canAttackNextTurn(card) || !CombatUtil.canAttackNextTurn(card)
|| !CombatUtil.canBlock(card, true)) { || !CombatUtil.canBlock(card, true)) {
return false; return false;