mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Fix mapping copied commander effects between games
This commit is contained in:
@@ -131,7 +131,7 @@ public class GameCopier {
|
|||||||
|
|
||||||
for (Player origPlayer : playerMap.keySet()) {
|
for (Player origPlayer : playerMap.keySet()) {
|
||||||
Player newPlayer = playerMap.get(origPlayer);
|
Player newPlayer = playerMap.get(origPlayer);
|
||||||
origPlayer.copyCommandersToSnapshot(newPlayer, newGame);
|
origPlayer.copyCommandersToSnapshot(newPlayer, gameObjectMap::map);
|
||||||
((PlayerZoneBattlefield) newPlayer.getZone(ZoneType.Battlefield)).setTriggers(true);
|
((PlayerZoneBattlefield) newPlayer.getZone(ZoneType.Battlefield)).setTriggers(true);
|
||||||
}
|
}
|
||||||
newGame.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
|
newGame.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class GameSnapshot {
|
|||||||
|
|
||||||
for (Player p : fromGame.getPlayers()) {
|
for (Player p : fromGame.getPlayers()) {
|
||||||
Player toPlayer = findBy(toGame, p);
|
Player toPlayer = findBy(toGame, p);
|
||||||
p.copyCommandersToSnapshot(toPlayer, toGame);
|
p.copyCommandersToSnapshot(toPlayer, c -> findBy(toGame, c));
|
||||||
((PlayerZoneBattlefield) toPlayer.getZone(ZoneType.Battlefield)).setTriggers(true);
|
((PlayerZoneBattlefield) toPlayer.getZone(ZoneType.Battlefield)).setTriggers(true);
|
||||||
}
|
}
|
||||||
toGame.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
|
toGame.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
|
||||||
|
|||||||
@@ -35,11 +35,13 @@ public class DetachedCardEffect extends Card {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public DetachedCardEffect(DetachedCardEffect from, Game game, boolean assignNewId) {
|
public DetachedCardEffect(DetachedCardEffect from, Game game, boolean assignNewId) {
|
||||||
super(assignNewId ? game.nextCardId() : from.id, from.getPaperCard(), from.getGame());
|
super(assignNewId ? game.nextCardId() : from.id, from.getPaperCard(), game);
|
||||||
this.setName(from.getName());
|
this.setName(from.getName());
|
||||||
this.setOwner(from.getOwner());
|
|
||||||
this.setGamePieceType(GamePieceType.EFFECT);
|
this.setGamePieceType(GamePieceType.EFFECT);
|
||||||
this.setEffectSource(from.getEffectSource());
|
if(from.getGame() == game) {
|
||||||
|
this.setOwner(from.getOwner());
|
||||||
|
this.setEffectSource(from.getEffectSource());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -2785,14 +2786,14 @@ public class Player extends GameEntity implements Comparable<Player> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void copyCommandersToSnapshot(Player toPlayer, Game toGame) {
|
public void copyCommandersToSnapshot(Player toPlayer, Function<Card, Card> mapper) {
|
||||||
//Seems like the rest of the logic for copying players should be in this class too.
|
//Seems like the rest of the logic for copying players should be in this class too.
|
||||||
//For now, doing this here can retain the links between commander effects and commanders.
|
//For now, doing this here can retain the links between commander effects and commanders.
|
||||||
|
|
||||||
toPlayer.resetCommanderStats();
|
toPlayer.resetCommanderStats();
|
||||||
toPlayer.commanders.clear();
|
toPlayer.commanders.clear();
|
||||||
for (final Card c : this.getCommanders()) {
|
for (final Card c : this.getCommanders()) {
|
||||||
Card newCommander = toGame.findById(c.getId());
|
Card newCommander = mapper.apply(c);
|
||||||
if(newCommander == null)
|
if(newCommander == null)
|
||||||
throw new RuntimeException("Unable to find commander in game snapshot: " + c);
|
throw new RuntimeException("Unable to find commander in game snapshot: " + c);
|
||||||
toPlayer.commanders.add(newCommander);
|
toPlayer.commanders.add(newCommander);
|
||||||
@@ -2800,18 +2801,18 @@ public class Player extends GameEntity implements Comparable<Player> {
|
|||||||
}
|
}
|
||||||
for (Map.Entry<Card, Integer> entry : this.commanderCast.entrySet()) {
|
for (Map.Entry<Card, Integer> entry : this.commanderCast.entrySet()) {
|
||||||
//Have to iterate over this separately in case commanders change mid-game.
|
//Have to iterate over this separately in case commanders change mid-game.
|
||||||
Card commander = toGame.findById(entry.getKey().getId());
|
Card commander = mapper.apply(entry.getKey());
|
||||||
toPlayer.commanderCast.put(commander, entry.getValue());
|
toPlayer.commanderCast.put(commander, entry.getValue());
|
||||||
}
|
}
|
||||||
for (Map.Entry<Card, Integer> entry : this.getCommanderDamage()) {
|
for (Map.Entry<Card, Integer> entry : this.getCommanderDamage()) {
|
||||||
Card commander = toGame.findById(entry.getKey().getId());
|
Card commander = mapper.apply(entry.getKey());
|
||||||
if(commander == null) //Ceased to exist?
|
if(commander == null) //Ceased to exist?
|
||||||
continue;
|
continue;
|
||||||
int damage = entry.getValue();
|
int damage = entry.getValue();
|
||||||
toPlayer.addCommanderDamage(commander, damage);
|
toPlayer.addCommanderDamage(commander, damage);
|
||||||
}
|
}
|
||||||
if (this.commanderEffect != null) {
|
if (this.commanderEffect != null) {
|
||||||
Card commanderEffect = toGame.findById(this.commanderEffect.getId());
|
Card commanderEffect = mapper.apply(this.commanderEffect);
|
||||||
toPlayer.commanderEffect = (DetachedCardEffect) commanderEffect;
|
toPlayer.commanderEffect = (DetachedCardEffect) commanderEffect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user