63 lines
6.1 KiB
Markdown
63 lines
6.1 KiB
Markdown
# Resource Atlas — какой мод чьи ресурсы использует
|
||
|
||
Карта ресурсов показывает, как моды игры пользуются ресурсами друг друга: фонами, звуками, музыкой, шейдерами, сценами, текстурами, сущностями, ключами перевода, сценарными действиями и патчами. Для каждого использования она проверяет, что берущий мод зависит от дающего. Она же находит случаи, когда один и тот же ключ кладут моды, не связанные depends, — тогда победителя определяет порядок загрузки, а он не определён, — и ключи, которых не даёт никто.
|
||
|
||
В её основе — граф объявлений и ссылок Validator; сверху добавлено то, чего он не отслеживает: ключи текстур, звуков и шейдеров, ключи перевода и ключи, записанные литералами в коде C#.
|
||
|
||
## Как запустить
|
||
|
||
Атлас — инструментальный запуск: он строит отчёт и завершается.
|
||
|
||
```text
|
||
godot --path . -- --game=novel_template --with-mods=resource_atlas --resource-atlas --atlas-out=<folder>
|
||
godot --path . -- --resource-atlas --atlas-out=res://tests/artifacts/resource_atlas --with-test-suites
|
||
```
|
||
|
||
- С `--game=<id>` картируются моды этой игры (плюс оболочка); без него — все установленные моды.
|
||
- `--with-test-suites` добавляет к карте и тестовые наборы модов.
|
||
- В папку `--atlas-out` пишутся `report.md` (для чтения) и `report.json` (для инструментов); в лог идёт строка `atlas: N error(s), M warning(s)`, а при ошибках код выхода — 1.
|
||
- В тест-раннере это тесты: `resource_atlas` (все моды) и по одному на игру, например `resource_atlas_novel_template`.
|
||
|
||
Текст `report.md` написан по-русски.
|
||
|
||
## Пример связи между модами
|
||
|
||
У собственного мода шаблона новеллы, `my_novel_game`, своих картинок нет: его город, бар и дом берут фоны из `town_pack` — многоразового пака той же игры. В таблице связей отчёта это выглядит одной строкой:
|
||
|
||
```text
|
||
| `my_novel_game` | `town_pack` | yes | 3 | background | `bar/bar`, `home/vestibule`, `town/town_entry` |
|
||
```
|
||
|
||
Столбцы здесь такие: мод; мод, у которого он берёт ресурсы; есть ли тот в его `depends`; число использований, их виды и примеры. Строка верна, потому что `my_novel_game` объявляет `town_pack>=1` в своём `depends`.
|
||
|
||
Для этой страницы из манифеста на один запуск убрали зависимость. Атлас тогда упал с тремя ошибками — по одной на фон, каждая с файлом, который его использует:
|
||
|
||
```text
|
||
**Errors: 3** (mods: my_novel_game) · warnings: 0
|
||
|
||
### A foreign resource is used without a dependency in depends
|
||
|
||
- `my_novel_game` → `town_pack`: background `bar/bar` — uses a resource of the mod town_pack (data) that is not in depends — add the dependency or move the resource. `scenes/my_novel_bar.json`
|
||
```
|
||
|
||
С возвращённой зависимостью в отчёте снова нет ошибок.
|
||
|
||
Почему это важно: без `depends` ничто не заставит игру загрузить `town_pack` вместе с модом шаблона. Игрок, поставивший только `my_novel_game`, получил бы сцены без фонов.
|
||
|
||
## Что внутри отчёта
|
||
|
||
- **Ошибки** — чужой ресурс используется без зависимости; один ключ дают моды, не связанные `depends`; патч чужого ресурса без зависимости.
|
||
- **Связи между модами** — кто у кого что берёт, объявлено ли это, сколько и каких видов.
|
||
- **Переопределения** — ключи, которые кладут несколько модов, и какой из них побеждает.
|
||
- **Патчи чужих ресурсов** — патчи сцен и сущностей, с указанием пропатченного мода.
|
||
- **Предупреждения** — ключи, которых не даёт ни один загруженный мод.
|
||
- **Сводка по модам** и **порядок загрузки**.
|
||
|
||
Сопоставление ключей повторяет правила игры: текстуры — по имени файла; звуки, музыка, шейдеры и сцены — по пути внутри группы; сущности — по виду и идентификатору; переводы — по языку и ключу.
|
||
|
||
## Как исправить найденное
|
||
|
||
1. **Ресурс используется без зависимости.** Добавьте владельца в `depends`, перенесите ресурс в мод, который им пользуется, или дайте своей копии собственный ключ.
|
||
2. **Один ключ в несвязанных модах.** Если один должен заменять другой, заменяющий мод обязан зависеть от владельца; иначе переименуйте один из них.
|
||
3. **Ключ, который никто не даёт.** Либо опечатка, либо дающий мод не входит в эту игру.
|