- Added Razor Boomerang

This commit is contained in:
moomarc
2013-02-20 10:00:35 +00:00
parent 670f345c16
commit cac8eab527
4 changed files with 131 additions and 111 deletions

1
.gitattributes vendored
View File

@@ -8253,6 +8253,7 @@ res/cardsfolder/r/raze.txt svneol=native#text/plain
res/cardsfolder/r/razias_purification.txt -text res/cardsfolder/r/razias_purification.txt -text
res/cardsfolder/r/razing_snidd.txt svneol=native#text/plain res/cardsfolder/r/razing_snidd.txt svneol=native#text/plain
res/cardsfolder/r/razor_barrier.txt svneol=native#text/plain res/cardsfolder/r/razor_barrier.txt svneol=native#text/plain
res/cardsfolder/r/razor_boomerang.txt -text
res/cardsfolder/r/razor_golem.txt svneol=native#text/plain res/cardsfolder/r/razor_golem.txt svneol=native#text/plain
res/cardsfolder/r/razor_hippogriff.txt svneol=native#text/plain res/cardsfolder/r/razor_hippogriff.txt svneol=native#text/plain
res/cardsfolder/r/razor_pendulum.txt svneol=native#text/plain res/cardsfolder/r/razor_pendulum.txt svneol=native#text/plain

View File

@@ -0,0 +1,12 @@
Name:Razor Boomerang
ManaCost:3
Types:Artifact Equipment
Text:no text
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ RazorDamage | AddSVar$ BoomerangCatch | Description$ Equipped creature has "{T}, Unattach CARDNAME: CARDNAME deals 1 damage to target creature or player. Return CARDNAME to its owner's hand."
SVar:RazorDamage:AB$ DealDamage | Cost$ T Unattach<OriginalHost/Razor Boomerang> | NumDmg$ 1 | DamageSource$ OriginalHost | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | RememberCostCards$ True | SubAbility$ BoomerangCatch | SpellDescription$ Razor Boomerang deals 1 damage to target creature or player. Return Razor Boomerang to its owner's hand.
SVar:BoomerangCatch:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Remembered | ForgetChanged$ True
K:Equip 2
SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_boomerang.jpg
SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/129.jpg
Oracle:Equipped creature has "{T}, Unattach Razor Boomerang: Razor Boomerang deals 1 damage to target creature or player. Return Razor Boomerang to its owner's hand."\nEquip {2}
End

View File

@@ -463,7 +463,7 @@ public class AbilityUtils {
players.addAll(AbilityFactory.getDefinedPlayers(card, "EnchantedController", ability)); players.addAll(AbilityFactory.getDefinedPlayers(card, "EnchantedController", ability));
return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier;
} }
*/ */
List<Card> list = new ArrayList<Card>(); List<Card> list = new ArrayList<Card>();
if (calcX[0].startsWith("Sacrificed")) { if (calcX[0].startsWith("Sacrificed")) {
@@ -610,7 +610,7 @@ public class AbilityUtils {
source = null; source = null;
ArrayList<Card> tgts = sa.findTargetedCards(); ArrayList<Card> tgts = sa.findTargetedCards();
if (!tgts.isEmpty()) { if (!tgts.isEmpty()) {
source = tgts.get(0); source = tgts.get(0);
} }
if (source == null) { if (source == null) {
return new ArrayList<Card>(); return new ArrayList<Card>();
@@ -646,7 +646,7 @@ public class AbilityUtils {
valid = valid.replace("X", Integer.toString(calculateAmount(source, "X", sa))); valid = valid.replace("X", Integer.toString(calculateAmount(source, "X", sa)));
} }
return CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), source); return CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), source);
} }
/** /**
* <p> * <p>
@@ -1050,8 +1050,9 @@ public class AbilityUtils {
@Override @Override
public void execute() { public void execute() {
if ( isSwitched && execSubsWhenNotPaid || execSubsWhenPaid) if (isSwitched && execSubsWhenNotPaid || execSubsWhenPaid) {
resolveSubAbilities(sa, usedStack, game); resolveSubAbilities(sa, usedStack, game);
}
} }
}; };
@@ -1061,8 +1062,9 @@ public class AbilityUtils {
@Override @Override
public void execute() { public void execute() {
sa.resolve(); sa.resolve();
if ( isSwitched && execSubsWhenPaid || execSubsWhenNotPaid) if (isSwitched && execSubsWhenPaid || execSubsWhenNotPaid) {
resolveSubAbilities(sa, usedStack, game); resolveSubAbilities(sa, usedStack, game);
}
} }
}; };
@@ -1083,10 +1085,10 @@ public class AbilityUtils {
boolean paid = false; boolean paid = false;
for (Player payer : payers) { for (Player payer : payers) {
if (payer.isComputer()) { if (payer.isComputer()) {
if ( AbilityUtils.willAIPayForAbility(sa, payer, ability, paid, payers) ) { if (AbilityUtils.willAIPayForAbility(sa, payer, ability, paid, payers)) {
ability.setActivatingPlayer(payer); ability.setActivatingPlayer(payer);
ability.setTarget(sa.getTarget()); ability.setTarget(sa.getTarget());
ComputerUtil.playNoStack((AIPlayer)payer, ability, game); // Unless cost was payed - no resolve ComputerUtil.playNoStack((AIPlayer) payer, ability, game); // Unless cost was payed - no resolve
paid = true; paid = true;
} }
} }
@@ -1117,8 +1119,6 @@ public class AbilityUtils {
* *
* @param sa * @param sa
* a SpellAbility object. * a SpellAbility object.
* @param af
* a {@link forge.card.ability.AbilityFactory} object.
*/ */
public static void handleRemembering(final SpellAbility sa) { public static void handleRemembering(final SpellAbility sa) {
Card host = sa.getSourceCard(); Card host = sa.getSourceCard();
@@ -1140,14 +1140,19 @@ public class AbilityUtils {
} }
} else if (sa.getParam("Cost").contains("Sac")) { } else if (sa.getParam("Cost").contains("Sac")) {
final List<Card> paidListSacrificed = sa.getPaidList("Sacrificed"); final List<Card> paidListSacrificed = sa.getPaidList("Sacrificed");
for (final Card SacrificedAsCost : paidListSacrificed) { for (final Card sacrificedAsCost : paidListSacrificed) {
host.addRemembered(SacrificedAsCost); host.addRemembered(sacrificedAsCost);
} }
} else if (sa.getParam("Cost").contains("tapXType")) { } else if (sa.getParam("Cost").contains("tapXType")) {
final List<Card> paidListTapped = sa.getPaidList("Tapped"); final List<Card> paidListTapped = sa.getPaidList("Tapped");
for (final Card tappedAsCost : paidListTapped) { for (final Card tappedAsCost : paidListTapped) {
host.addRemembered(tappedAsCost); host.addRemembered(tappedAsCost);
} }
} else if (sa.getParam("Cost").contains("Unattach")) {
final List<Card> paidListUnattached = sa.getPaidList("Unattached");
for (final Card unattachedAsCost : paidListUnattached) {
host.addRemembered(unattachedAsCost);
}
} }
} }
} }
@@ -1158,19 +1163,19 @@ public class AbilityUtils {
boolean payNever = "Never".equals(sa.getParam("UnlessAI")); boolean payNever = "Never".equals(sa.getParam("UnlessAI"));
boolean isMine = sa.getActivatingPlayer().equals(payer); boolean isMine = sa.getActivatingPlayer().equals(payer);
if (payNever) return false; if (payNever) { return false; }
if (payForOwnOnly && !isMine) return false; if (payForOwnOnly && !isMine) { return false; }
// AI will only pay when it's not already payed and only opponents abilities // AI will only pay when it's not already payed and only opponents abilities
if (paid || (payers.size() > 1 && (isMine && !payForOwnOnly))) { if (paid || (payers.size() > 1 && (isMine && !payForOwnOnly))) {
return false; return false;
} }
if (ComputerUtilCost.canPayCost(ability, payer) if (ComputerUtilCost.canPayCost(ability, payer)
&& ComputerUtilCost.checkLifeCost(payer, ability.getPayCosts(), source, 4, sa) && ComputerUtilCost.checkLifeCost(payer, ability.getPayCosts(), source, 4, sa)
&& ComputerUtilCost.checkDamageCost(payer, ability.getPayCosts(), source, 4) && ComputerUtilCost.checkDamageCost(payer, ability.getPayCosts(), source, 4)
&& ComputerUtilCost.checkDiscardCost(payer, ability.getPayCosts(), source) && ComputerUtilCost.checkDiscardCost(payer, ability.getPayCosts(), source)
&& (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2) && (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2)
&& (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1)) { && (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1)) {
// AI was crashing because the blank ability used to pay costs // AI was crashing because the blank ability used to pay costs
// Didn't have any of the data on the original SA to pay dependant costs // Didn't have any of the data on the original SA to pay dependant costs
return true; return true;

View File

@@ -311,10 +311,8 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
tgtCards = tgt.getTargetCards(); tgtCards = tgt.getTargetCards();
} else { } else {
tgtCards = new ArrayList<Card>(); tgtCards = new ArrayList<Card>();
for (ZoneType o : origin) { for (final Card c : AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa)) {
for (final Card c : sa.knownDetermineDefined(sa.getParam("Defined"))) { tgtCards.add(c);
tgtCards.add(c);
}
} }
} }
@@ -339,6 +337,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
} // End of change from stack } // End of change from stack
final String remember = sa.getParam("RememberChanged"); final String remember = sa.getParam("RememberChanged");
final String forget = sa.getParam("ForgetChanged");
final String imprint = sa.getParam("Imprint"); final String imprint = sa.getParam("Imprint");
if (sa.hasParam("Unimprint")) { if (sa.hasParam("Unimprint")) {
@@ -467,6 +466,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (remember != null) { if (remember != null) {
hostCard.addRemembered(movedCard); hostCard.addRemembered(movedCard);
} }
if (forget != null) {
sa.getSourceCard().getRemembered().remove(movedCard);
}
if (imprint != null) { if (imprint != null) {
hostCard.addImprinted(movedCard); hostCard.addImprinted(movedCard);
} }