Remove global Player cache, instead make it hang off the Game object.

This commit is contained in:
Myrd
2014-12-16 21:55:33 +00:00
parent 6be85a1741
commit 30fb451a45
20 changed files with 99 additions and 68 deletions

View File

@@ -53,6 +53,7 @@ import forge.game.phase.Untap;
import forge.game.phase.Upkeep;
import forge.game.player.IGameEntitiesFactory;
import forge.game.player.Player;
import forge.game.player.PlayerView;
import forge.game.player.RegisteredPlayer;
import forge.game.replacement.ReplacementHandler;
import forge.game.spellability.SpellAbility;
@@ -102,9 +103,16 @@ public class Game {
private final GameView view;
private GameEntityCache<Player, PlayerView> playerCache = new GameEntityCache<>();
public Player getPlayer(PlayerView playerView) {
return playerCache.get(playerView);
}
public void addPlayer(Integer id, Player player) {
playerCache.put(id, player);
}
public Game(List<RegisteredPlayer> players0, GameRules rules0, Match match0) { /* no more zones to map here */
Card.clearCache();
Player.clearCache();
rules = rules0;
match = match0;

View File

@@ -19,28 +19,15 @@ package forge.game;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardView;
import forge.game.card.CardCollectionView;
import forge.game.event.GameEventCardAttachment;
import forge.game.event.GameEventCardAttachment.AttachMethod;
import forge.game.player.Player;
import forge.game.player.PlayerView;
import java.util.Map;
import java.util.TreeMap;
public abstract class GameEntity extends GameObject implements IIdentifiable {
public static GameEntity get(GameEntityView gameEntityView) {
if (gameEntityView instanceof CardView) {
return Card.get((CardView)gameEntityView);
}
if (gameEntityView instanceof PlayerView) {
return Player.get((PlayerView)gameEntityView);
}
return null;
}
protected final int id;
private String name = "";
private int preventNextDamage = 0;

View File

@@ -0,0 +1,33 @@
package forge.game;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
public class GameEntityCache<Entity extends GameEntity, View extends GameEntityView> {
private HashMap<Integer, Entity> entityCache = new HashMap<Integer, Entity>();
public void put(Integer id, Entity entity) {
entityCache.put(id, entity);
}
public Entity get(View entityView) {
if (entityView == null) { return null; }
return entityCache.get(entityView.getId());
}
public void addToList(Iterable<View> views, List<Entity> list) {
for (View view : views) {
Entity entity = get(view);
if (entity != null) {
list.add(entity);
}
}
}
public List<Entity> getList(Iterable<View> views) {
List<Entity> list = new ArrayList<Entity>();
addToList(views, list);
return list;
}
}

View File

@@ -209,6 +209,6 @@ public class GameView extends TrackableObject {
}
public AnteResult getAnteResult(PlayerView player) {
return game.getOutcome().anteResult.get(Player.get(player));
return game.getOutcome().anteResult.get(game.getPlayer(player));
}
}

View File

@@ -82,25 +82,6 @@ public class Player extends GameEntity implements Comparable<Player> {
ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command, ZoneType.Ante,
ZoneType.Sideboard, ZoneType.PlanarDeck, ZoneType.SchemeDeck));
private static HashMap<Integer, Player> playerCache = new HashMap<Integer, Player>();
public static Player get(PlayerView playerView) {
if (playerView == null) { return null; }
return playerCache.get(playerView.getId());
}
public static List<Player> getList(Iterable<PlayerView> playerViews) {
List<Player> list = new ArrayList<Player>();
for (PlayerView pv : playerViews) {
Player p = get(pv);
if (p != null) {
list.add(p);
}
}
return list;
}
public static void clearCache() {
playerCache.clear();
}
private final Map<Card, Integer> commanderDamage = new HashMap<Card, Integer>();
private int poisonCounters = 0;
@@ -174,7 +155,7 @@ public class Player extends GameEntity implements Comparable<Player> {
view.updateKeywords(this);
setName(chooseName(name0));
if (id0 >= 0) {
playerCache.put(id0, this);
game.addPlayer(id, this);
}
}
@@ -2214,6 +2195,8 @@ public class Player extends GameEntity implements Comparable<Player> {
controllerCreator = ctrlr;
controller = ctrlr;
view.updateAvatarIndex(this);
view.updateIsAI(this);
view.updateLobbyPlayerName(this);
}
/**

View File

@@ -41,6 +41,23 @@ public class PlayerView extends GameEntityView {
set(TrackableProperty.Mana, Maps.newHashMapWithExpectedSize(MagicColor.NUMBER_OR_COLORS + 1));
}
public boolean isAI() {
return get(TrackableProperty.IsAI);
}
void updateIsAI(Player p) {
set(TrackableProperty.IsAI, p.getController().isAI());
}
public String getLobbyPlayerName() {
return get(TrackableProperty.LobbyPlayerName);
}
void updateLobbyPlayerName(Player p) {
set(TrackableProperty.LobbyPlayerName, p.getLobbyPlayer().getName());
}
public boolean isLobbyPlayer(LobbyPlayer p) {
return getLobbyPlayerName().equals(p.getName());
}
public int getAvatarIndex() {
return get(TrackableProperty.AvatarIndex);
}
@@ -257,9 +274,4 @@ public class PlayerView extends GameEntityView {
}
set(TrackableProperty.Mana, mana);
}
//TODO: Find better way to do this
public LobbyPlayer getLobbyPlayer() {
return Player.get(this).getLobbyPlayer();
}
}

View File

@@ -85,6 +85,8 @@ public enum TrackableProperty {
FoilIndex(TrackableTypes.IntegerType),
//Player
IsAI(TrackableTypes.BooleanType),
LobbyPlayerName(TrackableTypes.StringType),
AvatarIndex(TrackableTypes.IntegerType),
Opponents(TrackableTypes.PlayerViewCollectionType),
Life(TrackableTypes.IntegerType),