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