From a44c27aae57c70510c84f3fc0c1a331ce0e17f4c Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 13 Mar 2014 11:09:10 +0000 Subject: [PATCH] - Added Dakkon Blackblade Avatar --- .gitattributes | 2 + .../src/main/java/forge/ai/SpellApiToAi.java | 1 + .../main/java/forge/game/ability/ApiType.java | 1 + .../effects/PlayLandVariantEffect.java | 101 ++++++++++++++++++ .../main/java/forge/game/player/Player.java | 3 +- .../StaticAbilityContinuous.java | 2 +- .../d/dakkon_blackblade_avatar.txt | 9 ++ 7 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java create mode 100644 forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt diff --git a/.gitattributes b/.gitattributes index 4c6f091aede..8d6596b0ef5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -362,6 +362,7 @@ forge-game/src/main/java/forge/game/ability/effects/PermanentNoncreatureEffect.j forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java -text forge-game/src/main/java/forge/game/ability/effects/PlaneswalkEffect.java -text forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java -text +forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java -text forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java -text forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java -text forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java -text @@ -3108,6 +3109,7 @@ forge-gui/res/cardsfolder/d/daggerclaw_imp.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/daggerdrome_imp.txt -text forge-gui/res/cardsfolder/d/daily_regimen.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/dakkon_blackblade.txt svneol=native#text/plain +forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt -text forge-gui/res/cardsfolder/d/dakmor_bat.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/dakmor_ghoul.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/dakmor_lancer.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 8976caaed69..54b3d1ee808 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -87,6 +87,7 @@ public enum SpellApiToAi { apiToClass.put(ApiType.Phases, PhasesAi.class); apiToClass.put(ApiType.Planeswalk, AlwaysPlayAi.class); apiToClass.put(ApiType.Play, PlayAi.class); + apiToClass.put(ApiType.PlayLandVariant, CannotPlayAi.class); apiToClass.put(ApiType.Poison, PoisonAi.class); apiToClass.put(ApiType.PreventDamage, DamagePreventAi.class); apiToClass.put(ApiType.PreventDamageAll, DamagePreventAllAi.class); diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index f70746cc128..583d5a8271b 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -85,6 +85,7 @@ public enum ApiType { Phases (PhasesEffect.class), Planeswalk (PlaneswalkEffect.class), Play (PlayEffect.class), + PlayLandVariant (PlayLandVariantEffect.class), Poison (PoisonEffect.class), PreventDamage (DamagePreventEffect.class), PreventDamageAll (DamagePreventAllEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java new file mode 100644 index 00000000000..c1f78f255ce --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java @@ -0,0 +1,101 @@ +package forge.game.ability.effects; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +import forge.StaticData; +import forge.card.CardCharacteristicName; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.MagicColor; +import forge.game.Game; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.card.CardFactory; +import forge.game.card.CardUtil; +import forge.game.event.GameEventLandPlayed; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; +import forge.item.PaperCard; +import forge.util.Aggregates; + +public class PlayLandVariantEffect extends SpellAbilityEffect { + + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility) + */ + @Override + public void resolve(SpellAbility sa) { + Card source = sa.getHostCard(); + Player activator = sa.getActivatingPlayer(); + final Game game = source.getGame(); + final String landType = sa.getParam("Clone"); + List cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); + if ("BasicLand".equals(landType)) { + Predicate cpp = Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard.FN_GET_RULES); + cards = Lists.newArrayList(Iterables.filter(cards, cpp)); + } + // current color of source card + ColorSet color = CardUtil.getColors(source); + if (color.isColorless()) { + return; + } + // find basic lands that can produce mana of one of the card's colors + final List landnames = new ArrayList(); + for (byte i = 0; i < MagicColor.WUBRG.length; i++) { + if (color.hasAnyColor(MagicColor.WUBRG[i])) { + landnames.add(MagicColor.Constant.BASIC_LANDS.get(i)); + } + } + Predicate cp = Predicates.compose(new Predicate() { + @Override + public boolean apply(final String name) { + return landnames.contains(name); + } + }, PaperCard.FN_GET_NAME); + cards = Lists.newArrayList(Iterables.filter(cards, cp)); + // get a random basic land + PaperCard ran = Aggregates.random(cards); + Card random = CardFactory.getCard(ran, activator); + // if activator cannot play the random land, loop + while (!activator.canPlayLand(random, false) && !cards.isEmpty()) { + cards.remove(ran); + if (cards.isEmpty()) return; + ran = Aggregates.random(cards); + random = CardFactory.getCard(ran, activator); + } + + String imageFileName = game.getRules().canCloneUseTargetsImage ? source.getImageKey() : random.getImageKey(); + source.addAlternateState(CardCharacteristicName.Cloner); + source.switchStates(CardCharacteristicName.Original, CardCharacteristicName.Cloner); + source.setState(CardCharacteristicName.Original); + CardCharacteristicName stateToCopy = random.getCurState(); + CardFactory.copyState(random, stateToCopy, source); + source.setImageKey(imageFileName); + + source.setController(activator, 0); + game.getAction().moveTo(activator.getZone(ZoneType.Battlefield), source); + + // play a sound + game.fireEvent(new GameEventLandPlayed(activator, source)); + + // Run triggers + final HashMap runParams = new HashMap(); + runParams.put("Card", source); + game.getTriggerHandler().runTrigger(TriggerType.LandPlayed, runParams, false); + game.getStack().unfreezeStack(); + activator.setNumLandsPlayed(activator.getNumLandsPlayed() + 1); + + + } + +} diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index d74c90b4f1c..dbaf9b18a3e 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1732,6 +1732,7 @@ public class Player extends GameEntity implements Comparable { * a {@link forge.game.card.Card} object. */ public final boolean playLand(final Card land, final boolean ignoreZoneAndTiming) { + // Dakkon Blackblade Avatar will use a similar effect if (this.canPlayLand(land, ignoreZoneAndTiming)) { land.setController(this, 0); game.getAction().moveTo(this.getZone(ZoneType.Battlefield), land); @@ -1793,7 +1794,7 @@ public class Player extends GameEntity implements Comparable { return false; final Zone zone = game.getZoneOf(land); - if(zone.is(ZoneType.Battlefield) || (!zone.is(ZoneType.Hand) && !land.hasStartOfKeyword("May be played"))) { + if (zone != null && (zone.is(ZoneType.Battlefield) || (!zone.is(ZoneType.Hand) && !land.hasStartOfKeyword("May be played")))) { return false; } } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 82241011822..eae5f2ddc5c 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -450,7 +450,7 @@ public class StaticAbilityContinuous { final String costcmc = Integer.toString(affectedCard.getCMC()); abilty = abilty.replace("ConvertedManaCost", costcmc); } - if (abilty.startsWith("AB")) { // grant the ability + if (abilty.startsWith("AB") || abilty.startsWith("ST")) { // grant the ability final SpellAbility sa = AbilityFactory.getAbility(abilty, affectedCard); sa.setTemporary(true); sa.setIntrinsic(false); diff --git a/forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt b/forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt new file mode 100644 index 00000000000..2cbd9a32d2b --- /dev/null +++ b/forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt @@ -0,0 +1,9 @@ +Name:Dakkon Blackblade Avatar +ManaCost:no cost +Types:Vanguard +HandLifeModifier:+1/+0 +S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Hand | Affected$ Card.nonColorless+YouOwn | AddAbility$ STPlayLand | Description$ You may play any colored card from your hand as a copy of a basic land card chosen at random that can produce mana of one of the card's colors. +SVar:STPlayLand:ST$ PlayLandVariant | Cost$ 0 | Clone$ BasicLand | SorcerySpeed$ True | ActivationZone$ Hand | SpellDescription$ Play CARDNAME from your hand as a copy of a basic land card chosen at random that can produce mana of one of CARDNAME's colors. +SVar:RemAIDeck:True +SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/dakkon_blackblade_avatar.jpg +Oracle:Hand +1, life +0\nYou may play any colored card from your hand as a copy of a basic land card chosen at random that can produce mana of one of the card's colors.