EpsilionWar
June 29, 2023

Как программисты в игры играют

Наконец меня забанили в игре и появилось время отрефлексировать и написать заметку как так вышло. А для самых ловких и умелых — в конце будет ссылочка на готовый кликер.

Общак оживился, хоть какие-то обновления подвезли.

Откуда про игру узнал

Постучались в личку ребята, которые хотели оценку стоимости разработки клона игры: планировали локализовать и запускать отдельным проектом для центрально-азиатского региона.

Так про игру и узнал, пошёл изучать что в игре есть, какие механики как работают в первом приближении. Кроличья нора оказалась глубока и растянулась на часов 140 часов чистого времени (Оо)

Было решено прокачать персонажа до средних уровней, чтобы лучше составить представление об игре.

Прокачка очень монотонна

Буквально после пятого уровня качаться самостоятельно становится скучно. Квесты однообразные, читать их смысла мало. Мобы однообразные, дерутся одинаково и неважно как — за исключением буквально пары мобов, можно тупо бить в одну точку и побеждать.

Большую часть времени стоишь и ждёшь пока здоровье восстановится.

А если игра наскучивает монотонными действиями — решение простое — заставить машину играть скучные механики за тебя, оставляя интересные части для себя любимого. Готовых ботов в публичном коде не нашлось, так что пошёл писать.

Автоматизируем бои

Гриндинг мобов — самая муторная часть игры, так что с неё и начал.
Сам бой делится на три фазы: «найти моба», «выбрать куда бить», «выбрать где защищаться». Неустаревающая классика боёвки со времён БК (привет, 98й).
Накидать ботика, который авторизуется под твоим аккаунтом в телеге и жмёт три кнопки заняло 2 вечера ровно.

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

Логичнее смотреть на нормальное распределение направлений удара у персонажа — именно эта черта выделяет бота среди живых игроков, человек не умеет в случайные числа.

Дальше запускаем бота пока сидим за компьютером и спокойно делаем свои дела, а персонаж качается. Вкалывают роботы — счастлив человек =)

Добавляем комбо-удары

За пару дней такой бот докачивает персонажа до 10 уровня и тут у персонажа появляются комбо-удары. Это опциональная четвёртая фаза боя и её тоже пришлось определять и проходить.

В простейшем виде достаточно использовать первый из доступных комбо-приёмов — до Т3+ уровней мало у кого вызовет подозрения такое поведение живого игрока.

На поздних уровнях с такой стратегией комбо пришлось завязать и формализовать более «умную» тактику — сперва лечимся, если пора или кидаем абилки с указанным кулдауном и прочие штуки.

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

Ничто не вечно

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

Так же за человеком-оператором остался возврат персонажа в локацию для фарма после смерти.

Капча наносит ответный удар

После 15 уровня и 50-100 боёв в день начинает мешать капча. В игре два типа капч — распознавание цифр на картинке (жёсткая) и текстовые вопросы по математике или игре/иконкам (мягкая).

Ещё одно заблуждение: распознать цифры с картинки намного проще и быстрее, чем собирать словарь текстовых вопросов. Большое спасибо всем игрокам, которые скидывали сообщения о капче в общий чат — без вас собирать решебник было бы намного сложнее.

Банить за удары в одну точку и на основании общественного мнения? Непрофессионально, ребят.

Для распознавания картинок же я взял сервис анти капчи и подключил его по api. Полгода его помощи моему 24/7 фармеру обошлись в $2.2 (да, 36 центов в месяц, ребят).

Ускоряем фарм

Теперь, если не считать смертей и ремонта, нашего бота никто не останавливает и можно думать как повысить эффективность фарма.

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

Можно было бы перейти на фарм в магазинном шмоте, но до Т4 это имеет мало смысла — крафт дешёвый, так что слишком часто будем отлетать в город от PVP с игроками в крафте.

Так что закупаемся ремкомплектами впрок и раз в неделю заходим на персов для починки.

Это была последняя партия, штош =)

Фармим круглые сутки

Включать и выключать фармилку на домашнем компьютере быстро надоело, так что унёс бота на сервер и запустил фарм 24/7. Клиент к телеграму не требует чего-то особенного из окружения, на сервере запустить его не сложнее чем на десктопе.

Масштабируем ремёсла

На этом моменте я упёрся в «производительность» одного персонажа.
Как бы мы не изворачивались, один персонаж в игре может делать только одно дело одновременно. И легальные твинки на аккаунте тут не помогут.

Ответ простой — нужно масштабировать. В игре есть не только фарм, но и ремёсла. Экономический смысл последних не очень понятен, но почему бы нет?

Купил пару десятков аккаунтов телеги (копейки стоят, правда), прокачал шесть персов до 12 левла и отправил их рыбачить. Ещё семь пошли охотиться.

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

Ещё пара персонажей присоединилась к обычному фарму 24/7: по уровням они не пересекались, друг другу не мешали, экономия =)

Продаём награбленное

Фарминг с трёх персонажей и сбор рыбы/деликов с полутора десятков аккаунтов ведёт к накоплению большого количества разноуровневых предметов в инвентаре.

Чтобы удобнее было писать объявления о продаже всего этого пришлось написать единственную легальную автоматизацию — сбор и сортировку списка всех вещей в инвентаре.

Удивительно, почему разработчики не сделали это сами, для них эта задача буквально на час. Дольше думать как кнопку назвать.

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

Собираем ежедневные награды

Бегать по трём персонажам с целью собрать ежку каждый день — такое себе. Следующим шагом автоматизировал сбор ежедневной награды за битых мобов.

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

Заворачиваем в полноценный «кликер»

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

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

Всё, на этом этапе можно считать что прокачка до 36 поставлена на поток. Покупаете пару сотен ремкомплектов, заводите десяток твинков и заходите на перса раз в неделю — починиться да сундуки пооткрывать.

А за что забанили

Если коротко — как видите, за дело =)

Я ожидал бана намного раньше, но спустя три или четыре месяца игры 24/7 бана всё небыло. Ну и я ожидал бана скорее за твинков, нежели за «много играете», но знал бы прикуп…

Смешно, ведь я реально имею привычку спать по 4 часа неделями.

Что забавно, забанили только одного персонажа из двадцати. Несмотря на достаточно очевидные связи по линии реффералов и направлению торгов.

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

За полгода игры я встретил как минимум 6 человек с самописными ботами разной степени проработки. У кого-то на js, пара на java, ещё один на python и даже на rust!

На этих ботах сидит, как минимум, 30 персонажей — это и автоторговцы и рыбаки и охотники и «делаю ежку — коплю кселы». Ну и обычные боты-фармеры, конечно.

Большая часть кланов из топ10 числит таких персонажей как активных игроков — хаос, пираты, пешки, форварды, клевер, арбузы и прочие. Даже не спрашивайте, откуда я это знаю ;)

Кликеры не ходят на КВ? С чего вы это взяли?

Более того, я уверен что часть людей, которые любят кидаться в общаке обвинениями в «кликерстве» сами в той или иной мере ими пользовались, пока не дошли до 35. А теперь всячески дистанцируются, такой вот моральный шпагат.

Что же делать, чтобы не забанили?

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

Достаточно фармить не на одном персонаже 24 часа в сутки, а завести сразу несколько и ограничить игровые сессии каждого 5-6 часами. Так вы останетесь и ниже радаров по активности и не будете мозолить глаза игрокам круглые сутки.

Если же такая система появился, то нам пригодятся методы из реальной жизни, которые используются при разного рода скрытии финансовых махинаций и прочей "оптимизации налогов".

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

  • пять - шесть персонажей фармеров
  • два - три персонажа, делающих только ежку (как "отстойники")
  • десяток разноуровневых одноразовых дропов

Фармеры раз в неделю скидывают случайному одноразовуму дропу все ресы, одноразовые дропы раз в месяц скидывают всё накопившееся в инвентаре своему "отстойнику". Основной персонаж выкупает все ресы за игровые монетки и особо не отсвечивает.

Задача сводится к тому, чтобы из сложнозацикленных цепочек было сложно выделить конечного выгодоприобретателя. Бан же каждого отдельного персонажа наносит мало урона всему кластеру.

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

В заключение

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

Большинство онлайн проектов, если уж решили бороться, то делают это автоматизированными средствами. Самое простое — оценивать среднюю скорость прокачки игроками и следить за теми, кто качается/богатеет быстрее остальных.

Есть и другой путь — легализовать и возглавить. Вместо борьбы с твинками, разрешить их и преподносить как часть игрового процесса. Тут вам и шпионство и контрразведка и саботаж и ещё туча околоигровых механик. И да, лицензию на легального твинка можно продавать по подписке ;)

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

Пока же, имеем то что имеем — единичные истории показательных казней, без особых пруфов и игры в охлократию (:

Было весело, ребят, спасибо! Вокруг игры сложилась очень камерное и забавное комюнити, не теряйте его. И пните уже кельта написать аукцион в игре, ну ёмана!

Бонус — ссылка на документацию по кликеру, для тех кто дочитал. Тестировался и работает на linux+python3.11, но, вероятнее всего, заведётся и на других системах и версиях питона. Всегда готов помочь с исправлением багов, если кто готов рискнуть =)

Обмусолить вопросики можно в личке, велком.

На правах позднего апдейта

Накидал пару ботиков на коленке.

Первый - для получения реф ссылки другого персонажа. Может пригодиться, если хотите нагнать рефералов на потенциального противника =)

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