mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
- More improvements in AttachAI.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user