NOVENG: Консольный движок для текстовых новелл на чистом C++

  • Автор темы Автор темы TheCawa
  • Дата начала Дата начала
Приветствую, коллеги!

В эпоху, когда визуальные новеллы требуют гигабайты ассетов, 3D-фоны и тяжелые движки вроде Unity или Ren'Py, находится место и для настоящего минимализма.

Представляю вашему вниманию NOVENG (Novel Engine) v0.5 — легковесный консольный движок для создания текстовых квестов и новелл, написанный на чистом C++17.

В этом посте разберем, как устроен движок, почему он использует терминал, и как на нем можно создавать полноценные интерактивные истории.

Философия консоли: Больше, чем просто текст

Главная фишка NovEng — это текстовый UI. Вместо спрайтов и фонов движок использует возможности современных терминалов:

  • ANSI Escape-коды для раскраски имен персонажей и системных сообщений.
  • Псевдографика (ASCII-арт) для отрисовок рамок меню и красивого логотипа на старте.
  • Эффект печати (typewriter effect) с настраиваемой скоростью и звуковым сопровождением каждой буквы.
  • Тряска экрана (shake), реализованная через динамическое смещение offsetX и offsetY при перерисовке истории диалогов.

Такой подход не только снижает системные требования до абсолютного минимума, но и придает играм особый ретро-киберпанковый вайб, где воображение игрока дорисовывает графику лучше любого современного 3D-движка.

Архитектура и Стек

Движок написан на современном C++17 с активным использованием std::filesystem. Стек зависимостей намеренно минималистичен:

  1. miniaudio — мощная и легковесная библиотека для работы со звуком. Отвечает за фоновую музыку (с зацикливанием и перемоткой) и SFX. Поддерживается изменение pitch (высоты звука) на лету, что позволяет генерировать уникальные голоса для разных персонажей из одного сэмпла печати.
  2. nlohmann/json — стандарт индустрии. Используется для сериализации сохранений (позиция в сюжете, цвета, активная музыка, переменные) и хранения настроек.
  3. Собственная криптография — никаких внешних библиотек. Автор реализовал ChaCha20 и SHA-256 прямо внутри проекта для защиты ассетов.

💡 Паттерн Factory для команд
Одной из самых сильных сторон кодовой базы является расширяемость. Система команд сценария построена на паттерне Factory. Это означает, что разработчику не нужно лезть в ядро engine.cpp, чтобы добавить новую команду. Достаточно написать отдельный .cpp файл и зарегистрировать его. Движок автоматически подхватит новые функции при компиляции.

Сценарный язык: Пишем игру в Блокноте

NovEng не требует изучения сложных скриптовых языков. Сценарии хранятся в обычных .txt файлах в папке res/scenario/. Синтаксис интуитивно понятен и состоит из трех элементов:

  1. [Имя] — задает говорящего персонажа.
  2. Обычный текст — выводится на экран с эффектом печати.
  3. {команда:аргументы} — управляющие конструкции.

Код:
{color:Система|36}
{color:Голос|33}
{type:Система|1.2}
{play:ambient_base.mp3|loop}

[Система]
Инициализация протокола... $version$%
{sfx:beep.wav}

[Голос]
У нас хватит заряда для прыжка?
{choice:Рискнуть|jump_success.txt|Искать другой путь|search_path.txt}

Доступные команды:

  • Визуал и Система: clear (очистка), shake (тряска), color (ANSI-цвета), next_chapter (переход между файлами).
  • Звук: play (музыка с флагом loop), stop_music, sfx (эффекты с pitch), volume, type (настройка голоса).
  • Логика и Переменные:

    • set:key|value — создание переменных (вывод через $key$).
    • if:key|val|file1|file2 — условные переходы.
    • chance:%|file1|file2 — сюжетные развилки (RNG).
    • choice — интерактивное меню выбора.

Безопасность: Защита от взлома и чтения

Поскольку сценарии хранятся в .txt, любой мог бы открыть папку и прочитать спойлеры. NovEng решает эту проблему элегантно:

  1. Шифрование ассетов. В конфигурации сборки задается ASSET_KEY. При загрузке используется алгоритм ChaCha20 (с деривацией ключа через SHA-256). На диске файлы — нечитаемый мусор, расшифровка идет только в RAM.
  2. Защита от Path Traversal. В исходном коде (loadScenario) реализована проверка через fs::weakly_canonical. Исключает обращение к системным файлам ОС (например, {next_chapter:../../Windows/System32/config/SAM}).
  3. Кэширование. Расшифрованные файлы кэшируются в std::map, что предотвращает повторную нагрузку на CPU/Disk.

Удобство для разработчика

Автор уделил внимание не только игрокам, но и создателям новелл:

  • Система логирования. Класс Logger пишет отчеты в res/log с таймстампами. Ошибки фиксируются с уровнями ERROR/WARN.
  • Локализация. Встроенный LocalizationManager позволяет переводить интерфейс. Переключение языка доступно в настройках.
  • Сохранения. Быстрое сохранение на клавишу S или через меню. Сериализуется всё: от индекса строки до глобальных переменных.
  • Настройки. Громкость, скорость печати, размер истории диалогов — всё сохраняется в JSON между сессиями.

Сборка и запуск

Проект использует классический Makefile и компилятор с поддержкой C++17 (GCC или MSVC).

Важно для сборки сказал(а):
Зависимость от MinGW-w64. В репозитории лежат только базовые утилиты (make, g++). Для успешной компиляции потребуется скачать полный пакет winlibs standalone build of GCC и прописать его в системный PATH.

Зависимости:
  • miniaudio.h (в комплекте)
  • json.hpp (nlohmann/json)

Музыкальное сопровождение:
В проекте используются треки автора Егорbez (саундтреки из игры "Кризис: Третий путь"). Все права принадлежат автору.

Итоги

NOVENG v0.5 — это отличный пример того, как системный подход и знание C++ позволяют создать законченный, безопасный и удобный продукт в нише, где правят тяжелые визуальные движки.

Для инди-разработчиков, которые хотят рассказать историю, не отвлекаясь на рисование спрайтов и настройку шейдеров, NovEng предлагает идеальный баланс: простота Блокнота для сценариста и мощь современного C++ под капотом. А поддержка шифрования делает его пригодным даже для коммерческого релиза.

🔗 Ссылка на разработчика: TheCawa

📕 Ссылка на репозиторий: Noveng

📂 Проекты автора: AntiYandex, CawOS, NovEng, NodeFault​

Последнее редактирование: 25 мая 2026
 
Назад
Верх