mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-12 16:58:57 +00:00
Merge branch 'sliver' into 'master'
Fix Dementia Sliver See merge request core-developers/forge!6069
This commit is contained in:
@@ -43,7 +43,7 @@ public class DamagePreventAi extends SpellAbilityAi {
|
|||||||
final TargetRestrictions tgt = sa.getTargetRestrictions();
|
final TargetRestrictions tgt = sa.getTargetRestrictions();
|
||||||
if (tgt == null) {
|
if (tgt == null) {
|
||||||
// As far as I can tell these Defined Cards will only have one of them
|
// As far as I can tell these Defined Cards will only have one of them
|
||||||
final List<GameObject> objects = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("Defined"), sa);
|
final List<GameObject> objects = AbilityUtils.getDefinedObjects(hostCard, sa.getParam("Defined"), sa);
|
||||||
|
|
||||||
// react to threats on the stack
|
// react to threats on the stack
|
||||||
if (!game.getStack().isEmpty()) {
|
if (!game.getStack().isEmpty()) {
|
||||||
@@ -138,7 +138,7 @@ public class DamagePreventAi extends SpellAbilityAi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sa.usesTargeting() && sa.isDividedAsYouChoose() && !sa.getTargets().isEmpty()) {
|
if (sa.usesTargeting() && sa.isDividedAsYouChoose() && !sa.getTargets().isEmpty()) {
|
||||||
sa.addDividedAllocation(sa.getTargets().get(0), AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Amount"), sa));
|
sa.addDividedAllocation(sa.getTargets().get(0), AbilityUtils.calculateAmount(hostCard, sa.getParam("Amount"), sa));
|
||||||
}
|
}
|
||||||
|
|
||||||
return chance;
|
return chance;
|
||||||
|
|||||||
@@ -476,10 +476,10 @@ public class CountersPutEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
// these trigger are one per counter
|
// these trigger are one per counter
|
||||||
for (int i = 0; i < added; i++) {
|
for (int i = 0; i < added; i++) {
|
||||||
final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), sa.getHostCard(), intrinsic);
|
final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), host, intrinsic);
|
||||||
trig.addRemembered(tgt);
|
trig.addRemembered(tgt);
|
||||||
|
|
||||||
final SpellAbility newSa = AbilityFactory.getAbility(trigSA, sa.getHostCard());
|
final SpellAbility newSa = AbilityFactory.getAbility(trigSA, host);
|
||||||
newSa.setIntrinsic(intrinsic);
|
newSa.setIntrinsic(intrinsic);
|
||||||
trig.setOverridingAbility(newSa);
|
trig.setOverridingAbility(newSa);
|
||||||
sa.getActivatingPlayer().getGame().getTriggerHandler().registerDelayedTrigger(trig);
|
sa.getActivatingPlayer().getGame().getTriggerHandler().registerDelayedTrigger(trig);
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ public class CountersRemoveAllEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sa.hasParam("RememberAmount")) {
|
if (sa.hasParam("RememberAmount")) {
|
||||||
sa.getHostCard().setChosenNumber(numberRemoved);
|
sa.getHostCard().addRemembered(Integer.valueOf(numberRemoved));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ public class MustAttackEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO these should not override but add another requirement
|
||||||
for (final Player p : tgtPlayers) {
|
for (final Player p : tgtPlayers) {
|
||||||
if ((tgt == null) || p.canBeTargetedBy(sa)) {
|
if ((tgt == null) || p.canBeTargetedBy(sa)) {
|
||||||
if (thisTurn) {
|
if (thisTurn) {
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ public class MustBlockEffect extends SpellAbilityEffect {
|
|||||||
} else {
|
} else {
|
||||||
final Card attacker = cards.get(0);
|
final Card attacker = cards.get(0);
|
||||||
c.addMustBlockCard(attacker);
|
c.addMustBlockCard(attacker);
|
||||||
System.out.println(c + " is adding " + attacker + " to mustBlockCards: " + c.getMustBlockCards());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1477,7 +1477,7 @@ public class CardFactoryUtil {
|
|||||||
"TgtPrompt$ Select target artifact creature | CounterType$ P1P1 | CounterNum$ ModularX | Modular$ True";
|
"TgtPrompt$ Select target artifact creature | CounterType$ P1P1 | CounterNum$ ModularX | Modular$ True";
|
||||||
|
|
||||||
String trigStr = "Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard" +
|
String trigStr = "Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard" +
|
||||||
" | OptionalDecider$ TriggeredCardController | TriggerController$ TriggeredCardController" +
|
" | OptionalDecider$ TriggeredCardController" +
|
||||||
" | Secondary$ True | TriggerDescription$ When CARDNAME dies, " +
|
" | Secondary$ True | TriggerDescription$ When CARDNAME dies, " +
|
||||||
"you may put a +1/+1 counter on target artifact creature for each +1/+1 counter on CARDNAME";
|
"you may put a +1/+1 counter on target artifact creature for each +1/+1 counter on CARDNAME";
|
||||||
|
|
||||||
@@ -1784,8 +1784,7 @@ public class CardFactoryUtil {
|
|||||||
|
|
||||||
final String actualTrigger = "Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard"
|
final String actualTrigger = "Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard"
|
||||||
+ "| Secondary$ True | OptionalDecider$ You | ValidCard$ Card.Self"
|
+ "| Secondary$ True | OptionalDecider$ You | ValidCard$ Card.Self"
|
||||||
+ "| TriggerController$ TriggeredCardController | TriggerDescription$ " + k[0] + " " + k[1]
|
+ "| TriggerDescription$ " + k[0] + " " + k[1] + " (" + inst.getReminderText() + ")";
|
||||||
+ " (" + inst.getReminderText() + ")";
|
|
||||||
final String effect = "DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand"
|
final String effect = "DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand"
|
||||||
+ "| ValidTgts$ Spirit.YouOwn+cmcLE" + k[1];
|
+ "| ValidTgts$ Spirit.YouOwn+cmcLE" + k[1];
|
||||||
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, card, intrinsic);
|
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, card, intrinsic);
|
||||||
|
|||||||
@@ -870,7 +870,7 @@ public final class StaticAbilityContinuous {
|
|||||||
// but only do it if the trigger doesn't already have a overriding ability
|
// but only do it if the trigger doesn't already have a overriding ability
|
||||||
addedTrigger.add(actualTrigger);
|
addedTrigger.add(actualTrigger);
|
||||||
if (params.containsKey("TriggerRememberDefined")) {
|
if (params.containsKey("TriggerRememberDefined")) {
|
||||||
String triggerRemembered = (params.get("TriggerRememberDefined"));
|
String triggerRemembered = params.get("TriggerRememberDefined");
|
||||||
for (final String rem : triggerRemembered.split(",")) {
|
for (final String rem : triggerRemembered.split(",")) {
|
||||||
for (final Object o : AbilityUtils.getDefinedEntities(hostCard, rem, stAb)) {
|
for (final Object o : AbilityUtils.getDefinedEntities(hostCard, rem, stAb)) {
|
||||||
actualTrigger.addRemembered(o);
|
actualTrigger.addRemembered(o);
|
||||||
|
|||||||
@@ -17,15 +17,15 @@ public class StaticAbilityIgnoreHexproofShroud {
|
|||||||
final Game game = entity.getGame();
|
final Game game = entity.getGame();
|
||||||
for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) {
|
for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) {
|
||||||
for (final StaticAbility stAb : ca.getStaticAbilities()) {
|
for (final StaticAbility stAb : ca.getStaticAbilities()) {
|
||||||
if (stAb.isSuppressed() || !stAb.checkConditions()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (keyword.equals(Keyword.HEXPROOF) && !stAb.getParam("Mode").equals(HEXPROOF_MODE)) {
|
if (keyword.equals(Keyword.HEXPROOF) && !stAb.getParam("Mode").equals(HEXPROOF_MODE)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (keyword.equals(Keyword.SHROUD) && !stAb.getParam("Mode").equals(SHROUD_MODE)) {
|
if (keyword.equals(Keyword.SHROUD) && !stAb.getParam("Mode").equals(SHROUD_MODE)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (stAb.isSuppressed() || !stAb.checkConditions()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (commonAbility(stAb, entity, spellAbility)) {
|
if (commonAbility(stAb, entity, spellAbility)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ Types:Creature Sliver
|
|||||||
PT:3/3
|
PT:3/3
|
||||||
S:Mode$ Continuous | Affected$ Sliver | AddAbility$ ABDementiaNameCard | AddSVar$ DBDementiaReveal & DBDementiaDiscard | Description$ All Slivers have "{T}: Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate only during your turn."
|
S:Mode$ Continuous | Affected$ Sliver | AddAbility$ ABDementiaNameCard | AddSVar$ DBDementiaReveal & DBDementiaDiscard | Description$ All Slivers have "{T}: Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate only during your turn."
|
||||||
SVar:ABDementiaNameCard:AB$ NameCard | Cost$ T | Defined$ You | SubAbility$ DBDementiaReveal | SpellDescription$ Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate only during your turn.
|
SVar:ABDementiaNameCard:AB$ NameCard | Cost$ T | Defined$ You | SubAbility$ DBDementiaReveal | SpellDescription$ Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate only during your turn.
|
||||||
SVar:DBDementiaReveal:DB$ Reveal | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Random$ True | PlayerTurn$ True | SubAbility$ DBDementiaDiscard
|
SVar:DBDementiaReveal:DB$ Reveal | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Random$ True | PlayerTurn$ True | RememberRevealed$ True | SubAbility$ DBDementiaDiscard
|
||||||
SVar:DBDementiaDiscard:DB$ Discard | DiscardValid$ Card.NamedCard | Mode$ TgtChoose | Defined$ Targeted
|
SVar:DBDementiaDiscard:DB$ Discard | DiscardValid$ Card.NamedCard+IsRemembered | Mode$ TgtChoose | Defined$ Targeted | SubAbility$ DBCleanup
|
||||||
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
AI:RemoveDeck:All
|
AI:RemoveDeck:All
|
||||||
AI:RemoveDeck:Random
|
AI:RemoveDeck:Random
|
||||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/dementia_sliver.jpg
|
SVar:Picture:http://www.wizards.com/global/images/magic/general/dementia_sliver.jpg
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ K:ETBReplacement:Other:DBRemoveCounterAll
|
|||||||
SVar:DBRemoveCounterAll:DB$ RemoveCounterAll | ValidCards$ Permanent | AllCounterTypes$ True | StackDescription$ SpellDescription | SubAbility$ DBPutCounters | RememberAmount$ True | SpellDescription$ As CARDNAME enters the battlefield, remove all counters from all permanents. CARDNAME enters the battlefield with a +1/+1 counter on it for each counter removed this way.
|
SVar:DBRemoveCounterAll:DB$ RemoveCounterAll | ValidCards$ Permanent | AllCounterTypes$ True | StackDescription$ SpellDescription | SubAbility$ DBPutCounters | RememberAmount$ True | SpellDescription$ As CARDNAME enters the battlefield, remove all counters from all permanents. CARDNAME enters the battlefield with a +1/+1 counter on it for each counter removed this way.
|
||||||
SVar:DBPutCounters:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup
|
SVar:DBPutCounters:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
SVar:X:Count$ChosenNumber
|
SVar:X:Count$RememberedNumber
|
||||||
AI:RemoveDeck:Random
|
AI:RemoveDeck:Random
|
||||||
DeckHas:Ability$Counters
|
DeckHas:Ability$Counters
|
||||||
Oracle:Flying\nAs Thief of Blood enters the battlefield, remove all counters from all permanents. Thief of Blood enters the battlefield with a +1/+1 counter on it for each counter removed this way.
|
Oracle:Flying\nAs Thief of Blood enters the battlefield, remove all counters from all permanents. Thief of Blood enters the battlefield with a +1/+1 counter on it for each counter removed this way.
|
||||||
|
|||||||
Reference in New Issue
Block a user