GlobalGameData
El contenedor principal de estado guardable de una sesion de juego: dificultad, medallas,
escenas visitadas, ultima ubicacion de curado/jugador, conteo de pasos, y el estado
persistente de sistemas adicionales (seguidores, Base Secreta, gimnasio del jugador,
corridas de torre). Es un asset ScriptableObject inyectado via Zenject, y se serializa
a disco a traves de su espejo guardable, SavableGlobalGameData.
Namespace: OpenMon.MCE.Player
Money, DexNumber y RosterPreview en GlobalGameData existen solo para la UI de
vista previa de ranura de guardado: se toman como snapshot al guardar. Los valores vivos
estan en otro lado: el dinero en el Bag del jugador, el equipo real en
Roster (PlayerCharacter.PlayerRoster). Lee esos para la logica de
juego, no los campos de vista previa de aqui.
Definicion
[CreateAssetMenu(menuName = "MCE/Player/GlobalGameData", fileName = "GlobalGameData")]
public class GlobalGameData : GameVariableHolder
{
// Versionado (escrito al guardar)
public string LastSaveDate;
public string LastGameVersion;
public string LastMCEVersion;
public string LastMCEAssetsVersion;
// Opciones
public GameDifficulty GameDifficulty;
public CatchDifficulty CatchDifficulty;
// General
public bool HasDex;
public SceneLocation LastHealLocation;
public uint StepsTaken;
public SerializableDictionary<Region, List<Badge>> ObtainedBadges;
public List<SceneInfoAsset> VisitedScenes;
public Ball LastUsedBall;
// Ubicacion del jugador
public SceneLocation LastPlayerLocation;
public bool WasPlayerOnBridgeOnLastLocation;
// Solo vista previa del guardado
public uint DexNumber;
public uint Money;
public List<MonsterPreview> RosterPreview;
// Estado de sistemas adicionales (tolerante a null para saves viejos)
public FollowerSaveData FollowerData;
public SecretBaseData SecretBase;
public SceneLocation SecretBaseReturn;
public PlayerGymData PlayerGym;
public List<string> EarnedGymBadges;
public TowerRunState TowerRun;
public void AddBadge(Badge badge, Region region);
public bool HasBadge(Badge badge, Region region);
public List<Badge> GetBadges(Region region);
public int GetTotalNumberOfBadges();
public float GetCatchDifficultyMultiplier();
public override string SaveToText(ISerializer<string> serializer, PlayerCharacter playerCharacter);
public override IEnumerator LoadFromText(ISerializer<string> serializer, string data,
MCESettings mceSettings, MonsterDatabaseInstance monsterDatabase);
public override IEnumerator ResetSave();
}
Campos y propiedades
GameDifficulty
La dificultad de la partida.
Tipo: GameDifficulty
CatchDifficulty
La dificultad de captura. Alimenta a GetCatchDifficultyMultiplier().
Tipo: CatchDifficulty
HasDex
Si el jugador obtuvo la Dex.
Tipo: bool
LastHealLocation
El ultimo lugar donde el jugador se curo: el punto de reaparicion tras una derrota.
Tipo: SceneLocation
LastPlayerLocation
La ultima ubicacion conocida del jugador, escrita al guardar.
Tipo: SceneLocation
WasPlayerOnBridgeOnLastLocation
Si el jugador estaba sobre un puente en su ultima ubicacion (restaurado al cargar).
Tipo: bool
StepsTaken
Total de pasos caminados por el jugador (impulsa eclosion de huevos, roaming, etc.).
Tipo: uint
ObtainedBadges
Medallas obtenidas, indexadas por Region. Manipula via AddBadge / HasBadge /
GetBadges en lugar de mutar directamente.
Tipo: SerializableDictionary<Region, List<Badge>>
VisitedScenes
Escenas que el jugador ha visitado (una miga cosmetica de "ya estuve aqui").
Tipo: List<SceneInfoAsset>
LastUsedBall
La ultima ball que el jugador lanzo (usada para preseleccionarla en combate).
Tipo: Ball
Money
Snapshot de dinero para la vista previa del guardado (no la billetera viva, ver la nota de arriba).
Tipo: uint
DexNumber
Conteo de especies capturadas para la vista previa (solo vista previa).
Tipo: uint
RosterPreview
Snapshot del equipo para la vista previa (especie/forma/genero/huevo), un MonsterPreview
por ranura. Se construye al guardar a partir del roster vivo.
Tipo: List<MonsterPreview>
FollowerData
Estado persistente del seguidor activo en el mundo.
Tipo: FollowerSaveData (OpenMon.MCE.Characters.Followers)
SecretBase
Estado persistente de la Base Secreta del jugador (decoracion colocada). Tolerante a null para saves viejos.
Tipo: SecretBaseData (OpenMon.MCE.World.SecretBase)
SecretBaseReturn
La ubicacion en el mundo que el jugador dejo al entrar al interior de su Base Secreta,
para que el warp de salida lo devuelva exactamente de donde vino. Un Scene nulo/vacio
significa "sin retorno pendiente" y la salida recurre a LastHealLocation.
Tipo: SceneLocation
PlayerGym
El gimnasio personalizado del jugador: sala interior decorada, ranuras de equipo lider, medalla propia y dialogos. Tolerante a null para saves viejos.
Tipo: PlayerGymData (OpenMon.MCE.World.Gym)
EarnedGymBadges
Ids opacos de las medallas de gimnasio personalizadas que este jugador gano al derrotar
gimnasios de otros jugadores (una sola vez, deduplicado). Distinto de ObtainedBadges,
que guarda assets Badge de lideres de gimnasio de region.
Tipo: List<string>
TowerRun
Estado persistente de una corrida de torre de combate en curso.
Tipo: TowerRunState (OpenMon.MCE.Battle.Tower)
Metodos
AddBadge(Badge badge, Region region)
Agrega una medalla a una region (creando la lista de la region si hace falta).
HasBadge(Badge badge, Region region)
Si el jugador posee una medalla especifica en una region.
Devuelve: bool.
GetBadges(Region region)
Todas las medallas que el jugador posee en una region (lista vacia si ninguna).
Devuelve: List<Badge>.
GetTotalNumberOfBadges()
Conteo total de medallas en todas las regiones.
Devuelve: int.
GetCatchDifficultyMultiplier()
El multiplicador de tasa de captura para la CatchDifficulty actual (Guaranteed → -1,
Easy → 1.5, Normal → 1, Hard → 0.5).
Devuelve: float.
SaveToText(ISerializer<string> serializer, PlayerCharacter playerCharacter)
Toma un snapshot del estado vivo del jugador (ubicacion, dinero, dex number, vista previa
del roster), estampa las versiones y serializa a un string SavableGlobalGameData.
Devuelve: string.
LoadFromText(ISerializer<string> serializer, string data, MCESettings mceSettings, MonsterDatabaseInstance monsterDatabase)
Corrutina que deserializa un SavableGlobalGameData y lo aplica de vuelta sobre este
asset (corriendo antes las migraciones de guardado).
Devuelve: IEnumerator.
ResetSave()
Corrutina que restablece a un estado de partida nueva (dificultades Normales, sin dex, ubicacion de curado inicial, medallas/escenas limpias, sistemas adicionales reseteados).
Devuelve: IEnumerator.
SavableGlobalGameData
El espejo apto para serializacion de GlobalGameData. Los objetos Unity por referencia
(escenas, medallas, balls, especies) se guardan por nombre para que los saves sean
estables entre ejecuciones, y un sello SaveFormatVersion impulsa las migraciones al
cargar.
[Serializable]
public class SavableGlobalGameData
{
public int SaveFormatVersion;
public string LastSaveDate;
public string LastGameVersion;
public string LastMCEVersion;
public string LastMCEAssetsVersion;
public GameDifficulty GameDifficulty;
public bool HasDex;
public SavableSceneLocation LastHealLocation;
public SavableSceneLocation LastPlayerLocation;
public uint StepsTaken;
public List<ObjectPair<string, string>> ObtainedBadges; // (nombre region, nombre medalla)
public List<string> VisitedScenes; // nombres de escenas
public string LastUsedBallName; // id canonico
public uint DexNumber;
public uint Money;
public List<SavableMonsterPreview> RosterPreview;
public GameVariables GameVariables;
public FollowerSaveData FollowerData;
public SecretBaseData SecretBase;
public SavableSceneLocation SecretBaseReturn;
public PlayerGymData PlayerGym;
public List<string> EarnedGymBadges;
public TowerRunState TowerRun;
public SavableGlobalGameData(GlobalGameData globalGameData);
public void LoadGlobalGameData(GlobalGameData globalGameData,
MonsterDatabaseInstance monsterDatabase,
WorldDatabase worldDatabase);
}
SaveFormatVersion
La version del formato de guardado estampada cuando se escribio el save. Al cargar,
LoadGlobalGameData la compara contra la version actual y corre las migraciones
pendientes antes de aplicar los datos. Los saves anteriores al sello deserializan esto
como 0.
Tipo: int
LoadGlobalGameData(GlobalGameData globalGameData, MonsterDatabaseInstance monsterDatabase, WorldDatabase worldDatabase)
Resuelve cada nombre de vuelta a su asset vivo y aplica los datos sobre un
GlobalGameData. Las referencias cosmeticas (medallas, escenas visitadas) son
tolerantes: un asset removido/renombrado descarta esa unica entrada en lugar de
fallar toda la carga.
Ejemplo de uso
using OpenMon.MCE.Player;
using OpenMon.MCE.Badges;
using OpenMon.MCE.World;
using Zenject;
public class BadgeCounter : MonoBehaviour
{
[Inject] private GlobalGameData gameData;
private void Start()
{
Debug.Log($"Steps walked : {gameData.StepsTaken}");
Debug.Log($"Total badges : {gameData.GetTotalNumberOfBadges()}");
Debug.Log($"Has Dex : {gameData.HasDex}");
Debug.Log($"Catch mult. : {gameData.GetCatchDifficultyMultiplier()}");
}
}