TurnBase — это лёгкая и расширяемая библиотека на C#, предоставляющая основные компоненты для создания любых пошаговых 2D-игр. Независимо от того, разрабатываете ли вы классическую настольную игру, такую как шахматы или шашки, либо сложную пошаговую RPG, эта библиотека предназначена для реализации базовой игровой механики, позволяя вам сосредоточиться на уникальных особенностях вашей игры.
Проект разработан таким образом, чтобы не зависеть от конкретного игрового движка. Вы можете интегрировать его игровую логику в Godot, Unity или любой другой фреймворк.
HTML5-версию примера можно найти здесь: https://apmem.github.io/TurnBase/Godot.html
Репозиторий разделён на общий движок, реализацию игры, интерфейсы запуска и тесты:
- TurnBase — универсальное ядро пошаговых игр: игровой цикл, контракты игроков и правил, поле, события, логирование, ротация ходов, сетевые и replay-механизмы;
- TurnBase.KaNoBu — конкретная игра KaNoBu: фигуры, правила, модели обмена и AI-игроки;
- TurnBase.KaNoBu.Console — консольный интерфейс и демонстрационный запуск;
- TurnBase.KaNoBu.Godot — графический интерфейс Godot, уровни, визуализация и клиент-серверный слой;
- TurnBase.Tests — NUnit-тесты игровой логики и поведения AI.
Зависимости направлены от интерфейсов запуска к игровой логике, а от игровой логики к общему движку. Конкретные правила не должны попадать в TurnBase, а UI и консольные проекты не должны дублировать правила из TurnBase.KaNoBu.
TurnBase отвечает за универсальную координацию партии. TurnBase.KaNoBu отвечает за смысл игровых сущностей и правил. Console и Godot предоставляют разные способы взаимодействия с одной и той же игрой. Tests фиксирует ожидаемое поведение и помогает безопасно менять общий движок или KaNoBu.
При добавлении новой игровой механики её следует размещать в TurnBase.KaNoBu. Изменения в TurnBase нужны только для возможностей, общих для нескольких игр. Изменения интерфейса или визуализации не должны менять состояние игры в обход IGameRules.
- Создаётся реализация
IGameRulesи передаётся в универсальныйGame<T...>. - В
Gameдобавляются игроки и обработчики событий. - Движок запускает инициализацию: правила формируют модели, игроки возвращают ответы, а правила применяют их к основному полю.
- Для каждого хода игрок получает представление поля, возвращает ответ, после чего правила проверяют и применяют ход.
- Движок рассылает уведомления игрокам и слушателям, а затем передаёт ход следующему игроку согласно ротации.
- После ходов правила проверяют условие завершения. При готовом результате вызывается событие окончания игры.
В KaNoBu эти этапы конкретизируются классами KaNoBuRules, KaNoBuFigure, моделями ходов и игроками. Подробности доменной механики находятся в TurnBase.KaNoBu/README.md.
- Игровой движок — универсальная часть
TurnBase, координирующая игроков и правила. - Правила игры — реализация
IGameRules, управляющая полем, ходами и завершением партии. - Игрок — реализация
IPlayer, которая создаёт расстановку и предлагает ход. - Модель обмена — типизированный объект, передаваемый между движком, правилами и игроком.
- Слушатель событий — реализация
IGameEventListener, получающая уведомления о состоянии партии. - KaNoBu — конкретная игра, использующая общий движок и добавляющая свои фигуры, правила и стратегии.
Документация поддерживается по принципу вложенной синхронизации. Если изменилось содержимое папки, сначала нужно проверить README этой папки, затем README каждого родительского каталога вплоть до корня. Обновляется только тот документ, для которого изменение меняет описание его области ответственности, связей, состава подсистем или жизненного цикла.
README папки должен описывать её назначение, допустимое содержимое, связи с соседними слоями и правила размещения изменений. Поэтому при добавлении, удалении или переносе файлов и подпапок необходимо проверить, не устарели ли эти сведения. При изменении публичного контракта, игрового правила, формата данных или процесса выполнения нужно также проверить README зависимых и родительских компонентов.
Корневой README описывает репозиторий целиком: проекты, направление зависимостей, общую архитектуру, словарь и общий жизненный цикл. README дочерних каталогов уточняют эти сведения для своей области и не должны дублировать описание соседних проектов без необходимости. Такая структура одинаково полезна человеку и системе, которая использует документацию для навигации по коду.
При добавлении новой папки создайте в ней README, если она является самостоятельной подсистемой, и обновите ближайший родительский README. При удалении или переименовании папки удалите устаревшие ссылки и проверьте все документы, где она упоминается.