Building GDC Engine: One Foundation for Browser Mini-Games

3 августа 2026 г.
Разработчики:
wratixor-y-avatar Wratixor
If we all reacted the same way, we'd be predictable, and there's always more than one way to view a situation. Over-specialization leads to death. (c) Motoko Kusanagi, Ghost in the Shell

EN

Hello everyone!

Snake Match began as a standalone prototype. Very quickly, however, every “small” feature raised a larger question. How should all games handle a gamepad? Where should volume and language settings live? How do we reuse sprite animations without copying code? How can a catalog discover a new game automatically?

The answer became GDC Engine: a lightweight, repository-owned foundation for Geno-Dice browser mini-games.

🧩 Small modules instead of a black box

GDC Engine is not intended to compete with large general-purpose engines. It is a set of focused JavaScript modules that solve the recurring problems of our own browser games while leaving their rules independent.

The current foundation covers rendering and camera behavior, sprite atlases, input actions, shared UI navigation, display settings, audio, and catalog/PWA tooling. A game can use only the pieces it needs, and its gameplay code does not have to know which physical key or controller button triggered an action.

🎮 One action layer for every controller

The input layer converts keyboard, touch, mouse, and browser Gamepad API signals into named actions such as direction, confirm, back, menu, pause, special, next, and previous.

It supports:

  • arrows and WASD;
  • D-pad and analog-stick movement;
  • controller buttons with familiar menu behavior;
  • L1/R1 tab switching;
  • held directions for sliders and repeating navigation;
  • right-stick analog scrolling for large card panels;
  • consistent focus restoration when a menu is reopened.

This work is tested outside the game through a dedicated input utility. It displays both raw browser values and the normalized actions emitted by GDC Engine, making controller mapping problems visible instead of mysterious.

🖼️ Sprites, tiles, and animation

The sprite-atlas layer addresses another recurring cost: drawing and wiring every visual variation by hand. An atlas can expose named sprites and animations, weighted decorative tile variants, frame timing, rotation, and reflection.

That lets a single portal or head-mask animation face several directions without requiring four separately maintained copies. The renderer also supports different logical tile sizes, including 16×16, 32×32, and 64×64 assets, so future games do not inherit Snake Match’s scale by accident.

🪟 Shared interface and display behavior

Menus use a shared focus and navigation model across keyboard and gamepad. The same system is used for buttons, tabs, sliders, and select fields, with visible focus that remains readable on top of a game canvas.

System settings are separated from game-specific Properties. Language, master volume, SFX, music, display mode, orientation, and input preferences can therefore be shared by the catalog and reused by other games.

🔊 Audio as named events

Games request sounds by semantic paths rather than hardcoded filenames. For example, an event can ask for sounds.sfx.ui.confirm, and the engine chooses one of the compatible files in that group.

SFX and music have separate playback methods and buses. The system supports variants, per-file gain, pitch and delay adjustments, while generated manifests discover MP3, OGG, WAV, M4A, AAC, and FLAC files in the audio folders. This allows sound packs to be replaced or expanded without editing gameplay code.

🧰 Tooling around the game

The engine is accompanied by small build-time tools. They generate the game and utility catalog, PWA assets, and audio manifests from repository content. Each mini-app carries its own metadata, while the main page can discover and group playable games and development utilities automatically.

The result is a repository where adding a project is a defined process rather than another round of copying an old page and changing links by hand.

🚧 Built through a real game

GDC Engine is still deliberately young. Its APIs were extracted and corrected while Snake Match was being played on desktop, mobile, and gamepad. That gives us a practical foundation, but the next game will be the real test of which parts are genuinely reusable and which still contain assumptions from the first project.

For now, the engine has already changed how we work: fixes to input, audio, settings, sprites, or navigation can benefit the catalog and future mini-games together. Snake Match is the first release built on it, not the last.

RU

Всем привет!

Snake Match начиналась как самостоятельный прототип. Но почти каждая «небольшая» функция быстро поднимала более общий вопрос. Как все игры должны работать с геймпадом? Где хранить настройки громкости и языка? Как переиспользовать анимации спрайтов без копирования кода? Как научить каталог автоматически находить новую игру?

Ответом стал GDC Engine — лёгкая основа для браузерных мини-игр Geno-Dice, которая развивается прямо внутри репозитория.

🧩 Небольшие модули вместо чёрного ящика

GDC Engine не пытается конкурировать с крупными универсальными движками. Это набор специализированных JavaScript-модулей, решающих повторяющиеся задачи наших браузерных игр и не связывающих их игровые правила.

Сейчас основа включает рендеринг и камеру, атласы спрайтов, слой действий ввода, общую навигацию интерфейса, настройки отображения, звук и инструменты каталога/PWA. Игра может подключать только нужные части, а её логике не требуется знать, какая физическая клавиша или кнопка контроллера вызвала действие.

🎮 Единый слой действий для любого управления

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

Поддерживаются:

  • стрелки и WASD;
  • крестовина и аналоговый стик;
  • привычное поведение кнопок геймпада в меню;
  • переключение вкладок через L1/R1;
  • удержание направления для ползунков и повторяющейся навигации;
  • аналоговая прокрутка больших панелей карточек правым стиком;
  • восстановление видимого фокуса после повторного открытия меню.

Эта часть проверяется отдельно от игры с помощью специальной утилиты ввода. Она показывает и сырые значения браузера, и нормализованные действия GDC Engine, поэтому проблемы маппинга контроллеров становятся видимыми и воспроизводимыми.

🖼️ Спрайты, тайлы и анимация

Слой атласов спрайтов решает ещё одну повторяющуюся задачу: не приходится вручную подключать каждую визуальную вариацию. Атлас умеет описывать именованные спрайты и анимации, вероятности декоративных вариантов тайла, длительность кадров, поворот и отражение.

Благодаря этому один портал или маску головы можно направлять в разные стороны без четырёх независимо поддерживаемых копий. Рендерер также допускает разные логические размеры тайлов — 16×16, 32×32 и 64×64, чтобы будущие игры не наследовали масштаб Snake Match случайно.

🪟 Общий интерфейс и отображение

Меню используют единую модель фокуса и навигации для клавиатуры и геймпада. Она применяется к кнопкам, вкладкам, ползункам и выпадающим спискам, а заметное выделение остаётся читаемым поверх игрового canvas.

Системные настройки отделены от игровых «Свойств». Язык, общая громкость, SFX, музыка, режим экрана, ориентация и параметры ввода могут использоваться каталогом и следующими играми совместно.

🔊 Звук как именованное событие

Игры запрашивают звук по смысловому пути, а не по жёстко заданному имени файла. Например, событие может вызвать sounds.sfx.ui.confirm, после чего движок выберет один из совместимых файлов этой группы.

Для SFX и музыки предусмотрены отдельные методы воспроизведения и шины громкости. Система поддерживает варианты, индивидуальное усиление, высоту и задержку звука, а генерируемые манифесты находят MP3, OGG, WAV, M4A, AAC и FLAC в папках аудио. Благодаря этому звуковой набор можно заменить или расширить без правок игровой логики.

🧰 Инструменты вокруг игры

Вместе с движком развиваются небольшие инструменты сборки. Они создают каталог игр и утилит, PWA-ресурсы и аудиоманифесты на основе содержимого репозитория. У каждого мини-приложения есть собственные метаданные, а главная страница автоматически находит и группирует игры и служебные инструменты.

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

🚧 Движок, выросший из настоящей игры

GDC Engine пока намеренно молод. Его API выделялись и исправлялись во время реальной игры в Snake Match на компьютере, телефоне и геймпаде. Это даёт практичную основу, но именно следующая игра покажет, какие части действительно универсальны, а где ещё сохранились предположения первого проекта.

Уже сейчас движок изменил процесс разработки: исправления ввода, звука, настроек, спрайтов или навигации могут одновременно помогать каталогу и будущим мини-играм. Snake Match — первый релиз на этой основе, но точно не последний.

Метки записи:

dev gamepad gdc-engine miniapp pwa