Обновления по итогам июня

Вышел Dagon 1.1.1. Добавлено свойство GLTFMeshPrimitive.materialIndex, индекс материала в файле glTF. Этот индекс записывается в структуру Triangle при обходе по граней с помощью GLTFAsset.opApply, что позволяет передавать данные о материалах в различные обработчики мешей. Основное применение этой фичи — учет материалов при обнаружении столкновений и трассировке лучей. Соответственно, в dagon:newton добавлена поддержка индексов материалов при создании NewtonMeshShape. В интерфейсный метод NewtonRaycaster.onRayHit добавлен параметр long id, через который коллбек получает искомый индекс материала при попадании луча в меш.

Пошла серьезная работа над Chillwave Drive. Я уже рассказывал про ИИ, но, помимо этого, на днях улучшил модель колеса и наконец-то добавил поддержку материалов, чтобы машина учитывала свойства покрытия. Например, когда машина вылетает с трассы, то трава на обочине сильно ее замедляет и не дает разгоняться. Также добавил HUD-тахометр, обновил текстуры тестовой трассы, реализовал эффекты погоды — дождь и динамически появляющееся и исчезающее за облаками солнце. У игры появилась страничка на GameJolt, где я регулярно выкладываю альфа-версии.

Привел в порядок блог, объединил старую версию и новую, подкорректировал неактуальную информацию.

Как сделать ИИ для гонок

Пост является, по сути, продолжением статьи Как сделать простой автосимулятор.

Гонки — своего рода священный Грааль геймдева. Любительских гоночных игр исчезающе мало, даже простых и аркадных. А дело в том, что чисто технически «простых» гонок не существует — есть определенный минимум, которому они обязаны соответствовать, чтобы быть играбельными, и достижение этого — очень непростая задача. Если физика, как я уже отмечал в вышеупомянутой статье, не обязана быть чересчур навороченной и допускает довольно широкий разброс реалистичности, то с искусственным интеллектом особой свободы нет — виртуальные соперники обязаны изображать реальных водителей, причем, желательно, хороших. Это задача-минимум, и она же, как ни странно, задача-максимум, потому что игровому боту сильно лучше человека быть не положено.

Не будет преувеличением сказать, что ИИ — это самое сложное в играх. О графике в Интернете говорят очень много, о физике — намного меньше, а об игровом искусственном интеллекте почти не говорят. До этой территории мало кто добирается, а кто добирается — в основном, крупные студии — держат свои ноу-хау в секрете. Поэтому скажу честно: я не знаю, как написаны контроллеры оппонентов в коммерческих гоночных играх, и давно бросил попытки выяснить. Я пошел своим путем.

(далее…)

Соперники в Chillwave Drive

После релиза Dagon 1.1 я решил вернуться к демке автосимулятора Chillwave Drive — собираюсь превратить ее в полноценную гоночную игру. Этому препятствовало отсутствие ИИ для соперников, и на днях наконец-то эта задача была решена — я написал алгоритм следования траектории на базе Pure Pursiut, популярного метода из робототехники (но почему-то практически не известного в среде инди-разработчиков). В ближайшее время будет подробная статья на эту тему, а пока вы можете скачать свежий билд Chillwave Drive и увидеть ИИ в действии, либо просто посмотреть видео:

Блог восстановлен!

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

Обновления

Выпустил первое крупное обновление Dagon после стабильного релиза — 1.1.0. В этой версии исправлены некоторые баги, добавлен модуль проверки столкновений в 2D и в целом несколько упрощена работа с 2D-играми. Во всех встроенных шейдерах сабрутины GLSL заменены на ветвления для лучшей совместимости со старыми видеокартами. Стартовала работа над редактором сцен для движка.

К этому релизу я приурочил выпуск переиздания моей старой игры 2048×2 — версии популярной головоломки 2048 для двух игроков. Игра портирована на Dagon, что обеспечило поддержку x86_64 и улучшило качество рендеринга шрифтов. Также я добавил переводы игры на немецкий, французский, испанский, португальский и другие языки. Графический стиль и механика не изменились.

Сборку для Windows можно скачать тут, исходники и linux-версия будут на днях.

Подробности об инциденте 3 июня

Итак, что же произошло? 3 июня 2026 года нидерландский дата-центр nLighten без предупреждения обесточил серверы в Дронтене, которые арендовала компания MIRhosting. Этот инцидент стал продолжением массовой волны отключений: ранее с этим столкнулся еще один крупный российский хостинг VDSina.

Началась эта история с преследования двух лиц, которые, по версии следствия, причастны к кибератакам и операциям по вмешательству в выборы в Дании в конце 2025 года — в частности, обеспечивая инфраструктуру для атак хакерской группы NoName057(16). Тогда в Дании перестали работать сайты политических партий, датского парламента и издания The Copenhagen Post, а также была нарушена работа системы MitID, через которую граждане получают доступ к государственным сервисам.

По информации европейских информагентств, серверы компаний MIRhosting и WorkTitans наиболее активно использовались для осуществления незаконных действий на территории ЕС. Руководство MIRhosting, впрочем, все обвинения отрицает. MIRhosting — крупный оптовый провайдер, ориентированный преимущественно на B2B. Среди его клиентов множество мелких хостингов, в том числе и тот, услугами которого я пользовался (по соображениям безопасности, не буду его пока раскрывать).

Я пока не понимаю, какие юридические основания были для отключения со стороны дата-центра. Исходя из отписки техподдержки хостинга, есть вероятность, что это не более чем перестраховка, и все вернут (то есть, серверы не конфискованы полицией, а просто на всякий случай отключены). Но чисто интуитивно оснований для оптимизма я не вижу. В таком вот непредсказуемом мире мы сейчас живем.

Блог частично восстановлен

Хорошие новости: мне удалось восстановить большую часть постов 2026 года (правда, без картинок) из локального архива и сохранившихся копий Wayback Machine. В архивах сохранилось многое, но, к сожалению, все это практически невозможно импортировать в WordPress без ручной правки. В ближайшее время я восстановлю материалы за 2025 год, а остальным буду заниматься по мере сил.

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

Блог утерян :(

Из-за серьезных проблем с датацентром, на котором в последнее время был размещен блог, мне пришлось мигрировать на новый VPS. К сожалению, восстановить базу постов не удалось. Все, что я пока смог воссоздать — тема и некоторые страницы в меню (их версии по состоянию на май 2025 года).

Я не оставляю надежду, что еще удастся вернуться на старый сервер, где сохранились все данные, но большого оптимизма по этому поводу нет. Вероятнее всего, придется начать все с нуля.

Нововведения в GScript3

Давненько не писал о GScript! Между тем, VM языка уже пригодна для использования в играх, а спецификация пополнилась множеством интересных фич, о которых я сейчас и расскажу.

(далее…)

Формат DAF

В предыдущем посте я уже писал о том, почему glTF нельзя использовать в качестве полноценного формата игровых ассетов, и вот альтернатива, которую я специально проектирую для Dagon 2.0 — Dagon Asset Format, сокращенно DAF.

DAF хранит, в первую очередь, вершинные буферы для прямой передачи в VRAM. Формат бинарный, архитектурно соответствующий API Dagon 2.0 и расширяемый: в нем могут быть объявлены любые дополнительные структуры данных и даже динамические свойства, не ломая обратную совместимость.

Основные задачи формата:

  • Хранение данных в форме, подходящей для прямой загрузки в видеопамять без накладных расходов на обработку (zero overhead). В отличие от glTF, в DAF вершинные буферы имеют фиксированный формат, согласованный с пайплайном движка, не требуя конверсии;
  • Максимальная эффективность десериализации. glTF требует парсинга JSON и динамического построения довольно сложных объектов в памяти (списков, словарей), а загрузка DAF – это просто реинтерпретация слайсов байтового буфера в массивы POD-структур. DAF экономит память и сокращает риск утечек, поскольку не требует множества аллокаций;
  • Частичная десериализация. Декодер может читать из DAF только те данные, которые ему нужны, не разбирая остальные.
  • Формат «все в одном». Файл DAF может хранить как отдельный меш, так и целую сцену. Все структуры формата поддерживают пользовательские свойства, что позволяет хранить в DAF метаданные редактора. Фактически, DAF может быть использован как простая NoSQL база данных для различных целей.
  • Поддержка семантики данных. Все объекты имеют список классов, что позволяет движку группировать их для задач игровой логики. Все текстуры помечаются как baseColor, normal, height, roughness-metallic, emission, для того, чтобы движок мог выбрать оптимальный BCn формат сжатия.
  • Поддержка данных для физики и проверки столкновений (в разработке).

Спецификация DAF находится здесь.