Files
LittleSim/docs/mods.md
Leonid PershinandClaude Fable 5 8b531bcd7e 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>
2026-06-11 21:51:46 +03:00

4.8 KiB

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

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

{
  "id": "MyMod",
  "name": "Мой мод",
  "author": "…",
  "version": "1.0",
  "description": "…",
  "dependencies": ["Core"]
}

Дефы

Каждый файл в Defs/ — конверт с типом и списком дефов:

{
  "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 — плоские словари «ключ → строка»:

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