From 6dbff19b5dbe9fe2884612a60d45210aabb2fdc9 Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 07:23:17 +0000 Subject: [PATCH] - Small tweaks to tapXType cost - Added Hand of Justice --- .gitattributes | 1 + res/cardsfolder/hand_of_justice.txt | 9 ++++ src/forge/Ability_Cost.java | 39 +++++++++----- src/forge/CardFactory_Creatures.java | 2 +- src/forge/ComputerUtil.java | 33 +++++++----- src/forge/Cost_Payment.java | 79 +++++++++++++++------------- 6 files changed, 99 insertions(+), 64 deletions(-) create mode 100644 res/cardsfolder/hand_of_justice.txt diff --git a/.gitattributes b/.gitattributes index ac1e59f13d1..3600ebe972c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1579,6 +1579,7 @@ res/cardsfolder/hammerheim_deadeye.txt -text svneol=native#text/plain res/cardsfolder/hand_of_cruelty.txt -text svneol=native#text/plain res/cardsfolder/hand_of_death.txt -text svneol=native#text/plain res/cardsfolder/hand_of_honor.txt -text svneol=native#text/plain +res/cardsfolder/hand_of_justice.txt -text svneol=native#text/plain res/cardsfolder/hanna_ships_navigator.txt -text svneol=native#text/plain res/cardsfolder/hannas_custody.txt -text svneol=native#text/plain res/cardsfolder/harabaz_druid.txt -text svneol=native#text/plain diff --git a/res/cardsfolder/hand_of_justice.txt b/res/cardsfolder/hand_of_justice.txt new file mode 100644 index 00000000000..66221771c49 --- /dev/null +++ b/res/cardsfolder/hand_of_justice.txt @@ -0,0 +1,9 @@ +Name:Hand of Justice +ManaCost:5 W +Types:Creature Avatar +Text:no text +PT:2/6 +K:abDestroyTgtV T tapXType<3/Creature.White>:Creature:Destroy target creature. +K:SVar:Rarity:Rare +K:SVar:Picture:http://www.wizards.com/global/images/magic/general/hand_of_justice.jpg +End diff --git a/src/forge/Ability_Cost.java b/src/forge/Ability_Cost.java index 9efedeb4c19..af2e4501074 100644 --- a/src/forge/Ability_Cost.java +++ b/src/forge/Ability_Cost.java @@ -61,6 +61,17 @@ public class Ability_Cost { // when adding new costs for cost string, place them here name = cardName; + String tapXStr = "tapXType<"; + if (parse.contains(tapXStr)) + { + tapXTypeCost = true; + String[] splitStr = abCostParse(parse, tapXStr, 2); + parse = abUpdateParse(parse, tapXStr); + + tapXTypeAmount = Integer.parseInt(splitStr[0]); + tapXType = splitStr[1]; + } + String subStr = "SubCounter<"; if(parse.contains(subStr)) { // SubCounter @@ -104,17 +115,6 @@ public class Ability_Cost { sacAmount = Integer.parseInt(splitStr[0]); sacType = splitStr[1]; sacThis = (sacType.equals("CARDNAME")); - } - - String tapXStr = "tapXType<"; - if (parse.contains(tapXStr)) - { - tapXTypeCost = true; - String[] splitStr = abCostParse(parse, tapXStr, 2); - parse = abUpdateParse(parse, tapXStr); - - tapXTypeAmount = Integer.parseInt(splitStr[0]); - tapXType = splitStr[1]; } if (parse.contains("Untap")){ @@ -239,9 +239,22 @@ public class Ability_Cost { if (untapCost){ if (first) - cost.append("Untap"); + cost.append("Untap "); else - cost.append(", untap"); + cost.append(", untap "); + first = false; + } + + if (tapXTypeCost){ + if (first) + cost.append("Tap "); + else + cost.append(", tap "); + cost.append(tapXTypeAmount); + cost.append(" untapped "); + cost.append(tapXType); // needs IsValid String converter + if (tapXTypeAmount > 1) + cost.append("s"); first = false; } diff --git a/src/forge/CardFactory_Creatures.java b/src/forge/CardFactory_Creatures.java index b954acd7bf3..8db86e84f56 100644 --- a/src/forge/CardFactory_Creatures.java +++ b/src/forge/CardFactory_Creatures.java @@ -14901,7 +14901,7 @@ public class CardFactory_Creatures { //*************** START *********** START ************************** else if(cardName.equals("Tradewind Rider")) { - final SpellAbility a1 = new Ability(card, "0") { + final SpellAbility a1 = new Ability_Activated(card, "0") { private static final long serialVersionUID = 3438865371487994984L; @Override diff --git a/src/forge/ComputerUtil.java b/src/forge/ComputerUtil.java index db039071350..1b923c4569a 100644 --- a/src/forge/ComputerUtil.java +++ b/src/forge/ComputerUtil.java @@ -232,6 +232,24 @@ public class ComputerUtil if (cost.getUntap() && (card.isUntapped() || card.isSick())) return false; + if (cost.getTapXTypeCost()) + { + PlayerZone play = AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer); + CardList typeList = new CardList(play.getCards()); + typeList = typeList.getValidCards(cost.getTapXType().split(",")); + + if (cost.getTap()) + typeList.remove(sa.getSourceCard()); + typeList = typeList.filter( new CardListFilter() { + public boolean addCard(Card c) { + return c.isUntapped(); + } + }); + + if (cost.getTapXTypeAmount() > typeList.size()) + return false; + } + if (cost.getSubCounter()){ Counters c = cost.getCounterType(); if (card.getCounters(c) - cost.getCounterNum() < 0 || !AllZone.GameAction.isCardInPlay(card)){ @@ -273,23 +291,14 @@ public class ComputerUtil Card target = sa.getTargetCard(); if (target != null && target.getController().equals(Constant.Player.Computer)) // don't sacrifice the card we're pumping typeList.remove(target); - return typeList.size() >= cost.getSacAmount(); + + if (cost.getSacAmount() > typeList.size()) + return false; } else if (cost.getSacThis() && !AllZone.GameAction.isCardInPlay(card)) return false; } - if (cost.getTapXTypeCost()) - { - PlayerZone play = AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer); - CardList typeList = new CardList(play.getCards()); - typeList = typeList.getValidCards(cost.getTapXType().split(",")); - - if (cost.getTap()) - typeList.remove(sa.getSourceCard()); - - return typeList.size() >= cost.getTapXTypeAmount(); - } return true; } diff --git a/src/forge/Cost_Payment.java b/src/forge/Cost_Payment.java index 5915c2fe2d6..a0ca307f049 100644 --- a/src/forge/Cost_Payment.java +++ b/src/forge/Cost_Payment.java @@ -58,6 +58,25 @@ public class Cost_Payment { if (cost.getUntap() && (card.isUntapped() || card.isSick())) return false; + if (cost.getTapXTypeCost()){ + PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController()); + CardList typeList = new CardList(play.getCards()); + + typeList = typeList.getValidCards(cost.getTapXType().split(",")); + + if (cost.getTap()) { + typeList = typeList.filter(new CardListFilter() + { + public boolean addCard(Card c) + { + return !c.equals(card) && c.isUntapped(); + } + }); + } + if (typeList.size() == 0) + return false; + } + int countersLeft = 0; if (cost.getSubCounter()){ Counters c = cost.getCounterType(); @@ -104,27 +123,6 @@ public class Cost_Payment { } else if (cost.getSacThis() && !AllZone.GameAction.isCardInPlay(card)) return false; - } - - if (cost.getTapXTypeCost()) - { - PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController()); - CardList typeList = new CardList(play.getCards()); - - typeList = typeList.getValidCards(cost.getTapXType().split(",")); - - if (cost.getTap()) { - typeList = typeList.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return !c.equals(card); - } - }); - } - if (typeList.size() == 0) - return false; - } return true; @@ -158,6 +156,16 @@ public class Cost_Payment { changeInput.stopSetNext(new Input_PayCostMana(this)); return false; } + + if (!payTapXType && cost.getTapXTypeCost()){ + PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController()); + CardList typeList = new CardList(play.getCards()); + typeList = typeList.getValidCards(cost.getTapXType().split(",")); + + changeInput.stopSetNext(input_tapXCost(cost.getTapXTypeAmount(),cost.getTapXType(), typeList, ability, this)); + return false; + } + if (!paySubCounter && cost.getSubCounter()){ // pay counters here. Counters c = cost.getCounterType(); int countersLeft = card.getCounters(c) - cost.getCounterNum(); @@ -225,16 +233,6 @@ public class Cost_Payment { changeInput.stopSetNext(sacrificeType(ability, cost.getSacType(), this)); return false; } - - if (!payTapXType && cost.getTapXTypeCost()) - { - PlayerZone play = AllZone.getZone(Constant.Zone.Play, card.getController()); - CardList typeList = new CardList(play.getCards()); - typeList = typeList.getValidCards(cost.getTapXType().split(",")); - - changeInput.stopSetNext(input_tapXCost(cost.getTapXTypeAmount(),cost.getTapXType(), typeList, ability, this)); - return false; - } req.finishPaying(); return true; @@ -257,6 +255,11 @@ public class Cost_Payment { // refund mana AllZone.ManaPool.unpaid(); + if (cost.getTapXTypeCost() && payTapXType){ + // todo: it would be great if a user cancels payment that the tapped creatures will untap + + } + // refund counters if (cost.getSubCounter() && paySubCounter){ Counters c = cost.getCounterType(); @@ -328,6 +331,11 @@ public class Cost_Payment { if (!cost.hasNoManaCost()) ComputerUtil.payManaCost(ability); + if (cost.getTapXTypeCost()){ + for (Card c : tapXCard) + c.tap(); + } + if (cost.getSubCounter()) card.setCounter(cost.getCounterType(), countersLeft); @@ -360,12 +368,6 @@ public class Cost_Payment { for(Card c : sacCard) AllZone.GameAction.sacrifice(c); } - - if (cost.getTapXTypeCost()) - { - for (Card c : tapXCard) - c.tap(); - } AllZone.Stack.add(ability); } @@ -529,7 +531,7 @@ public class Cost_Payment { public void showMessage() { if (cardList.size() == 0) stop(); - AllZone.Display.showMessage("Select a "+ cardType + " card to tap"); + AllZone.Display.showMessage("Select a "+ cardType + " to tap"); ButtonUtil.enableOnlyCancel(); } @@ -543,6 +545,7 @@ public class Cost_Payment { if(zone.is(Constant.Zone.Play) && cardList.contains(card) && card.isUntapped() ) { // send in CardList for Typing card.tap(); + cardList.remove(card); nTapped++; if(nTapped == nCards)