Data-driven текстовая RPG в Telegram на базе aiogram 3.x. Вся игровая логика и контент описаны в JSON-сценариях.
- Data-driven архитектура: движок бота максимально простой, вся логика игры в JSON
- Сеттинг Warhammer 40K: порча, репутация фракций, атмосфера мрачного будущего
- Skill checks: проверки навыков с детерминированным рандомом
- Ветвящийся сюжет: условия, эффекты, множественные концовки
- Тестируемость: JSON-сценарии можно валидировать и тестировать как данные
git clone <repo>
cd BotGame
# Создать .env файл
echo "BOT_TOKEN=your_telegram_bot_token" > .envdocker-compose up -d# Создать виртуальное окружение
python -m venv venv
venv\Scripts\activate # Windows
# или
source venv/bin/activate # Linux/Mac
# Установить зависимости
pip install -r requirements.txt
# Запустить бота
python -m bot.mainДля создания и редактирования кампаний доступен визуальный редактор с графическим интерфейсом.
- Визуальный граф узлов с drag & drop
- Редактирование текста, тегов, эффектов
- Настройка условий и проверок навыков
- Управление предметами и таблицами лута
- Редактирование метаданных кампании
- Автосохранение позиций узлов
cd campaign-editor
docker-compose up -dРедактор будет доступен по адресу: http://localhost:3000
Подробнее: campaign-editor/README.md
BotGame/
├── bot/ # Код бота
│ ├── main.py # Точка входа
│ ├── config.py # Настройки
│ ├── handlers/ # Aiogram handlers
│ ├── engine/ # Игровой движок
│ ├── models/ # Pydantic модели
│ └── db/ # Работа с БД
├── campaigns/ # Кампании (JSON)
│ └── hive_tithes/ # Пример кампании
├── campaign-editor/ # Визуальный редактор кампаний
│ ├── src/client/ # React frontend
│ ├── src/server/ # Express API
│ └── docker-compose.yml # Отдельный запуск
├── schemas/ # JSON Schema для валидации
├── tests/ # Тесты
├── docs/ # Документация и изображения
├── Dockerfile
├── docker-compose.yml
└── requirements.txt
Кампания состоит из нескольких JSON-файлов в папке campaigns/<campaign_id>/:
{
"campaign": {
"id": "my_campaign",
"title": "Название кампании",
"version": "1.0.0"
},
"start_node": "intro"
}{
"intro": {
"text": ["Первый абзац.", "Второй абзац."],
"options": [
{
"label": "Идти вперёд",
"action": {
"goto": { "next": "scene_2" }
}
},
{
"label": "Проверить ловкость",
"action": {
"checks": [
{
"stat": "agility",
"dc": 10,
"on_fail": [{ "type": "modify_resource", "key": "hp", "delta": -2 }]
}
],
"goto": { "success": "success_scene", "fail": "fail_scene" }
}
}
]
}
}{
"loot_table": [
{ "weight": 70, "effects": [{ "type": "message", "text": "Ничего" }] },
{ "weight": 30, "effects": [{ "type": "add_item", "id": "treasure" }] }
]
}| Тип | Описание | Параметры |
|---|---|---|
stat_gte |
Стат >= значения | stat, value |
stat_lte |
Стат <= значения | stat, value |
resource_gte |
Ресурс >= значения | key, value |
reputation_gte |
Репутация >= значения | faction, value |
has_item |
Есть предмет | id |
has_status |
Есть статус | status |
flag_is |
Флаг равен значению | flag, value |
Логические операторы: all, any, not
| Тип | Описание | Параметры |
|---|---|---|
modify_stat |
Изменить стат | stat, delta |
modify_resource |
Изменить ресурс | key, delta |
modify_reputation |
Изменить репутацию | faction, delta |
add_item |
Добавить предмет | id |
remove_item |
Убрать предмет | id |
add_status |
Добавить статус | status |
remove_status |
Убрать статус | status |
set_flag |
Установить флаг | flag, value |
roll_table |
Бросок по таблице | table |
message |
Показать сообщение | text |
/start- Начать игру или продолжить/status- Показать статус персонажа/help- Справка
# Установить pytest
pip install pytest
# Запустить тесты
pytest tests/ -vJSON Schema находится в schemas/campaign.schema.json. Можно использовать для валидации в CI/CD.
| Переменная | Описание | По умолчанию |
|---|---|---|
BOT_TOKEN |
Токен Telegram бота | - |
DB_PATH |
Путь к SQLite базе | data/game.db |
CAMPAIGN_PATH |
Путь к кампаниям | campaigns |
LOG_LEVEL |
Уровень логирования | INFO |
MIT
В мрачной тьме далёкого будущего есть только война...
