- Fix Premature Burial so it works when casting from other's hand

This commit is contained in:
swordshine
2014-05-05 05:43:29 +00:00
parent 429c340166
commit c91f1854ea
8 changed files with 94 additions and 6 deletions

2
.gitattributes vendored
View File

@@ -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/SetStateAi.java -text
forge-ai/src/main/java/forge/ai/ability/ShuffleAi.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/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/StoreSVarAi.java -text
forge-ai/src/main/java/forge/ai/ability/TapAi.java -text forge-ai/src/main/java/forge/ai/ability/TapAi.java -text
forge-ai/src/main/java/forge/ai/ability/TapAiBase.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/SetStateEffect.java -text
forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.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/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/StoreSVarEffect.java -text
forge-game/src/main/java/forge/game/ability/effects/TapAllEffect.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 forge-game/src/main/java/forge/game/ability/effects/TapEffect.java -text

View File

@@ -121,6 +121,7 @@ public enum SpellApiToAi {
apiToClass.put(ApiType.SetState, SetStateAi.class); apiToClass.put(ApiType.SetState, SetStateAi.class);
apiToClass.put(ApiType.Shuffle, ShuffleAi.class); apiToClass.put(ApiType.Shuffle, ShuffleAi.class);
apiToClass.put(ApiType.SkipTurn, SkipTurnAi.class); apiToClass.put(ApiType.SkipTurn, SkipTurnAi.class);
apiToClass.put(ApiType.StoreMap, StoreMapAi.class);
apiToClass.put(ApiType.StoreSVar, StoreSVarAi.class); apiToClass.put(ApiType.StoreSVar, StoreSVarAi.class);
apiToClass.put(ApiType.Tap, TapAi.class); apiToClass.put(ApiType.Tap, TapAi.class);
apiToClass.put(ApiType.TapAll, TapAllAi.class); apiToClass.put(ApiType.TapAll, TapAllAi.class);

View File

@@ -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;
}
}

View File

@@ -120,6 +120,7 @@ public enum ApiType {
Shuffle (ShuffleEffect.class), Shuffle (ShuffleEffect.class),
SkipTurn (SkipTurnEffect.class), SkipTurn (SkipTurnEffect.class),
StoreSVar (StoreSVarEffect.class), StoreSVar (StoreSVarEffect.class),
StoreMap (StoreMapEffect.class),
Tap (TapEffect.class), Tap (TapEffect.class),
TapAll (TapAllEffect.class), TapAll (TapAllEffect.class),
TapOrUntap (TapOrUntapEffect.class), TapOrUntap (TapOrUntapEffect.class),

View File

@@ -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<GameEntity> entity = new ArrayList<GameEntity>();
List<Object> objects = new ArrayList<Object>();
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();
}
}
}
}

View File

@@ -53,10 +53,13 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.CollectionSuppliers;
import forge.util.Expressions; import forge.util.Expressions;
import forge.util.Lang; import forge.util.Lang;
import forge.util.MyRandom; import forge.util.MyRandom;
import forge.util.TextUtil; 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.StringUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@@ -115,6 +118,7 @@ public class Card extends GameEntity implements Comparable<Card> {
private Map<Long, CardKeywords> changedCardKeywords = new ConcurrentSkipListMap<Long, CardKeywords>(); private Map<Long, CardKeywords> changedCardKeywords = new ConcurrentSkipListMap<Long, CardKeywords>();
private final ArrayList<Object> rememberedObjects = new ArrayList<Object>(); private final ArrayList<Object> rememberedObjects = new ArrayList<Object>();
private final MapOfLists<GameEntity, Object> rememberMap = new HashMapOfLists<GameEntity, Object>(CollectionSuppliers.<Object>arrayLists());
private final ArrayList<Card> imprintedCards = new ArrayList<Card>(); private final ArrayList<Card> imprintedCards = new ArrayList<Card>();
private final ArrayList<Card> encodedCards = new ArrayList<Card>(); private final ArrayList<Card> encodedCards = new ArrayList<Card>();
private final List<Card> devouredCards = new ArrayList<Card>(); private final List<Card> devouredCards = new ArrayList<Card>();
@@ -512,6 +516,13 @@ public class Card extends GameEntity implements Comparable<Card> {
return this.devouredCards; return this.devouredCards;
} }
public final void addRememberMap(final GameEntity e, final List<Object> o) {
this.rememberMap.addAll(e, o);
}
public MapOfLists<GameEntity, Object> getRememberMap() {
return rememberMap;
}
/** /**
* <p> * <p>
* addRemembered. * addRemembered.
@@ -6711,6 +6722,16 @@ public class Card extends GameEntity implements Comparable<Card> {
if (!this.getCharacteristics().getManaCost().hasPhyrexian()) { if (!this.getCharacteristics().getManaCost().hasPhyrexian()) {
return false; 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")) { } else if (property.equals("IsRemembered")) {
if (!source.getRemembered().contains(this)) { if (!source.getRemembered().contains(this)) {
return false; return false;

View File

@@ -5,9 +5,7 @@ import forge.gui.framework.FScreen;
import forge.gui.framework.ILocalRepaint; import forge.gui.framework.ILocalRepaint;
import forge.menus.ForgeMenu; import forge.menus.ForgeMenu;
import forge.menus.LayoutMenu; import forge.menus.LayoutMenu;
import forge.model.FModel;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.toolbox.FButton; import forge.toolbox.FButton;
import forge.toolbox.FDigitalClock; import forge.toolbox.FDigitalClock;
import forge.toolbox.FSkin; import forge.toolbox.FSkin;

View File

@@ -1,10 +1,10 @@
Name:Premature Burial Name:Premature Burial
ManaCost:1 B ManaCost:1 B
Types:Sorcery 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 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonBlack | Static$ True | Execute$ TrigRemember
SVar:TrigRemember:DB$ Pump | RememberObjects$ TriggeredCard SVar:TrigRemember:DB$ StoreMap | RememberEntity$ Each | RememberObjects$ TriggeredCard | ObjectType$ Card
T:Mode$ Phase | Phase$ Cleanup | ValidPlayer$ You | Execute$ TrigCleanup | Static$ True T:Mode$ Phase | Phase$ Cleanup | Execute$ TrigCleanup | Static$ True
SVar:TrigCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TrigCleanup:DB$ StoreMap | RememberEntity$ TriggeredPlayer | Clear$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/premature_burial.jpg 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. Oracle:Destroy target nonblack creature that entered the battlefield since your last turn ended.