Чиним баги(добавляем фичи) с помощью чит энджина.
В общем суть. Есть одна визуальная новелла Steins;Gate Elite. К ней вышел руссификатор полусырой, разработчики на него забили, и где нужно не проставили перенос строки. По итогу получаем мы в результате вот такое:
Не знаю как вас, но я когда вижу такие переносы у меня внутри всё бурлит и читать становится невыносимо. Что делать? Ну раз разработчики движка не добавили перенос текста по словам, так-как в японии это нахуй не нужно, там иероглифы, добавлять будем мы.
Итак с чего начать? Ну начать следует с того, чтобы найти строку текста отображаемую на экране в оперативке. В зависимости от движка текст может быть и разбросанным по символам, а не целой строкой. Для поиска текста открываем чит энджин, подрубаемся к нашей игре. Далее сканирование -> новое сканирование выбираем тип строка, пишем искомую строку. В конкретно данном случае получаем залупу за воротник, так-как текст не ищется ни в одной нормальной кодировке.
Что делать дальше? А дальше думать, если искомый текст не находится, то есть вероятность, что игрой используется кастомная кодировка. Мы слепы как кроты, но не стоит отчаиваться, нужно просто немного схитрить. Мы не знаем как выглядит текст в кастомной кодировке, но есть кое-что, что нам известно. Например количество символов в строке. Ну и понеслась. Новое сканирование, тип 4 байта. Подсчитываем количество символов, сканируем. Жмакаем кнопку, снова подсчитываем символы уже в новой строке, жмакаем кнопку. Так пока не останется только один, два адреса. А потом просто смотрим какие функции обращаются к этому адресу.
Что же, вот она, функция где форматируется текст. Если пролистать дальше, то можно будет увидеть работу с символами из строки. Красным если что выделена строка текста в кастомной кодировке, опытным путем выяснил значение контролирующих байтов: 01 80 - начало имени 02 80 - конец. 03 80 - конец текста.
Тааак, вот это уже интересно. У меня уже был опыт добавления переноса текста по словам в Rewrite стимовский, поэтому стал искать место где может формироваться уже новая строка с контрольными байтами переноса строки. Но тут меня ждало фиаско. Строка есть только одна, ебись с ней как хочешь. Но ведь как-то же движок переносит текст на новую строчку в игре?
Дальше я стал проводить эксперименты, высчитал нужную букву перед которой происходит перенос. Поставил на неё брейкпоинт, тыкался - тыкался в дебаггере, что там блядь происходит, нихуя не понятно. Думаю хуй с тобой золотая рыбка. Решил найти производится ли учет количества строк, но нет, нужной переменной не нашел. Далее координаты текста по оси y, и бинго. Нашел
для лучшей наглядности. Ну думаю отлично, тут как раз есть проверочка, возможно это оно и нужно. В чит энджине jnz меняю на jmp, проверяю строку и есть. Перевод строки не произошел. Плюс еще движок услужливо помещает всю строку текста сжимаю буквы по иксу. Вообще кайф, значит можно не заморачиваться подсчетом ширины символов, хотя по хорошему нужно, но мне просто нормально почитать и все.
Поэтому что в этом случае можно придумать? А вот что, заводим булевую. Пускай будет единица когда произойдет перевод на новую строку, но переводить мы не будем. Будем каждый символ проверять является ли он пробелом и если да, тогда уже делать перевод на новую строку. По итогу получается как-то так. И результат собственно
На третьем примере кстати видно недостаток подобного подхода, слишком сильно сжимает, по хорошему надо учитывать ширину символов, но итак сойдет. Ну и в конце всё это запилить в дллку, но я ебал его в рот, не люблю кресты, плюс еще не правильно чего сделаешь привет утечки памяти и прочие радости. А я точно неправильно сделаю, так-как на крестах не пишу.Если кому нужна таблица для чит энджина: https://cdn.discordapp.com/attachments/128912752604348416/1000075342477787227/SteinsGateElite.CTНа сим всё. На самом деле там еще дохуя работы, в глоссарии пиздец тоже творится, но мне лень уже этим заниматься, все равно не так часто туда заходишь.
Отличный комментарий!