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.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<PlayerView> 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<PlayerView> getPlayers() {
return players;
return get(TrackableProperty.Players);
}
public String getTitle() {

View File

@@ -16,6 +16,7 @@ public abstract class TrackableObject implements IIdentifiable, Serializable {
protected final transient Tracker tracker;
private final Map<TrackableProperty, Object> props;
private final Set<TrackableProperty> 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) {

View File

@@ -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 <T> void updateObjLookup(T newObj) {
((TrackableType<T>)type).updateObjLookup(newObj);
}
public void copyChangedProps(TrackableObject from, TrackableObject to) {
type.copyChangedProps(from, to, this);
}

View File

@@ -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<T> newCollection) {
for (T newObj : newCollection) {
if (newObj != null) {
itemType.updateObjLookup(newObj);
}
}
}
@Override
protected void copyChangedProps(TrackableObject from, TrackableObject to, TrackableProperty prop) {
TrackableCollection<T> newCollection = from.get(prop);