Приветствую, коллеги!
В эпоху, когда визуальные новеллы требуют гигабайты ассетов, 3D-фоны и тяжелые движки вроде Unity или Ren'Py, находится место и для настоящего минимализма.
Представляю вашему вниманию NOVENG (Novel Engine) v0.5 — легковесный консольный движок для создания текстовых квестов и новелл, написанный на чистом C++17.
В этом посте разберем, как устроен движок, почему он использует терминал, и как на нем можно создавать полноценные интерактивные истории.
Философия консоли: Больше, чем просто текст
В эпоху, когда визуальные новеллы требуют гигабайты ассетов, 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. Стек зависимостей намеренно минималистичен:
- miniaudio — мощная и легковесная библиотека для работы со звуком. Отвечает за фоновую музыку (с зацикливанием и перемоткой) и SFX. Поддерживается изменение pitch (высоты звука) на лету, что позволяет генерировать уникальные голоса для разных персонажей из одного сэмпла печати.
- nlohmann/json — стандарт индустрии. Используется для сериализации сохранений (позиция в сюжете, цвета, активная музыка, переменные) и хранения настроек.
- Собственная криптография — никаких внешних библиотек. Автор реализовал ChaCha20 и SHA-256 прямо внутри проекта для защиты ассетов.
Паттерн Factory для команд
Одной из самых сильных сторон кодовой базы является расширяемость. Система команд сценария построена на паттерне Factory. Это означает, что разработчику не нужно лезть в ядро engine.cpp, чтобы добавить новую команду. Достаточно написать отдельный .cpp файл и зарегистрировать его. Движок автоматически подхватит новые функции при компиляции.
Сценарный язык: Пишем игру в Блокноте
NovEng не требует изучения сложных скриптовых языков. Сценарии хранятся в обычных .txt файлах в папке res/scenario/. Синтаксис интуитивно понятен и состоит из трех элементов:
[Имя] — задает говорящего персонажа.
- Обычный текст — выводится на экран с эффектом печати.
{команда:аргументы} — управляющие конструкции.
Код:
{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 решает эту проблему элегантно:
- Шифрование ассетов. В конфигурации сборки задается
ASSET_KEY. При загрузке используется алгоритм ChaCha20 (с деривацией ключа через SHA-256). На диске файлы — нечитаемый мусор, расшифровка идет только в RAM.
- Защита от Path Traversal. В исходном коде (
loadScenario) реализована проверка через fs::weakly_canonical. Исключает обращение к системным файлам ОС (например, {next_chapter:../../Windows/System32/config/SAM}).
- Кэширование. Расшифрованные файлы кэшируются в
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
shake), реализованная через динамическое смещение offsetX и offsetY при перерисовке истории диалогов.Движок написан на современном C++17 с активным использованием
std::filesystem. Стек зависимостей намеренно минималистичен:- miniaudio — мощная и легковесная библиотека для работы со звуком. Отвечает за фоновую музыку (с зацикливанием и перемоткой) и SFX. Поддерживается изменение pitch (высоты звука) на лету, что позволяет генерировать уникальные голоса для разных персонажей из одного сэмпла печати.
- nlohmann/json — стандарт индустрии. Используется для сериализации сохранений (позиция в сюжете, цвета, активная музыка, переменные) и хранения настроек.
- Собственная криптография — никаких внешних библиотек. Автор реализовал ChaCha20 и SHA-256 прямо внутри проекта для защиты ассетов.
Паттерн Factory для команд
Одной из самых сильных сторон кодовой базы является расширяемость. Система команд сценария построена на паттерне Factory. Это означает, что разработчику не нужно лезть в ядроengine.cpp, чтобы добавить новую команду. Достаточно написать отдельный.cppфайл и зарегистрировать его. Движок автоматически подхватит новые функции при компиляции.
Сценарный язык: Пишем игру в Блокноте
NovEng не требует изучения сложных скриптовых языков. Сценарии хранятся в обычных .txt файлах в папке res/scenario/. Синтаксис интуитивно понятен и состоит из трех элементов:
[Имя] — задает говорящего персонажа.
- Обычный текст — выводится на экран с эффектом печати.
{команда:аргументы} — управляющие конструкции.
Код:
{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 решает эту проблему элегантно:
- Шифрование ассетов. В конфигурации сборки задается
ASSET_KEY. При загрузке используется алгоритм ChaCha20 (с деривацией ключа через SHA-256). На диске файлы — нечитаемый мусор, расшифровка идет только в RAM.
- Защита от Path Traversal. В исходном коде (
loadScenario) реализована проверка через fs::weakly_canonical. Исключает обращение к системным файлам ОС (например, {next_chapter:../../Windows/System32/config/SAM}).
- Кэширование. Расшифрованные файлы кэшируются в
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
[Имя] — задает говорящего персонажа.{команда:аргументы} — управляющие конструкции.
Код:
{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 решает эту проблему элегантно:- Шифрование ассетов. В конфигурации сборки задается
ASSET_KEY. При загрузке используется алгоритм ChaCha20 (с деривацией ключа через SHA-256). На диске файлы — нечитаемый мусор, расшифровка идет только в RAM. - Защита от Path Traversal. В исходном коде (
loadScenario) реализована проверка черезfs::weakly_canonical. Исключает обращение к системным файлам ОС (например,{next_chapter:../../Windows/System32/config/SAM}). - Кэширование. Расшифрованные файлы кэшируются в
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
Logger пишет отчеты в res/log с таймстампами. Ошибки фиксируются с уровнями ERROR/WARN.LocalizationManager позволяет переводить интерфейс. Переключение языка доступно в настройках.S или через меню. Сериализуется всё: от индекса строки до глобальных переменных.Проект использует классический Makefile и компилятор с поддержкой C++17 (GCC или MSVC).
Важно для сборки сказал(а):Зависимость от MinGW-w64. В репозитории лежат только базовые утилиты (make,g++). Для успешной компиляции потребуется скачать полный пакет winlibs standalone build of GCC и прописать его в системный PATH.
Зависимости:
miniaudio.h(в комплекте)json.hpp(nlohmann/json)
Музыкальное сопровождение:
В проекте используются треки автора Егорbez (саундтреки из игры "Кризис: Третий путь"). Все права принадлежат автору.