mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28: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.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() {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user