Дудос. Девлог#5: рефакторинг перед интеграциями с tgapps, я.играми, crazygames
DTF, привет. Если кто помнит - мы (я и немного claude) пилим Dudos, - кибер-панк хакерский tycoon, который начинался как браузерная игрушка, потом переродился в Telegram Mini App, а теперь собирается лезть на Я.Игры, Crazy Games и куда придётся.
Кто написал это говно? Я.
Изначально проект задумывался как браузерная игра без адаптации под мобилки, не знаю с чего я принял такое решение - скорее всего потому что для меня это показалось проще - не надо заморачиваться с адаптивностью, быстрее разработка ну или просто потому что я ленивый. Спустя время приоритеты сменились и было решено переделать проект под мобилку, а именно под телеграм мини-апп. И снова вместо того чтобы сделать нормальную адаптивность я принял решение написать отдельный проект под миниапп, и вести два проекта параллельно - отдельно для тг и отдельно основной веб версии.
Решение максимально тупое и его результатом стало то, что со временем я забил на поддержку основной веб версии и стал заниматься только мини-аппом. И тут приходит понимание - помимо телеги хочется опубликовать игру и на других веб-площадках, да и просто как отдельный веб-сайт, а значит нужна чёртова адаптивность.
Один проект, который умеет везде
Дальше - стандартные архитектурные варианты:
- monorepo с shared core и per-platform приложениями (правильный, чистый, но более долгий вариант);
- один проект с runtime-выбором адаптера (дёшево, гибко, понятно, но не "бест практис");
Выбрал второй вариант. Один проект, который сам понимает где он запущен - в ТГ, на Я.Играх, в обычном браузере - и подстраивается. Картинка одна, поведение разное. Открываешь телеграм-бот → миниапп, мобильный вид с нижней панелью. Открываешь то же самое в телеграм-десктопе и растягиваешь окно - появляется боковая панель как в нормальном вебе. Сжал окно обратно - пропала. Открываешь как обычный сайт в браузере - то же самое: широкий экран → видна боковая панель, узкий → нижняя панель. Один сайт, одно меню, никаких «адаптивных версий». Авторизация под капотом тоже разная в зависимости от площадки.
R.I.P. старой веб-версии
Заодно похоронил старую браузерную версию. Перенёс из неё последнее уникальное - кнопку «войти через Google» (в Телеграме она не нужна, в открытом вебе - нужна). После этого старый проект просто... удалил. Целый проект, который я долго поддерживал параллельно - rm -rf и его нет. Странное ощущение, если честно. Будто похоронил младшего брата, который и так был задумкой временной, но всё равно жил рядом.
А между делом - новые небольшие фичи
Сотрудники (юниты) теперь устают
У юнитов теперь две метрики производительности вместо одной: performance (текущая) и maxPerformance (потолок). Во время задач performance плавно падает, на отдыхе восстанавливается обратно к потолку. Восстановление нелинейное. Чем сильнее устал - тем медленнее лезет обратно. Условно: с 95% восстанавливается за полчаса. С 30% - за сутки. То есть загнать в ноль и потом снова в бой - плохая стратегия. Лучше чередовать: попахать, отпустить отдохнуть, попахать ещё раз. Микро-менеджмент, из которого родилась новая фича, а точнее новая роль сотрудников - Менеджер, она ещё в разработке о ней в следующих девлогах.
Заодно переделал как работает обучение. Раньше LEARNING-задача растила текущую эффективность. Теперь она растит потолок - то есть открывает новые верхние границы. Чем больше человек уже знает, тем медленнее учится новому - diminishing returns как в реальной жизни. Придумал не я, это очень старая RPG-идея.
GitHub оброс рейтингами и описаниями
В игре есть фейковый GitHub - место где живёт ваш разработанный софт. Раньше там было довольно скучно: список ваших разработок, кнопка «опубликовать» - и всё. Теперь стало побогаче.Описание у репо. Можно написать README - короткий текст про то, что это за софт. Особенно полезно если выкладываете публично - другие игроки понимают что качают. Звёздные рейтинги - это про доверие. Поставил публичный репо - кто-то его установил, поставил оценку от 1 до 5 звёзд. У вас в карточке показывается средний рейтинг и сколько голосов. Рейтинг - это не косметика, это механика доверия в PvP-сеттинге. Дело в том, что игроки могут публиковать софт с эксплойтами - например, майнер который якобы выдаёт нормальный доход, но половину тихо отчисляет автору. Низкий рейтинг - красный флаг. Большое количество хороших оценок - больше шансов что софт чистый. Но даже это не гарантия - автор может скрытно встроить эксплойт уже после того как репо набрал репутацию. Параноить нужно всегда.
Счётчик установок. Сколько активных установок у публичного софта теперь видят все. Раньше эта цифра была только у автора. Сейчас прямо в карточке - ещё один косвенный показатель стоит ли доверять. Косвенный, потому что тысяча мух может ошибаться, как говорится.
Кошельки. Полноценная финансовая страница
До этого в игре существовал ровно один кошелёк на игрока. Все доходы туда, все расходы оттуда. Минимализм.
Сейчас:
- Можно создать сколько угодно дополнительных кошельков. "зарплаты", "на железо", "украденные (с помощью эксплойтов)", "накопления" - как вам удобно. Главный кошелёк - primary, его удалить нельзя. Остальные можно при условии что баланс нулевой.
- Полная история операций. Каждый кошелёк теперь показывает все транзакции: что пришло, что ушло, когда, от чего. С пагинацией - если у вас тысячи операций.
- Фильтры. Можно отсортировать только доходы. Только расходы. По типам - только зарплаты, или только покупки железа, или только майнинг-выплаты. По датам. Хочешь посмотреть «сколько я в последнюю неделю слил на Cloudflare» - три клика.
- Сводка над списком показывает: «получено столько-то, потрачено столько-то, чистая прибыль такая-то». Учитывает активные фильтры. Удобно для финансовой паранойи.
В следующих статьях расскажу про новую роль юнитов - Менеджера (он будет сам раздавать задачи простаивающим сотрудникам, без вашего вмешательства, чтобы автоматизировать работу, влиять на производительность команды и другие штуки), ещё планировал рассказать про публичное API, но придётся отложить и поработать в ближайшее время над интеграцией с tgapps - они отказали в размещении, говорят надо добавить и фич побольше, желательно связанных с криптой, и интеграцию с оплатой stars'ми (внутренняя телеграм валюта), поэтому буду продумывать систему майнинга крипты и добавлять оплату старсами (не знаю пока за что, буду думать). Такие дела, пока!