# Модификации, игровые режимы и Lua

## Режим как набор слоёв

[C7Engine/Lua/GameMode.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/Lua/GameMode.cs) загружает базовый каталог и упорядоченные дополнения. Конфигурация содержит `baseModeDir` и список `addonPaths`. Например, `civ3` — база, а `standalone` накладывается поверх неё.

В текущем коде есть **четыре** канала: ruleset, textures, behaviors и audio. [документ о режимах](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/Lua/README.GameModes.md) описывает первые три и отстаёт от реализации в части аудио.

| Файл режима | Назначение |
| --- | --- |
| `ruleset.json` или `ruleset.lua` | Данные игры и сценария |
| `textures.lua` | Ключи и способы загрузки графики |
| `behaviors.lua` | Изменяемые функции правил |
| `audio.lua` | Конфигурация звука |

Для базового ruleset сначала пробуется JSON. Дополнение возвращает функцию преобразования текущей таблицы, а не готовую независимую таблицу. Дополнения применяются по порядку; отсутствующий в дополнении канал пропускается. Итоговые данные преобразуются в JSON и десериализуются в SaveGame.

## Данные отдельно от поведения

В [C7Engine/Lua/BehaviorEngine.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/Lua/BehaviorEngine.cs) строковый путь вроде `building.production_rules.must_be_coastal` разрешается в Lua-функцию и C# delegate, который кэшируется. Данные могут ссылаться на именованное правило, вместо жёсткой ветки по имени здания.

Примеры вынесенного поведения: условия строительства, изменение дохода клетки, преобразование производства в доход, награда за роспуск юнита и календарная подпись. Источники: [C7/Lua/civ3/behaviors/buildings.lua](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/Lua/civ3/behaviors/buildings.lua), [C7/Lua/civ3/behaviors/gameplay.lua](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/Lua/civ3/behaviors/gameplay.lua), [C7/Lua/civ3/behaviors/terrain_improvements.lua](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/Lua/civ3/behaviors/terrain_improvements.lua).

## Standalone меняет и содержание

[C7/Lua/standalone/ruleset.lua](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/Lua/standalone/ruleset.lua) не только заменяет изображения. Оно удаляет юниты без доступной замены и ссылки обновления на отсутствующие цели. Это важная причина различать графический пакет и пакет правил: в этом проекте они намеренно связаны.

## Границы моддинга

В документе остаётся TODO по загрузке модов без изменения кода: описанная процедура предполагает создание Config в C#. Это ещё не законченный пользовательский менеджер модов.

`ScriptInitializer` регистрирует публичные типы C7GameData и глобальные `GAME_DATA` и `ENUMS`. Такая интеграция удобна, но по этим исходникам нельзя объявить произвольные моды изолированными и безопасными. Это оценка архитектурной границы, не проведённый аудит защиты.

## Для нашей игры

Начать с JSON-профиля и реестра заранее разрешённых функций JavaScript. Отдельно версионировать правила, графику и сценарий; проверять конфликты дополнений и отсутствующие ссылки до старта партии. Если позже появятся исполняемые моды, API и изоляцию проектировать специально.

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

