Модификации, игровые режимы и Lua
Режим как набор слоёв
C7Engine/Lua/GameMode.cs загружает базовый каталог и упорядоченные дополнения. Конфигурация содержит baseModeDir и список addonPaths. Например, civ3 — база, а standalone накладывается поверх неё.
В текущем коде есть четыре канала: ruleset, textures, behaviors и audio. документ о режимах описывает первые три и отстаёт от реализации в части аудио.
| Файл режима | Назначение |
|---|---|
ruleset.json или ruleset.lua | Данные игры и сценария |
textures.lua | Ключи и способы загрузки графики |
behaviors.lua | Изменяемые функции правил |
audio.lua | Конфигурация звука |
Для базового ruleset сначала пробуется JSON. Дополнение возвращает функцию преобразования текущей таблицы, а не готовую независимую таблицу. Дополнения применяются по порядку; отсутствующий в дополнении канал пропускается. Итоговые данные преобразуются в JSON и десериализуются в SaveGame.
Данные отдельно от поведения
В C7Engine/Lua/BehaviorEngine.cs строковый путь вроде building.production_rules.must_be_coastal разрешается в Lua-функцию и C# delegate, который кэшируется. Данные могут ссылаться на именованное правило, вместо жёсткой ветки по имени здания.
Примеры вынесенного поведения: условия строительства, изменение дохода клетки, преобразование производства в доход, награда за роспуск юнита и календарная подпись. Источники: C7/Lua/civ3/behaviors/buildings.lua, C7/Lua/civ3/behaviors/gameplay.lua, C7/Lua/civ3/behaviors/terrain_improvements.lua.
Standalone меняет и содержание
C7/Lua/standalone/ruleset.lua не только заменяет изображения. Оно удаляет юниты без доступной замены и ссылки обновления на отсутствующие цели. Это важная причина различать графический пакет и пакет правил: в этом проекте они намеренно связаны.
Границы моддинга
В документе остаётся TODO по загрузке модов без изменения кода: описанная процедура предполагает создание Config в C#. Это ещё не законченный пользовательский менеджер модов.
ScriptInitializer регистрирует публичные типы C7GameData и глобальные GAME_DATA и ENUMS. Такая интеграция удобна, но по этим исходникам нельзя объявить произвольные моды изолированными и безопасными. Это оценка архитектурной границы, не проведённый аудит защиты.
Для нашей игры
Начать с JSON-профиля и реестра заранее разрешённых функций JavaScript. Отдельно версионировать правила, графику и сценарий; проверять конфликты дополнений и отсутствующие ссылки до старта партии. Если позже появятся исполняемые моды, API и изоляцию проектировать специально.
Порядок дополнений и версии их содержимого должны сохраняться вместе с партией. Одних имён каталогов недостаточно для воспроизведения игры после обновления модов.