From fe3b689f84d23a816e42772f0b4795ee10b5e2f4 Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 18 Jul 2015 21:57:18 +0000 Subject: [PATCH] Improve trackability of players in game --- .../src/main/java/forge/game/GameView.java | 6 ++---- .../java/forge/trackable/TrackableObject.java | 7 +++++++ .../forge/trackable/TrackableProperty.java | 6 ++++++ .../java/forge/trackable/TrackableTypes.java | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameView.java b/forge-game/src/main/java/forge/game/GameView.java index 721695bd2ed..0f346fcf291 100644 --- a/forge-game/src/main/java/forge/game/GameView.java +++ b/forge-game/src/main/java/forge/game/GameView.java @@ -18,7 +18,6 @@ import forge.game.player.Player; import forge.game.player.PlayerView; import forge.game.spellability.StackItemView; import forge.game.zone.MagicStack; -import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; import forge.util.collect.FCollectionView; @@ -26,7 +25,6 @@ import forge.util.collect.FCollectionView; public class GameView extends TrackableObject { private static final long serialVersionUID = 8522884512960961528L; - private final TrackableCollection players; private CombatView combatView; private final transient Game game; //TODO: Remove this when possible before network support added @@ -45,11 +43,11 @@ public class GameView extends TrackableObject { set(TrackableProperty.GameLog, game.getGameLog()); set(TrackableProperty.NumPlayedGamesInMatch, game.getMatch().getPlayedGames().size()); - players = PlayerView.getCollection(game.getPlayers()); + set(TrackableProperty.Players, PlayerView.getCollection(game.getPlayers())); } public FCollectionView getPlayers() { - return players; + return get(TrackableProperty.Players); } public String getTitle() { diff --git a/forge-game/src/main/java/forge/trackable/TrackableObject.java b/forge-game/src/main/java/forge/trackable/TrackableObject.java index de0d708a5cb..746b19d8d88 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableObject.java +++ b/forge-game/src/main/java/forge/trackable/TrackableObject.java @@ -16,6 +16,7 @@ public abstract class TrackableObject implements IIdentifiable, Serializable { protected final transient Tracker tracker; private final Map props; private final Set changedProps; + private boolean copyingProps; protected TrackableObject(final int id0, final Tracker tracker) { id = id0; @@ -56,10 +57,12 @@ public abstract class TrackableObject implements IIdentifiable, Serializable { if (value == null || value.equals(key.getDefaultValue())) { if (props.remove(key) != null) { changedProps.add(key); + key.updateObjLookup(value); } } else if (!value.equals(props.put(key, value))) { changedProps.add(key); + key.updateObjLookup(value); } } @@ -67,14 +70,18 @@ public abstract class TrackableObject implements IIdentifiable, Serializable { * Copy all change properties of another Trackable object to this object. */ public final void copyChangedProps(final TrackableObject from) { + if (copyingProps) { return; } //prevent infinite loop from circular reference + copyingProps = true; for (final TrackableProperty prop : from.changedProps) { prop.copyChangedProps(from, this); } + copyingProps = false; } //use when updating collection type properties with using set protected final void flagAsChanged(final TrackableProperty key) { changedProps.add(key); + key.updateObjLookup(props.get(key)); } public final void serialize(final TrackableSerializer ts) { diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 8e8bb74eeab..e2fc3c89b24 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -135,6 +135,7 @@ public enum TrackableProperty { BandsWithPlannedBlockers(TrackableTypes.CardViewCollectionType, false), //Game + Players(TrackableTypes.PlayerViewCollectionType), GameType(TrackableTypes.EnumType(GameType.class)), Title(TrackableTypes.StringType), Turn(TrackableTypes.IntegerType), @@ -166,6 +167,11 @@ public enum TrackableProperty { return respectFreeze; } + @SuppressWarnings("unchecked") + public void updateObjLookup(T newObj) { + ((TrackableType)type).updateObjLookup(newObj); + } + public void copyChangedProps(TrackableObject from, TrackableObject to) { type.copyChangedProps(from, to, this); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableTypes.java b/forge-game/src/main/java/forge/trackable/TrackableTypes.java index ab37001dd9a..0cb6f0bb4c1 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableTypes.java +++ b/forge-game/src/main/java/forge/trackable/TrackableTypes.java @@ -24,6 +24,8 @@ public class TrackableTypes { private TrackableType() { } + protected void updateObjLookup(T newObj) { + } protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) { to.set(prop, from.get(prop)); } @@ -42,6 +44,13 @@ public class TrackableTypes { objLookup.clear(); } + @Override + protected void updateObjLookup(T newObj) { + if (!objLookup.containsKey(newObj.getId())) { + objLookup.put(newObj.getId(), newObj); + } + } + @Override protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) { T newObj = from.get(prop); @@ -66,6 +75,15 @@ public class TrackableTypes { itemType = itemType0; } + @Override + protected void updateObjLookup(TrackableCollection newCollection) { + for (T newObj : newCollection) { + if (newObj != null) { + itemType.updateObjLookup(newObj); + } + } + } + @Override protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) { TrackableCollection newCollection = from.get(prop);