Add MrGameEng.Mods: mod loading, JSON defs and localization
CI / build-test (push) Failing after 1m8s
CI / build-test (push) Failing after 1m8s
Mods are folders with About/About.json metadata; ModLoader resolves a
deterministic load order (dependencies first, ties alphabetical) and
later mods override earlier ones everywhere.
DefDatabase loads JSON def files ({ "type", "defs": [...] }) into
game-registered Def subclasses, with parent inheritance (own fields on
top of the parent's, nested values replaced whole), abstract parents
and full replacement of same-named defs by later mods.
LanguageManager loads Languages/<code>/*.json flat key-string maps,
switches language at runtime and falls back current -> default -> key.
ModContentTree merges one content folder across mods by relative path;
AtlasBuilder gains an explicit-sources Build overload so a merged
texture tree can be packed incrementally at game start.
The LittleSim game now ships its entire content as the Core mod,
demonstrating the module end to end.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
501d81e19f
commit
5d3c18de40
+23
-1
@@ -41,8 +41,30 @@
|
||||
| `MrGameEng.Collisions` | Определение столкновений: компонент `Collider`, spatial hash, пары/запросы/raycast |
|
||||
| `MrGameEng.UI` | Игровой UI на [Myra](https://github.com/rds1983/Myra): `Desktop` на сцену, виджеты, скининг |
|
||||
| `MrGameEng.DevConsole` | Ингейм-консоль разработчика: логи `Log`, команды, история, автодополнение |
|
||||
| `MrGameEng.Mods` | Система модов: обнаружение и порядок загрузки (`About/About.json`), JSON-дефы с наследованием и переопределением, локализация (`Languages/<код>/`), слияние деревьев контента |
|
||||
|
||||
Планируемые модули (по мере развития): `Physics2D`, `Tilemap`, `UI`, `Particles`.
|
||||
Планируемые модули (по мере развития): `Physics2D`, `Particles`.
|
||||
|
||||
### MrGameEng.Mods
|
||||
|
||||
Контент игры описывается **модами** — папками вида `Mods/<Id>` с метаданными в
|
||||
`About/About.json` (id, имя, версия, зависимости). `ModLoader.Load` упорядочивает моды
|
||||
детерминированно: зависимости раньше зависимых, при равенстве — по алфавиту id. Поздний
|
||||
мод переопределяет ранние во всех системах контента. Сама игра поставляет свой контент
|
||||
как мод `Core` — любой другой мод может переопределить её данные.
|
||||
|
||||
- **Дефы** (`Defs/**/*.json`): файл-конверт `{ "type": "<ключ>", "defs": [ … ] }`;
|
||||
CLR-тип на ключ регистрирует игра (`DefDatabase.RegisterType<T>`). Поля: `defName`
|
||||
(уникален в типе; одноимённый деф позднего мода полностью заменяет ранний), `parent`
|
||||
(поля родителя как основа, свои — поверх; вложенные объекты заменяются целиком),
|
||||
`abstract` (только родитель, в базу не попадает; не наследуется), `label`.
|
||||
- **Локализация** (`Languages/<код>/**/*.json`): плоские словари ключ→строка;
|
||||
`LanguageManager` переключает язык на лету, недостающие ключи берёт из языка по
|
||||
умолчанию, в крайнем случае возвращает сам ключ.
|
||||
- **Деревья контента**: `ModContentTree.Build(mods, "Textures")` сливает одноимённые
|
||||
папки всех модов (поздний мод побеждает по относительному пути) — результат кормится,
|
||||
например, в `AtlasBuilder.Build(options, sources)` для инкрементальной сборки атласов
|
||||
при старте игры.
|
||||
|
||||
### Правило зависимостей
|
||||
|
||||
|
||||
Reference in New Issue
Block a user