mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
Remove global Player cache, instead make it hang off the Game object.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
33
forge-game/src/main/java/forge/game/GameEntityCache.java
Normal file
33
forge-game/src/main/java/forge/game/GameEntityCache.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user