package forge.card.cardFactory; import forge.*; import forge.card.spellability.*; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; import forge.gui.input.Input; import java.util.ArrayList; /** * <p>CardFactory_Equipment class.</p> * * @author Forge * @version $Id: $ */ class CardFactory_Equipment { /** * <p>shouldEquip.</p> * * @param c a {@link forge.Card} object. * @return a int. */ public static int shouldEquip(Card c) { ArrayList<String> a = c.getKeyword(); for (int i = 0; i < a.size(); i++) { // Keyword renamed to eqPump, was VanillaEquipment if (a.get(i).toString().startsWith("eqPump")) { return i; } } return -1; } /** * <p>getCard.</p> * * @param card a {@link forge.Card} object. * @param cardName a {@link java.lang.String} object. * @param owner a {@link forge.Player} object. * @return a {@link forge.Card} object. */ public static Card getCard(final Card card, String cardName, Player owner) { //*************** START *********** START ************************** if (cardName.equals("Umbral Mantle")) { Cost abCost = new Cost("0", cardName, true); Target target = new Target(card, "Select target creature you control", "Creature.YouCtrl".split(",")); final Ability_Activated equip = new Ability_Activated(card, abCost, target) { private static final long serialVersionUID = -6122939616068165612L; @Override public void resolve() { if (AllZoneUtil.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { if (card.isEquipping()) { Card crd = card.getEquipping().get(0); if (crd.equals(getTargetCard())) { return; } card.unEquipCard(crd); } card.equipCard(getTargetCard()); } } @Override public boolean canPlayAI() { return false; } };//equip ability equip.setType("Extrinsic"); final Ability untapboost = new Ability(card, "3") { Command EOT(final Card c) { return new Command() { private static final long serialVersionUID = -8840812331316327448L; public void execute() { if (AllZoneUtil.isCardInPlay(getSourceCard())) { c.addTempAttackBoost(-2); c.addTempDefenseBoost(-2); } } }; } @Override public void resolve() { getSourceCard().addTempAttackBoost(2); getSourceCard().addTempDefenseBoost(2); AllZone.getEndOfTurn().addUntil(EOT(getSourceCard())); } @Override public boolean canPlay() { return (getSourceCard().isTapped() && !getSourceCard().hasSickness() && super.canPlay()); } };//equiped creature's ability untapboost.makeUntapAbility(); Command onEquip = new Command() { private static final long serialVersionUID = -4784079305541955698L; public void execute() { if (card.isEquipping()) { Card crd = card.getEquipping().get(0); StringBuilder sbDesc = new StringBuilder(); sbDesc.append("3, Untap: ").append(crd).append(" gets +2/+2 until end of turn"); untapboost.setDescription(sbDesc.toString()); StringBuilder sbStack = new StringBuilder(); sbStack.append(crd).append(" - +2/+2 until EOT"); untapboost.setStackDescription(sbStack.toString()); crd.addSpellAbility(untapboost); } }//execute() };//Command Command onUnEquip = new Command() { private static final long serialVersionUID = -3427116314295067303L; public void execute() { if (card.isEquipping()) { Card crd = card.getEquipping().get(0); crd.removeSpellAbility(untapboost); } }//execute() };//Command equip.setBeforePayMana(CardFactoryUtil.input_equipCreature(equip)); equip.getRestrictions().setSorcerySpeed(true); equip.setDescription("Equip: 0"); card.addSpellAbility(equip); card.addEquipCommand(onEquip); card.addUnEquipCommand(onUnEquip); } //*************** END ************ END ************************** //*************** START *********** START ************************** else if (cardName.equals("Hedron Matrix")) { /* * Equipped creature gets +X/+X, where X is its converted mana cost. */ final Ability equip = new Ability(card, "4") { //not changed @Override public void resolve() { if (AllZoneUtil.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { if (card.isEquipping()) { Card crd = card.getEquipping().get(0); if (crd.equals(getTargetCard())) { return; } card.unEquipCard(crd); } card.equipCard(getTargetCard()); } } //not changed @Override public boolean canPlay() { return AllZone.getZone(card).is(Constant.Zone.Battlefield) && Phase.canCastSorcery(card.getController()) && super.canPlay(); } //not changed @Override public boolean canPlayAI() { return getCreature().size() != 0 && !card.isEquipping() && super.canPlayAI(); } //not changed @Override public void chooseTargetAI() { Card target = CardFactoryUtil.AI_getBestCreature(getCreature()); setTargetCard(target); } //not changed CardList getCreature() { CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); list = list.filter(new CardListFilter() { public boolean addCard(Card c) { return CardFactoryUtil.AI_doesCreatureAttack(c) && CardFactoryUtil.canTarget(card, c) && (!c.hasKeyword("Defender")); } }); // Is there at least 1 Loxodon Punisher and/or Goblin Gaveleer to target CardList equipMagnetList = list; equipMagnetList = equipMagnetList.getEquipMagnets(); if (equipMagnetList.size() != 0) { return equipMagnetList; } return list; }//getCreature() };//equip ability Command onEquip = new Command() { private static final long serialVersionUID = -5356474407155702171L; public void execute() { if (card.isEquipping()) { Card crd = card.getEquipping().get(0); int pump = CardUtil.getConvertedManaCost(crd.getManaCost()); crd.addSemiPermanentAttackBoost(pump); crd.addSemiPermanentDefenseBoost(pump); } }//execute() };//Command Command onUnEquip = new Command() { private static final long serialVersionUID = 5196262972986079207L; public void execute() { if (card.isEquipping()) { Card crd = card.getEquipping().get(0); int pump = CardUtil.getConvertedManaCost(crd.getManaCost()); crd.addSemiPermanentAttackBoost(-pump); crd.addSemiPermanentDefenseBoost(-pump); } }//execute() };//Command equip.setBeforePayMana(CardFactoryUtil.input_equipCreature(equip)); equip.setDescription("Equip: 4"); card.addSpellAbility(equip); card.addEquipCommand(onEquip); card.addUnEquipCommand(onUnEquip); } //*************** END ************ END ************************** //*************** START *********** START ************************** else if (cardName.equals("Blade of the Bloodchief")) { final Ability triggeredAbility = new Ability(card, "0") { @Override public void resolve() { if (card.getEquipping().size() != 0) { Card equipping = card.getEquipping().get(0); if (equipping.isType("Vampire")) { equipping.addCounter(Counters.P1P1, 2); } else { equipping.addCounter(Counters.P1P1, 1); } } } }; final Trigger myTrigger = TriggerHandler.parseTrigger("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigOverride | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, put a +1/+1 counter on equipped creature. If equipped creature is a Vampire, put two +1/+1 counters on it instead.", card); myTrigger.setOverridingAbility(triggeredAbility); card.addTrigger(myTrigger); } //*************** END ************ END ************************** //*************** START *********** START ************************** else if (cardName.equals("Piston Sledge")) { final Input in = new Input() { private static final long serialVersionUID = 1782826197612459365L; @Override public void showMessage() { CardList list = AllZoneUtil.getCreaturesInPlay(card.getController()); list = list.filter(AllZoneUtil.getCanTargetFilter(card)); AllZone.getDisplay().showMessage(card + " - Select target creature you control to attach"); ButtonUtil.disableAll(); if (list.size() == 0) { stop(); } } @Override public void selectCard(Card c, PlayerZone z) { if (z.is(Constant.Zone.Battlefield, card.getController()) && c.isCreature() && CardFactoryUtil.canTarget(card, c)) { card.equipCard(c); stop(); } } }; final SpellAbility comesIntoPlayAbility = new Ability(card, "0") { @Override public void resolve() { AllZone.getInputControl().setInput(in); }//resolve() }; //comesIntoPlayAbility Command intoPlay = new Command() { private static final long serialVersionUID = 2985015252466920757L; public void execute() { StringBuilder sb = new StringBuilder(); sb.append("When Piston Sledge enters the battlefield, attach it to target creature you control."); comesIntoPlayAbility.setStackDescription(sb.toString()); AllZone.getStack().addSimultaneousStackEntry(comesIntoPlayAbility); } }; card.addComesIntoPlayCommand(intoPlay); }//*************** END ************ END ************************** if (shouldEquip(card) != -1) { int n = shouldEquip(card); if (n != -1) { String parse = card.getKeyword().get(n).toString(); card.removeIntrinsicKeyword(parse); String k[] = parse.split(":"); String tmpCost; tmpCost = k[0].substring(6); String keywordsUnsplit = ""; String extrinsicKeywords[] = {"none"}; // for equips with no keywords to add //final String manaCost = tmpCost.trim(); final Cost abCost = new Cost(tmpCost.trim(), card.getName(), true); int power = 0; int tough = 0; String ptk[] = k[1].split("/"); if (ptk.length == 1) // keywords in first cell { keywordsUnsplit = ptk[0]; } else // parse the power/toughness boosts in first two cells { for (int i = 0; i < 2; i++) { if (ptk[i].matches("[\\+\\-][0-9]")) { ptk[i] = ptk[i].replace("+", ""); } } power = Integer.parseInt(ptk[0].trim()); tough = Integer.parseInt(ptk[1].trim()); if (ptk.length > 2) { // keywords in third cell keywordsUnsplit = ptk[2]; } } if (keywordsUnsplit.length() > 0) // then there is at least one extrinsic keyword to assign { String tempKwds[] = keywordsUnsplit.split("&"); extrinsicKeywords = new String[tempKwds.length]; for (int i = 0; i < tempKwds.length; i++) { extrinsicKeywords[i] = tempKwds[i].trim(); } } card.addSpellAbility(CardFactoryUtil.eqPump_Equip(card, power, tough, extrinsicKeywords, abCost)); card.addEquipCommand(CardFactoryUtil.eqPump_onEquip(card, power, tough, extrinsicKeywords, abCost)); card.addUnEquipCommand(CardFactoryUtil.eqPump_unEquip(card, power, tough, extrinsicKeywords, abCost)); } }// eqPump (was VanillaEquipment) if (card.hasKeyword("Living Weapon")) { card.removeIntrinsicKeyword("Living Weapon"); final Ability etbAbility = new Ability(card, "0") { @Override public void resolve() { String[] types = new String[]{"Creature", "Germ"}; String[] keywords = new String[0]; CardList germs = CardFactoryUtil.makeToken("Germ", "B 0 0 Germ", card.getController(), "B", types, 1, 1, keywords); card.equipCard(germs.get(0)); for (Card c : germs) { c.setBaseAttack(0); c.setBaseDefense(0); } } }; final Trigger etbTrigger = TriggerHandler.parseTrigger("Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigOverriding | TriggerDescription$ Living Weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.)", card); etbTrigger.setOverridingAbility(etbAbility); card.addTrigger(etbTrigger); } return card; } }