Genshin Impact и управление диалогами клавиатурой

Или сказ о том как за год можно улучшить игру и не сойти при этом с ума

Wise man once said: "IT JUST WORKS"

Все играют в разные игры для своего удовольствия. Игроки Genshin’а играют в неё для своего удовольствия (ну или не знают куда ещё можно потратить деньги). Я же отношусь к игре как к интерактивной визуальной новелле с элементами РПГ, и мне очень как нравится сюжет игры, мини сюжеты сайд квестов и пр., но как же меня раздражает то что ДИАЛОГИ МОЖНО ВЫБИРАТЬ ТОЛЬКО МЫШЬЮ щ(゜ロ゜щ).

Играя с геймпада диалоги можно выбирать кнопками. Играя с телефона… Ну тут и так всё понятно. Но что не так с игрой на ПК? В гугле на весь интернет 1-2 поста (но может я не так запрос строил, конечно, но всё же). Это просто больно, в некоторые визуальные новеллы хочется играть минимально напрягаясь, попивая при этом чай. Геншин же мне такого удовольствия не дал, потому я смахнул пыль с моего диплома программиста и вышел на тропу войны.

Итог: Потратив год работы я довёл до релиза 🎇 Aurora Dialog Enhancer — программу, которая допиливает этот функционал в Геншине. Теперь диалоги можно листать и клацать клавиатурой, колесом мыши, и вообще всем чем угодно.

<i>ОНО РАБОТАЕТ, СПУСТЯ ГОД, ЕЕЕЕЕЕЕЕЕЕЕЕЕЕ</i> 🥳
ОНО РАБОТАЕТ, СПУСТЯ ГОД, ЕЕЕЕЕЕЕЕЕЕЕЕЕЕ 🥳

Могут ли за такое забанить: тут-же отвечаю на самый интересующий вопрос — 99.9% что не могут, где 0.1% это явно какая-то аномалия.

Почему так: работает всё на технологии OpenCV (обработка компьютерного изображения, т.е. анализ происходящего на экране по скриншотам) и отсутствие какой-либо работы с памятью игры. + К этому — программа не даёт какого-либо преимущества в игре. (Как пример — можно считать что у вас открыта какя-либо программа для стриминга, например Open Broadcast Studio, которая при необходимости двигает ваш курсор мыши на облачка диалогов).

За что можно получить бан (из лицензионного соглашения игры): "Обратите внимание, что программное обеспечение игр COGNOSPHERE может содержать программное обеспечение или функции обнаружения читов (Cheat Detection). «Обнаружение читов» означает функционал, предназначенный для нахождения и определения читов. «Читы» - программы, методы, процессы или другие программы с программным или аппаратным обеспечением в любых форматах, которые могут дать Пользователям несправедливое конкурентное преимущество в играх COGNOSPHERE".

На словах оно так всё и работает, но людей банят почти за всё: изменение файлов игры, работа с памятью игры, AutoHotKey скрипты дающие преимущество (отмена анимации некоторых персонажей), разблокировка FPS, использование ReShade (Nvidia ReShade Filter разрешается), игра на пиратских серверах, замена моделей персонажей, перемещение вне текстур и границ мира. В общем, отслеживается почти каждый шаг. Вот на это "почти" я и ориентировался.

А точно безопасно? Отвечу как разработчик и фанат игры — я сделал всё что мог что-бы было безопасно (у самого AR 58, такой прогресс я терять точно не хочу). Год единоличной разработки и тестирования тремя люди тому свидетель. Я больше не могу играть в игру без вот этого всего вот, но всё равно, я должен это сказать, абсолютной гарантии я дать не могу, используйте только НА СВОЙ СТРАХ И РИСК!

На этом всё? На этом всё. Самое интересное в статье закончилось, можно расходится, ха! А всё что дальше — это всё про изумительно "ИнТеРеСнЫй" годовой путь разработки (что можно и не читать).

В общем, для тех кому этого достаточно, спасибо вам большое за интерес, прочтение, отзывы, критику, комментарии, репосты и использование. Добра и мира всем вам. Спасибо что читаете! (^・ω・^ )

П.С. Ещё однин мой лонг в догонку:

Путь, мотивация и перспективы

В один день после работы (а я Java/Angular разработчик с 4х летним стажем на удалёнке) я подумал, раз я уже год сижу дома безвылазно, а не забросить ли мне все свои друшие дела, и не взяться ли за вот эту идею с Геншином?

В память игры внедрятся не хотелось вообще, зная как разработчики банят за всё что можно и нельзя, потому единственным вариантом было изучить OpenCV (оказывается очень много разных ботов пишут с использованием OpenCV). Через 3 дня чтения документации OpenCV, копипасты кода со Stack Overflow и задалбывания вопросами своего знакомого, который с этим работает профессионально, я перепробовал множество разных вариантов как определить облачка диалогов на экране, и в итоге всё заработало… Ну, кое-как.

<i>Определение границ объектов в OpenCV что мне не подошло</i>
Определение границ объектов в OpenCV что мне не подошло

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

<i>Как оно было. Пре-релизная версия 1.0</i>
Как оно было. Пре-релизная версия 1.0

Но в итоге тогда я подумал, эти 3 года работы на моей рабочей работе, какую пользу они принесли мне и обществу в целом? Какие вообще у меня перспективы на работе? Может стоит что-то сделать, а не просто жить жизнь, почему у меня десяток начатых но не но не законченных проектов на ГитХабе? Почему бы хоть этот проект не довести до релиза? Ну и ещё к этому всему повлиял ещё и тот факт что я купил себе 2к монитор и оно всё перестало работать

(╯‵□′) ╯︵┻━┻

Как всё начиналось

Теперь когда я решил довести всё до релиза нужно было сделать много вещей:

  • Посмотреть ещё раз точно ли нет ничего подобного и за что именно банят в игре (а я очень много наиграл, риск того не стоил бы). С этим всё было в порядке, банят за что надо, а моя поделка вне радара.
  • Подтянуть C#. Так как я Java разработчик, а C# и Java это одного поля ягоды, то пришлось разобраться в некотором количестве разных тонкостей. К тому же никаких дополнительных вещей на комп ставить не надо из-за встроенной в Windows технологии .Net Framework (хоть и давно заброшенной Microsoft).
  • Стилизовать приложение. Тут просто хотелось хоть какого-нибудь качества. Выбрал WPF за счёт того что он работает на Windows 7, а в Геншине заявлена поддержка Windows 7. Ну и ещё потому что абсолютно не хотелось всё делать на Electron (что съел бы всю память) и Qt (что пришлось бы изучать с нуля ничего не зная). Посмотрел я на разные библиотеки стилей и компонентов. Были и очень большие и платные… Ничего мне не понравилось. Прям совсем. Потому параллельно с основной программой я писал (и таки дописал) свою такую очень легковесную библиотеку Why Orchid которую везде теперь для себя буду использовать.
<i>Как оно было. Пре-релизная версия 2.0</i>
Как оно было. Пре-релизная версия 2.0

Самым сложным оказалось сохранить рассудок. С утра ты работаешь рабочую работу, а вечером вот это вот всё. И на выходных тоже. И конца и края не видно.

И ещё нужно было бороться с голосами в голове: Стоит ли оно всего этого? Это очень странная идея, кому вообще оно может понадобится? Может стоило другой проект допилить а не этот? Почему я хочу нормально поиграть в игры, а вместо этого сижу и это всё программирую? Сколько оно займёт времени? Почему я не уеду в регион где потише, так как мой регион ВЗРЫВНОЙ, и можно спокойно выходить на улицу? Когда люди перейдут от капиталистического формата общества к созидательному? Почему с некоторых пор я стал уделять этому проекту времени больше чем основной работе? Почему Орхидея? Почему 42?

<i>Undertale копиум _(:з)∠)_</i>
Undertale копиум _(:з)∠)_

Разработка наглядно

Сразу решил всё оптимизировать. Не ка каждое же нажатие делать скриншот области экрана, это очень ресурсо-затратно. Придумал несколько защит:

  • Первым делом нужно проверить отображается ли курсор в игре (а при движении персонажа он не отображается), что проверяется системными вызовами Windows в коде.
  • Имена NPC в диалогах, как оказалось, имеют уникальный цвет. Теперь можно делать скриншот этой области на экране и проверять на наличие такого цветового диапазона.
  • Эти два условия выше гарантируют то что сейчас идёт какой-то диалог. Именно в этом режиме, при нажатии на назначенные кнопки, можно уже не боятся выполнять ресурсно-затратную функцию поиска облачков диалогов в определённой узкой области.
  • Ну и к этому ещё всему там подключилась оптимизация потоков, что было очень больно, и ещё я вот даже пока не знаю где такие знания вообще могут пригодится, но оно хотя-бы работает теперь очень быстро.
<i>Тут OpenCV всё нашел. Хорошая работа, OpenCV</i>
Тут OpenCV всё нашел. Хорошая работа, OpenCV

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

Объясняю нормально: программа не должна знать ничего о играх, а все настройки и прочий функционал должен быть реализованы в .dll файлах, которые программа должна находить, подхватывать и считывать оттуда информацию. Вот тебе и Genshin, и Star Rail, и куча всего другого (осталось только написать для этого всего другого код).

Ну ладно, хорошо, это я сделал, вернулся, наконец, обратно к множеству картинок-шаблонов облачков диалогов, и в итоге ниже какого-то разрешения экрана (1600xНа-что-то-там-ещё) всё перестало работать. Т.е. буквально на несколько разрешений экрана ниже 1920x1080. Почему так, как оказалось, — чем больше шаблон изображения, что нужно найти, тем меньше порог погрешности при его нахождении, ну и обратно — чем меньше шаблон, тем результаты недостовернее.

<i>Пример облачка диалога что нужно искать</i>
Пример облачка диалога что нужно искать
<i>Его кусочек-шаблон что ищется (ну не прям точь в точь, он со всякими масками контуров и пр, но суть та же)</i>
Его кусочек-шаблон что ищется (ну не прям точь в точь, он со всякими масками контуров и пр, но суть та же)
<i>Тут OpenCV нашел всё, но не то что не надо. Плохая работа, OpenCV</i> &gt;:(
Тут OpenCV нашел всё, но не то что не надо. Плохая работа, OpenCV >:(

Ну и дальше проблемы начали прибавляться:

  • Облачка диалогов, оказывается, имеют прозрачность. Небольшую, но она есть. OpenCV это, естественно не нравится.
  • На низких разрешениях игра сглаживает контуры облачков диалогов, из-за чего порог погрешности поиска приходится очень занижать, что влияет на результаты.
  • Яркость в игре тоже на всё влияет.
  • Если на облачке диалога находится курсор, и оно таким образом подсвечено, такое облачко не распознаётся.

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

Первая идея что у меня появилась — соединить картинки 2х шаблонов в одну, где одна картинка нормальная, а 2я со сглаженными контурами, наложить их друг на друга и убрать каждый 2й пиксель картинки. Ну это более менее сработало, но всё равно мне не нравилось. Ещё из-за использования OpenCV, моя мелкая, казалось, бы программа весила под 70 Мб (её конечно удалось пересобрать, не без помощи, до 20 Мб, но всё же).

В общем накатились серьёзные проблемы, и я не знал как их решать. И всё отложил на время. Морально это было сложно. Всё работало, но криво, а такие планы были. Помогло просто отвлечься на другие игры на месяц. Вообще всё бросил. И в итоге появилась очень странная идея — если я перепробовал всё что мог с OpenCV, и в принципе знаю как оно всё работает, почему бы картинку-шаблон облачка диалога не задать математически? Всего-то нужно найти все ключевые точки по которым нужно её искать, и найти их зависимость от разрешения экрана. Таким образом можно отказать от OpenCV, и искать всё чистой математикой. Ну ладно, у меня достаточно времени, одиночества и безумства что-бы это можно было проверить.

<i>Буквально я</i>
Буквально я

Сделав скриншоты игры во всех возможных её разрешениях экрана я начал искать зависимости расположения разных ключевых точек (где по X и Y координатам рисуются облачка диалогов, где их контурные границы, диапазоны чёрно-белого цвета контурных линий, расстояния между линиями, размеры и цвета иконок и всё такое прочее). Получилась просто ГИГА ОГРОМНАЯ таблица в Excel, но всё же удалось вывести чёткую зависимость. Осталось только её запрограммировать. Из-за того что шаблон теперь стал чисто математический, теперь облачка диалогов можно находить для любых разрешений экрана игры. Ну и программа стала весть 2 Мб после удаления из неё OpenCV.

<i>Все изображения нужно переводить в серый цвет что-бы проще было работать с полупрозачностью, ориентируясь на переходы контракта</i>
Все изображения нужно переводить в серый цвет что-бы проще было работать с полупрозачностью, ориентируясь на переходы контракта

Ну, это всё же оказалось сложнее чем я думал. Где-то недели две я работал над этим функционалом, мне он даже снился, я только его и видел перед собой. Но он в итоге заработал. Это было для меня каким-то открытием, что библиотеки это не всегда ультимативное решение проблемы. И этот мой функционал, в итоге, заработал, можно сказать идеально (но сколько же багов там было по началу, просто больно вспоминать даже).

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

Это мем для web программистов. Много библиотек - не решение проблемы

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

Ну и в общем я взял отпуск на работе и уехал подальше от компа и от своего города. Что оказалось правильным решением — вернулся, нашел ещё баги. И исправив прям явные — сел писать этот лонг.

Что в итоге

Пройдя весь этот путь разработки, могу только поделиться такими своими мыслями и советами:

  • Срок разработки по времени можно умножать на 2 или даже 3 совершенно спокойно.
  • Очень редко когда что идёт по плану.
  • Любая проблема решаема, если её разбить на множество мелких проблем.
  • Хочешь стать хорошим программистом — просто больше как можно больше кода. Идеально — свой проект.
  • Писать программу для Геншина — не самая нормальная идея.
  • Есть более интересные идеи для портфолио на GitHub.
  • Релиз большого проекта добавляет уверенности во всех делах в повседневной жизни.
  • Жить в опасном городе и районе, без нормальной возможности выйти на улицу и при этом работать удалённо — это очень одиноко.
  • Время идёт очень быстро, просто пролетает мимо, и причём совершенно незаметно.
  • Человеческие отношения и люди важнее всего-всего другого.
  • Стены очень давят.
  • (´。_。`)

Дальнейшие планы (что-бы рассмешить Бога и вас):

  • Добавить поддержку Star Rail.
  • Исправить больше багов.
  • Взяться за заброшенный проект по фарму твич дропов в фоне (за который я словил предупреждение на GitHub'е).
  • Взяться за ещё один заброшенный проект.
  • И ещё один.
  • Поставить FL Studio и стать микстейпером.
  • Наконец поиграть в другие игры.
  • Дальше работать на благо общества, создавая полезные и интересные штуки (это прям лучшая моя мотивация).
  • Найти себе жену, в конце то концов (ノ◕ヮ◕)ノ*:・゚✧ (Хотя в моих реальностях это сейчас очень и очень сложно... Я не знаю, попробую может и здесь. Кому нужен программист под 30 лет — пишите ( • ω • )y ) (работодатели тоже).
(*゜ー゜*)
(*゜ー゜*)

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

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

Добра и мира всем вам. До новых встреч, до новых статей и до новых странных проектов.

(づ ̄3 ̄)づ╭✨~

Genshin Impact и управление диалогами клавиатурой
109109
99 комментариев

Советую срочно выйти на улицу и потрогать траву пока она ещё есть

21
Ответить

@Рыцарь Травинка я потрогаю тебя, хорошо?

8
Ответить

Ты крут)

8
Ответить

Спасибо. Мама мне так же говорит

9
Ответить

Все играют в разные игры для своего удовольствия. Игроки Genshin’аработают

6
Ответить

Да, я наконец-то могу нормально поиграть. Это заняло слишком много времени...

4
Ответить