- Fixed a bug in predictToughnessBonusOfAttacker/Blocker (thanks excessum).

This commit is contained in:
Sloth
2014-03-23 14:11:55 +00:00
parent 2677323657
commit 27e07fd9dd

View File

@@ -724,34 +724,34 @@ public class ComputerUtilCombat {
* *
* @param attacker * @param attacker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @param defender * @param blocker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @return a int. * @return a int.
*/ */
public static int predictPowerBonusOfBlocker(final Card attacker, final Card defender, boolean withoutAbilities) { public static int predictPowerBonusOfBlocker(final Card attacker, final Card blocker, boolean withoutAbilities) {
int power = 0; int power = 0;
if (attacker.hasKeyword("Flanking") && !defender.hasKeyword("Flanking")) { if (attacker.hasKeyword("Flanking") && !blocker.hasKeyword("Flanking")) {
power -= attacker.getAmountOfKeyword("Flanking"); power -= attacker.getAmountOfKeyword("Flanking");
} }
// Serene Master switches power with attacker // Serene Master switches power with attacker
if (defender.getName().equals("Serene Master")) { if (blocker.getName().equals("Serene Master")) {
power += attacker.getNetAttack() - defender.getNetAttack(); power += attacker.getNetAttack() - blocker.getNetAttack();
} else if (defender.getName().equals("Shape Stealer")) { } else if (blocker.getName().equals("Shape Stealer")) {
power += attacker.getNetAttack() - defender.getNetAttack(); power += attacker.getNetAttack() - blocker.getNetAttack();
} }
// if the attacker has first strike and wither the blocker will deal // if the attacker has first strike and wither the blocker will deal
// less damage than expected // less damage than expected
if ((attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike")) if ((attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike"))
&& (attacker.hasKeyword("Wither") || attacker.hasKeyword("Infect")) && (attacker.hasKeyword("Wither") || attacker.hasKeyword("Infect"))
&& !(defender.hasKeyword("First Strike") || defender.hasKeyword("Double Strike") || defender && !(blocker.hasKeyword("First Strike") || blocker.hasKeyword("Double Strike") || blocker
.hasKeyword("CARDNAME can't have counters placed on it."))) { .hasKeyword("CARDNAME can't have counters placed on it."))) {
power -= attacker.getNetCombatDamage(); power -= attacker.getNetCombatDamage();
} }
power += defender.getKeywordMagnitude("Bushido"); power += blocker.getKeywordMagnitude("Bushido");
final Game game = attacker.getGame(); final Game game = attacker.getGame();
// look out for continuous static abilities that only care for blocking // look out for continuous static abilities that only care for blocking
@@ -767,7 +767,7 @@ public class ComputerUtilCombat {
continue; continue;
} }
final String valid = params.get("Affected").replace("blocking", "Creature"); final String valid = params.get("Affected").replace("blocking", "Creature");
if (!defender.isValid(valid, card.getController(), card)) { if (!blocker.isValid(valid, card.getController(), card)) {
continue; continue;
} }
if (params.containsKey("AddPower")) { if (params.containsKey("AddPower")) {
@@ -791,7 +791,7 @@ public class ComputerUtilCombat {
final Map<String, String> trigParams = trigger.getMapParams(); final Map<String, String> trigParams = trigger.getMapParams();
final Card source = trigger.getHostCard(); final Card source = trigger.getHostCard();
if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, defender, trigger, null) if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, blocker, trigger, null)
|| !trigParams.containsKey("Execute")) { || !trigParams.containsKey("Execute")) {
continue; continue;
} }
@@ -808,12 +808,12 @@ public class ComputerUtilCombat {
} }
final List<Card> list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null); final List<Card> list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null);
if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredBlocker")) { if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredBlocker")) {
list.add(defender); list.add(blocker);
} }
if (list.isEmpty()) { if (list.isEmpty()) {
continue; continue;
} }
if (!list.contains(defender)) { if (!list.contains(blocker)) {
continue; continue;
} }
if (!abilityParams.containsKey("NumAtt")) { if (!abilityParams.containsKey("NumAtt")) {
@@ -834,7 +834,7 @@ public class ComputerUtilCombat {
if (withoutAbilities) { if (withoutAbilities) {
return power; return power;
} }
for (SpellAbility ability : defender.getAllSpellAbilities()) { for (SpellAbility ability : blocker.getAllSpellAbilities()) {
if (!(ability instanceof AbilityActivated) || ability.getPayCosts() == null) { if (!(ability instanceof AbilityActivated) || ability.getPayCosts() == null) {
continue; continue;
} }
@@ -847,7 +847,7 @@ public class ComputerUtilCombat {
continue; continue;
} }
if (ComputerUtilCost.canPayCost(ability, defender.getController())) { if (ComputerUtilCost.canPayCost(ability, blocker.getController())) {
int pBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("NumAtt"), ability); int pBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("NumAtt"), ability);
if (pBonus > 0) { if (pBonus > 0) {
power += pBonus; power += pBonus;
@@ -858,11 +858,11 @@ public class ComputerUtilCombat {
continue; continue;
} }
if (ability.hasParam("Monstrosity") && attacker.isMonstrous()) { if (ability.hasParam("Monstrosity") && blocker.isMonstrous()) {
continue; continue;
} }
if (ComputerUtilCost.canPayCost(ability, defender.getController())) { if (ComputerUtilCost.canPayCost(ability, blocker.getController())) {
int pBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability); int pBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability);
if (pBonus > 0) { if (pBonus > 0) {
power += pBonus; power += pBonus;
@@ -883,22 +883,22 @@ public class ComputerUtilCombat {
* *
* @param attacker * @param attacker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @param defender * @param blocker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @return a int. * @return a int.
*/ */
public static int predictToughnessBonusOfBlocker(final Card attacker, final Card defender, boolean withoutAbilities) { public static int predictToughnessBonusOfBlocker(final Card attacker, final Card blocker, boolean withoutAbilities) {
int toughness = 0; int toughness = 0;
if (attacker.hasKeyword("Flanking") && !defender.hasKeyword("Flanking")) { if (attacker.hasKeyword("Flanking") && !blocker.hasKeyword("Flanking")) {
toughness -= attacker.getAmountOfKeyword("Flanking"); toughness -= attacker.getAmountOfKeyword("Flanking");
} }
if (defender.getName().equals("Shape Stealer")) { if (blocker.getName().equals("Shape Stealer")) {
toughness += attacker.getNetDefense() - defender.getNetDefense(); toughness += attacker.getNetDefense() - blocker.getNetDefense();
} }
toughness += defender.getKeywordMagnitude("Bushido"); toughness += blocker.getKeywordMagnitude("Bushido");
final Game game = attacker.getGame(); final Game game = attacker.getGame();
final ArrayList<Trigger> theTriggers = new ArrayList<Trigger>(); final ArrayList<Trigger> theTriggers = new ArrayList<Trigger>();
for (Card card : game.getCardsIn(ZoneType.Battlefield)) { for (Card card : game.getCardsIn(ZoneType.Battlefield)) {
@@ -909,7 +909,7 @@ public class ComputerUtilCombat {
final Map<String, String> trigParams = trigger.getMapParams(); final Map<String, String> trigParams = trigger.getMapParams();
final Card source = trigger.getHostCard(); final Card source = trigger.getHostCard();
if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, defender, trigger, null) if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, blocker, trigger, null)
|| !trigParams.containsKey("Execute")) { || !trigParams.containsKey("Execute")) {
continue; continue;
} }
@@ -929,7 +929,7 @@ public class ComputerUtilCombat {
// can't parse the number (X for example) // can't parse the number (X for example)
continue; continue;
} }
toughness -= predictDamageTo(defender, damage, 0, source, false); toughness -= predictDamageTo(blocker, damage, 0, source, false);
continue; continue;
} }
@@ -945,12 +945,12 @@ public class ComputerUtilCombat {
} }
final List<Card> list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null); final List<Card> list = AbilityUtils.getDefinedCards(source, abilityParams.get("Defined"), null);
if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredBlocker")) { if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredBlocker")) {
list.add(defender); list.add(blocker);
} }
if (list.isEmpty()) { if (list.isEmpty()) {
continue; continue;
} }
if (!list.contains(defender)) { if (!list.contains(blocker)) {
continue; continue;
} }
if (!abilityParams.containsKey("NumDef")) { if (!abilityParams.containsKey("NumDef")) {
@@ -971,7 +971,7 @@ public class ComputerUtilCombat {
if (withoutAbilities) { if (withoutAbilities) {
return toughness; return toughness;
} }
for (SpellAbility ability : defender.getAllSpellAbilities()) { for (SpellAbility ability : blocker.getAllSpellAbilities()) {
if (!(ability instanceof AbilityActivated) || ability.getPayCosts() == null) { if (!(ability instanceof AbilityActivated) || ability.getPayCosts() == null) {
continue; continue;
} }
@@ -980,8 +980,12 @@ public class ComputerUtilCombat {
continue; continue;
} }
if (ability.getApi() != ApiType.Pump || !ability.hasParam("NumDef")) { if (ability.getApi() == ApiType.Pump) {
if (ComputerUtilCost.canPayCost(ability, defender.getController())) { if (!ability.hasParam("NumDef")) {
continue;
}
if (ComputerUtilCost.canPayCost(ability, blocker.getController())) {
int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("NumDef"), ability); int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("NumDef"), ability);
if (tBonus > 0) { if (tBonus > 0) {
toughness += tBonus; toughness += tBonus;
@@ -992,11 +996,11 @@ public class ComputerUtilCombat {
continue; continue;
} }
if (ability.hasParam("Monstrosity") && attacker.isMonstrous()) { if (ability.hasParam("Monstrosity") && blocker.isMonstrous()) {
continue; continue;
} }
if (ComputerUtilCost.canPayCost(ability, defender.getController())) { if (ComputerUtilCost.canPayCost(ability, blocker.getController())) {
int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability); int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability);
if (tBonus > 0) { if (tBonus > 0) {
toughness += tBonus; toughness += tBonus;
@@ -1016,13 +1020,13 @@ public class ComputerUtilCombat {
* *
* @param attacker * @param attacker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @param defender * @param blocker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @param combat * @param combat
* a {@link forge.game.combat.Combat} object. * a {@link forge.game.combat.Combat} object.
* @return a int. * @return a int.
*/ */
public static int predictPowerBonusOfAttacker(final Card attacker, final Card defender, final Combat combat public static int predictPowerBonusOfAttacker(final Card attacker, final Card blocker, final Combat combat
, boolean withoutAbilities) { , boolean withoutAbilities) {
int power = 0; int power = 0;
@@ -1035,10 +1039,10 @@ public class ComputerUtilCombat {
} }
// Serene Master switches power with attacker // Serene Master switches power with attacker
if (defender!= null && defender.getName().equals("Serene Master")) { if (blocker!= null && blocker.getName().equals("Serene Master")) {
power += defender.getNetAttack() - attacker.getNetAttack(); power += blocker.getNetAttack() - attacker.getNetAttack();
} else if (defender != null && attacker.getName().equals("Shape Stealer")) { } else if (blocker != null && attacker.getName().equals("Shape Stealer")) {
power += defender.getNetAttack() - attacker.getNetAttack(); power += blocker.getNetAttack() - attacker.getNetAttack();
} }
final Game game = attacker.getGame(); final Game game = attacker.getGame();
@@ -1048,14 +1052,14 @@ public class ComputerUtilCombat {
} }
// if the defender has first strike and wither the attacker will deal // if the defender has first strike and wither the attacker will deal
// less damage than expected // less damage than expected
if (null != defender) { if (null != blocker) {
if ((defender.hasKeyword("First Strike") || defender.hasKeyword("Double Strike")) if ((blocker.hasKeyword("First Strike") || blocker.hasKeyword("Double Strike"))
&& (defender.hasKeyword("Wither") || defender.hasKeyword("Infect")) && (blocker.hasKeyword("Wither") || blocker.hasKeyword("Infect"))
&& !(attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike") || attacker && !(attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike") || attacker
.hasKeyword("CARDNAME can't have counters placed on it."))) { .hasKeyword("CARDNAME can't have counters placed on it."))) {
power -= defender.getNetCombatDamage(); power -= blocker.getNetCombatDamage();
} }
theTriggers.addAll(defender.getTriggers()); theTriggers.addAll(blocker.getTriggers());
} }
// look out for continuous static abilities that only care for attacking // look out for continuous static abilities that only care for attacking
@@ -1090,7 +1094,7 @@ public class ComputerUtilCombat {
final Map<String, String> trigParams = trigger.getMapParams(); final Map<String, String> trigParams = trigger.getMapParams();
final Card source = trigger.getHostCard(); final Card source = trigger.getHostCard();
if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, defender, trigger, combat) if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, blocker, trigger, combat)
|| !trigParams.containsKey("Execute")) { || !trigParams.containsKey("Execute")) {
continue; continue;
} }
@@ -1197,13 +1201,13 @@ public class ComputerUtilCombat {
* *
* @param attacker * @param attacker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @param defender * @param blocker
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
* @param combat * @param combat
* a {@link forge.game.combat.Combat} object. * a {@link forge.game.combat.Combat} object.
* @return a int. * @return a int.
*/ */
public static int predictToughnessBonusOfAttacker(final Card attacker, final Card defender, final Combat combat public static int predictToughnessBonusOfAttacker(final Card attacker, final Card blocker, final Combat combat
, boolean withoutAbilities) { , boolean withoutAbilities) {
int toughness = 0; int toughness = 0;
@@ -1214,8 +1218,8 @@ public class ComputerUtilCombat {
} }
} }
if (defender != null && attacker.getName().equals("Shape Stealer")) { if (blocker != null && attacker.getName().equals("Shape Stealer")) {
toughness += defender.getNetDefense() - attacker.getNetDefense(); toughness += blocker.getNetDefense() - attacker.getNetDefense();
} }
final Game game = attacker.getGame(); final Game game = attacker.getGame();
@@ -1223,9 +1227,9 @@ public class ComputerUtilCombat {
for (Card card : game.getCardsIn(ZoneType.Battlefield)) { for (Card card : game.getCardsIn(ZoneType.Battlefield)) {
theTriggers.addAll(card.getTriggers()); theTriggers.addAll(card.getTriggers());
} }
if (defender != null) { if (blocker != null) {
toughness += attacker.getKeywordMagnitude("Bushido"); toughness += attacker.getKeywordMagnitude("Bushido");
theTriggers.addAll(defender.getTriggers()); theTriggers.addAll(blocker.getTriggers());
} }
// look out for continuous static abilities that only care for attacking // look out for continuous static abilities that only care for attacking
@@ -1260,7 +1264,7 @@ public class ComputerUtilCombat {
final Map<String, String> trigParams = trigger.getMapParams(); final Map<String, String> trigParams = trigger.getMapParams();
final Card source = trigger.getHostCard(); final Card source = trigger.getHostCard();
if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, defender, trigger, combat) if (!ComputerUtilCombat.combatTriggerWillTrigger(attacker, blocker, trigger, combat)
|| !trigParams.containsKey("Execute")) { || !trigParams.containsKey("Execute")) {
continue; continue;
} }
@@ -1346,7 +1350,11 @@ public class ComputerUtilCombat {
continue; continue;
} }
if (ability.getApi() != ApiType.Pump || !ability.hasParam("NumDef")) { if (ability.getApi() == ApiType.Pump) {
if (!ability.hasParam("NumDef")) {
continue;
}
if (!ability.getPayCosts().hasTapCost() && ComputerUtilCost.canPayCost(ability, attacker.getController())) { if (!ability.getPayCosts().hasTapCost() && ComputerUtilCost.canPayCost(ability, attacker.getController())) {
int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("NumDef"), ability); int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("NumDef"), ability);
if (tBonus > 0) { if (tBonus > 0) {