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 разрешается после слияния всех файлов, так что ссылка на родителя из другого
файла/папки (TreeOakA → BaseTree) работает независимо от расположения.
Локализация
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 [имя] [фильтр]— загруженные атласы и их регионы.