Genshin Impact и управление диалогами клавиатурой
Путь, мотивация и перспективы
В один день после работы (а я Java/Angular разработчик с 4х летним стажем на удалёнке) я подумал, раз я уже год сижу дома безвылазно, а не забросить ли мне все свои друшие дела, и не взяться ли за вот эту идею с Геншином?
В память игры внедрятся не хотелось вообще, зная как разработчики банят за всё что можно и нельзя, потому единственным вариантом было изучить OpenCV (оказывается очень много разных ботов пишут с использованием OpenCV). Через 3 дня чтения документации OpenCV, копипасты кода со Stack Overflow и задалбывания вопросами своего знакомого, который с этим работает профессионально, я перепробовал множество разных вариантов как определить облачка диалогов на экране, и в итоге всё заработало… Ну, кое-как.
Неделю спустя диалоги уже можно было выбирать через нахождение шаблона облачка диалога, но только для разрешения 1920x1080, месяц спустя я сделал самый базовый интерфейс и на этом остановился. Мне этого было достаточно, я поделился тем что получилось со своим друзьям, и на этом я остановился.
Но в итоге тогда я подумал, эти 3 года работы на моей рабочей работе, какую пользу они принесли мне и обществу в целом? Какие вообще у меня перспективы на работе? Может стоит что-то сделать, а не просто жить жизнь, почему у меня десяток начатых но не но не законченных проектов на ГитХабе? Почему бы хоть этот проект не довести до релиза? Ну и ещё к этому всему повлиял ещё и тот факт что я купил себе 2к монитор и оно всё перестало работать
(╯‵□′) ╯︵┻━┻
Как всё начиналось
Теперь когда я решил довести всё до релиза нужно было сделать много вещей:
- Посмотреть ещё раз точно ли нет ничего подобного и за что именно банят в игре (а я очень много наиграл, риск того не стоил бы). С этим всё было в порядке, банят за что надо, а моя поделка вне радара.
- Подтянуть C#. Так как я Java разработчик, а C# и Java это одного поля ягоды, то пришлось разобраться в некотором количестве разных тонкостей. К тому же никаких дополнительных вещей на комп ставить не надо из-за встроенной в Windows технологии .Net Framework (хоть и давно заброшенной Microsoft).
- Стилизовать приложение. Тут просто хотелось хоть какого-нибудь качества. Выбрал WPF за счёт того что он работает на Windows 7, а в Геншине заявлена поддержка Windows 7. Ну и ещё потому что абсолютно не хотелось всё делать на Electron (что съел бы всю память) и Qt (что пришлось бы изучать с нуля ничего не зная). Посмотрел я на разные библиотеки стилей и компонентов. Были и очень большие и платные… Ничего мне не понравилось. Прям совсем. Потому параллельно с основной программой я писал (и таки дописал) свою такую очень легковесную библиотеку Why Orchid которую везде теперь для себя буду использовать.
Самым сложным оказалось сохранить рассудок. С утра ты работаешь рабочую работу, а вечером вот это вот всё. И на выходных тоже. И конца и края не видно.
И ещё нужно было бороться с голосами в голове: Стоит ли оно всего этого? Это очень странная идея, кому вообще оно может понадобится? Может стоило другой проект допилить а не этот? Почему я хочу нормально поиграть в игры, а вместо этого сижу и это всё программирую? Сколько оно займёт времени? Почему я не уеду в регион где потише, так как мой регион ВЗРЫВНОЙ, и можно спокойно выходить на улицу? Когда люди перейдут от капиталистического формата общества к созидательному? Почему с некоторых пор я стал уделять этому проекту времени больше чем основной работе? Почему Орхидея? Почему 42?
Разработка наглядно
Сразу решил всё оптимизировать. Не ка каждое же нажатие делать скриншот области экрана, это очень ресурсо-затратно. Придумал несколько защит:
- Первым делом нужно проверить отображается ли курсор в игре (а при движении персонажа он не отображается), что проверяется системными вызовами Windows в коде.
- Имена NPC в диалогах, как оказалось, имеют уникальный цвет. Теперь можно делать скриншот этой области на экране и проверять на наличие такого цветового диапазона.
- Эти два условия выше гарантируют то что сейчас идёт какой-то диалог. Именно в этом режиме, при нажатии на назначенные кнопки, можно уже не боятся выполнять ресурсно-затратную функцию поиска облачков диалогов в определённой узкой области.
- Ну и к этому ещё всему там подключилась оптимизация потоков, что было очень больно, и ещё я вот даже пока не знаю где такие знания вообще могут пригодится, но оно хотя-бы работает теперь очень быстро.
На горизонте замаячил Star Rail. Посмотрев геймплей, я увидел что там тоже проблема с диалогами. В итоге я решил изменить приложение, нацелив его не на Genshin конкретно, а сделать из него некий "каркас" — реализовать модульность и динамическую погрузку библиотек, заточенную под каждую игру...
Объясняю нормально: программа не должна знать ничего о играх, а все настройки и прочий функционал должен быть реализованы в .dll файлах, которые программа должна находить, подхватывать и считывать оттуда информацию. Вот тебе и Genshin, и Star Rail, и куча всего другого (осталось только написать для этого всего другого код).
Ну ладно, хорошо, это я сделал, вернулся, наконец, обратно к множеству картинок-шаблонов облачков диалогов, и в итоге ниже какого-то разрешения экрана (1600xНа-что-то-там-ещё) всё перестало работать. Т.е. буквально на несколько разрешений экрана ниже 1920x1080. Почему так, как оказалось, — чем больше шаблон изображения, что нужно найти, тем меньше порог погрешности при его нахождении, ну и обратно — чем меньше шаблон, тем результаты недостовернее.
Ну и дальше проблемы начали прибавляться:
- Облачка диалогов, оказывается, имеют прозрачность. Небольшую, но она есть. OpenCV это, естественно не нравится.
- На низких разрешениях игра сглаживает контуры облачков диалогов, из-за чего порог погрешности поиска приходится очень занижать, что влияет на результаты.
- Яркость в игре тоже на всё влияет.
- Если на облачке диалога находится курсор, и оно таким образом подсвечено, такое облачко не распознаётся.
И если на последние две проблемы можно закрыть глаза (что я и сделал), то первые две нужно было как-то решить.
Первая идея что у меня появилась — соединить картинки 2х шаблонов в одну, где одна картинка нормальная, а 2я со сглаженными контурами, наложить их друг на друга и убрать каждый 2й пиксель картинки. Ну это более менее сработало, но всё равно мне не нравилось. Ещё из-за использования OpenCV, моя мелкая, казалось, бы программа весила под 70 Мб (её конечно удалось пересобрать, не без помощи, до 20 Мб, но всё же).
В общем накатились серьёзные проблемы, и я не знал как их решать. И всё отложил на время. Морально это было сложно. Всё работало, но криво, а такие планы были. Помогло просто отвлечься на другие игры на месяц. Вообще всё бросил. И в итоге появилась очень странная идея — если я перепробовал всё что мог с OpenCV, и в принципе знаю как оно всё работает, почему бы картинку-шаблон облачка диалога не задать математически? Всего-то нужно найти все ключевые точки по которым нужно её искать, и найти их зависимость от разрешения экрана. Таким образом можно отказать от OpenCV, и искать всё чистой математикой. Ну ладно, у меня достаточно времени, одиночества и безумства что-бы это можно было проверить.
Сделав скриншоты игры во всех возможных её разрешениях экрана я начал искать зависимости расположения разных ключевых точек (где по X и Y координатам рисуются облачка диалогов, где их контурные границы, диапазоны чёрно-белого цвета контурных линий, расстояния между линиями, размеры и цвета иконок и всё такое прочее). Получилась просто ГИГА ОГРОМНАЯ таблица в Excel, но всё же удалось вывести чёткую зависимость. Осталось только её запрограммировать. Из-за того что шаблон теперь стал чисто математический, теперь облачка диалогов можно находить для любых разрешений экрана игры. Ну и программа стала весть 2 Мб после удаления из неё OpenCV.
Ну, это всё же оказалось сложнее чем я думал. Где-то недели две я работал над этим функционалом, мне он даже снился, я только его и видел перед собой. Но он в итоге заработал. Это было для меня каким-то открытием, что библиотеки это не всегда ультимативное решение проблемы. И этот мой функционал, в итоге, заработал, можно сказать идеально (но сколько же багов там было по началу, просто больно вспоминать даже).
Хотя то что библиотеки это не эталон я должен был заметить и раньше, ведь во всех библиотеках, что я использовал в своей программе, почти весь код пришлось переписать и адаптировал под свои задачи.
Эта была просто нереальная победа и нереально безумство. В итоге я потратил ещё месяц что-бы отполировать разные места программы, исправить разные баги... И ещё месяц что-бы исправить больше багов, и написать ридми... И исправить ещё больше багов. В общем то оно всё было готово в июле, но очень уж хотелось выпустить программу без багов (это, как оказалось, в принципе невозможно), и уже в начале сентября, (сейчас почти октябрь) сделал незаметный релиз. Чем меньше людей будет знать, тем меньше багов будет найдено.
Ну и в общем я взял отпуск на работе и уехал подальше от компа и от своего города. Что оказалось правильным решением — вернулся, нашел ещё баги. И исправив прям явные — сел писать этот лонг.
Что в итоге
Пройдя весь этот путь разработки, могу только поделиться такими своими мыслями и советами:
- Срок разработки по времени можно умножать на 2 или даже 3 совершенно спокойно.
- Очень редко когда что идёт по плану.
- Любая проблема решаема, если её разбить на множество мелких проблем.
- Хочешь стать хорошим программистом — просто больше как можно больше кода. Идеально — свой проект.
- Писать программу для Геншина — не самая нормальная идея.
- Есть более интересные идеи для портфолио на GitHub.
- Релиз большого проекта добавляет уверенности во всех делах в повседневной жизни.
- Жить в опасном городе и районе, без нормальной возможности выйти на улицу и при этом работать удалённо — это очень одиноко.
- Время идёт очень быстро, просто пролетает мимо, и причём совершенно незаметно.
- Человеческие отношения и люди важнее всего-всего другого.
- Стены очень давят.
- (´。_。`)
Дальнейшие планы (что-бы рассмешить Бога и вас):
- Добавить поддержку Star Rail.
- Исправить больше багов.
- Взяться за заброшенный проект по фарму твич дропов в фоне (за который я словил предупреждение на GitHub'е).
- Взяться за ещё один заброшенный проект.
- И ещё один.
- Поставить FL Studio и стать микстейпером.
- Наконец поиграть в другие игры.
- Дальше работать на благо общества, создавая полезные и интересные штуки (это прям лучшая моя мотивация).
- Найти себе жену, в конце то концов (ノ◕ヮ◕)ノ*:・゚✧ (Хотя в моих реальностях это сейчас очень и очень сложно... Я не знаю, попробую может и здесь. Кому нужен программист под 30 лет — пишите ( • ω • )y ) (работодатели тоже).
В общем, это всё было и интересно, и невыносимо сложно... Наверное это было самое странное время моей жизни, но если моя голова не работает, то я просто лезу на стены, просто есть какая-то зависимость от решения чего-то сложного. Ну и конечно, я бы не справился без помощи и поддержки всех моих друзей, что помогали мне всё это время (в основном, конечно, слушая нытьё). Так что, спасибо вам большое пребольшое))).
И спасибо всем вам, кто это всё прочёл, или просто перешел в конец. Спасибо также за комментарии, отзывы, критику, репосты, подписки, звёздочки на ГитХабе и использование. Пишите свои мысли, задавайте вопросы, пишите личные сообщения, и я всем-всем отвечу, обещаю.
Добра и мира всем вам. До новых встреч, до новых статей и до новых странных проектов.
(づ ̄3 ̄)づ╭✨~
Советую срочно выйти на улицу и потрогать траву пока она ещё есть
@Рыцарь Травинка я потрогаю тебя, хорошо?
Ты крут)
Спасибо. Мама мне так же говорит
Все играют в разные игры для своего удовольствия. Игроки Genshin’аработают
Да, я наконец-то могу нормально поиграть. Это заняло слишком много времени...