From 35d8ea09492b7963c51a40607bcbd8c5aeefd373 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 13 Feb 2014 05:13:14 +0000 Subject: [PATCH] - Added Daxos of Meletis and Psychic Intrusion (only updated mana color conversion for human players) --- .gitattributes | 2 ++ .../src/main/java/forge/ai/ComputerUtil.java | 4 +-- .../java/forge/game/ability/AbilityUtils.java | 29 +++++++++++++++++++ .../StaticAbilityContinuous.java | 28 +----------------- .../res/cardsfolder/d/daxos_of_meletis.txt | 19 ++++++++++++ .../res/cardsfolder/p/psychic_intrusion.txt | 13 +++++++++ .../gui/player/HumanPlaySpellAbility.java | 19 ++++++++++++ 7 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 forge-gui/res/cardsfolder/d/daxos_of_meletis.txt create mode 100644 forge-gui/res/cardsfolder/p/psychic_intrusion.txt diff --git a/.gitattributes b/.gitattributes index eb0ad25f3af..5d4e0d2d827 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3219,6 +3219,7 @@ forge-gui/res/cardsfolder/d/dawns_reflection.txt -text forge-gui/res/cardsfolder/d/dawnstrider.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/dawnstrike_paladin.txt -text forge-gui/res/cardsfolder/d/dawntreader_elk.txt -text +forge-gui/res/cardsfolder/d/daxos_of_meletis.txt -text forge-gui/res/cardsfolder/d/day_of_destiny.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/day_of_judgment.txt svneol=native#text/plain forge-gui/res/cardsfolder/d/day_of_the_dragons.txt svneol=native#text/plain @@ -9433,6 +9434,7 @@ forge-gui/res/cardsfolder/p/psychatog.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/psychic_allergy.txt -text forge-gui/res/cardsfolder/p/psychic_barrier.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/psychic_drain.txt svneol=native#text/plain +forge-gui/res/cardsfolder/p/psychic_intrusion.txt -text forge-gui/res/cardsfolder/p/psychic_membrane.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/psychic_miasma.txt -text svneol=unset#text/plain forge-gui/res/cardsfolder/p/psychic_overload.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index f5f24175f0c..3e76c3a237f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -91,7 +91,7 @@ public class ComputerUtil { } final Cost cost = sa.getPayCosts(); - + // TODO: update mana color conversion for Daxos of Meletis if (cost == null) { if (ComputerUtilMana.payManaCost(ai, sa)) { game.getStack().addAndUnfreeze(sa); @@ -105,8 +105,6 @@ public class ComputerUtil { game.getAction().reveal(sa.getSplicedCards(), ai, true, "Computer reveals spliced cards from "); } return true; - // TODO: solve problems with TapsForMana triggers by adding - // sources tapped here if possible (ArsenalNut) } } //Should not arrive here diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 867e10b300e..db8090e3a6a 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1,6 +1,7 @@ package forge.game.ability; import com.google.common.collect.Iterables; + import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; @@ -15,10 +16,13 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.zone.ZoneType; import forge.util.Expressions; + import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.text.WordUtils; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * TODO: Write javadoc for this type. @@ -1354,4 +1358,29 @@ public class AbilityUtils { } return CardFactoryUtil.xCount(c, s); } + + public static final void applyManaColorConvertion(final Player p, final Map params) { + String conversionType = params.get("ManaColorConversion"); + + // Choices are Additives(OR) or Restrictive(AND) + boolean additive = "Additive".equals(conversionType); + + for(String c : MagicColor.Constant.COLORS_AND_COLORLESS) { + // Use the strings from MagicColor, since that's how the Script will be coming in as + String key = WordUtils.capitalize(c) + "Conversion"; + if (params.containsKey(key)) { + String convertTo = params.get(key); + byte convertByte = 0; + if ("All".equals(convertTo)) { + convertByte = MagicColor.ALL_COLORS; + } else{ + for(String convertColor : convertTo.split(",")) { + convertByte |= MagicColor.fromName(convertColor); + } + } + // AdjustColorReplacement has two different matrices handling final mana conversion under the covers + p.getManaPool().adjustColorReplacement(MagicColor.fromName(c), convertByte, additive); + } + } + } } 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 531faa313c4..417c32ab309 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -20,7 +20,6 @@ package forge.game.staticability; import com.google.common.collect.Lists; import forge.card.CardType; import forge.card.ColorSet; -import forge.card.MagicColor; import forge.card.mana.ManaCostShard; import forge.game.*; import forge.game.ability.AbilityFactory; @@ -29,7 +28,6 @@ import forge.game.card.Card; import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardUtil; -import forge.game.mana.ManaPool; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; @@ -39,8 +37,6 @@ import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; import forge.game.zone.ZoneType; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; - import java.util.*; /** @@ -341,29 +337,7 @@ public class StaticAbilityContinuous { } if (params.containsKey("ManaColorConversion")) { - String conversionType = params.get("ManaColorConversion"); - - // Choices are Additives(OR) or Restrictive(AND) - boolean additive = "Additive".equals(conversionType); - ManaPool pool = p.getManaPool(); - - for(String c : MagicColor.Constant.COLORS_AND_COLORLESS) { - // Use the strings from MagicColor, since that's how the Script will be coming in as - String key = WordUtils.capitalize(c) + "Conversion"; - if (params.containsKey(key)) { - String convertTo = params.get(key); - byte convertByte = 0; - if ("All".equals(convertTo)) { - convertByte = MagicColor.ALL_COLORS; - } else{ - for(String convertColor : convertTo.split(",")) { - convertByte |= MagicColor.fromName(convertColor); - } - } - // AdjustColorReplacement has two different matrices handling final mana conversion under the covers - pool.adjustColorReplacement(MagicColor.fromName(c), convertByte, additive); - } - } + AbilityUtils.applyManaColorConvertion(p, params); } } diff --git a/forge-gui/res/cardsfolder/d/daxos_of_meletis.txt b/forge-gui/res/cardsfolder/d/daxos_of_meletis.txt new file mode 100644 index 00000000000..851f27f7803 --- /dev/null +++ b/forge-gui/res/cardsfolder/d/daxos_of_meletis.txt @@ -0,0 +1,19 @@ +Name:Daxos of Meletis +ManaCost:1 W U +Types:Legendary Creature Human Soldier +PT:2/2 +K:CantBeBlockedBy Creature.powerGE3 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile the top card of that player's library. You gain life equal to that card's converted mana cost. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. +SVar:TrigExile:AB$ Mill | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 1 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBEffect +SVar:X:Remembered$CardManaCost +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay,STPlay2 | Triggers$ TriggerCastDoM | SVars$ TrigRemoveSelf,DoM | RememberObjects$ Remembered | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand+YouOwn | AddSVar$ DoM | AddHiddenKeyword$ May be played & May spend mana as though it were mana of any color to cast CARDNAME | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. +SVar:STPlay2:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand+OppOwn | AddSVar$ DoM | AddHiddenKeyword$ May be played by your opponent & May spend mana as though it were mana of any color to cast CARDNAME | AffectedZone$ Exile +SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Execute$ TrigRemoveSelf | Static$ True +SVar:TrigRemoveSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DoM:SVar:ManaConversionMatrix:ManaColorConversion$ Additive | WhiteConversion$ All | BlueConversion$ All | BlackConversion$ All | RedConversion$ All | GreenConversion$ All | ColorlessConversion$ All +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/daxos_of_meletis.jpg +Oracle:Daxos of Meletis can't be blocked by creatures with power 3 or greater.\nWhenever Daxos of Meletis deals combat damage to a player, exile the top card of that player's library. You gain life equal to that card's converted mana cost. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. diff --git a/forge-gui/res/cardsfolder/p/psychic_intrusion.txt b/forge-gui/res/cardsfolder/p/psychic_intrusion.txt new file mode 100644 index 00000000000..6d6220b6bff --- /dev/null +++ b/forge-gui/res/cardsfolder/p/psychic_intrusion.txt @@ -0,0 +1,13 @@ +Name:Psychic Intrusion +ManaCost:3 U B +Types:Sorcery +A:SP$ ChangeZone | Cost$ 3 U B | Origin$ Hand,Graveyard | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Target opponent reveals his or her hand. You choose a nonland card from that player's graveyard or hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell. +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastPI | SVars$ TrigRemoveSelf,ManaConversionPI | RememberObjects$ Remembered | Duration$ Permanent | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered+OppOwn | AddSVar$ ManaConversionPI | AddHiddenKeyword$ May be played by your opponent & May spend mana as though it were mana of any color to cast CARDNAME | AffectedZone$ Exile | Description$ You may cast that card and you may spend mana as though it were mana of any color to cast it. +SVar:TriggerCastPI:Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Execute$ TrigRemoveSelf | Static$ True +SVar:TrigRemoveSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:ManaConversionPI:SVar:ManaConversionMatrix:ManaColorConversion$ Additive | WhiteConversion$ All | BlueConversion$ All | BlackConversion$ All | RedConversion$ All | GreenConversion$ All | ColorlessConversion$ All +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_intrusion.jpg +Oracle:Target opponent reveals his or her hand. You choose a nonland card from that player's graveyard or hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell. diff --git a/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java index 72625505e85..0157731e16a 100644 --- a/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java @@ -18,13 +18,16 @@ package forge.gui.player; import com.google.common.collect.Iterables; + import forge.card.CardType; import forge.game.Game; import forge.game.GameObject; +import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.cost.CostPartMana; import forge.game.cost.CostPayment; +import forge.game.mana.ManaPool; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.game.spellability.AbilitySub; @@ -32,9 +35,11 @@ import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.Zone; + import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; +import java.util.Map; /** *

@@ -60,8 +65,13 @@ public class HumanPlaySpellAbility { // used to rollback Zone fromZone = null; int zonePosition = 0; + final ManaPool manapool = human.getManaPool(); final Card c = this.ability.getHostCard(); + boolean manaConversion = (ability.isSpell() && c.hasKeyword("May spend mana as though it were mana of any color to cast CARDNAME")); + + Map params = AbilityFactory.getMapParams(c.getSVar("ManaConversionMatrix")); + if (this.ability instanceof Spell && !c.isCopiedSpell()) { fromZone = game.getZoneOf(c); if (fromZone != null) { @@ -73,6 +83,9 @@ public class HumanPlaySpellAbility { // freeze Stack. No abilities should go onto the stack while I'm filling requirements. game.getStack().freezeStack(); + if (manaConversion) { + AbilityUtils.applyManaColorConvertion(human, params); + } // This line makes use of short-circuit evaluation of boolean values, that is each subsequent argument // is only executed or evaluated if the first argument does not suffice to determine the value of the expression boolean prerequisitesMet = this.announceValuesLikeX() @@ -91,6 +104,9 @@ public class HumanPlaySpellAbility { ability.getHostCard().unanimateBestow(); } } + if (manaConversion) { + manapool.restoreColorReplacements(); + } return; } @@ -109,6 +125,9 @@ public class HumanPlaySpellAbility { if (mayChooseTargets) { clearTargets(ability); } + if (manaConversion) { + manapool.restoreColorReplacements(); + } } }