Files
LittleSim/docs/mods.md
T

5.9 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.

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 разрешается после слияния всех файлов, так что ссылка на родителя из другого файла/папки (TreeOakABaseTree) работает независимо от расположения.

Локализация

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