Files

110 lines
5.9 KiB
Markdown

# Моды и локализация
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`.
`Defs/` сканируется рекурсивно (`Defs/**/*.json`), и имя файла ни на что не влияет —
важны только `type` и `defName`. Поэтому контент Core разложен по подпапкам для удобства
поиска: одна папка на тип дефа, внутри — общие (абстрактные) дефы в `_Bases.json` и
конкретные, разбитые по семействам:
```
Defs/
Genes/ _Bases.json, Environment.json, Growth.json, Content.json
Plants/ _Bases.json, Trees.json, Bushes.json, Grass.json, Cacti.json,
Mushrooms.json, Flowers.json, Berries.json
Pawns/ _Bases.json, Beings.json, Animals.json
Terrain/ Terrain.json
Products/ Products.json
Patches/ Patches.json
WorldPresets/ WorldPresets.json
```
`parent` разрешается после слияния всех файлов, так что ссылка на родителя из другого
файла/папки (`TreeOakA``BaseTree`) работает независимо от расположения.
## Локализация
`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 [имя] [фильтр]` — загруженные атласы и их регионы.