From c91f1854eac0943a6191a209910f690c3ec4a6b7 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 5 May 2014 05:43:29 +0000 Subject: [PATCH] - Fix Premature Burial so it works when casting from other's hand --- .gitattributes | 2 + .../src/main/java/forge/ai/SpellApiToAi.java | 1 + .../java/forge/ai/ability/StoreMapAi.java | 21 +++++++++ .../main/java/forge/game/ability/ApiType.java | 1 + .../game/ability/effects/StoreMapEffect.java | 44 +++++++++++++++++++ .../src/main/java/forge/game/card/Card.java | 21 +++++++++ .../main/java/forge/view/FNavigationBar.java | 2 - .../res/cardsfolder/p/premature_burial.txt | 8 ++-- 8 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java create mode 100644 forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java diff --git a/.gitattributes b/.gitattributes index 4359bf126fe..e6c3fc2c62c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -129,6 +129,7 @@ forge-ai/src/main/java/forge/ai/ability/ScryAi.java -text forge-ai/src/main/java/forge/ai/ability/SetStateAi.java -text forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java -text forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java -text +forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java -text forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java -text forge-ai/src/main/java/forge/ai/ability/TapAi.java -text forge-ai/src/main/java/forge/ai/ability/TapAiBase.java -text @@ -396,6 +397,7 @@ forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java -text forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java -text forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java -text forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java -text +forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java -text forge-game/src/main/java/forge/game/ability/effects/StoreSVarEffect.java -text forge-game/src/main/java/forge/game/ability/effects/TapAllEffect.java -text forge-game/src/main/java/forge/game/ability/effects/TapEffect.java -text diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 63594f93907..9802f38d6fc 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -121,6 +121,7 @@ public enum SpellApiToAi { apiToClass.put(ApiType.SetState, SetStateAi.class); apiToClass.put(ApiType.Shuffle, ShuffleAi.class); apiToClass.put(ApiType.SkipTurn, SkipTurnAi.class); + apiToClass.put(ApiType.StoreMap, StoreMapAi.class); apiToClass.put(ApiType.StoreSVar, StoreSVarAi.class); apiToClass.put(ApiType.Tap, TapAi.class); apiToClass.put(ApiType.TapAll, TapAllAi.class); diff --git a/forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java b/forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java new file mode 100644 index 00000000000..6e15ae56cae --- /dev/null +++ b/forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java @@ -0,0 +1,21 @@ +package forge.ai.ability; + +import forge.ai.SpellAbilityAi; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; + +public class StoreMapAi extends SpellAbilityAi { + + @Override + protected boolean canPlayAI(Player ai, SpellAbility sa) { + + return true; + } + + @Override + protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { + + return true; + } + +} 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 cbfb75d8590..f8aa5c7e967 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -120,6 +120,7 @@ public enum ApiType { Shuffle (ShuffleEffect.class), SkipTurn (SkipTurnEffect.class), StoreSVar (StoreSVarEffect.class), + StoreMap (StoreMapEffect.class), Tap (TapEffect.class), TapAll (TapAllEffect.class), TapOrUntap (TapOrUntapEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java new file mode 100644 index 00000000000..e3641767a55 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java @@ -0,0 +1,44 @@ +package forge.game.ability.effects; + +import java.util.ArrayList; +import java.util.List; + +import forge.game.GameEntity; +import forge.game.ability.AbilityUtils; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +public class StoreMapEffect extends SpellAbilityEffect { + + @Override + public void resolve(SpellAbility sa) { + final Card source = sa.getHostCard(); + List entity = new ArrayList(); + List objects = new ArrayList(); + + if (sa.hasParam("RememberEntity")) { + entity.addAll(AbilityUtils.getDefinedPlayers(source, sa.getParam("RememberEntity"), sa)); + entity.addAll(AbilityUtils.getDefinedCards(source, sa.getParam("RememberEntity"), sa)); + } + + if (sa.hasParam("RememberObjects")) { + String type = sa.hasParam("ObjectType") ? sa.getParam("ObjectType") : "Card"; + if (type.equals("Card")) { + objects.addAll(AbilityUtils.getDefinedCards(source, sa.getParam("RememberObjects"), sa)); + } + } + + for (GameEntity e : entity) { + source.addRememberMap(e, objects); + } + + if (sa.hasParam("Clear")) { + for (GameEntity e : entity) { + source.getRememberMap().get(e).clear(); + } + } + + } + +} diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 47e4c6f9a6c..3457e94f8cc 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -53,10 +53,13 @@ import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.util.CollectionSuppliers; import forge.util.Expressions; import forge.util.Lang; import forge.util.MyRandom; import forge.util.TextUtil; +import forge.util.maps.HashMapOfLists; +import forge.util.maps.MapOfLists; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -115,6 +118,7 @@ public class Card extends GameEntity implements Comparable { private Map changedCardKeywords = new ConcurrentSkipListMap(); private final ArrayList rememberedObjects = new ArrayList(); + private final MapOfLists rememberMap = new HashMapOfLists(CollectionSuppliers.arrayLists()); private final ArrayList imprintedCards = new ArrayList(); private final ArrayList encodedCards = new ArrayList(); private final List devouredCards = new ArrayList(); @@ -512,6 +516,13 @@ public class Card extends GameEntity implements Comparable { return this.devouredCards; } + public final void addRememberMap(final GameEntity e, final List o) { + this.rememberMap.addAll(e, o); + } + public MapOfLists getRememberMap() { + return rememberMap; + } + /** *

* addRemembered. @@ -6711,6 +6722,16 @@ public class Card extends GameEntity implements Comparable { if (!this.getCharacteristics().getManaCost().hasPhyrexian()) { return false; } + } else if (property.startsWith("RememberMap")) { + System.out.println(source.getRememberMap()); + for (SpellAbility sa : source.getSpellAbilities()) { + for (Player p : AbilityUtils.getDefinedPlayers(source, property.split("RememberMap_")[1], sa)) { + if (source.getRememberMap().get(p).contains(this)) { + return true; + } + } + } + return false; } else if (property.equals("IsRemembered")) { if (!source.getRemembered().contains(this)) { return false; diff --git a/forge-gui-desktop/src/main/java/forge/view/FNavigationBar.java b/forge-gui-desktop/src/main/java/forge/view/FNavigationBar.java index 96018ec0d7e..a41ef03ccff 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FNavigationBar.java +++ b/forge-gui-desktop/src/main/java/forge/view/FNavigationBar.java @@ -5,9 +5,7 @@ import forge.gui.framework.FScreen; import forge.gui.framework.ILocalRepaint; import forge.menus.ForgeMenu; import forge.menus.LayoutMenu; -import forge.model.FModel; import forge.properties.ForgePreferences; -import forge.properties.ForgePreferences.FPref; import forge.toolbox.FButton; import forge.toolbox.FDigitalClock; import forge.toolbox.FSkin; diff --git a/forge-gui/res/cardsfolder/p/premature_burial.txt b/forge-gui/res/cardsfolder/p/premature_burial.txt index 782829c692c..e112c59bc7f 100644 --- a/forge-gui/res/cardsfolder/p/premature_burial.txt +++ b/forge-gui/res/cardsfolder/p/premature_burial.txt @@ -1,10 +1,10 @@ Name:Premature Burial ManaCost:1 B Types:Sorcery -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.IsRemembered | TgtPrompt$ Select target nonblack creature that entered the battlefield since your last turn ended | SpellDescription$ Destroy target nonblack creature that entered the battlefield since your last turn ended. +A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.RememberMap_You | TgtPrompt$ Select target nonblack creature that entered the battlefield since your last turn ended | SpellDescription$ Destroy target nonblack creature that entered the battlefield since your last turn ended. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonBlack | Static$ True | Execute$ TrigRemember -SVar:TrigRemember:DB$ Pump | RememberObjects$ TriggeredCard -T:Mode$ Phase | Phase$ Cleanup | ValidPlayer$ You | Execute$ TrigCleanup | Static$ True -SVar:TrigCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigRemember:DB$ StoreMap | RememberEntity$ Each | RememberObjects$ TriggeredCard | ObjectType$ Card +T:Mode$ Phase | Phase$ Cleanup | Execute$ TrigCleanup | Static$ True +SVar:TrigCleanup:DB$ StoreMap | RememberEntity$ TriggeredPlayer | Clear$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/premature_burial.jpg Oracle:Destroy target nonblack creature that entered the battlefield since your last turn ended.