mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Merge branch 'lightning' into 'master'
Fix Lightning Storm retargeting See merge request core-developers/forge!6054
This commit is contained in:
@@ -1325,7 +1325,10 @@ public class AbilityUtils {
|
||||
}
|
||||
}
|
||||
else if (defined.equals("SourceFirstSpell")) {
|
||||
sas.add(card.getFirstSpellAbility());
|
||||
SpellAbility spell = game.getStack().getSpellMatchingHost(card);
|
||||
if (spell != null) {
|
||||
sas.add(spell);
|
||||
}
|
||||
}
|
||||
else if (defined.startsWith("Triggered") && sa instanceof SpellAbility) {
|
||||
final SpellAbility root = ((SpellAbility)sa).getRootAbility();
|
||||
@@ -1362,8 +1365,7 @@ public class AbilityUtils {
|
||||
if (instanceSA != null) {
|
||||
sas.add(instanceSA);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
sas.add(targetSpell);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -579,7 +579,7 @@ public abstract class SpellAbilityEffect {
|
||||
PlayerCollection defendingPlayers = AbilityUtils.getDefinedPlayers(host, attacking, sa);
|
||||
defs = new FCollection<>();
|
||||
for (Player p : defendingPlayers) {
|
||||
defs.addAll(game.getCombat().getDefendersControlledBy(p));
|
||||
defs.addAll(combat.getDefendersControlledBy(p));
|
||||
}
|
||||
} else if ("True".equalsIgnoreCase(attacking)) {
|
||||
defs = (FCollection<GameEntity>) combat.getDefenders();
|
||||
|
||||
@@ -68,7 +68,6 @@ public class ReplaceToken extends ReplacementEffect {
|
||||
sa.setReplacingObject(AbilityKey.Player, runParams.get(AbilityKey.Affected));
|
||||
}
|
||||
|
||||
|
||||
public int filterAmount(final TokenCreateTable table) {
|
||||
return table.getFilterAmount(getParamOrDefault("ValidPlayer", null), getParamOrDefault("ValidToken", null), this);
|
||||
}
|
||||
|
||||
@@ -2102,7 +2102,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
public boolean isCumulativeupkeep() {
|
||||
return cumulativeupkeep;
|
||||
}
|
||||
|
||||
public void setCumulativeupkeep(boolean cumulativeupkeep0) {
|
||||
cumulativeupkeep = cumulativeupkeep0;
|
||||
}
|
||||
|
||||
@@ -81,8 +81,8 @@ public class StaticAbilityPanharmonicon {
|
||||
}
|
||||
} else if (trigMode.equals(TriggerType.ChangesZoneAll)) {
|
||||
// Check if the cards have a trigger at all
|
||||
final String origin = stAb.hasParam("Origin") ? stAb.getParam("Origin") : null;
|
||||
final String destination = stAb.hasParam("Destination") ? stAb.getParam("Destination") : null;
|
||||
final String origin = stAb.getParamOrDefault("Origin", null);
|
||||
final String destination = stAb.getParamOrDefault("Destination", null);
|
||||
final CardZoneTable table = (CardZoneTable) runParams.get(AbilityKey.Cards);
|
||||
|
||||
if (table.filterCards(origin == null ? null : ImmutableList.of(ZoneType.smartValueOf(origin)), ZoneType.smartValueOf(destination), stAb.getParam("ValidCause"), card, stAb).isEmpty()) {
|
||||
|
||||
@@ -766,6 +766,15 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
return null;
|
||||
}
|
||||
|
||||
public final SpellAbility getSpellMatchingHost(final Card host) {
|
||||
for (final SpellAbilityStackInstance si : stack) {
|
||||
if (si.isSpell() && host.equals(si.getSpellAbility(false).getHostCard())) {
|
||||
return si.getSpellAbility(false);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public final boolean hasSimultaneousStackEntries() {
|
||||
return !simultaneousStackEntryList.isEmpty();
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:3
|
||||
Types:Artifact
|
||||
A:AB$ DigUntil | Cost$ 4 T | ValidTgts$ Opponent | Valid$ Instant,Sorcery | ValidDescription$ instant or sorcery | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | RememberRevealed$ True | IsCurse$ True | SubAbility$ DBPlay | SpellDescription$ Target opponent exiles cards from the top of their library until they exile an instant or sorcery card. You may cast that card without paying its mana cost. Then put the exiled cards that weren't cast this way on the bottom of that library in a random order.
|
||||
SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidZone$ Exile | Valid$ Instant.IsRemembered,Sorcery.IsRemembered | ValidSA$ Spell | WithoutManaCost$ True | RememberObjects$ Remembered | Optional$ True | ForgetTargetRemembered$ True | SubAbility$ DBRestRandomOrder
|
||||
SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup
|
||||
SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chaos_wand.jpg
|
||||
Oracle:{4}, {T}: Target opponent exiles cards from the top of their library until they exile an instant or sorcery card. You may cast that card without paying its mana cost. Then put the exiled cards that weren't cast this way on the bottom of that library in a random order.
|
||||
Reference in New Issue
Block a user