Перейти к основному содержимому

GlobalGameData

Основной сохраняемый контейнер состояния игровой сессии — сложность, значки, посещённые сцены, последнее место лечения/игрока, счётчик шагов и постоянное состояние дополнительных систем (спутники, Secret Base, зал игрока, забеги по башне). Это ассет ScriptableObject, внедряемый через Zenject, который сериализует себя на диск через своё сохраняемое зеркало SavableGlobalGameData.

Namespace: OpenMon.MCE.Player

Некоторые поля только для предпросмотра сохранения

Money, DexNumber и RosterPreview в GlobalGameData существуют только для UI предпросмотра слота сохранения — они снимаются в момент сохранения. Живые значения лежат в другом месте: деньги — в Bag игрока, реальная команда — в Roster (PlayerCharacter.PlayerRoster). Для игровой логики читайте их, а не поля предпросмотра здесь.

Определение​

[CreateAssetMenu(menuName = "MCE/Player/GlobalGameData", fileName = "GlobalGameData")]
public class GlobalGameData : GameVariableHolder
{
// Версионирование (записывается при сохранении)
public string LastSaveDate;
public string LastGameVersion;
public string LastMCEVersion;
public string LastMCEAssetsVersion;

// Опции
public GameDifficulty GameDifficulty;
public CatchDifficulty CatchDifficulty;

// Общее
public bool HasDex;
public SceneLocation LastHealLocation;
public uint StepsTaken;
public SerializableDictionary<Region, List<Badge>> ObtainedBadges;
public List<SceneInfoAsset> VisitedScenes;
public Ball LastUsedBall;

// Местоположение игрока
public SceneLocation LastPlayerLocation;
public bool WasPlayerOnBridgeOnLastLocation;

// Только предпросмотр сохранения
public uint DexNumber;
public uint Money;
public List<MonsterPreview> RosterPreview;

// Состояние дополнительных систем (устойчиво к null для старых сохранений)
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();
}

Поля и свойства​

GameDifficulty​

Сложность прохождения.

Тип: GameDifficulty

CatchDifficulty​

Сложность поимки. Питает GetCatchDifficultyMultiplier().

Тип: CatchDifficulty

HasDex​

Получил ли игрок Dex.

Тип: bool

LastHealLocation​

Последнее место, где игрок лечился — точка возрождения после поражения.

Тип: SceneLocation

LastPlayerLocation​

Последнее известное местоположение игрока, записанное при сохранении.

Тип: SceneLocation

WasPlayerOnBridgeOnLastLocation​

Стоял ли игрок на мосту в своём последнем местоположении (восстанавливается при загрузке).

Тип: bool

StepsTaken​

Всего пройдено шагов игроком (влияет на вылупление яиц, роуминг и т. д.).

Тип: uint

ObtainedBadges​

Полученные значки, с ключом по Region. Управляйте через AddBadge / HasBadge / GetBadges, а не изменяйте напрямую.

Тип: SerializableDictionary<Region, List<Badge>>

VisitedScenes​

Сцены, которые посетил игрок (косметическая пометка «был ли я здесь»).

Тип: List<SceneInfoAsset>

LastUsedBall​

Последний мяч, брошенный игроком (используется для предвыбора в бою).

Тип: Ball

Money​

Снимок денег для предпросмотра сохранения (не живой кошелёк — см. заметку выше).

Тип: uint

DexNumber​

Счётчик пойманных видов для предпросмотра (только предпросмотр).

Тип: uint

RosterPreview​

Снимок команды для предпросмотра сохранения (вид/форма/пол/яйцо), по одному MonsterPreview на слот. Строится при сохранении из живого ростера.

Тип: List<MonsterPreview>

FollowerData​

Постоянное состояние активного спутника в мире.

Тип: FollowerSaveData (OpenMon.MCE.Characters.Followers)

SecretBase​

Постоянное состояние Secret Base игрока (размещённый декор). Устойчиво к null для старых сохранений.

Тип: SecretBaseData (OpenMon.MCE.World.SecretBase)

SecretBaseReturn​

Местоположение в мире, которое игрок покинул, входя в интерьер своей Secret Base, чтобы телепорт выхода вернул его точно туда, откуда он пришёл. Пустой/null Scene означает «нет ожидающего возврата», и выход откатывается к LastHealLocation.

Тип: SceneLocation

PlayerGym​

Собственный кастомный зал игрока: обставленная внутренняя комната, слоты команды лидера, кастомный значок и диалоги. Устойчиво к null для старых сохранений.

Тип: PlayerGymData (OpenMon.MCE.World.Gym)

EarnedGymBadges​

Непрозрачные идентификаторы кастомных значков зала, заработанных этим игроком за победу над залами других игроков (единожды, с дедупликацией). Отличается от ObtainedBadges, который хранит авторские ассеты Badge лидеров региональных залов.

Тип: List<string>

TowerRun​

Постоянное состояние текущего забега по боевой башне.

Тип: TowerRunState (OpenMon.MCE.Battle.Tower)

Методы​

AddBadge(Badge badge, Region region)​

Добавляет значок в регион (создавая список региона при необходимости).

HasBadge(Badge badge, Region region)​

Владеет ли игрок конкретным значком в регионе.

Возвращает: bool.

GetBadges(Region region)​

Все значки, которыми игрок владеет в регионе (пустой список, если нет).

Возвращает: List<Badge>.

GetTotalNumberOfBadges()​

Общее число значков по всем регионам.

Возвращает: int.

GetCatchDifficultyMultiplier()​

Множитель шанса поимки для текущей CatchDifficulty (Guaranteed → -1, Easy → 1.5, Normal → 1, Hard → 0.5).

Возвращает: float.

SaveToText(ISerializer<string> serializer, PlayerCharacter playerCharacter)​

Снимает живое состояние игрока (местоположение, деньги, номер dex, предпросмотр ростера), штампует версии и сериализует в строку SavableGlobalGameData.

Возвращает: string.

LoadFromText(ISerializer<string> serializer, string data, MCESettings mceSettings, MonsterDatabaseInstance monsterDatabase)​

Корутина, десериализующая SavableGlobalGameData и применяющая его обратно на этот ассет (предварительно выполнив миграции сохранения).

Возвращает: IEnumerator.

ResetSave()​

Корутина, сбрасывающая к свежему состоянию новой игры (сложности Normal, без dex, начальное место лечения, очищенные значки/сцены, сброшенные дополнительные системы).

Возвращает: IEnumerator.

SavableGlobalGameData​

Удобное для сериализации зеркало GlobalGameData. Ссылочные объекты Unity (сцены, значки, мячи, виды) хранятся по имени, чтобы сохранения были стабильны между запусками, а штамп SaveFormatVersion управляет миграциями при загрузке.

[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; // (имя региона, имя значка)
public List<string> VisitedScenes; // имена сцен
public string LastUsedBallName; // канонический id
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​

Версия формата сохранения, проштампованная при записи. При загрузке LoadGlobalGameData сравнивает её с текущей версией и выполняет ожидающие миграции перед применением данных. Сохранения старше штампа десериализуют это как 0.

Тип: int

LoadGlobalGameData(GlobalGameData globalGameData, MonsterDatabaseInstance monsterDatabase, WorldDatabase worldDatabase)​

Разрешает каждое имя обратно в живой ассет и применяет данные к GlobalGameData. Косметические ссылки (значки, посещённые сцены) устойчивы: удалённый/переименованный ассет отбрасывает одну эту запись, а не рушит всю загрузку.

Пример использования​

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()}");
}
}