Обновлено:

На этой странице

Модификации, игровые режимы и 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 и изоляцию проектировать специально.

Порядок дополнений и версии их содержимого должны сохраняться вместе с партией. Одних имён каталогов недостаточно для воспроизведения игры после обновления модов.