diff --git a/res/cardsfolder/umezawas_jitte.txt b/res/cardsfolder/umezawas_jitte.txt index 3526763936d..f4bfa3e5c7a 100644 --- a/res/cardsfolder/umezawas_jitte.txt +++ b/res/cardsfolder/umezawas_jitte.txt @@ -2,6 +2,9 @@ Name:Umezawa's Jitte ManaCost:2 Types:Legendary Artifact Equipment Text:Whenever equipped creature deals combat damage, put two charge counters on Umezawa's Jitte. +K:abPumpEquipped SubCounter<1/CHARGE>:+2/+2 +K:abPumpTgtC SubCounter<1/CHARGE>:-1/-1 +K:abGainLife SubCounter<1/CHARGE>:2 SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/umezawas_jitte.jpg End diff --git a/src/forge/Card.java b/src/forge/Card.java index 0d599950fb8..a2aa97076c0 100644 --- a/src/forge/Card.java +++ b/src/forge/Card.java @@ -1409,6 +1409,12 @@ public class Card extends MyObservable { return equipping; } + public Card getEquippingCard() { + if (equipping.size() == 0) + return null; + return equipping.get(0); + } + public void setEquipping(ArrayList list) { equipping = list; } @@ -1475,6 +1481,12 @@ public class Card extends MyObservable { return enchanting; } + public Card getEnchantingCard() { + if (enchanting.size() == 0) + return null; + return enchanting.get(0); + } + public void setEnchanting(ArrayList list) { enchanting = list; } diff --git a/src/forge/CardFactory.java b/src/forge/CardFactory.java index 6764f3336b8..919fce01f65 100644 --- a/src/forge/CardFactory.java +++ b/src/forge/CardFactory.java @@ -1575,6 +1575,8 @@ public class CardFactory implements NewConstants { String[] tmpCost = tmp.split(" ", 2); + final boolean bPumpEquipped = (tmpCost[0].equals("Equipped")); + final Target abTgt = new Target(tmpCost[0]); final Ability_Cost abCost = new Ability_Cost(tmpCost[1], card.getName(), true); @@ -1639,14 +1641,17 @@ public class CardFactory implements NewConstants { String d = "none"; StringBuilder sbD = new StringBuilder(); + if(abTgt.doesTarget()) + sbD.append("Target creature"); + else if (bPumpEquipped) + sbD.append("Equipped creature"); + else + sbD.append(cardName); + if((AttackX[0].equals("none") && !(NumAttack[0] == -1138)) && (DefenseX[0].equals("none") && !(NumDefense[0] == -1138)) && Keyword[0].equals("none")) { // pt boost - if(abTgt.doesTarget()) sbD.append("Target creature gets "); - else { - sbD.append(cardName); - sbD.append(" gets "); - } + sbD.append(" gets "); if(NumAttack[0] > 0 || (NumAttack[0] == 0 && NumDefense[0] > 0)) // +0/+1 sbD.append("+"); @@ -1666,11 +1671,7 @@ public class CardFactory implements NewConstants { if((AttackX[0].equals("none") && NumAttack[0] == -1138) && (DefenseX[0].equals("none") && NumDefense[0] == -1138) && !Keyword[0].equals("none")) { // k boost - if(abTgt.doesTarget()) sbD.append("Target creature gains "); - else { - sbD.append(cardName); - sbD.append(" gains "); - } + sbD.append(" gains "); sbD.append(dK); sbD.append(" until end of turn."); @@ -1678,11 +1679,7 @@ public class CardFactory implements NewConstants { if((AttackX[0].equals("none") && !(NumAttack[0] == -1138)) && (DefenseX[0].equals("none") && !(NumDefense[0] == -1138)) && !Keyword[0].equals("none")) { // ptk boost - if(abTgt.doesTarget()) sbD.append("Target creature gets "); - else { - sbD.append(cardName); - sbD.append(" gets "); - } + sbD.append(" gets "); if(NumAttack[0] > 0 || (NumAttack[0] == 0 && NumDefense[0] > 0)) // +0/+1 sbD.append("+"); @@ -1744,8 +1741,23 @@ public class CardFactory implements NewConstants { public boolean canPlayAI() { // temporarily disabled until AI is improved if (abCost.getSacCost()) return false; - if (abCost.getSubCounter()) return false; if (abCost.getLifeCost()) return false; + if (abCost.getSubCounter()){ + // instead of never removing counters, we will have a random possibility of failure. + // all the other tests still need to pass if a counter will be removed + Counters count = abCost.getCounterType(); + double chance = .66; + if (count.equals("P1P1")){ // 10% chance to remove +1/+1 to pump + chance = .1; + } + else if (count.equals("CHARGE")){ // 50% chance to remove +1/+1 to pump + chance = .5; + } + Random r = new Random(); + if(r.nextFloat() > chance) + return false; + } + if (bPumpEquipped && card.getEquippingCard() == null) return false; if (!ComputerUtil.canPayCost(this)) return false; @@ -1756,17 +1768,21 @@ public class CardFactory implements NewConstants { if(AllZone.Phase.getPhase().equals(Constant.Phase.Main2)) return false; if(!abTgt.doesTarget()) { - setTargetCard(card); + Card creature; + if (bPumpEquipped) + creature = card.getEquippingCard(); + else + creature = card; - if((card.getNetDefense() + defense > 0) && (!card.getKeyword().contains(keyword))) { - if(card.hasSickness() && keyword.contains("Haste")) + if((creature.getNetDefense() + defense > 0) && (!creature.getKeyword().contains(keyword))) { + if(creature.hasSickness() && keyword.contains("Haste")) return true; - else if (card.hasSickness() ^ keyword.contains("Haste")) + else if (creature.hasSickness() ^ keyword.contains("Haste")) return false; else { Random r = new Random(); if(r.nextFloat() <= Math.pow(.6667, card.getAbilityUsed())) - return CardFactoryUtil.AI_doesCreatureAttack(card); + return CardFactoryUtil.AI_doesCreatureAttack(creature); } } } @@ -1823,12 +1839,17 @@ public class CardFactory implements NewConstants { @Override public void resolve() { - if(AllZone.GameAction.isCardInPlay(getTargetCard()) - && (CardFactoryUtil.canTarget(card, getTargetCard()) || !abTgt.doesTarget() )) { - final Card[] creature = new Card[1]; - if(abTgt.doesTarget()) creature[0] = getTargetCard(); - else creature[0] = card; - + final Card[] creature = new Card[1]; + if(abTgt.doesTarget()) + creature[0] = getTargetCard(); + else if (bPumpEquipped) + creature[0] = card.getEquippingCard(); + else + creature[0] = card; + + if(creature[0] != null && AllZone.GameAction.isCardInPlay(creature[0]) + && (!abTgt.doesTarget() || CardFactoryUtil.canTarget(card, getTargetCard()))) { + final int a = getNumAttack(); final int d = getNumDefense(); @@ -4607,6 +4628,11 @@ public class CardFactory implements NewConstants { return 0; } + + public boolean canPlay(){ + Cost_Payment pay = new Cost_Payment(abCost, this); + return (pay.canPayAdditionalCosts() && CardFactoryUtil.canUseAbility(card) && super.canPlay()); + } public boolean canPlayAI() { diff --git a/src/forge/CardFactory_Equipment.java b/src/forge/CardFactory_Equipment.java index 18e4f117d20..7a378a75788 100644 --- a/src/forge/CardFactory_Equipment.java +++ b/src/forge/CardFactory_Equipment.java @@ -218,8 +218,6 @@ class CardFactory_Equipment { card.addUnEquipCommand(onUnEquip); } //*************** END ************ END ************************** - - //*************** START *********** START ************************** else if(cardName.equals("Umezawa's Jitte")) { final Ability equip = new Ability(card, "2") { @@ -278,174 +276,10 @@ class CardFactory_Equipment { }//getCreature() };//equip ability - - final Ability gainLife = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.CHARGE, 1); - AllZone.GameAction.gainLife(card.getController(), 2); - } - - @Override - public boolean canPlay() { - SpellAbility sa; - for(int i = 0; i < AllZone.Stack.size(); i++) { - sa = AllZone.Stack.peek(i); - if(sa.getSourceCard().equals(card)) return false; - } - - return card.getCounters(Counters.CHARGE) > 0; - } - - @Override - public boolean canPlayAI() { - return AllZone.GameAction.getPlayerLife(Constant.Player.Computer).getLife() <= 4; - } - - }; - - gainLife.setDescription("Remove a charge counter from Umezawa's Jitte: You gain 2 life."); - gainLife.setStackDescription(cardName + " - You gain 2 life."); - - final Ability negBoost = new Ability(card, "0") { - @Override - public void resolve() { - - card.subtractCounter(Counters.CHARGE, 1); - final Card[] target = new Card[1]; - final Command untilEOT = new Command() { - private static final long serialVersionUID = -1615047325868708734L; - - public void execute() { - if(AllZone.GameAction.isCardInPlay(target[0])) { - target[0].addTempAttackBoost(1); - target[0].addTempDefenseBoost(1); - } - } - }; - - target[0] = getTargetCard(); - if(AllZone.GameAction.isCardInPlay(target[0]) && CardFactoryUtil.canTarget(card, target[0])) { - target[0].addTempAttackBoost(-1); - target[0].addTempDefenseBoost(-1); - - AllZone.EndOfTurn.addUntil(untilEOT); - } - } - - @Override - public boolean canPlay() { - SpellAbility sa; - for(int i = 0; i < AllZone.Stack.size(); i++) { - sa = AllZone.Stack.peek(i); - if(sa.getSourceCard().equals(card)) return false; - } - - return card.getCounters(Counters.CHARGE) > 0; - } - - @Override - public boolean canPlayAI() { - if(gainLife.canPlayAI()) return false; - - CardList c = CardFactoryUtil.AI_getHumanCreature(1, card, true); - CardListUtil.sortAttack(c); - CardListUtil.sortFlying(c); - - if(c.isEmpty()) return false; - else { - setTargetCard(c.get(0)); - return true; - } - }//canPlayAI() - }; - Input target = new Input() { - private static final long serialVersionUID = -5404464532726469761L; - - @Override - public void showMessage() { - AllZone.Display.showMessage("Select target creature for " + card.getName()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if(!CardFactoryUtil.canTarget(negBoost, card)) { - AllZone.Display.showMessage("Cannot target this card (Shroud? Protection?)."); - } else if(card.isCreature() && zone.is(Constant.Zone.Play)) { - negBoost.setTargetCard(card); - AllZone.Stack.add(negBoost); - stop(); - } - } - };//Input - negBoost.setDescription("Remove a charge counter from Umezawa's Jitte: Target creature gets -1/-1 until end of turn."); - negBoost.setBeforePayMana(target); - - final Ability boost = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.CHARGE, 1); - final Card[] target = new Card[1]; - final Command untilEOT = new Command() { - private static final long serialVersionUID = 2751279830522020186L; - - public void execute() { - if(AllZone.GameAction.isCardInPlay(target[0])) { - target[0].addTempAttackBoost(-2); - target[0].addTempDefenseBoost(-2); - } - } - }; - - target[0] = card.getEquipping().get(0); - if(AllZone.GameAction.isCardInPlay(target[0])) { - target[0].addTempAttackBoost(2); - target[0].addTempDefenseBoost(2); - - AllZone.EndOfTurn.addUntil(untilEOT); - } - } - - @Override - public boolean canPlay() { - SpellAbility sa; - for(int i = 0; i < AllZone.Stack.size(); i++) { - sa = AllZone.Stack.peek(i); - if(sa.getSourceCard().equals(card)) return false; - } - - return card.isEquipping() && card.getCounters(Counters.CHARGE) > 0; - } - - @Override - public boolean canPlayAI() { - if(gainLife.canPlayAI() || negBoost.canPlayAI()) return false; - - if(card.isEquipping()) { - Card c = card.getEquipping().get(0); - if(CardFactoryUtil.AI_doesCreatureAttack(c)) return true; - - } - return false; - } - }; - - boost.setDescription("Remove a charge counter from Umezawa's Jitte: Equipped creature gets +2/+2 until end of turn."); - boost.setStackDescription(cardName + " - Equipped creature gets +2/+2 untin end of turn."); - equip.setBeforePayMana(CardFactoryUtil.input_equipCreature(equip)); equip.setDescription("Equip: 2"); card.addSpellAbility(equip); - card.addSpellAbility(boost); - card.addSpellAbility(negBoost); - card.addSpellAbility(gainLife); } //*************** END ************ END **************************