Сейчас на форуме: jinoweb (+4 невидимых) |
eXeL@B —› Программирование —› Расширение функции в готовом приложении |
Посл.ответ | Сообщение |
|
Создано: 18 февраля 2020 15:14 · Личное сообщение · #1 Добрый день! Есть приложение (игра), которое получает из внешнего файла анимацию по буквенному коду вида "ride__****". За это отвечает функция: Code:
В зависимости от значения EAX выбирается код анимации: 0A - ev 18 или 19 - hl Есть еще варианты sp и 3_, они, повидимому, проверяются тут: 004841DC. В итоге код анимации для 0A должен выглядеть так: ride__ev00 ride__ev01 ride__ev02 ride__ev03 ride__ev04 ride__ev05 Видно, что выбор производится добавлением чисел в EAX: 3_ - 12C sp - 136 0A - 142 18 - 172 19 - 172 Что поисходит дальше я уже не понимаю. Что это за числа? Смещение в памяти? Собственно задача в том, чтобы добовить еще несколько вариантов, по аналогии с EV и HL. Нашел функцию, которая обрабатывает эти текстовые индексы в момент запуска программы: Code:
Все копировать не стал - слишком объемно. Прикрепил exe с минимальным набором для запуска в олли. https://yadi.sk/d/EKoG8TAqdpHaHQ Тут мне нужно добавить свои коды (допустим ts,tt,tu,tv,tw). Внес изменения: Code:
Я понимаю, что, вероятно, этот подход неверный, тем более, что он не работает... Тем не менее, когда я вчера, полусонный, накосячил здесь, анимация менялась местами и даже читался код TS (в отличии от некоторых старых кодов). Значит с локацией я угадал. Тут я вроде-бы все логично перенес - вытащил целиком HL и продолжил TS. Теперь старая анимация работает, а вот TS не читает. Кстати, в первой функции изменения: Code:
То-есть для EAX=19 выполняем ADD EAX,1A2. В дальнейшем я вместо 19 добавлю другие варианты (1B,1C,1D и тд), с этим, вроде, проблем быть не должно. А пока так для теста использую 19. 1A2 написал от балды, поскольку, как я писал выше, я не понимаю, что это за число и как мне вычислить следующее. Пробовал перебирать подряд, начиная со 172, но следующим (ближе к 190) идет уже анимация другого порядка. Если бы кто-то реально помог сделать полностью рабочий вариант - закину на пиво. Но и за советы буду очень признателен. |
|
Создано: 18 февраля 2020 18:19 · Личное сообщение · #2 gabryelle пишет: Есть приложение (игра), которое получает из внешнего файла анимацию по буквенному коду вида "ride__****". В смысле - внешний файл это архив, в котором хранятся файлы под такими именами? gabryelle пишет: Видно, что выбор производится добавлением чисел в EAX: 3_ - 12C sp - 136 Это как? gabryelle пишет: Тут мне нужно добавить свои коды (допустим ts,tt,tu,tv,tw) Зачем? Вы добавили данные в архив с такими именами? А что мешает добавлять с уже существующими? | Сообщение посчитали полезным: gabryelle |
|
Создано: 18 февраля 2020 19:01 · Поправил: gabryelle · Личное сообщение · #3 Не архив. Там в одном каталоге набор файлов, каждый из которых объединяет в себе 1 - текстуры, 2 - модели, на которые эти текстуры натягиваются, позы/анимации для различных действий, фактически не привязанные к моделям в этом файле, а универсальные. При запуске приложения эти файлы (man1, man2, woman1, woman2 и тд), каждый со своим набором, загружаются в оперативку. При активации транспорта вызывается первая функция, которая определяет, какую позу/анимацию использовать для этого порядкового номера транспорта (номера от 0h до 1Ah исходные, но расширяются без проблем). Вот фактический список номеров и буквенных кодов для них: sp (ride__sp00) - 0,1,B,C и 1A+ (по умолчанию) 3_ (ride__3_00) - 2,3,4,5,6,7,8,9,D,E,F,10,11,12,13,14,15,16,17 ev (ride__ev00) - A hl (ride__hl00) - 18,19 Таким образом, я могу добавить еще много различных транспортов, но позы у меня только 4... Я могу добавить новую анимацию в эти файлы-сборки, но нужно, чтобы у этой анимации были уникальные коды и программа их распознавала. Допустим, для мотоцикла будет ride__ts00, для коня ride__tu00 и тд. Коды ev и hl - это как раз частные случаи, по аналогии с ними я надеюсь добавить свои. |
|
Создано: 18 февраля 2020 19:05 · Поправил: _MBK_ · Личное сообщение · #4 |
|
Создано: 18 февраля 2020 19:18 · Личное сообщение · #5 |
|
Создано: 18 февраля 2020 19:29 · Личное сообщение · #6 |
|
Создано: 18 февраля 2020 19:39 · Личное сообщение · #7 Эти дополнительные цифры обозначают каждая свой тип позы. Покой/движение/атака и тд. Сейчас у меня 4 типа транспорта - байк (sp), борд (3_), сани (ev), и харлей (hl). С официального клиента я могу взять транспорты и позы к ним, но, само собой, это уже будет пятый тип транспорта, шестой и тд., а их мой вариант приложения уже не увидит. Вот тут, как раз, происходит выбор - сани (0A) или харлей (18,19). Code:
Сюда же можно дописать также частный случай 1B, но как привязать к нему дополнительный буквенный код (ts к примеру, какие именно будут буквы - неважно). |
|
Создано: 18 февраля 2020 21:07 · Личное сообщение · #8 |
|
Создано: 19 февраля 2020 09:37 · Поправил: gabryelle · Личное сообщение · #9 Так и задача в том, чтобы она их стала грузить. Code:
Здесь как раз и происходит загрузка текстовых индексов. Я добавил сюда же "ts", при запуске программа проходит через добавленный мною код. В первой функции происходит подстановка текстового индекса к номеру транспорта (ADD EAX,172 для 18,19 - hl). Просто я не понимаю того, что происходит дальше, как это число (172) далее определяет, какой текстовый индекс использовать. Но то, что первая функция осуществляет выбор - кому какой индекс использовать, а вторая - считывает эти текстовые индексы в память при запуске - в этом я уверен процентов на 99. Вот место вызова первой функции Code:
|
|
Создано: 19 февраля 2020 09:45 · Личное сообщение · #10 |
|
Создано: 19 февраля 2020 09:50 · Личное сообщение · #11 Я же в первом посте все написал... Code:
в первой функции изменения: Code:
То-есть для EAX=19 выполняем ADD EAX,1A2. В дальнейшем я вместо 19 добавлю другие варианты (1B,1C,1D и тд), с этим, вроде, проблем быть не должно. А пока так для теста использую 19. 1A2 написал от балды, поскольку, как я писал выше, я не понимаю, что это за число и как мне вычислить следующее. Пробовал перебирать подряд, начиная со 172, но следующим (ближе к 190) идет уже анимация другого порядка. |
|
Создано: 19 февраля 2020 10:05 · Личное сообщение · #12 |
|
Создано: 19 февраля 2020 10:20 · Личное сообщение · #13 |
|
Создано: 19 февраля 2020 10:54 · Личное сообщение · #14 Обратите внимание, в вашем файле полно еще других суффиксов помимо вышеперечисленных Code:
|
|
Создано: 19 февраля 2020 11:01 · Личное сообщение · #15 |
|
Создано: 19 февраля 2020 11:05 · Личное сообщение · #16 |
|
Создано: 19 февраля 2020 11:24 · Личное сообщение · #17 Похоже, что в итоге строки выглядят так: ride____00 ride____01 ride____02 ride____03 То-есть тут используется код "__". Попробовал убрать эту анимацию совсем - ничего не изменилось. Заменил, чтобы посмотреть визуально, что это такое. Это аналог "3_". Который нигде не используется. Скорее всего изначально был только это вариант, а с обновлениями его отключили, заменив четырьмя, имеющимися сейчас. |
|
Создано: 19 февраля 2020 11:39 · Личное сообщение · #18 По вашей логике, у этих суффиксов тоже должны быть некие зарезервированные коды. На мой же взгляд, вы изначально исходите из ложных предпосылок и код, ответственный за загрузку находится где то в другом месте, а процедура A1EE46 абсолютно ни при чем. Возможно, разве что, формирует какую то таблицу суффиксов для создания хэшкодов, а возможно и нет. Проверить элементарно - поменяйте в Code:
|
|
Создано: 19 февраля 2020 11:43 · Личное сообщение · #19 |
|
Создано: 19 февраля 2020 12:17 · Личное сообщение · #20 А, примерно вкурил принцип. Смотрите, если суффикс содержит ev то данные из переменной [esp+10h] инитят таблицу [edx+eax*8+0A10h] Code:
а если суффикс hl то другую таблицу [edx+eax*8] Code:
Возможно, это разные индексы одной и той же таблицы Добавлено спустя 33 минуты _MBK_ пишет: Возможно, это разные индексы одной и той же таблицы На это, кстати, какбэ намекает и то, что смещение между индексами = 0xA10 = как раз 0x142 восьмибайтовых элемента таблицы |
|
Создано: 19 февраля 2020 13:51 · Личное сообщение · #21 Вот содержимое регистров в точке 004CAFA4 (промотал, пока не получил HL00): Code:
Тут в EAX как раз лежит число 172, по которому осуществляется выбор тут: Code:
Таблица должна быть по адресу в ECX (14767770)? Code:
Там в конце "Bip01 Pelvis" - да, это уже куски анимации. А что дальше? Нужно ее как-то расширить? Или просто добавить смещение? Я попробовал для ts сделать MOV DWORD PTR [EAX*8+EDX+1420],ECX но в EAX все равно получаю харлеевские 172 для __ts00 |
|
Создано: 19 февраля 2020 14:14 · Личное сообщение · #22 gabryelle пишет: Вот содержимое регистров в точке 004CAFA4 (промотал, пока не получил HL00): Не обращайте внимание, значения ebx, ebp и esi остались из предыдущей процедуры сравнения, они дальше никуда не идут gabryelle пишет: Тут в EAX как раз лежит число 172, по которому осуществляется выбор тут: Скорее всего да, это индекс в этом массиве, начало которого, cудя по всему в edx то есть 10438A38 |
|
Создано: 19 февраля 2020 14:42 · Поправил: gabryelle · Личное сообщение · #23 Code:
|
|
Создано: 19 февраля 2020 14:48 · Личное сообщение · #24 |
|
Создано: 19 февраля 2020 15:17 · Личное сообщение · #25 |
|
Создано: 19 февраля 2020 15:47 · Личное сообщение · #26 |
|
Создано: 19 февраля 2020 16:06 · Личное сообщение · #27 |
|
Создано: 19 февраля 2020 16:08 · Личное сообщение · #28 |
|
Создано: 20 февраля 2020 11:26 · Личное сообщение · #29 |
|
Создано: 20 февраля 2020 11:59 · Личное сообщение · #30 |
eXeL@B —› Программирование —› Расширение функции в готовом приложении |