# Моды и локализация

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