mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Rebound: make it a ReplacementEffect as it should be
check for Fizzle in ReplaceMoved, so it only works when it resolved from Stack
This commit is contained in:
@@ -71,7 +71,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
|
||||
}
|
||||
}
|
||||
|
||||
if (mapParams.containsKey("Execute")) {
|
||||
if (mapParams.containsKey("Execute") || sa.hasAdditonalAbility("Execute")) {
|
||||
SpellAbility overridingSA = sa.getAdditonalAbility("Execute");
|
||||
overridingSA.setActivatingPlayer(sa.getActivatingPlayer());
|
||||
overridingSA.setDeltrigActivatingPlayer(sa.getActivatingPlayer()); // ensure that the original activator can be restored later
|
||||
|
||||
@@ -2124,7 +2124,7 @@ public class Card extends GameEntity implements Comparable<Card> {
|
||||
sb.delete(sb.lastIndexOf("\r\n"), sb.lastIndexOf("\r\n") + 3);
|
||||
}
|
||||
sb.append("Remove CARDNAME from your deck before playing if you're not playing for ante.\r\n");
|
||||
} else if (keyword.equals("Rebound") || keyword.equals("Retrace") || keyword.equals("Changeling")) {
|
||||
} else if (keyword.equals("Retrace") || keyword.equals("Changeling")) {
|
||||
sb.append(keyword + " (" + Keyword.getInstance(keyword).getReminderText() + ")");
|
||||
} else if (keyword.startsWith("Presence")) {
|
||||
sb.append(Keyword.getInstance(keyword).getReminderText());
|
||||
|
||||
@@ -2195,6 +2195,9 @@ public class CardFactoryUtil {
|
||||
else if (keyword.equals("Persist")) {
|
||||
addTriggerAbility(keyword, card, null);
|
||||
}
|
||||
else if (keyword.equals("Rebound")) {
|
||||
addReplacementEffect(keyword, card, null);
|
||||
}
|
||||
else if (keyword.equals("Undying")) {
|
||||
addTriggerAbility(keyword, card, null);
|
||||
}
|
||||
@@ -3497,6 +3500,42 @@ public class CardFactoryUtil {
|
||||
if (!intrinsic) {
|
||||
kws.addReplacement(re);
|
||||
}
|
||||
} else if (keyword.equals("Rebound")) {
|
||||
String repeffstr = "Event$ Moved | ValidCard$ Card.Self+wasCastFromHand+YouOwn+YouCtrl "
|
||||
+ " | Origin$ Stack | Destination$ Graveyard | Fizzle$ False "
|
||||
+ " | Description$ " + Keyword.REBOUND.getDescription();
|
||||
|
||||
String abExile = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile";
|
||||
String delTrig = "DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You " +
|
||||
" | OptionalDecider$ You | RememberObjects$ Self | TriggerDescription$"
|
||||
+ " At the beginning of your next upkeep, you may cast " + card.toString() + " without paying it's manacost.";
|
||||
// TODO add check for still in exile
|
||||
String abPlay = "DB$ Play | Defined$ Self | WithoutManaCost$ True | Optional$ True";
|
||||
|
||||
SpellAbility saExile = AbilityFactory.getAbility(abExile, card);
|
||||
|
||||
final AbilitySub delsub = (AbilitySub) AbilityFactory.getAbility(delTrig, card);
|
||||
|
||||
final AbilitySub saPlay = (AbilitySub) AbilityFactory.getAbility(abPlay, card);
|
||||
|
||||
delsub.setAdditionalAbility("Execute", saPlay);
|
||||
|
||||
saExile.setSubAbility(delsub);
|
||||
|
||||
if (!intrinsic) {
|
||||
saExile.setIntrinsic(false);
|
||||
}
|
||||
|
||||
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, card, intrinsic);
|
||||
re.setLayer(ReplacementLayer.Other);
|
||||
|
||||
re.setOverridingAbility(saExile);
|
||||
|
||||
ReplacementEffect cardre = card.addReplacementEffect(re);
|
||||
|
||||
if (!intrinsic) {
|
||||
kws.addReplacement(cardre);
|
||||
}
|
||||
} else if (keyword.equals("Unleash")) {
|
||||
String effect = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Unleash (" + Keyword.getInstance(keyword).getReminderText() + ")";
|
||||
|
||||
|
||||
@@ -84,6 +84,17 @@ public class ReplaceMoved extends ReplacementEffect {
|
||||
}
|
||||
}
|
||||
|
||||
if (hasParam("Fizzle")) {
|
||||
// if Replacement look for Fizzle
|
||||
if (!runParams.containsKey("Fizzle")) {
|
||||
return false;
|
||||
}
|
||||
Boolean val = (Boolean) runParams.get("Fizzle");
|
||||
if ("True".equals(getParam("Fizzle")) != val) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasParam("Cause")) {
|
||||
if (!runParams.containsKey("Cause")) {
|
||||
return false;
|
||||
|
||||
@@ -595,26 +595,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
else if (sa.isAftermath()) {
|
||||
game.getAction().exile(source, sa, Maps.newHashMap());
|
||||
}
|
||||
else if (source.hasKeyword("Rebound")
|
||||
&& !fizzle
|
||||
&& source.getCastFrom() == ZoneType.Hand
|
||||
&& game.getZoneOf(source).is(ZoneType.Stack)
|
||||
&& source.getOwner().equals(source.getController())) //"If you cast this spell from your hand"
|
||||
{
|
||||
//Move rebounding card to exile
|
||||
source = game.getAction().exile(source, null, Maps.newHashMap());
|
||||
|
||||
source.setSVar("ReboundAbilityTrigger", "DB$ Play | Defined$ Self "
|
||||
+ "| WithoutManaCost$ True | Optional$ True");
|
||||
|
||||
//Setup a Rebound-trigger
|
||||
final Trigger reboundTrigger = forge.game.trigger.TriggerHandler.parseTrigger("Mode$ Phase "
|
||||
+ "| Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | Execute$ ReboundAbilityTrigger "
|
||||
+ "| TriggerDescription$ At the beginning of your next upkeep, you may cast " + source.toString()
|
||||
+ " without paying it's manacost.", source, true);
|
||||
|
||||
game.getTriggerHandler().registerDelayedTrigger(reboundTrigger);
|
||||
}
|
||||
else if (!source.isCopiedSpell() &&
|
||||
(source.isInstant() || source.isSorcery() || fizzle) &&
|
||||
source.isInZone(ZoneType.Stack)) {
|
||||
|
||||
Reference in New Issue
Block a user