PumpAiBase: updated isUsefulCurseKeyword to remove getOpponent

refactor Combat related stuff, for AI attacking, the card's controller need to be the one attacked.
This commit is contained in:
Hanmac
2016-10-07 08:23:20 +00:00
parent 09b0db74cc
commit 737fae947d

View File

@@ -55,26 +55,25 @@ public abstract class PumpAiBase extends SpellAbilityAi {
final Game game = ai.getGame(); final Game game = ai.getGame();
final Combat combat = game.getCombat(); final Combat combat = game.getCombat();
final PhaseHandler ph = game.getPhaseHandler(); final PhaseHandler ph = game.getPhaseHandler();
final Player human = ai.getOpponent();
//int attack = getNumAttack(sa); //int attack = getNumAttack(sa);
//int defense = getNumDefense(sa); //int defense = getNumDefense(sa);
if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) {
return false; return false;
} else if (keyword.equals("Defender") || keyword.endsWith("CARDNAME can't attack.")) { } else if (keyword.equals("Defender") || keyword.endsWith("CARDNAME can't attack.")) {
if (ph.isPlayerTurn(ai) || !CombatUtil.canAttack(card, human) if (!ph.isPlayerTurn(card.getController()) || !CombatUtil.canAttack(card, ai)
|| (card.getNetCombatDamage() <= 0) || (card.getNetCombatDamage() <= 0)
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
return false; return false;
} }
} else if (keyword.endsWith("CARDNAME can't attack or block.")) { } else if (keyword.endsWith("CARDNAME can't attack or block.")) {
if (sa.hasParam("UntilYourNextTurn")) { if (sa.hasParam("UntilYourNextTurn")) {
if (CombatUtil.canAttack(card, human) || CombatUtil.canBlock(card, true)) { if (CombatUtil.canAttack(card, ai) || CombatUtil.canBlock(card, true)) {
return true; return true;
} }
return false; return false;
} }
if (ph.isPlayerTurn(human)) { if (!ph.isPlayerTurn(ai)) {
if (!CombatUtil.canAttack(card, human) if (!CombatUtil.canAttack(card, ai)
|| (card.getNetCombatDamage() <= 0) || (card.getNetCombatDamage() <= 0)
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
return false; return false;
@@ -85,14 +84,14 @@ public abstract class PumpAiBase extends SpellAbilityAi {
return false; return false;
} }
List<Card> attackers = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), new Predicate<Card>() { List<Card> attackers = CardLists.filter(ai.getCreaturesInPlay(), new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
if (c.equals(sa.getHostCard()) && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost() if (c.equals(sa.getHostCard()) && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()
&& (combat == null || !combat.isAttacking(c))) { && (combat == null || !combat.isAttacking(c))) {
return false; return false;
} }
return (c.isCreature() && CombatUtil.canAttack(c, human) || (combat != null && combat.isAttacking(c))); return CombatUtil.canAttack(c, card.getController()) || (combat != null && combat.isAttacking(c));
} }
}); });
if (!CombatUtil.canBlockAtLeastOne(card, attackers)) { if (!CombatUtil.canBlockAtLeastOne(card, attackers)) {
@@ -100,32 +99,38 @@ public abstract class PumpAiBase extends SpellAbilityAi {
} }
} }
} else if (keyword.endsWith("CARDNAME can't block.")) { } else if (keyword.endsWith("CARDNAME can't block.")) {
if (ph.isPlayerTurn(human) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) if (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)
|| ph.getPhase().isBefore(PhaseType.MAIN1)) { || ph.getPhase().isBefore(PhaseType.MAIN1)) {
return false; return false;
} }
List<Card> attackers = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), new Predicate<Card>() { List<Card> attackers = CardLists.filter(ai.getCreaturesInPlay(), new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
if (c.equals(sa.getHostCard()) && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost() if (c.equals(sa.getHostCard()) && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()
&& (combat == null || !combat.isAttacking(c))) { && (combat == null || !combat.isAttacking(c))) {
return false; return false;
} }
return (c.isCreature() && CombatUtil.canAttack(c, human) || (combat != null && combat.isAttacking(c))); // the cards controller needs to be the one attacked
return CombatUtil.canAttack(c, card.getController()) || (combat != null && combat.isAttacking(c)
&& card.getController().equals(combat.getDefenderPlayerByAttacker(c)));
} }
}); });
if (!CombatUtil.canBlockAtLeastOne(card, attackers)) { if (!CombatUtil.canBlockAtLeastOne(card, attackers)) {
return false; return false;
} }
} else if (keyword.endsWith("CantBlockCardUIDSource")) { // can't block CARDNAME this turn } else if (keyword.endsWith("CantBlockCardUIDSource")) { // can't block CARDNAME this turn
if (ph.isPlayerTurn(human) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) if (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)
|| ph.getPhase().isBefore(PhaseType.MAIN1) || !CombatUtil.canBlock(sa.getHostCard(), card) || ph.getPhase().isBefore(PhaseType.MAIN1) || !CombatUtil.canBlock(sa.getHostCard(), card)) {
|| (sa.getHostCard().isTapped() && (combat == null || !combat.isAttacking(sa.getHostCard())))) { return false;
}
// target needs to be a creature, controlled by the player which is attacked
if (sa.getHostCard().isTapped() && (combat == null || !combat.isAttacking(sa.getHostCard())
|| !card.getController().equals(combat.getDefenderPlayerByAttacker(sa.getHostCard())))) {
return false; return false;
} }
} else if (keyword.endsWith("This card doesn't untap during your next untap step.")) { } else if (keyword.endsWith("This card doesn't untap during your next untap step.")) {
if (ph.getPhase().isBefore(PhaseType.MAIN2) || card.isUntapped() || ph.isPlayerTurn(human) if (ph.getPhase().isBefore(PhaseType.MAIN2) || card.isUntapped() || !ph.isPlayerTurn(ai)
|| !Untap.canUntap(card)) { || !Untap.canUntap(card)) {
return false; return false;
} }
@@ -138,12 +143,12 @@ public abstract class PumpAiBase extends SpellAbilityAi {
|| CardLists.getNotKeyword(ai.getCreaturesInPlay(), "Defender").isEmpty())) { || CardLists.getNotKeyword(ai.getCreaturesInPlay(), "Defender").isEmpty())) {
return false; return false;
} }
if (ph.isPlayerTurn(human) && (combat == null || !combat.isAttacking(card) || card.getNetCombatDamage() <= 0)) { if (!ph.isPlayerTurn(ai) && (combat == null || !combat.isAttacking(card) || card.getNetCombatDamage() <= 0)) {
return false; return false;
} }
} else if (keyword.endsWith("CARDNAME attacks each turn if able.") } else if (keyword.endsWith("CARDNAME attacks each turn if able.")
|| keyword.endsWith("CARDNAME attacks each combat if able.")) { || keyword.endsWith("CARDNAME attacks each combat if able.")) {
if (ph.isPlayerTurn(ai) || !CombatUtil.canAttack(card, human) || !CombatUtil.canBeBlocked(card, ai.getOpponent()) if (ph.isPlayerTurn(ai) || !CombatUtil.canAttack(card, ai) || !CombatUtil.canBeBlocked(card, ai)
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
return false; return false;
} }
@@ -468,7 +473,9 @@ public abstract class PumpAiBase extends SpellAbilityAi {
*/ */
protected CardCollection getCurseCreatures(final Player ai, final SpellAbility sa, final int defense, final int attack, final List<String> keywords) { protected CardCollection getCurseCreatures(final Player ai, final SpellAbility sa, final int defense, final int attack, final List<String> keywords) {
CardCollection list = new CardCollection(); CardCollection list = new CardCollection();
list.addAll(ai.getOpponent().getCardsIn(ZoneType.Battlefield)); for (final Player opp : ai.getOpponents()) {
list.addAll(opp.getCardsIn(ZoneType.Battlefield));
}
final Game game = ai.getGame(); final Game game = ai.getGame();
final Combat combat = game.getCombat(); final Combat combat = game.getCombat();
list = CardLists.getTargetableCards(list, sa); list = CardLists.getTargetableCards(list, sa);