From 9327d525c4ee8f2168aeb3668a777ae77182d99f Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Thu, 29 Sep 2011 10:56:32 -0400 Subject: [PATCH] added CREATE_TOKEN event --- .../src/mage/sets/conflux/MartialCoup.java | 4 +-- .../mage/sets/innistrad/BackFromTheBrink.java | 2 +- .../sets/innistrad/CacklingCounterpart.java | 2 +- .../src/mage/sets/innistrad/CellarDoor.java | 2 +- .../sets/innistrad/GeistOfSaintTraft.java | 2 +- .../mage/sets/magic2012/DruidicSatchel.java | 2 +- .../mage/sets/magic2012/ThroneOfEmpires.java | 4 +-- .../mirrodinbesieged/HeroOfBladehold.java | 10 +++----- .../sets/mirrodinbesieged/Mirrorworks.java | 2 +- .../mirrodinbesieged/PhyrexianRebirth.java | 2 +- .../mage/sets/newphyrexia/BeastWithin.java | 2 +- .../src/mage/sets/newphyrexia/FreshMeat.java | 4 +-- .../sets/riseoftheeldrazi/BroodBirthing.java | 4 +-- .../sets/riseoftheeldrazi/SarkhanTheMad.java | 2 +- .../sets/riseoftheeldrazi/SplinterTwin.java | 2 +- .../mage/sets/scarsofmirrodin/MimicVat.java | 2 +- .../sets/scarsofmirrodin/MyrPropagator.java | 4 +-- .../mage/sets/scarsofmirrodin/Myrsmith.java | 2 +- .../sets/scarsofmirrodin/PrototypePortal.java | 2 +- .../effects/common/CreateTokenEffect.java | 4 +-- .../keyword/LivingWeaponAbility.java | 2 +- Mage/src/mage/game/events/GameEvent.java | 1 + Mage/src/mage/game/permanent/token/Token.java | 25 +++++++++++++------ 23 files changed, 43 insertions(+), 45 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/MartialCoup.java b/Mage.Sets/src/mage/sets/conflux/MartialCoup.java index 540bb96df01..15be32723d5 100644 --- a/Mage.Sets/src/mage/sets/conflux/MartialCoup.java +++ b/Mage.Sets/src/mage/sets/conflux/MartialCoup.java @@ -90,9 +90,7 @@ class MartialCoupEffect extends OneShotEffect { permanent.destroy(source.getSourceId(), game, false); } } - for (int i = 0; i < amount; i++) { - token.putOntoBattlefield(game, source.getId(), source.getControllerId()); - } + token.putOntoBattlefield(amount, game, source.getId(), source.getControllerId()); return true; } diff --git a/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java b/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java index 3f80a811bed..e4d9e328ed6 100644 --- a/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java +++ b/Mage.Sets/src/mage/sets/innistrad/BackFromTheBrink.java @@ -91,7 +91,7 @@ class BackFromTheBrinkEffect extends OneShotEffect { if (card != null) { EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(card); - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java b/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java index 2a810bab43c..57a706b9aa1 100644 --- a/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java +++ b/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java @@ -91,7 +91,7 @@ class CacklingCounterpartEffect extends OneShotEffect if (card != null) { EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(card); - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java b/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java index d68940ee970..5ff7832c335 100644 --- a/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java +++ b/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java @@ -96,7 +96,7 @@ class CellarDoorEffect extends OneShotEffect { card.moveToZone(Zone.GRAVEYARD, source.getId(), game, true); if (card.getCardType().contains(CardType.CREATURE)) { ZombieToken token = new ZombieToken(); - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); } } return true; diff --git a/Mage.Sets/src/mage/sets/innistrad/GeistOfSaintTraft.java b/Mage.Sets/src/mage/sets/innistrad/GeistOfSaintTraft.java index 7cbf9be2d67..45bbdc44d03 100644 --- a/Mage.Sets/src/mage/sets/innistrad/GeistOfSaintTraft.java +++ b/Mage.Sets/src/mage/sets/innistrad/GeistOfSaintTraft.java @@ -92,7 +92,7 @@ class GeistOfSaintTraftEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { AngelToken token = new AngelToken(); - if (token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId())) { + if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) { Permanent p = game.getPermanent(token.getLastAddedToken()); game.getCombat().declareAttacker(p.getId(), game.getCombat().getDefendingPlayer(source.getSourceId()), game); Effect effect = new ExileTargetEffect(); diff --git a/Mage.Sets/src/mage/sets/magic2012/DruidicSatchel.java b/Mage.Sets/src/mage/sets/magic2012/DruidicSatchel.java index 1bbb1851adc..3d14109db22 100644 --- a/Mage.Sets/src/mage/sets/magic2012/DruidicSatchel.java +++ b/Mage.Sets/src/mage/sets/magic2012/DruidicSatchel.java @@ -89,7 +89,7 @@ class DruidicSatchelEffect extends OneShotEffect { if (card != null) { if (card.getCardType().contains(CardType.CREATURE)) { Token token = new SaprolingToken(); - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); } if (card.getCardType().contains(CardType.LAND)) { player.getLibrary().remove(card.getId(), game); diff --git a/Mage.Sets/src/mage/sets/magic2012/ThroneOfEmpires.java b/Mage.Sets/src/mage/sets/magic2012/ThroneOfEmpires.java index dcbc688d85b..a8de58d9cd9 100644 --- a/Mage.Sets/src/mage/sets/magic2012/ThroneOfEmpires.java +++ b/Mage.Sets/src/mage/sets/magic2012/ThroneOfEmpires.java @@ -93,9 +93,7 @@ class ThroneOfEmpiresEffect extends OneShotEffect { } Token soldier = new SoldierToken(); int count = scepter && crown ? 5 : 1; - for (int i = 0; i < count; i++) { - soldier.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); - } + soldier.putOntoBattlefield(count, game, source.getSourceId(), source.getControllerId()); return false; } diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/HeroOfBladehold.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/HeroOfBladehold.java index 94e405d7a37..85cff1fdafe 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/HeroOfBladehold.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/HeroOfBladehold.java @@ -87,12 +87,10 @@ class HeroOfBladeholdEffect extends OneShotEffect { SoldierToken token = new SoldierToken(); Player player = game.getPlayer(source.getControllerId()); if (player != null) { - for (int i = 1; i <= 2; i++) { - token.putOntoBattlefield(game, source.getId(), source.getControllerId()); - Permanent p = game.getPermanent(token.getLastAddedToken()); - game.getCombat().declareAttacker(p.getId(), game.getCombat().getDefendingPlayer(source.getSourceId()), game); - p.setTapped(true); - } + token.putOntoBattlefield(2, game, source.getId(), source.getControllerId()); + Permanent p = game.getPermanent(token.getLastAddedToken()); + game.getCombat().declareAttacker(p.getId(), game.getCombat().getDefendingPlayer(source.getSourceId()), game); + p.setTapped(true); } return true; } diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java index 543cbdd7360..5cd575e7275 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/Mirrorworks.java @@ -138,7 +138,7 @@ class MirrorworksEffect extends OneShotEffect { if (target != null) { EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(target); - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); return true; } } diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java index 22d7091f1d3..9cb47c4814d 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRebirth.java @@ -84,7 +84,7 @@ public class PhyrexianRebirth extends CardImpl { HorrorToken horrorToken = new HorrorToken(); horrorToken.getPower().setValue(count); horrorToken.getToughness().setValue(count); - horrorToken.putOntoBattlefield(game, source.getId(), source.getControllerId()); + horrorToken.putOntoBattlefield(1, game, source.getId(), source.getControllerId()); return true; } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/BeastWithin.java b/Mage.Sets/src/mage/sets/newphyrexia/BeastWithin.java index 8d06ff5d831..8913131ffe0 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/BeastWithin.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/BeastWithin.java @@ -90,7 +90,7 @@ class BeastWithinEffect extends OneShotEffect { Permanent permanent = (Permanent) game.getLastKnownInformation(targetPointer.getFirst(source), Constants.Zone.BATTLEFIELD); if (permanent != null) { BeastToken token = new BeastToken(); - token.putOntoBattlefield(game, source.getId(), permanent.getControllerId()); + token.putOntoBattlefield(1, game, source.getId(), permanent.getControllerId()); } return true; } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java b/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java index 78c8879c1ad..e87e60bcd2c 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java @@ -132,9 +132,7 @@ class FreshMeatEffect extends OneShotEffect { FreshMeatWatcher watcher = (FreshMeatWatcher) game.getState().getWatchers().get(source.getControllerId(), "CreaturesDiedFreshMeat"); int count = watcher.getCreaturesCount(); BeastToken token = new BeastToken(); - for (int i = 0; i < count; i++) { - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); - } + token.putOntoBattlefield(count, game, source.getSourceId(), source.getControllerId()); return true; } } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/BroodBirthing.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/BroodBirthing.java index a1be1ca2486..6b294fa255a 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/BroodBirthing.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/BroodBirthing.java @@ -89,9 +89,7 @@ class BroodBirthingEffect extends OneShotEffect { EldraziSpawnToken token = new EldraziSpawnToken(); int count = game.getBattlefield().countAll(filter, source.getControllerId()) > 0 ? 3 : 1; - for (int i = 0; i < count; i++) { - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); - } + token.putOntoBattlefield(count, game, source.getSourceId(), source.getControllerId()); return true; } } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SarkhanTheMad.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SarkhanTheMad.java index d11fcee2d6b..a110f8e477f 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SarkhanTheMad.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SarkhanTheMad.java @@ -146,7 +146,7 @@ class SarkhanTheMadSacEffect extends OneShotEffect { Player player = game.getPlayer(permanent.getControllerId()); permanent.sacrifice(this.getId(), game); Token dragonToken = new DragonToken(); - dragonToken.putOntoBattlefield(game, this.getId(), player.getId()); + dragonToken.putOntoBattlefield(1, game, this.getId(), player.getId()); } return false; } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java index df912b027a5..713adb0b8f4 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java @@ -113,7 +113,7 @@ class SplinterTwinEffect extends OneShotEffect { CardUtil.copyTo(token).from(card); token.addAbility(HasteAbility.getInstance()); - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); ExileTargetEffect exileEffect = new ExileTargetEffect(); exileEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken())); diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java index c1b5659cafc..12683648640 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java @@ -200,7 +200,7 @@ class MimicVatCreateTokenEffect extends OneShotEffect CardUtil.copyTo(token).from(card); token.addAbility(HasteAbility.getInstance()); - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); ExileTargetEffect exileEffect = new ExileTargetEffect(); exileEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken())); diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrPropagator.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrPropagator.java index 49d0300490f..c1ca9ba7d6b 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrPropagator.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrPropagator.java @@ -97,14 +97,14 @@ class MyrPropagatorCreateTokenEffect extends OneShotEffect { Cost cost = new GenericManaCost(1); cost.clearPaid(); if (cost.pay(source, game, source.getId(), source.getControllerId(), false)) { - new MyrToken().putOntoBattlefield(game, source.getControllerId(), source.getControllerId()); + new MyrToken().putOntoBattlefield(1, game, source.getControllerId(), source.getControllerId()); } return true; } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/PrototypePortal.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/PrototypePortal.java index d8ff8104b12..4610bb346ec 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/PrototypePortal.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/PrototypePortal.java @@ -166,7 +166,7 @@ class PrototypePortalCreateTokenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int value = amount.calculate(game, source); - for (int i = 0; i < value; i++) { - token.putOntoBattlefield(game, source.getSourceId(), source.getControllerId()); - } + token.putOntoBattlefield(value, game, source.getSourceId(), source.getControllerId()); return true; } diff --git a/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java b/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java index 6b0c8f2fe50..d29c0bee69b 100644 --- a/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java +++ b/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java @@ -42,7 +42,7 @@ class LivingWeaponEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { GermToken token = new GermToken(); - token.putOntoBattlefield(game, source.getId(), source.getControllerId()); + token.putOntoBattlefield(1, game, source.getId(), source.getControllerId()); Permanent p = game.getPermanent(token.getLastAddedToken()); if (p != null) { p.addAttachment(source.getSourceId(), game); diff --git a/Mage/src/mage/game/events/GameEvent.java b/Mage/src/mage/game/events/GameEvent.java index 790a88c19f8..e553c71d83e 100644 --- a/Mage/src/mage/game/events/GameEvent.java +++ b/Mage/src/mage/game/events/GameEvent.java @@ -120,6 +120,7 @@ public class GameEvent { COUNTER_REMOVED, LOSE_CONTROL, LOST_CONTROL, GAIN_CONTROL, GAINED_CONTROL, + CREATE_TOKEN, //combat events COMBAT_DAMAGE_APPLIED, diff --git a/Mage/src/mage/game/permanent/token/Token.java b/Mage/src/mage/game/permanent/token/Token.java index e545e93d3b5..38310c70b9b 100644 --- a/Mage/src/mage/game/permanent/token/Token.java +++ b/Mage/src/mage/game/permanent/token/Token.java @@ -38,6 +38,8 @@ import mage.abilities.Abilities; import mage.abilities.Ability; import mage.cards.Card; import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.PermanentToken; @@ -86,16 +88,23 @@ public class Token extends MageObjectImpl { return new Token(this); } - public boolean putOntoBattlefield(Game game, UUID sourceId, UUID controllerId) { + public boolean putOntoBattlefield(int amount, Game game, UUID sourceId, UUID controllerId) { Card source = game.getCard(sourceId); String setCode = source != null ? source.getExpansionSetCode() : null; - PermanentToken permanent = new PermanentToken(this, controllerId, setCode); - game.getBattlefield().addPermanent(permanent); - this.lastAddedTokenId = permanent.getId(); - permanent.entersBattlefield(sourceId, game); - game.applyEffects(); - game.fireEvent(new ZoneChangeEvent(permanent, controllerId, Zone.OUTSIDE, Zone.BATTLEFIELD)); - return true; + GameEvent event = GameEvent.getEvent(EventType.CREATE_TOKEN, null, sourceId, controllerId, amount); + if (!game.replaceEvent(event)) { + amount = event.getAmount(); + for (int i = 0; i < amount; i++) { + PermanentToken permanent = new PermanentToken(this, controllerId, setCode); + game.getBattlefield().addPermanent(permanent); + this.lastAddedTokenId = permanent.getId(); + permanent.entersBattlefield(sourceId, game); + game.applyEffects(); + game.fireEvent(new ZoneChangeEvent(permanent, controllerId, Zone.OUTSIDE, Zone.BATTLEFIELD)); + } + return true; + } + return false; } }