mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
Improve trackability of players in game
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user