Improve trackability of players in game

This commit is contained in:
drdev
2015-07-18 21:57:18 +00:00
parent 8a41142933
commit fe3b689f84
4 changed files with 33 additions and 4 deletions

View File

@@ -18,7 +18,6 @@ import forge.game.player.Player;
import forge.game.player.PlayerView; import forge.game.player.PlayerView;
import forge.game.spellability.StackItemView; import forge.game.spellability.StackItemView;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.trackable.TrackableCollection;
import forge.trackable.TrackableObject; import forge.trackable.TrackableObject;
import forge.trackable.TrackableProperty; import forge.trackable.TrackableProperty;
import forge.util.collect.FCollectionView; import forge.util.collect.FCollectionView;
@@ -26,7 +25,6 @@ import forge.util.collect.FCollectionView;
public class GameView extends TrackableObject { public class GameView extends TrackableObject {
private static final long serialVersionUID = 8522884512960961528L; private static final long serialVersionUID = 8522884512960961528L;
private final TrackableCollection<PlayerView> players;
private CombatView combatView; private CombatView combatView;
private final transient Game game; //TODO: Remove this when possible before network support added 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.GameLog, game.getGameLog());
set(TrackableProperty.NumPlayedGamesInMatch, game.getMatch().getPlayedGames().size()); set(TrackableProperty.NumPlayedGamesInMatch, game.getMatch().getPlayedGames().size());
players = PlayerView.getCollection(game.getPlayers()); set(TrackableProperty.Players, PlayerView.getCollection(game.getPlayers()));
} }
public FCollectionView<PlayerView> getPlayers() { public FCollectionView<PlayerView> getPlayers() {
return players; return get(TrackableProperty.Players);
} }
public String getTitle() { public String getTitle() {

View File

@@ -16,6 +16,7 @@ public abstract class TrackableObject implements IIdentifiable, Serializable {
protected final transient Tracker tracker; protected final transient Tracker tracker;
private final Map<TrackableProperty, Object> props; private final Map<TrackableProperty, Object> props;
private final Set<TrackableProperty> changedProps; private final Set<TrackableProperty> changedProps;
private boolean copyingProps;
protected TrackableObject(final int id0, final Tracker tracker) { protected TrackableObject(final int id0, final Tracker tracker) {
id = id0; id = id0;
@@ -56,10 +57,12 @@ public abstract class TrackableObject implements IIdentifiable, Serializable {
if (value == null || value.equals(key.getDefaultValue())) { if (value == null || value.equals(key.getDefaultValue())) {
if (props.remove(key) != null) { if (props.remove(key) != null) {
changedProps.add(key); changedProps.add(key);
key.updateObjLookup(value);
} }
} }
else if (!value.equals(props.put(key, value))) { else if (!value.equals(props.put(key, value))) {
changedProps.add(key); 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. * Copy all change properties of another Trackable object to this object.
*/ */
public final void copyChangedProps(final TrackableObject from) { public final void copyChangedProps(final TrackableObject from) {
if (copyingProps) { return; } //prevent infinite loop from circular reference
copyingProps = true;
for (final TrackableProperty prop : from.changedProps) { for (final TrackableProperty prop : from.changedProps) {
prop.copyChangedProps(from, this); prop.copyChangedProps(from, this);
} }
copyingProps = false;
} }
//use when updating collection type properties with using set //use when updating collection type properties with using set
protected final void flagAsChanged(final TrackableProperty key) { protected final void flagAsChanged(final TrackableProperty key) {
changedProps.add(key); changedProps.add(key);
key.updateObjLookup(props.get(key));
} }
public final void serialize(final TrackableSerializer ts) { public final void serialize(final TrackableSerializer ts) {

View File

@@ -135,6 +135,7 @@ public enum TrackableProperty {
BandsWithPlannedBlockers(TrackableTypes.CardViewCollectionType, false), BandsWithPlannedBlockers(TrackableTypes.CardViewCollectionType, false),
//Game //Game
Players(TrackableTypes.PlayerViewCollectionType),
GameType(TrackableTypes.EnumType(GameType.class)), GameType(TrackableTypes.EnumType(GameType.class)),
Title(TrackableTypes.StringType), Title(TrackableTypes.StringType),
Turn(TrackableTypes.IntegerType), Turn(TrackableTypes.IntegerType),
@@ -166,6 +167,11 @@ public enum TrackableProperty {
return respectFreeze; return respectFreeze;
} }
@SuppressWarnings("unchecked")
public <T> void updateObjLookup(T newObj) {
((TrackableType<T>)type).updateObjLookup(newObj);
}
public void copyChangedProps(TrackableObject from, TrackableObject to) { public void copyChangedProps(TrackableObject from, TrackableObject to) {
type.copyChangedProps(from, to, this); type.copyChangedProps(from, to, this);
} }

View File

@@ -24,6 +24,8 @@ public class TrackableTypes {
private TrackableType() { private TrackableType() {
} }
protected void updateObjLookup(T newObj) {
}
protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) { protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) {
to.set(prop, from.get(prop)); to.set(prop, from.get(prop));
} }
@@ -42,6 +44,13 @@ public class TrackableTypes {
objLookup.clear(); objLookup.clear();
} }
@Override
protected void updateObjLookup(T newObj) {
if (!objLookup.containsKey(newObj.getId())) {
objLookup.put(newObj.getId(), newObj);
}
}
@Override @Override
protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) { protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) {
T newObj = from.get(prop); T newObj = from.get(prop);
@@ -66,6 +75,15 @@ public class TrackableTypes {
itemType = itemType0; itemType = itemType0;
} }
@Override
protected void updateObjLookup(TrackableCollection<T> newCollection) {
for (T newObj : newCollection) {
if (newObj != null) {
itemType.updateObjLookup(newObj);
}
}
}
@Override @Override
protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) { protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) {
TrackableCollection<T> newCollection = from.get(prop); TrackableCollection<T> newCollection = from.get(prop);