12345
PROGRAMMING
Serke
30 апреля 2018, 00:54
Хакерствую. Есть игра, я про нее на форуме писал - Grimoire. Автор, крайне своеобразный тип, пилил ее 20 с чем-то лет, в прошлом году она вышла в стиме. Музыка в игре в формате MIDI и ее вывод осуществляется средствами давно объявленного устаревшим компонента DirectMusic на MIDI порт по умолчанию. В эпоху до Windows Vista портом по умолчанию был MIDI Mapper, позволявший перенаправлять вывод куда угодно, на любое устройство (синтезатор), потом мелкомягкие MIDI Mapper убрали и прибили этот порт гвоздями к программному синтезатору Microsoft, качество звучания которого, мягко говоря, оставляет желать лучшего. Я дизассемблировал код аудио движка игры, восстановил его, вплоть до реконструкции классов (игра написана на C++) и на основе полученных данных наваял wrapper (обертку) интерфейсов DirectMusic - по подобному принципу работают врапперы DirectDraw/Direct3D -> OpenGL и Glide -> DirectDraw/Direct3D. DLL с враппером внедряется в адресное пространство игры загрузчиком и перехватывает функции интерфейсов DirectMusic, вместо порта по умолчанию подсовывая порт синтезатора, который мне нужен.

Теоретически, поскольку у меня теперь на руках есть восстановленный код аудио движка, я могу переписать весь движок с нуля и засунуть его в игру вместо того, который там есть сейчас. Могу написать свой движок с маджонгом и гейшами, могу написать движок на основе какой-нибудь библиотеки с поддержкой звуковых банков (soundfonts) вроде BASS (библиотека, использовавшаяся помимо прочего в старых версий AIMP). Но для этого мне нужно проводить полноценную крупномасштабную операцию на исполняемом файле игры, изрезать его по живому вдоль и поперек. С помощью враппера такую задачу нормально просто не решить. У меня есть опыт такой работы - когда-то я участвовал в проектах по переводу визуальных новелл Cartagra и Kara no Shoujo и мне пришлось изрезать их движки так, что на них живого места не осталось. Размер патча, который я вставлял в экзешник Kara no Shoujo, составлял несколько тысяч строк ассемблерного кода и патч для Cartagra был сравнимого объема. Когда объявился паблишер, заинтересованный в издании Cartagra и Kara no Shoujo для западного рынка, ему пришлось переносить код новелл на другой движок - японцы сказали им, что адаптировать движок для английского текста невозможно. Когда я об этом узнал, мне было очень весело - "невозможную" работу я проделал не имея доступа к исходникам движка, чисто хакерскими методами. К сожалению, я не могу проводить подобные операции на исполняемом файле Grimoire, потому что автор все еще выкатывает патчи (и судя по всему, остановится не скоро). С выходом очередного патча вся работа пойдет насмарку.

Добавлено (через 23 мин. и 52 сек.):

TL;DR: игра воспроизводит музыку в формате MIDI, пользуясь средствами компонента DirectMusic, входившего в состав DirectX (пока его оттуда не выкинули, объявив устаревшим) и направляет вывод на стандартный программный синтезатор MIDI, являющийся частью Windows. Я работаю над тем, чтобы можно было направить вывод на любой синтезатор по выбору пользователя.

Исправлено: Serke, 30 апреля 2018, 03:10
Если тебе дадут линованную бумагу, пиши поперек.
Last Romantic
30 апреля 2018, 18:35
Сам программист, и только могу позавидовать твоему Serke упорству и наличию свободного времени, чтобы этим заниматься. Я бы давно уже забил. Одно дело ковырять уже законченный продукт, другое дело постоянно обновляющийся.
У меня последние два года все силы уходят на написание ПО для будущего, мать его, чемпионата мира. Все свои проекты, которые писал уже подзабросил, просто тупо нет желания очередной раз в лишнее время смотреть очередной код.
Романтиком быть выгодно. Почему ты поступаешь нелогично? Я романтик. Почему ты бедный? Я романтик. Почему у тебя труп в подвале? Я романтик.
Serke
30 апреля 2018, 20:40
Ну у меня давняя страсть к перепиливанию игровых аудиодвижков и исправлению багов, я еще 11 лет назад этим занимался. Что касается Grimoire - враппер, в отличие от патча, достаточно универсален, чтобы работать с постоянно обновляющимся продуктом.
Если тебе дадут линованную бумагу, пиши поперек.
JayD
30 апреля 2018, 21:09
Serke ну ничего себе, ты крут. Сам интересовался реверс инжинирингом какое-то время но до практики так дело и не дошло, а в свободное время практическим программированием вообще не занимаюсь, в лучшем случае читаю статьи или книги по тематике.

Была идея начать какой-то свой проект, чтобы практиковаться, но ничего достойного не приходит в голову.
Serke
30 апреля 2018, 23:37
Камеди голд.

Исправлено: Serke, 01 мая 2018, 00:39
Если тебе дадут линованную бумагу, пиши поперек.
macsla
30 апреля 2018, 23:52
Если бы у меня в программе были бы подобные косяки я бы спать не смог нормально. А он молодец, несколько месяцев держался пока носом не ткнули где что вставить)

Исправлено: macsla, 30 апреля 2018, 23:52
post tenebras lux
Serke
01 мая 2018, 01:01
Я вижу два возможных объяснения, причем они друг друга не исключают. Первое - эти косяки имеют для него низкий приоритет, он мыслит о более высоких материях. Работы у него действительно непочатый край, игра сырая, к тому же, он параллельно пилит мануал, ставший отдельным мемом - он обещает его уже год. Второе - он не очень хорошо разбирается в программировании аудио. Я когда разбирал ответственный за аудио код, удивлялся тому, что где-то он весьма стройный и красивый, а где-то, мягко говоря, кривоватый. Потом сообразил, что стройный и красивый код принадлежит аудиодвижку - библиотеке, написанной другим автором. И это объясняет, почему он игнорирует просьбы о предоставлении игроку возможности выбрать устройство для воспроизведения музыки - аудиодвижок такую возможность не поддерживает. Его нужно допиливать, добавлять недостающий функционал.

Добавлено (через 35 мин. и 1 сек.):

Вообще говоря, у было серьезное опасение, что после подобных советов он забанит меня на форуме Стима, за то что я ковыряюсь во внутренностях его игры. Он уже пол форума забанил по разным причинам, ему не привыкать. Автор довольно нервно реагирует на такие вещи, с людьми, написавшими для игры редакторы ресурсов, он на ножах. В последних обновлениях игры ресурсы зашифрованы, чтобы сделать эти редакторы нерабочими.

Исправлено: Serke, 01 мая 2018, 01:05
Если тебе дадут линованную бумагу, пиши поперек.
JayD
01 мая 2018, 10:50
У него очень неправильная реакция. По сути у его игры есть комьюнити, которому игра очень не безразлична.
Комьюнити настолько нравится игра, что они по дизасму даже баги фиксят и игру реверснули чтобы редактор написать.
Ему надо им ноги целовать и код открыть, а он вместо этого агрится и людей банит.
macsla
01 мая 2018, 11:23
Творческие люди они такие обидчивые)
post tenebras lux
Шемас
 МОДЕРАТОР 
01 мая 2018, 11:59
 Serke @ 30 апреля 2018, 23:37 
От автора ни ответа, ни привета

Но он же ублюдок и полный мракобес, это всем известно.
Rem
01 мая 2018, 16:27
 Serke @ 30 апреля 2018, 00:54 
У меня есть опыт такой работы - когда-то я участвовал в проектах по переводу визуальных новелл Cartagra и Kara no Shoujo и мне пришлось изрезать их движки так, что на них живого места не осталось.

Ух ты, внезапно. А тебя можно будет позадалбывать нубскими вопросами по поводу шрифтов или тебе уже это не интересно вообще?
~
Serke
01 мая 2018, 17:27
 Rem @ 01 мая 2018, 16:27 
Ух ты, внезапно.

Нашел старые страницы наших проектов на TLWiki. После того, как мы получили "письмо счастья" (C&D) от Innocent Grey, они были удалены. Для переводчика это было ударом - к тому времени он практически закончил работу. Для меня тоже - над движками я работал полтора года и тоже почти закончил свою работу. Переводчик, погоревав, сказал, что он слишком много вложил в проекты, чтобы сдаваться и мы ушли в подполье. Официально работа была прекращена, неофициально мы продолжали делать свое грязное дело. Потом один из участников проекта выступил с предложением обратиться к западному издателю и после переговоров перевод было решено выпустить официально.

Совсем старая страница проекта по переводу Cartagra, когда переводом занимался Zan
Более новая страница, когда переводом занимался Apoptosis, именно его перевод вышел официально
Kara no Shoujo

 Rem @ 01 мая 2018, 16:27 
А тебя можно будет позадалбывать нубскими вопросами по поводу шрифтов или тебе уже это не интересно вообще?

Конечно можно. Попробовать - все-таки я занимался этим последний раз лет 9 назад. =)

Исправлено: Serke, 01 мая 2018, 18:05
Если тебе дадут линованную бумагу, пиши поперек.
Rem
01 мая 2018, 18:16
 Serke @ 01 мая 2018, 17:27 
Конечно можно. Попробовать - все-таки я занимался этим последний раз лет 9 назад. =)

Ну если вкратце, то вот игра (в папке тулс первые 3 папки это проги для распаковки текстов, картинок и ex), игра не защищена и вроде всё ок, н о шр и ф ты вы  г л я д ят ка к-  то так:

СКРЫТЫЙ ТЕКСТ

Вроде всё работает, но выглядит просто вырвиглазно.

Точней на самом деле всё ещё хуже, там ещё не работают буквы "я" "г" и "ё", вместо них выдаются иероглифы. А скрин кидал какой-то чувак, который нашёл решение с этими буквами, но само решение так и не скинул. ><

Исправлено: Rem, 01 мая 2018, 18:30
~
Serke
01 мая 2018, 19:46
Вы шрифт не меняли? Очень похоже на то, что у вас в движке, заточенном под шрифты с фиксированной шириной символов (моноширинные), используется шрифт с переменной длиной (пропорциональный). Все японские игры рассчитаны на работу с моноширинными шрифтами - символы катаканы, хираганы и кандзи занимают строго одну клетку (представь себе тетрадный лист в клетку) и все клетки/символы одинаковы по ширине. Движки для вывода текста обычно использует WinAPI функцию TextOut, которой передаются координаты - X и Y, по которым выводится символ (в визуальных новеллах текст как правило выводится посимвольно). После вывода символа координата X приращивается на некоторое фиксированное значение - ширину клетки. С пропорциональными шрифтами такой алгоритм нормально не работает, каждая следующая координата X для пропорционального шрифта должна высчитываться движком в реальном времени, с учетом длины предыдущего символа. Да еще и кернинг должен учитываться по-хорошему - это когда расстояние между некоторыми сочетаниями букв должно быть скорректировано, иначе буквы будут сливаться (или наоборот, отстоять слишком далеко). Вдобавок к этому, движок должен высчитывать в рантайме переносы строк, из-за переменной длины символов длину строки нельзя вычислить заранее. Весь этот функционал нужно дописывать и это довольно сложно, поэтому с этим почти никто не заморачивается - проще использовать моноширинный шрифт. Я с Kara no Shoujo заморочился, реализовал и поддержку пропорциональных шрифтов, и кернинг.



Исправлено: Serke, 01 мая 2018, 19:12

Добавлено (через 35 мин. и 33 сек.):

 Rem @ 01 мая 2018, 18:16 
Точней на самом деле всё ещё хуже, там ещё не работают буквы "я" "г" и "ё", вместо них выдаются иероглифы.

А здесь, я думаю, другая проблема. Движок, скорее всего, работает с двухбайтовой кодировкой Shift-JIS и некоторые русские буквы принимает за кандзи. Если эти иероглифы "съедают" еще и следующую букву - это оно.
Если тебе дадут линованную бумагу, пиши поперек.
Rem
01 мая 2018, 20:09
 Serke @ 01 мая 2018, 19:46 
Вы шрифт не меняли? Очень похоже на то, что у вас в движке, заточенном под шрифты с фиксированной шириной символов (моноширинные), используется шрифт с переменной длиной (пропорциональный).

Неа, ну т.е. какой-то чел начинал разбираться и дословно:

А трабл собственно вот в чём: EXE-шник игры категорически не воспринимает буквы "ё", "я" и "г".
А это значит, что нужно ассемблить EXE-шник и полностью заблокировать(выпилить) ему доступ к родному шрифту(Rance01Font.fnl). Ну или у китайцев просить о помощи, у них со шрифтами такие же проблемы как и у нас.
Конечно, можно просто удалить Rance01Font.fnl, но тогда пропадёт меню, надписи во время боя и название вещей.
То есть, в EXE-шник нужно, помимо того, что выпилить локальный шрифт, но и заменить его ещё 3-мя новыми стандартными шрифтами. А работы это... Много.

И у него даже получилось реализовать недостающие буквы и он даже обещал показать, как это делается и пропал... =_=
Т.е. на данный момент шрифты те, что были по дефолту и я даже хз, где они находятся.
[QUOTE=Serke,01 мая 2018, 19:46][/QUOTE]

СКРЫТЫЙ ТЕКСТ

Ну да, судя по всему это оно.
~
FFF Форум » ОБЩИЙ » Programming (java, javaScript, C, PHP, Ruby and etc)
СООБЩЕНИЕ НОВАЯ ТЕМА ГОЛОСОВАНИЕ
12345
(c) 2002-2019 Final Fantasy Forever
Powered by Ikonboard 3.1.2a © 2003 Ikonboard
Дизайн и модификации (c) 2019 EvilSpider