add new TriggerRevealed to use it for Miracle

This commit is contained in:
Hanmac
2016-12-06 06:32:02 +00:00
parent f0bc477319
commit 8968ea3382
5 changed files with 79 additions and 16 deletions

1
.gitattributes vendored
View File

@@ -721,6 +721,7 @@ forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java -text
forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java -text forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java -text
forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java -text forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java -text
forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java -text forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java -text
forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java -text svneol=unset#text/plain
forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java svneol=native#text/plain forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java svneol=native#text/plain
forge-game/src/main/java/forge/game/trigger/TriggerScry.java -text forge-game/src/main/java/forge/game/trigger/TriggerScry.java -text
forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java -text forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java -text

View File

@@ -9,25 +9,26 @@ import forge.game.card.CardCollectionView;
import forge.game.card.CardLists; import forge.game.card.CardLists;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.Aggregates; import forge.util.Aggregates;
import java.util.List; import java.util.List;
import java.util.Map;
import com.google.common.collect.Maps;
public class RevealEffect extends SpellAbilityEffect { public class RevealEffect extends SpellAbilityEffect {
@Override @Override
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
final Card host = sa.getHostCard(); final Card host = sa.getHostCard();
final Game game = host.getGame();
final boolean anyNumber = sa.hasParam("AnyNumber"); final boolean anyNumber = sa.hasParam("AnyNumber");
int cnt = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(host, sa.getParam("NumCards"), sa) : 1; int cnt = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(host, sa.getParam("NumCards"), sa) : 1;
final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : getTargetPlayers(sa)) { for (final Player p : getTargetPlayers(sa)) {
final Game game = p.getGame(); if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
if (tgt == null || p.canBeTargetedBy(sa)) {
final CardCollectionView cardsInHand = p.getZone(ZoneType.Hand).getCards(); final CardCollectionView cardsInHand = p.getZone(ZoneType.Hand).getCards();
if (cardsInHand.isEmpty()) { if (cardsInHand.isEmpty()) {
continue; continue;
@@ -71,10 +72,15 @@ public class RevealEffect extends SpellAbilityEffect {
} }
game.getAction().reveal(revealed, p); game.getAction().reveal(revealed, p);
for (final Card c : revealed) {
if (sa.hasParam("RememberRevealed")) { Map<String, Object> runParams = Maps.newHashMap();
for (final Card rem : revealed) { runParams.put("Card", c);
host.addRemembered(rem); if (sa.hasParam("MiracleCost")) {
runParams.put("Miracle", true);
}
game.getTriggerHandler().runTrigger(TriggerType.Revealed, runParams, false);
if (sa.hasParam("RememberRevealed")) {
host.addRemembered(c);
} }
} }
} }

View File

@@ -3027,18 +3027,29 @@ public class CardFactoryUtil {
} else if (keyword.startsWith("Miracle")) { } else if (keyword.startsWith("Miracle")) {
final String[] k = keyword.split(":"); final String[] k = keyword.split(":");
final String manacost = k[1]; final String manacost = k[1];
final String abStr = "DB$ Play | Defined$ Self | PlayCost$ " + manacost; final String abStrReveal = "DB$ Reveal | Defined$ You | RevealDefined$ Self | MiracleCost$ " + manacost;
final String abStrPlay = "DB$ Play | Defined$ Self | PlayCost$ " + manacost;
final String trigStr = "Mode$ Drawn | ValidCard$ Card.Self | Miracle$ True | Secondary$ True " final String trigStrDrawn = "Mode$ Drawn | ValidCard$ Card.Self | Miracle$ True | Secondary$ True"
+ "| Static$ True | TriggerDescription$ CARDNAME - Miracle"; + " | OptionalDecider$ You | Static$ True | TriggerDescription$ CARDNAME - Miracle";
final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); final String trigStrRevealed = "Mode$ Revealed | ValidCard$ Card.Self | Miracle$ True"
+ " | IsPresent$ Card.Self | PresentZone$ Hand | Secondary$ True"
+ " | TriggerDescription$ CARDNAME - Miracle";
trigger.setOverridingAbility(AbilityFactory.getAbility(abStr, card)); final Trigger triggerDrawn = TriggerHandler.parseTrigger(trigStrDrawn, card, intrinsic);
final Trigger cardTrigger = card.addTrigger(trigger); triggerDrawn.setOverridingAbility(AbilityFactory.getAbility(abStrReveal, card));
final Trigger triggerRevealed = TriggerHandler.parseTrigger(trigStrRevealed, card, intrinsic);
triggerRevealed.setOverridingAbility(AbilityFactory.getAbility(abStrPlay, card));
final Trigger cardTriggerDrawn = card.addTrigger(triggerDrawn);
final Trigger cardTriggerRevealed = card.addTrigger(triggerRevealed);
if (!intrinsic) { if (!intrinsic) {
kws.addTrigger(cardTrigger); kws.addTrigger(cardTriggerDrawn);
kws.addTrigger(cardTriggerRevealed);
} }
} else if (keyword.startsWith("Modular")) { } else if (keyword.startsWith("Modular")) {
final String abStr = "AB$ PutCounter | Cost$ 0 | ValidTgts$ Artifact.Creature | " + final String abStr = "AB$ PutCounter | Cost$ 0 | ValidTgts$ Artifact.Creature | " +

View File

@@ -0,0 +1,44 @@
package forge.game.trigger;
import java.util.Map;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
public class TriggerRevealed extends Trigger {
public TriggerRevealed(Map<String, String> params, Card host, boolean intrinsic) {
super(params, host, intrinsic);
}
@Override
public boolean performTest(Map<String, Object> runParams2) {
if (this.mapParams.containsKey("ValidCard")) {
final Card moved = (Card) runParams2.get("Card");
if (!moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(),
this.getHostCard(), null)) {
return false;
}
}
if (this.mapParams.containsKey("Miracle")) {
Boolean madness = (Boolean) runParams2.get("Miracle");
if (this.mapParams.get("Miracle").equals("True") ^ madness) {
return false;
}
}
return true;
}
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Revealed: ").append(sa.getTriggeringObject("Card"));
return sb.toString();
}
}

View File

@@ -62,6 +62,7 @@ public enum TriggerType {
PlanarDice(TriggerPlanarDice.class), PlanarDice(TriggerPlanarDice.class),
PlaneswalkedFrom(TriggerPlaneswalkedFrom.class), PlaneswalkedFrom(TriggerPlaneswalkedFrom.class),
PlaneswalkedTo(TriggerPlaneswalkedTo.class), PlaneswalkedTo(TriggerPlaneswalkedTo.class),
Revealed(TriggerRevealed.class),
Sacrificed(TriggerSacrificed.class), Sacrificed(TriggerSacrificed.class),
Scry(TriggerScry.class), Scry(TriggerScry.class),
SearchedLibrary(TriggerSearchedLibrary.class), SearchedLibrary(TriggerSearchedLibrary.class),