From 53a2ef4ee92c344f366145e2c02b2b9742b841f2 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sat, 6 Apr 2013 08:06:12 +0000 Subject: [PATCH] - Added Attached Trigger - Added Bramble Elemental, Oathkeeper, Takeno's Daisho and Shieldmage Elder --- .gitattributes | 4 + res/cardsfolder/b/bramble_elemental.txt | 11 +++ .../o/oathkeeper_takenos_daisho.txt | 17 ++++ res/cardsfolder/s/shieldmage_elder.txt | 13 +++ src/main/java/forge/Card.java | 10 +++ .../forge/card/trigger/TriggerAttached.java | 89 +++++++++++++++++++ .../java/forge/card/trigger/TriggerType.java | 1 + 7 files changed, 145 insertions(+) create mode 100644 res/cardsfolder/b/bramble_elemental.txt create mode 100644 res/cardsfolder/o/oathkeeper_takenos_daisho.txt create mode 100644 res/cardsfolder/s/shieldmage_elder.txt create mode 100644 src/main/java/forge/card/trigger/TriggerAttached.java diff --git a/.gitattributes b/.gitattributes index 9c970317527..2d6478bb898 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1247,6 +1247,7 @@ res/cardsfolder/b/brainspoil.txt svneol=native#text/plain res/cardsfolder/b/brainstorm.txt svneol=native#text/plain res/cardsfolder/b/brainwash.txt svneol=native#text/plain res/cardsfolder/b/bramble_creeper.txt svneol=native#text/plain +res/cardsfolder/b/bramble_elemental.txt -text res/cardsfolder/b/bramblecrush.txt -text res/cardsfolder/b/bramblesnap.txt svneol=native#text/plain res/cardsfolder/b/bramblewood_paragon.txt svneol=native#text/plain @@ -7355,6 +7356,7 @@ res/cardsfolder/o/oath_of_druids.txt svneol=native#text/plain res/cardsfolder/o/oath_of_ghouls.txt svneol=native#text/plain res/cardsfolder/o/oath_of_lieges.txt -text res/cardsfolder/o/oath_of_lim_dul.txt -text +res/cardsfolder/o/oathkeeper_takenos_daisho.txt -text res/cardsfolder/o/oathsworn_giant.txt svneol=native#text/plain res/cardsfolder/o/ob_nixilis_the_fallen.txt svneol=native#text/plain res/cardsfolder/o/obelisk_of_alara.txt svneol=native#text/plain @@ -9453,6 +9455,7 @@ res/cardsfolder/s/shield_sphere.txt svneol=native#text/plain res/cardsfolder/s/shield_wall.txt svneol=native#text/plain res/cardsfolder/s/shielded_passage.txt -text res/cardsfolder/s/shielding_plax.txt svneol=native#text/plain +res/cardsfolder/s/shieldmage_elder.txt -text res/cardsfolder/s/shieldmates_blessing.txt svneol=native#text/plain res/cardsfolder/s/shields_of_velis_vel.txt -text res/cardsfolder/s/shifting_borders.txt -text @@ -13831,6 +13834,7 @@ src/main/java/forge/card/staticability/StaticAbilityPreventDamage.java svneol=na src/main/java/forge/card/staticability/package-info.java svneol=native#text/plain src/main/java/forge/card/trigger/Trigger.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerAlways.java svneol=native#text/plain +src/main/java/forge/card/trigger/TriggerAttached.java -text src/main/java/forge/card/trigger/TriggerAttackerBlocked.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerAttackerUnblocked.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerAttackersDeclared.java svneol=native#text/plain diff --git a/res/cardsfolder/b/bramble_elemental.txt b/res/cardsfolder/b/bramble_elemental.txt new file mode 100644 index 00000000000..d1f1c6d1ad9 --- /dev/null +++ b/res/cardsfolder/b/bramble_elemental.txt @@ -0,0 +1,11 @@ +Name:Bramble Elemental +ManaCost:3 G G +Types:Creature Elemental +PT:4/4 +T:Mode$ Attached | ValidSource$ Aura | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an Aura becomes attached to CARDNAME, put two 1/1 green Saproling creature tokens onto the battlefield. +SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 2 | TokenOwner$ TriggeredTargetController | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 +SVar:EnchantMe:Multiple +SVar:Picture:http://www.wizards.com/global/images/magic/general/bramble_elemental.jpg +Oracle:Whenever an Aura becomes attached to Bramble Elemental, put two 1/1 green Saproling creature tokens onto the battlefield. +SetInfo:RAV Common +SetInfo:PC2 Common \ No newline at end of file diff --git a/res/cardsfolder/o/oathkeeper_takenos_daisho.txt b/res/cardsfolder/o/oathkeeper_takenos_daisho.txt new file mode 100644 index 00000000000..07b7a4e3bd6 --- /dev/null +++ b/res/cardsfolder/o/oathkeeper_takenos_daisho.txt @@ -0,0 +1,17 @@ +Name:Oathkeeper, Takeno's Daisho +ManaCost:3 +Types:Legendary Artifact Equipment +Equipped creature gets +3/+1. +K:Equip 2 +T:Mode$ Attached | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigRemember | Static$ True +SVar:TrigRemember:DB$ Cleanup | ClearRemembered$ True | SubAbility$ RememberNew +SVar:RememberNew:DB$ Pump | RememberObjects$ Equipped +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+equipping | Execute$ TrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, exile equipped creature. +SVar:TrigChangeZone:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Exile | Defined$ Remembered +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EquippedBy | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card. +SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | GainControl$ True | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Samurai | ConditionCompare$ GE1 +SVar:RemAIDeck:True +DeckHints:Type$Samurai +SVar:Picture:http://www.wizards.com/global/images/magic/general/oathkeeper_takenos_daisho.jpg +Oracle:Equipped creature gets +3/+1.\nWhenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card.\nWhen Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature.\nEquip {2} +SetInfo:CHK Rare \ No newline at end of file diff --git a/res/cardsfolder/s/shieldmage_elder.txt b/res/cardsfolder/s/shieldmage_elder.txt new file mode 100644 index 00000000000..dfeb76cc28f --- /dev/null +++ b/res/cardsfolder/s/shieldmage_elder.txt @@ -0,0 +1,13 @@ +Name:Shieldmage Elder +ManaCost:5 W +Types:Creature Human Cleric Wizard +PT:2/3 +A:AB$ Pump | Cost$ tapXType<2/Cleric> | ValidTgts$ Creature | KW$ HIDDEN Prevent all damage that would be dealt by CARDNAME. | IsCurse$ True | TgtPrompt$ Select target creature | SpellDescription$ Prevent all damage target creature would deal this turn. +A:AB$ Effect | Cost$ tapXType<2/Wizard> | ValidTgts$ Card.inZoneStack | TgtZone$ Stack,Battlefield | IsCurse$ True | TgtPrompt$ Select target spell | RememberObjects$ Targeted | StaticAbilities$ STNoDmg | SubAbility$ DBCleanup | SpellDescription$ Prevent all damage target spell would deal this turn. +SVar:STNoDmg:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield,Stack | Affected$ Card.IsRemembered | AddHiddenKeyword$ Prevent all damage that would be dealt by CARDNAME. | Description$ Prevent all damage target spell would deal this turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +#Another Zone should be included currently, therefore the target would be a card, not a spell/ability +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/shieldmage_elder.jpg +Oracle:Tap two untapped Clerics you control: Prevent all damage target creature would deal this turn.\nTap two untapped Wizards you control: Prevent all damage target spell would deal this turn. +SetInfo:ONS Uncommon \ No newline at end of file diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 3d1678cdf54..d9ec6805277 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -3715,6 +3715,11 @@ public class Card extends GameEntity implements Comparable { // Play the Equip sound Singletons.getModel().getGame().getEvents().post(new CardEquippedEvent()); + // run trigger + final HashMap runParams = new HashMap(); + runParams.put("AttachSource", this); + runParams.put("AttachTarget", c); + this.getController().getGame().getTriggerHandler().runTrigger(TriggerType.Attached, runParams, false); } /** @@ -3898,6 +3903,11 @@ public class Card extends GameEntity implements Comparable { this.addEnchanting(entity); entity.addEnchantedBy(this); this.enchant(); + // run trigger + final HashMap runParams = new HashMap(); + runParams.put("AttachSource", this); + runParams.put("AttachTarget", entity); + this.getController().getGame().getTriggerHandler().runTrigger(TriggerType.Attached, runParams, false); } /** diff --git a/src/main/java/forge/card/trigger/TriggerAttached.java b/src/main/java/forge/card/trigger/TriggerAttached.java new file mode 100644 index 00000000000..e89775b2f77 --- /dev/null +++ b/src/main/java/forge/card/trigger/TriggerAttached.java @@ -0,0 +1,89 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.card.trigger; + +import forge.Card; +import forge.card.spellability.SpellAbility; + +/** + *

+ * Trigger_Attached class. + *

+ * + * @author Forge + * @version $Id: TriggerAttached.java 17802 2012-10-31 08:05:14Z Max mtg $ + */ +public class TriggerAttached extends Trigger { + + /** + *

+ * Constructor for Trigger_Attached. + *

+ * + * @param params + * a {@link java.util.HashMap} object. + * @param host + * a {@link forge.Card} object. + * @param intrinsic + * the intrinsic + */ + public TriggerAttached(final java.util.Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} */ + @Override + public final boolean performTest(final java.util.Map runParams2) { + final Card src = (Card) runParams2.get("AttachSource"); + final Object tgt = runParams2.get("AttachTarget"); + + if (this.getMapParams().containsKey("ValidSource")) { + if (!src.isValid(this.getMapParams().get("ValidSource").split(","), this.getHostCard().getController(), + this.getHostCard())) { + return false; + } + } + + if (this.getMapParams().containsKey("ValidTarget")) { + if (!matchesValid(tgt, this.getMapParams().get("ValidTarget").split(","), this.getHostCard())) { + return false; + } + } + + return true; + } + + /** {@inheritDoc} */ + @Override + public final Trigger getCopy() { + final Trigger copy = new TriggerAttached(this.getMapParams(), this.getHostCard(), this.isIntrinsic()); + if (this.getOverridingAbility() != null) { + copy.setOverridingAbility(this.getOverridingAbility()); + } + + copyFieldsTo(copy); + return copy; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa) { + sa.setTriggeringObject("Source", this.getRunParams().get("AttachSource")); + sa.setTriggeringObject("Target", this.getRunParams().get("AttachTarget")); + } +} diff --git a/src/main/java/forge/card/trigger/TriggerType.java b/src/main/java/forge/card/trigger/TriggerType.java index 622a7b980a5..3dd6b06fe28 100644 --- a/src/main/java/forge/card/trigger/TriggerType.java +++ b/src/main/java/forge/card/trigger/TriggerType.java @@ -20,6 +20,7 @@ public enum TriggerType { ChangesZone(TriggerChangesZone.class), Clashed(TriggerClashed.class), + Attached(TriggerAttached.class), Destroyed(TriggerDestroyed.class), Devoured(TriggerDevoured.class), Countered(TriggerCountered.class),