The whole game is now described by Mods/Core — the first consumer of the engine's new MrGameEng.Mods module: - textures/ moved to Mods/Core/Textures; atlases are built at game start from the merged texture tree of all active mods into Cache/ (gitignored, incremental) instead of being committed, and the GameAssets atlas handles are gone with them - terrain, plants and pawns are JSON defs (Mods/Core/Defs) with parent inheritance; scenes read TerrainDef/PlantDef/PawnDef instead of hardcoded arrays, and the TerrainKind enum is retired - HUD strings come from Mods/Core/Languages (ru default, en fallback) through LanguageManager; the language switches at runtime - new console commands: mods, lang [code], defs [type]; atlas now inspects the runtime-built cache - bump engine: MrGameEng.Mods module and the explicit-sources AtlasBuilder overload Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.8 KiB
Моды и локализация
LittleSim устроен по принципу RimWorld: вся игра — это мод. Папка Mods/Core
содержит весь контент игры (дефы, текстуры, языки), а движковый модуль
MrGameEng.Mods умеет загружать сколько угодно таких папок. Любой мод, загруженный
после Core, может переопределить его данные — деф, текстуру или строку перевода.
Структура мода
Mods/<Имя>/
About/About.json метаданные: id, name, version, dependencies
Defs/**/*.json дефы — данные игровых сущностей
Languages/<код>/*.json строки локализации (ru, en, …)
Textures/** картинки; пути = ключи регионов атласов
Порядок загрузки детерминирован: зависимости раньше зависимых, при равенстве — по алфавиту id. Поздний мод переопределяет ранние: одноимённый деф заменяется целиком, одноимённый ключ перевода и текстура по тому же относительному пути — тоже.
About.json
{
"id": "MyMod",
"name": "Мой мод",
"author": "…",
"version": "1.0",
"description": "…",
"dependencies": ["Core"]
}
Дефы
Каждый файл в Defs/ — конверт с типом и списком дефов:
{
"type": "Pawn",
"defs": [
{ "defName": "BaseAnimal", "abstract": true, "kind": "animal" },
{ "defName": "Bear", "parent": "BaseAnimal", "label": "pawn.bear",
"texture": "things/pawn/animal/bear/Bear_east", "sizeCells": 1.7 }
]
}
defName— уникален внутри типа; одноимённый деф позднего мода полностью заменяет ранний (слияния полей между модами нет — намеренно, для предсказуемости).parent— поля родителя берутся как основа, свои пишутся поверх; вложенные объекты и массивы заменяются целиком. Абстрактность не наследуется.abstract: true— деф служит только родителем и в базу не попадает.label— ключ локализации (или сырой текст, если перевода нет).- Комментарии
//и висячие запятые в JSON допускаются.
Типы дефов Core: Terrain (порог высоты, цвет, поверхность тайла, скаттер растений),
Plant (текстура, размер, радиус ствола-препятствия), Pawn (текстура, размер,
вид — being/animal). CLR-классы — src/LittleSim/Content/GameDefs.cs; новый тип
дефа = новый класс + RegisterType в GameContent.Load.
Локализация
Languages/<код>/*.json — плоские словари «ключ → строка»:
{ "hud.world": "LittleSim | сид {0} | население {1} | {2} FPS" }
Язык по умолчанию — ru, fallback на язык по умолчанию, затем на сам ключ (не краш,
а видимый «голый» ключ). Переключение на лету: команда консоли lang en. Строки в
коде запрашиваются по ключу через LanguageManager.Get/Format — никаких строк UI
в коде.
Текстуры и атласы
Текстуры всех модов сливаются в одно дерево (поздний мод побеждает по относительному
пути) и при старте игры собираются в атласы в Cache/Atlases (gitignored).
Сборка инкрементальная: без изменений старт мгновенный, чистая пересборка ~20 секунд.
Ключ региона — путь без расширения: things/plant/treeoak/TreeOakA; имя атласа — два
первых сегмента пути (things.plant).
Консоль
mods— активные моды в порядке загрузки;lang [код]— показать/переключить язык;defs [тип]— типы дефов или дефы одного типа;atlas [имя] [фильтр]— загруженные атласы и их регионы.