- 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/razing_snidd.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_hippogriff.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));
return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier;
}
*/
*/
List<Card> list = new ArrayList<Card>();
if (calcX[0].startsWith("Sacrificed")) {
@@ -610,7 +610,7 @@ public class AbilityUtils {
source = null;
ArrayList<Card> tgts = sa.findTargetedCards();
if (!tgts.isEmpty()) {
source = tgts.get(0);
source = tgts.get(0);
}
if (source == null) {
return new ArrayList<Card>();
@@ -646,7 +646,7 @@ public class AbilityUtils {
valid = valid.replace("X", Integer.toString(calculateAmount(source, "X", sa)));
}
return CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), source);
}
}
/**
* <p>
@@ -1050,8 +1050,9 @@ public class AbilityUtils {
@Override
public void execute() {
if ( isSwitched && execSubsWhenNotPaid || execSubsWhenPaid)
if (isSwitched && execSubsWhenNotPaid || execSubsWhenPaid) {
resolveSubAbilities(sa, usedStack, game);
}
}
};
@@ -1061,8 +1062,9 @@ public class AbilityUtils {
@Override
public void execute() {
sa.resolve();
if ( isSwitched && execSubsWhenPaid || execSubsWhenNotPaid)
if (isSwitched && execSubsWhenPaid || execSubsWhenNotPaid) {
resolveSubAbilities(sa, usedStack, game);
}
}
};
@@ -1083,10 +1085,10 @@ public class AbilityUtils {
boolean paid = false;
for (Player payer : payers) {
if (payer.isComputer()) {
if ( AbilityUtils.willAIPayForAbility(sa, payer, ability, paid, payers) ) {
if (AbilityUtils.willAIPayForAbility(sa, payer, ability, paid, payers)) {
ability.setActivatingPlayer(payer);
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;
}
}
@@ -1117,8 +1119,6 @@ public class AbilityUtils {
*
* @param sa
* a SpellAbility object.
* @param af
* a {@link forge.card.ability.AbilityFactory} object.
*/
public static void handleRemembering(final SpellAbility sa) {
Card host = sa.getSourceCard();
@@ -1140,14 +1140,19 @@ public class AbilityUtils {
}
} else if (sa.getParam("Cost").contains("Sac")) {
final List<Card> paidListSacrificed = sa.getPaidList("Sacrificed");
for (final Card SacrificedAsCost : paidListSacrificed) {
host.addRemembered(SacrificedAsCost);
for (final Card sacrificedAsCost : paidListSacrificed) {
host.addRemembered(sacrificedAsCost);
}
} else if (sa.getParam("Cost").contains("tapXType")) {
final List<Card> paidListTapped = sa.getPaidList("Tapped");
for (final Card tappedAsCost : paidListTapped) {
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 isMine = sa.getActivatingPlayer().equals(payer);
if (payNever) return false;
if (payForOwnOnly && !isMine) return false;
if (payNever) { return false; }
if (payForOwnOnly && !isMine) { return false; }
// AI will only pay when it's not already payed and only opponents abilities
if (paid || (payers.size() > 1 && (isMine && !payForOwnOnly))) {
return false;
}
if (ComputerUtilCost.canPayCost(ability, payer)
&& ComputerUtilCost.checkLifeCost(payer, ability.getPayCosts(), source, 4, sa)
&& ComputerUtilCost.checkDamageCost(payer, ability.getPayCosts(), source, 4)
&& ComputerUtilCost.checkDiscardCost(payer, ability.getPayCosts(), source)
&& (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2)
&& (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1)) {
&& ComputerUtilCost.checkLifeCost(payer, ability.getPayCosts(), source, 4, sa)
&& ComputerUtilCost.checkDamageCost(payer, ability.getPayCosts(), source, 4)
&& ComputerUtilCost.checkDiscardCost(payer, ability.getPayCosts(), source)
&& (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2)
&& (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1)) {
// 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
return true;

View File

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