Game as the Core mod: data-driven content and localization
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>
This commit is contained in:
co-authored by
Claude Fable 5
parent
218973ae60
commit
8b531bcd7e
@@ -0,0 +1,89 @@
|
||||
# Моды и локализация
|
||||
|
||||
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
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "MyMod",
|
||||
"name": "Мой мод",
|
||||
"author": "…",
|
||||
"version": "1.0",
|
||||
"description": "…",
|
||||
"dependencies": ["Core"]
|
||||
}
|
||||
```
|
||||
|
||||
## Дефы
|
||||
|
||||
Каждый файл в `Defs/` — конверт с типом и списком дефов:
|
||||
|
||||
```json
|
||||
{
|
||||
"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` — плоские словари «ключ → строка»:
|
||||
|
||||
```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 [имя] [фильтр]` — загруженные атласы и их регионы.
|
||||
Reference in New Issue
Block a user