Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

DTF, привет. Если кто помнит - мы (я и немного claude) пилим Dudos, - кибер-панк хакерский tycoon, который начинался как браузерная игрушка, потом переродился в Telegram Mini App, а теперь собирается лезть на Я.Игры, Crazy Games и куда придётся.

Кто написал это говно? Я.

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

Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

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

Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

Один проект, который умеет везде

Дальше - стандартные архитектурные варианты:
- monorepo с shared core и per-platform приложениями (правильный, чистый, но более долгий вариант);
- один проект с runtime-выбором адаптера (дёшево, гибко, понятно, но не "бест практис");

Выбрал второй вариант. Один проект, который сам понимает где он запущен - в ТГ, на Я.Играх, в обычном браузере - и подстраивается. Картинка одна, поведение разное. Открываешь телеграм-бот → миниапп, мобильный вид с нижней панелью. Открываешь то же самое в телеграм-десктопе и растягиваешь окно - появляется боковая панель как в нормальном вебе. Сжал окно обратно - пропала. Открываешь как обычный сайт в браузере - то же самое: широкий экран → видна боковая панель, узкий → нижняя панель. Один сайт, одно меню, никаких «адаптивных версий». Авторизация под капотом тоже разная в зависимости от площадки.

R.I.P. старой веб-версии
Заодно похоронил старую браузерную версию. Перенёс из неё последнее уникальное - кнопку «войти через Google» (в Телеграме она не нужна, в открытом вебе - нужна). После этого старый проект просто... удалил. Целый проект, который я долго поддерживал параллельно - rm -rf и его нет. Странное ощущение, если честно. Будто похоронил младшего брата, который и так был задумкой временной, но всё равно жил рядом.

А между делом - новые небольшие фичи

Сотрудники (юниты) теперь устают

У юнитов теперь две метрики производительности вместо одной: performance (текущая) и maxPerformance (потолок). Во время задач performance плавно падает, на отдыхе восстанавливается обратно к потолку. Восстановление нелинейное. Чем сильнее устал - тем медленнее лезет обратно. Условно: с 95% восстанавливается за полчаса. С 30% - за сутки. То есть загнать в ноль и потом снова в бой - плохая стратегия. Лучше чередовать: попахать, отпустить отдохнуть, попахать ещё раз. Микро-менеджмент, из которого родилась новая фича, а точнее новая роль сотрудников - Менеджер, она ещё в разработке о ней в следующих девлогах.

Заодно переделал как работает обучение. Раньше LEARNING-задача растила текущую эффективность. Теперь она растит потолок - то есть открывает новые верхние границы. Чем больше человек уже знает, тем медленнее учится новому - diminishing returns как в реальной жизни. Придумал не я, это очень старая RPG-идея.

GitHub оброс рейтингами и описаниями

Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

В игре есть фейковый GitHub - место где живёт ваш разработанный софт. Раньше там было довольно скучно: список ваших разработок, кнопка «опубликовать» - и всё. Теперь стало побогаче.Описание у репо. Можно написать README - короткий текст про то, что это за софт. Особенно полезно если выкладываете публично - другие игроки понимают что качают. Звёздные рейтинги - это про доверие. Поставил публичный репо - кто-то его установил, поставил оценку от 1 до 5 звёзд. У вас в карточке показывается средний рейтинг и сколько голосов. Рейтинг - это не косметика, это механика доверия в PvP-сеттинге. Дело в том, что игроки могут публиковать софт с эксплойтами - например, майнер который якобы выдаёт нормальный доход, но половину тихо отчисляет автору. Низкий рейтинг - красный флаг. Большое количество хороших оценок - больше шансов что софт чистый. Но даже это не гарантия - автор может скрытно встроить эксплойт уже после того как репо набрал репутацию. Параноить нужно всегда.

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

Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

Кошельки. Полноценная финансовая страница

До этого в игре существовал ровно один кошелёк на игрока. Все доходы туда, все расходы оттуда. Минимализм.

Сейчас:

- Можно создать сколько угодно дополнительных кошельков. "зарплаты", "на железо", "украденные (с помощью эксплойтов)", "накопления" - как вам удобно. Главный кошелёк - primary, его удалить нельзя. Остальные можно при условии что баланс нулевой.

Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

- Полная история операций. Каждый кошелёк теперь показывает все транзакции: что пришло, что ушло, когда, от чего. С пагинацией - если у вас тысячи операций.

Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

- Фильтры. Можно отсортировать только доходы. Только расходы. По типам - только зарплаты, или только покупки железа, или только майнинг-выплаты. По датам. Хочешь посмотреть «сколько я в последнюю неделю слил на Cloudflare» - три клика.

Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames

- Сводка над списком показывает: «получено столько-то, потрачено столько-то, чистая прибыль такая-то». Учитывает активные фильтры. Удобно для финансовой паранойи.

В следующих статьях расскажу про новую роль юнитов - Менеджера (он будет сам раздавать задачи простаивающим сотрудникам, без вашего вмешательства, чтобы автоматизировать работу, влиять на производительность команды и другие штуки), ещё планировал рассказать про публичное API, но придётся отложить и поработать в ближайшее время над интеграцией с tgapps - они отказали в размещении, говорят надо добавить и фич побольше, желательно связанных с криптой, и интеграцию с оплатой stars'ми (внутренняя телеграм валюта), поэтому буду продумывать систему майнинга крипты и добавлять оплату старсами (не знаю пока за что, буду думать). Такие дела, пока!