Погроммистское. Или конец жизни 2х годового проекта разработки

В ноябре 2022 года я начал писать программу для управления и выбора вариантов диалога в Genshin Impact на основе компьютерного зрения (ADE). Осенью 2023го я выпустил её в релиз и поддерживал до сих пор. С новым патчем игры разработчики HoYoverse добавили этот функционал прямо в игру. Осень 2024. Прощай ADE 🙏. История

Погроммистское. Или конец жизни 2х годового проекта разработки

Содержание

О чём вообще речь

Когда-то я писал статью об этом. В чём суть. В игре выбирать варианты диалогов можно только мышкой. Можно было. И чёт это так меня напрягало, что я решил набросать на коленке распознавание этих облачков диалога, и сделал это за 3 дня. А вот дальше уже делал обёртку над всем этим.

Переключение и выбор колесом мыши, кнопками на клаве. Написал свою UI библиотеку на WPF для программы, отказался от OpenCV (как-раз таки библиотеки для компьютерного зрения) и написал свой алгоритм распознавание, сугубо для игры. Под все разрешения экрана. Добавил автопропуск диалогов. И теперь это всё не нужно больше.

Вот всё это в Aurora Dialog Enhancer.

Но теперь это есть в самой игре
Но теперь это есть в самой игре

Делаем. Интерфейс?

Это не был мой первый проект, но на нём я учился новым штукам, так как эксперементировать на основной работе с кодом очень стрёмно.

Выбор пал на C# и NetFramework 4.8 потому что он вшит в Windows, и ничего ставить дополнительно не нужно. Так вес программы стал всего 3мб.

Нужно было нарисовать интерфейс. Ну тут только WPF позволял сделать красивости. Я хотел слизать его с Google Material, но мне нужно было... Ээээ. Смешивать полупрозрачные цвета

И для C# я ничего не нашел такого, потому посмотрел как оно работает на "Всемирном консорциуме веб-технологий 3"

И запрограммировал это. Что вообще ЭТО такое? Это - например как в фотошопе слои накладываются друг на друга с разными цветами и полупрозрачностями.

Погроммистское. Или конец жизни 2х годового проекта разработки

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

Погроммистское. Или конец жизни 2х годового проекта разработки
Погроммистское. Или конец жизни 2х годового проекта разработки

"Лучшие" моменты разработки

Распознавание изображений

Как всё началось можно почитать с старой статье.

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

Погроммистское. Или конец жизни 2х годового проекта разработки

Нет, формулы нет. Ну или я очень затупил. Потому я сделал математические шаблоны для соотношений сторон экрана, а не прям разрещений

Погроммистское. Или конец жизни 2х годового проекта разработки

Главное что оно работает. Никому не интересно как, поверьте

Автозагрузка и права администратора

А права нужны для того что-бы повить глобальный перехватчик нажатий на клавиатуру. Ни никак иначе нельзя было сделать. И Майкрософт запрещают запускать автозапуском программы с правами администратора. НО!

В Винде есть Планировщик Задач

Погроммистское. Или конец жизни 2х годового проекта разработки

И туда можно добавить задачу с помощью... Ээээ. PowerShell скрипта, который можно запустить в фоне.

Погроммистское. Или конец жизни 2х годового проекта разработки

Это самая тупая идея для обхода такой проблемы, но она сработало. Правда занимает секунды 3-4 на выполнение :/

Одновременный запуск нескольких приложений

В моём случае - нужно было как-то это запретить, и открывать уже запущенное приложение. в WPF проекте это сделать нельзя, а вот в следующей его версии UWP есть отдельная галочка в настройках проекта. И шо делать?
Оказалось, лучшием решением было бы поднять локальный сервер/канал обмена сообщениями в системе, и посылать команду/слушать, если приложение запускается
NamedPipeServerStream

И закрывать текущее, если такое же уже запущено.

Блин, сложно, ладно, объясн. проще:
Знаете как можно запустить игру стим через исполнение комманды в Виндоус на Win+R

Погроммистское. Или конец жизни 2х годового проекта разработки

Вот Стим слушает такое. А я слушаю своё, но только когда запущенна программа.

Ослеживание фокусировки игры

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

Но. Большое но. Я столкнулся с проблемой. Если запустить игру в окне (это важно) и переключиться на другое окно. А потом навести мышкой на значок игры в пуске и нажать. Игра развернётся, окно сфокусируется... Только вот Виндоус говорит что фокус сейчас у окна explorer. Я не могу это объяснить, жта проблема только с этой игрой. Но она не одна.
Проблема №2. Видете этот экран?

Погроммистское. Или конец жизни 2х годового проекта разработки

Что произойдёт если я нажму на него, начнётся грузится мир, и я переключусь на другое окно?
Правильно - игра пошлёт сообщение Винде что она сфокусирована. Но только сообщение, фокуса у неё не будет.
Я уже и спросил на StackOverflow типа ПОЧЕМУ!? ЧТО Я ДЕЛАЮ НЕ ТАК!? И мне сказали чтовсё так, но у тебя в коде странные решения.

А странные решения потому что я думал как это обойти. Поставил ещё фокус и на коик мышкой - что-бы при первом клике когда такое вот произошло, перефокусировать окно принудительно обратно.
Ну как-бы ладно. Я нашел другое - есть фокус окна, а есть фокус клавиатуры. И это разные фокусы - куда сейчас будут вводится команды с клавиатуры и на какое окно сфокустрованно сейчас. И, да, они могут быть разными. И в случае с Геншином, когда такое происходит, и когда фокус окна и клавиатуры разный...

Погроммистское. Или конец жизни 2х годового проекта разработки

Я это теперь отлавливаю и принулительно фокусируюсь на окне, у которого нет фокуса клавиатуры.Что я могу сказать - это костыль, но это криворукость разработчиков Геншина. Я не мог спать по ночам, думая как обойти эту проблему, но в итоге обошел.

А все другие сложности, они оказались и не сложностями. Просто заняли много времени. Эти же, что выше. Над ними пришлось долго думать. Ладно хватит о интересных проблемах

Подводим итоги

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

Погроммистское. Или конец жизни 2х годового проекта разработки

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

Что я хочу вам сказать. В общем 36 звёзд ⭐ на Гитхабе с 1.3 скачиваниями. И 2.3к скачиваний на Gamebanana. В целом, неплохо.

Я многому научился как программист, было и весело, и интересно и сложно, и тащемта, но главное - я поверил в свои силы, и что всё возможно. И эта уверенность, что ты чего-то достиг, она помогает по жизни и с другими задачами. Типа "Я сделал в прошлом вот то, значит справлюсь и с этим - Ай Кэн Ду Ит"!!!

Программистам, кто это вдруг всё читает, я хочу сказать что - опыт приходит пока что-то делаешь. Ничего не делаешь - ничему не научишься. Ну и что языки программирования гов**. Пишите на чём хотите, это лишь инструменты, а самое главное - это идея.

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

(И, ДА, - У МЕНЯ ЕСТЬ ОСНОВНАЯ РАБОТА!!!)

Может во что поиграть...
Может во что поиграть...

P.S. Интересно было бы вам, начни я стримить. Что-то по погроммированию/игоры

Стриминг 📺
Айнтересно!!!
Нет, я на такое не подписывался
Результаты
8383
55
44
11
11
11
11
11
247 комментариев

Опять День РЖД напрограммировал какой-то хуйни
Круто!

19
1
1
Ответить

Вот именно что какой-то хуйни, ЛОООООЛ. Всё так

11
1
1
Ответить

Пон.

10
1
1
Ответить

Эййййййй. Откуда это у тебя? 👀

4
1
Ответить

Дееееееееньчик

8
1
1
Ответить

Где

7
1
1
Ответить

СООООООДАААААААААА

6
1
1
Ответить