Merge branch 'control' into 'master'

Control changing effects should not overwrite default controller

Closes #1990

See merge request core-developers/forge!5624
This commit is contained in:
Michael Kamensky
2021-10-23 04:03:55 +00:00
8 changed files with 14 additions and 15 deletions

View File

@@ -828,6 +828,11 @@ public class Game {
getAction().controllerChangeZoneCorrection(c); getAction().controllerChangeZoneCorrection(c);
} }
c.removeTempController(p); c.removeTempController(p);
// return stolen spells
if (c.isInZone(ZoneType.Stack)) {
SpellAbilityStackInstance si = getStack().getInstanceFromSpellAbility(c.getCastSA());
si.setActivatingPlayer(c.getController());
}
if (c.getController().equals(p)) { if (c.getController().equals(p)) {
getAction().exile(c, null); getAction().exile(c, null);
} }

View File

@@ -96,8 +96,8 @@ public class ControlExchangeEffect extends SpellAbilityEffect {
} }
final long tStamp = game.getNextTimestamp(); final long tStamp = game.getNextTimestamp();
object2.setController(player1, tStamp); object2.addTempController(player1, tStamp);
object1.setController(player2, tStamp); object1.addTempController(player2, tStamp);
if (sa.hasParam("RememberExchanged")) { if (sa.hasParam("RememberExchanged")) {
host.addRemembered(object1); host.addRemembered(object1);
host.addRemembered(object2); host.addRemembered(object2);

View File

@@ -53,10 +53,10 @@ public class ControlExchangeVariantEffect extends SpellAbilityEffect {
// set new controller // set new controller
final long tStamp = sa.getActivatingPlayer().getGame().getNextTimestamp(); final long tStamp = sa.getActivatingPlayer().getGame().getNextTimestamp();
for (final Card c : chosen1) { for (final Card c : chosen1) {
c.setController(player2, tStamp); c.addTempController(player2, tStamp);
} }
for (final Card c : chosen2) { for (final Card c : chosen2) {
c.setController(player1, tStamp); c.addTempController(player1, tStamp);
} }
} }
} }

View File

@@ -145,11 +145,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
} }
long tStamp = game.getNextTimestamp(); long tStamp = game.getNextTimestamp();
if (lose != null) { tgtC.addTempController(newController, tStamp);
tgtC.addTempController(newController, tStamp);
} else {
tgtC.setController(newController, tStamp);
}
if (bUntap) { if (bUntap) {
tgtC.untap(true); tgtC.untap(true);

View File

@@ -90,7 +90,7 @@ public class ControlGainVariantEffect extends SpellAbilityEffect {
if (!tgtC.isInPlay() || !tgtC.canBeControlledBy(newController)) { if (!tgtC.isInPlay() || !tgtC.canBeControlledBy(newController)) {
continue; continue;
} }
tgtC.setController(newController, tStamp); tgtC.addTempController(newController, tStamp);
} }
} }
} }

View File

@@ -87,7 +87,7 @@ public class ControlSpellEffect extends SpellAbilityEffect {
if (remember) { if (remember) {
source.addRemembered(c); source.addRemembered(c);
} }
c.setController(si.getActivatingPlayer(), tStamp); c.addTempController(si.getActivatingPlayer(), tStamp);
} }
} }
@@ -98,7 +98,7 @@ public class ControlSpellEffect extends SpellAbilityEffect {
if (remember) { if (remember) {
source.addRemembered(tgtC); source.addRemembered(tgtC);
} }
tgtC.setController(newController, tStamp); tgtC.addTempController(newController, tStamp);
si.setActivatingPlayer(newController); si.setActivatingPlayer(newController);
} }
} }

View File

@@ -30,8 +30,6 @@ public class PermanentEffect extends SpellAbilityEffect {
CardZoneTable table = new CardZoneTable(); CardZoneTable table = new CardZoneTable();
ZoneType previousZone = host.getZone().getZoneType(); ZoneType previousZone = host.getZone().getZoneType();
host.setController(sa.getActivatingPlayer(), 0);
CardCollectionView lastStateBattlefield = game.copyLastStateBattlefield(); CardCollectionView lastStateBattlefield = game.copyLastStateBattlefield();
CardCollectionView lastStateGraveyard = game.copyLastStateGraveyard(); CardCollectionView lastStateGraveyard = game.copyLastStateGraveyard();

View File

@@ -91,7 +91,7 @@ public class CostGainControl extends CostPartWithList {
*/ */
@Override @Override
protected Card doPayment(SpellAbility ability, Card targetCard) { protected Card doPayment(SpellAbility ability, Card targetCard) {
targetCard.setController(ability.getActivatingPlayer(), ability.getActivatingPlayer().getGame().getNextTimestamp()); targetCard.addTempController(ability.getActivatingPlayer(), ability.getActivatingPlayer().getGame().getNextTimestamp());
return targetCard; return targetCard;
} }