diff --git a/forge-game/src/main/java/forge/game/GameSnapshot.java b/forge-game/src/main/java/forge/game/GameSnapshot.java index 4d4f5479157..2a0d0505e51 100644 --- a/forge-game/src/main/java/forge/game/GameSnapshot.java +++ b/forge-game/src/main/java/forge/game/GameSnapshot.java @@ -194,6 +194,7 @@ public class GameSnapshot { newPlayer.setLibrarySearched(origPlayer.getLibrarySearched()); newPlayer.setSpellsCastLastTurn(origPlayer.getSpellsCastLastTurn()); newPlayer.setCommitedCrimeThisTurn(origPlayer.getCommittedCrimeThisTurn()); + newPlayer.setExpentThisTurn(origPlayer.getExpentThisTurn()); for (int j = 0; j < origPlayer.getSpellsCastThisTurn(); j++) { newPlayer.addSpellCastThisTurn(); } 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 f5ea111c64a..cf2830637a7 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -101,6 +101,7 @@ public class Player extends GameEntity implements Comparable { private int lifeGainedTimesThisTurn; private int lifeGainedByTeamThisTurn; private int committedCrimeThisTurn; + private int expentThisTurn; private int numManaShards; private int numPowerSurgeLands; private int numLibrarySearchedOwn; //The number of times this player has searched his library @@ -2557,6 +2558,7 @@ public class Player extends GameEntity implements Comparable { setNumManaConversion(0); setCommitedCrimeThisTurn(0); + setExpentThisTurn(0); damageReceivedThisTurn.clear(); planeswalkedToThisTurn.clear(); @@ -3864,6 +3866,13 @@ public class Player extends GameEntity implements Comparable { committedCrimeThisTurn = v; } + public int getExpentThisTurn() { + return expentThisTurn; + } + public void setExpentThisTurn(int v) { + expentThisTurn = v; + } + public void visitAttractions(int light) { CardCollection attractions = CardLists.filter(getCardsIn(ZoneType.Battlefield), CardPredicates.isAttractionWithLight(light)); for (Card c : attractions) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerManaExpend.java b/forge-game/src/main/java/forge/game/trigger/TriggerManaExpend.java new file mode 100644 index 00000000000..ee784bf3336 --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerManaExpend.java @@ -0,0 +1,62 @@ +/* + * 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.game.trigger; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +import java.util.Map; + +/** + *

+ * TriggerManaExpend class. + *

+ * + * @author Forge + * @version $Id$ + */ +public class TriggerManaExpend extends Trigger { + public TriggerManaExpend(final Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} + * @param runParams*/ + @Override + public final boolean performTest(final Map runParams) { + if (!matchesValidParam("Player", runParams.get(AbilityKey.Player))) { + return false; + } + + int targetAmount = Integer.parseInt(mapParams.get("Amount")); + int actualAmount = (int) runParams.get(AbilityKey.Amount); + return targetAmount == actualAmount; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { + sa.setTriggeringObjectsFrom(runParams, AbilityKey.Amount, AbilityKey.Player); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + return sa.getTriggeringObject(AbilityKey.Player) + " expended " + sa.getTriggeringObject(AbilityKey.Amount) + " mana"; + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 219e7a8459a..869cfaeac6e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -1,11 +1,11 @@ package forge.game.trigger; +import forge.game.card.Card; + import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Map; -import forge.game.card.Card; - /** * TODO: Write javadoc for this type. @@ -95,6 +95,7 @@ public enum TriggerType { LifeLostAll(TriggerLifeLostAll.class), LosesGame(TriggerLosesGame.class), ManaAdded(TriggerManaAdded.class), + ManaExpend(TriggerManaExpend.class), Mentored(TriggerMentored.class), Milled(TriggerMilled.class), MilledOnce(TriggerMilledOnce.class), diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index f4fc1bc749d..56a83b1f6e5 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -353,6 +353,35 @@ public class MagicStack /* extends MyObservable */ implements Iterable expendPlayers = Maps.newHashMap(); + + for (Mana m : sp.getPayingMana()) { + // TODO this currently assumes that all mana came from your own pool + // but with Assist some might belong to another player instead + Player manaPayer = sp.getActivatingPlayer(); + + expendPlayers.put(manaPayer, expendPlayers.getOrDefault(manaPayer, 0) + 1); + } + + for (Entry entry : expendPlayers.entrySet()) { + Player manaPayer = entry.getKey(); + int startingMana = manaPayer.getExpentThisTurn(); + int totalMana = startingMana + entry.getValue(); + + if (totalMana == 0) { + continue; + } + + manaPayer.setExpentThisTurn(totalMana); + for(int i = startingMana + 1; i <= totalMana; i++) { + Map expendParams = AbilityKey.mapFromPlayer(manaPayer); + expendParams.put(AbilityKey.SpellAbility, sp); + expendParams.put(AbilityKey.Amount, i); + game.getTriggerHandler().runTrigger(TriggerType.ManaExpend, expendParams, true); + } + } } runParams.put(AbilityKey.Cost, sp.getPayCosts()); diff --git a/forge-gui/res/cardsfolder/upcoming/teapot_slinger.txt b/forge-gui/res/cardsfolder/upcoming/teapot_slinger.txt new file mode 100644 index 00000000000..e920f5a6ad4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/teapot_slinger.txt @@ -0,0 +1,8 @@ +Name:Teapot Slinger +ManaCost:3 R +Types:Creature Raccoon Warrior +PT:3/4 +K:Menace +T:Mode$ ManaExpend | Amount$ 4 | Player$ You | TriggerZones$ Battlefield | Execute$ DealDamage | TriggerDescription$ Whenever you expend 4, CARDNAME deals 2 damage to each opponent. +SVar:DealDamage:DB$ DealDamage | NumDmg$ 2 | Defined$ Opponent +Oracle:Menace\nWhenever you expend 4, Teapot Slinger deals 2 damage to each opponent. (You expend 4 as you spend your fourth total mana to cast spells during a turn.)