# Разработка, сборка и проверка совместимости

## Зафиксированный стек

[C7/C7.csproj](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/C7.csproj) использует **Godot.NET.Sdk 4.4.1**, `net8.0` и ссылки на движок, импорт и конвертацию. [C7Engine/C7Engine.csproj](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7Engine.csproj) использует обычный .NET SDK, MoonSharp 2.0.0 и System.Text.Json 6.0.11 среди пакетов. Версии относятся к изученному коммиту, не являются рекомендацией обновлять наш проект.

[doc/dev_environment.md](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/doc/dev_environment.md) описывает импорт `C7/project.godot`, редактор Godot с .NET, Rider либо VS Code. Для полного checkout нужны субмодули Assets и MarkdownLabel; их закреплённые ревизии указаны в [метаданных среза](data/repository-snapshot.json).

Команды из документа для отдельной исследовательской копии:

```bash
dotnet build C7/C7.sln
dotnet test C7/C7.sln --logger "console;verbosity=detailed"
```

В этом исследовании команды **не выполнялись**: задача состояла в анализе и подготовке базы, а не установке desktop-игры на сервере.

## Что есть в тестах

Механический подсчёт корпуса обнаружил **186 атрибутов Fact, Theory и SkippableFact** в тестовых файлах. Это не число пройденных тестов: Theory может разворачиваться в несколько случаев, некоторые проверки пропускаются.

| Направление | Примеры источников |
| --- | --- |
| Маршруты | [AStarPathFindingTest](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/AI/Pathing/AStarPathFindingTest.cs), колёсные ограничения |
| Поселение | [Заблокированная цель поселенца](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/AI/UnitAI/SettlerDestinationBlockedTest.cs) |
| Города и здания | [CityTest](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/CityTest.cs), зависимости, чудеса, глобальные эффекты |
| Сохранения | [SaveTest](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/SaveTest.cs), преобразование и сценарии |
| Сделки | [MultiTurnDealsTest](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/MultiTurnDealsTest.cs) |
| Технологии | [FreeTechTest](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/FreeTechTest.cs) |
| Победы | [CheckVictoryTest](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/Victory/CheckVictoryTest.cs) |
| Генерация | [MapGeneratorTest](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/MapGeneratorTest.cs), поймы и карта высот |

Полный реестр атрибутов: [test-inventory.json](data/test-inventory.json).

## Условия выполнения

Часть тестов требует локальную Civ3 и пропускается при её отсутствии. [EngineTests/Utils/RemoteSaveLoader.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/Utils/RemoteSaveLoader.cs) скачивает примеры сохранений по сети. Успешный запуск без ресурсов может поэтому покрыть меньше сценариев, чем кажется.

[Основной workflow сборки](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/.github/workflows/export-c7.yml) содержит запуск dotnet test для платформенных сборок и получение субмодулей. Файл с названием test-action — демонстрационный workflow, его нельзя ошибочно принять за всю CI-проверку.

## План проверки для нас

При реализации выбранной механики взять небольшой независимый пример и ожидаемое правило, затем проверить полный путь «приказ → изменение состояния → подсказка → сохранение → загрузка». Для совместимости Atlants нужны собственные fixtures и отчёт по каждому неподдерживаемому свойству.

Особенно ценны проверки границ: последний житель, полный запас производства, нулевая наука, обрыв дороги, последняя сторона в игре и загрузка посреди хода. Сходство названий тестов двух проектов не заменяет проверку нашей реализации.

