It's me, HoneyBadger.
Today we’ll skip the structured overview — I’ll just tell you a story.
Initially, my plan was to focus on polishing the auto-update system. But, as often happens after the phrase “I’ll just take a quick look”, I suddenly found myself in the middle of full-scale development of a game client for Android.
As many of you know, our game is basically just a web page, so I decided to start with the Capacitor framework. A couple of quick fixes — and the game was running. But then I thought: what about auto-updates? And I started digging into it.
The task of updating the application itself is interesting in its own right. However, most of the app’s functionality is just displaying our web page. That can wait — there won’t be major or frequent changes there. But when it comes to game code and assets, updates are absolutely necessary.
Capacitor allows writing files into the app’s local storage. But in order to load and replace files that were originally bundled into the app package, I would have had to turn all in-game data loaders into spaghetti. Reluctantly, I made the tough decision to write a native Capacitor plugin in Android’s native language.
After spending a day setting up the development environment, I was surprised to discover that I could easily connect a debugger both to the WebView and to Capacitor itself. Overall, Android development in 2025 turned out to be pretty convenient. The only downside was virtualization, which left much to be desired. In the end, I hooked up three real devices, so virtualization wasn’t really needed anymore.
Capacitor’s architecture was quite hostile to what I was trying to do. But I managed to write a plugin that seamlessly replaces file paths when an alternative version is available. Now we can update assets as much as we want without changing a single line of our game code.
Unfortunately, when it comes to WebGL2, the performance of Android browser engines is very disappointing. On none of my low-end devices did the game deliver acceptable FPS. I didn’t like that. So I threw Capacitor away entirely and wrote my own wrapper. Now the game can run in the native WebView (which varies from device to device), GeckoView (the Firefox engine), as well as in any browser installed on the user’s device. Maybe this will help someone out there!
In general, we can hope that performance issues will improve over time. On our side, we’re planning to switch to the new rendering library PIXI v8, use dynamic resolution textures, compression, and so on. And WebGL support on Android devices is bound to get better too.
Right now, I’m working on an API for reading and writing save files, configs, and updates into local storage. I also have to slightly rework how the game handles this data to make it asynchronous. Not a big problem — plus it opens up opportunities for cloud saves on our server. I don’t like the idea of requesting excessive permissions for the app, so for permanent file storage, players will manually select a folder.
As for auto-updates themselves, we’ll be able to reuse the desktop auto-update module on Android. Fully borrowing the system where “the game updates the module, the module updates the game”. This means that across all versions of the game on any device, the only things that remain unchanged are the loader code and the API call scheme.
In addition, releasing the first Android version will require basic touchscreen and OSD gamepad support.
And of course, we still need to polish the auto-update system for desktop applications. So, those are all my plans for the release of version 0.9.0.

Oh, and regarding other aspects of the game — HandlessGhoul is working on a new event about Natasha being abducted by aliens for the next update. There will be new animations and other content added. You might be able to learn more if you ask him about it on our Discord server. But no promises. xD
Unfortunately, I have to inform you that due to the amount of work required for the next update, as well as other factors unrelated to development, we won’t be able to release the new version before mid-September.
My deepest respect to everyone who made it to the end of this story. Mic drop.

Это я, HoneyBadger.
Сегодня мы обойдёмся без структурированного обзора — я просто расскажу историю.
Изначально я планировал сосредоточиться на доводке системы автообновлений. Но, как это часто бывает после фразы «я просто посмотрю», внезапно я оказался посреди полноценной разработки клиента игры под Android.
Как многие знают, наша игра по сути — это веб-страница, поэтому я решил начать с фреймворка Capacitor. Пара быстрых фиксов — и игра запустилась. Но потом я подумал: а что с автообновлением? И начал в этом копаться.
Задача обновления непосредственно приложения интересна сама по себе. Однако, почти весь функционал приложения состоит в том, чтобы отобразить нашу веб-страницу. Это можно отложить — там не ожидается частых или крупных изменений. А вот что касается игрового кода и ассетов — здесь уже без обновлений не обойтись.
Capacitor позволяет писать файлы в локальное хранилище приложения. Но чтобы подгружать их и подменять старые файлы, встроенные в изначальный пакет приложения, пришлось бы превратить все внутриигровые загрузчики данных в кашу. С неохотой я принял трудное решение написать нативный плагин для Capacitor на родном языке Android.
После дня настройки среды разработки я с удивлением обнаружил, что могу легко подключать отладчик как к WebView, так и к самому Capacitor. В целом, разработка под Android в 2025 оказалась довольно удобной. Единственный минус — виртуализация, которая оставляла желать лучшего. В итоге я просто подключил три реальных устройства, и необходимость в ней отпала.
Архитектура Capacitor была довольно враждебной к тому, что я пытался реализовать. Но мне удалось написать плагин, который бесшовно подменяет пути к файлам при наличии альтернативной версии. Теперь мы можем обновлять ассеты сколько угодно, не трогая ни строчки игрового кода.
К сожалению, когда дело дошло до WebGL2, производительность браузерных движков на Android оказалась очень печальной. На моих бюджетных устройствах игра не выдавала приемлемого FPS. Мне это не понравилось. Поэтому я полностью отказался от Capacitor и написал собственную обёртку. Теперь игра может запускаться в нативном WebView (он различается от устройства к устройству), в GeckoView (движок Firefox), а также в любом браузере, установленном у пользователя. Возможно, это кому-то пригодится!
В целом можно надеяться, что со временем проблема производительности будет решаться. С нашей стороны мы планируем перейти на новую библиотеку рендеринга PIXI v8, добавить текстуры с динамическим разрешением, сжатие и так далее. Да и поддержка WebGL на Android-устройствах определённо будет улучшаться.
Сейчас я работаю над API для чтения и записи файлов сохранений, конфигов и обновлений в локальное хранилище. Также нужно немного переделать работу игры с этими данными, чтобы сделать её асинхронной. Это несложно и к тому же открывает возможность облачных сохранений на нашем сервере. Мне не нравится идея запрашивать избыточные права для приложения, поэтому для постоянного хранения файлов игрок будет выбирать папку вручную.
Что касается самих автообновлений, то мы сможем переиспользовать код модуля автообновления для десктопа на Android. Полностью сохранив систему «игра обновляет модуль, модуль обновляет игру». В итоге во всех версиях игры на любых устройствах неизменными останутся только код загрузчика и схема работы с API.
Кроме того, для выпуска первой Android-версии потребуется базовая поддержка тачскрина и OSD-геймпада.
И конечно, ещё предстоит довести автообновления десктопных приложений до ума. Вот, собственно, все мои планы на релиз версии 0.9.0.

Ах да, что касается других аспектов игры — HandlessGhoul работает над новым эвентом про похищение Наташи инопланетянами для следующего обновления. Будут добавлены новые анимации и прочий контент. Возможно, вы сможете узнать больше, если спросите его об этом на нашем Discord-сервере. Но это не точно. xD
К сожалению, я должен сообщить вам, что из-за объёма работы, необходимой для следующего обновления, а также других факторов, не связанных с разработкой, мы не сможем выпустить новую версию раньше середины сентября.
Огромное уважение всем, кто дочитал мою историю до конца. Mic drop.
Zerro
2025-08-29 21:01:53 +0000 UTC