110 lines
5.9 KiB
Markdown
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 [имя] [фильтр]` — загруженные атласы и их регионы.
|