Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обсуждение инженерного анализа
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
major
а как с помощью ЕРМ сделать?
по некоторому адресу стоит 8-байтное значение 0.5, мне надо его поменять на 0.6. !!UN:C 8-байт не принимает, дробные значения не вписывает и переменные с плавающей точкой 4-байтные.
Как быть???
Хмм..
Цитата(major @ 03 Nov 2008, 20:47)
!!UN:C 8-байт не принимает

8 - это 2*4 dry.gif

Цитата(major @ 03 Nov 2008, 20:47)
переменные с плавающей точкой 4-байтные.

Это все условно. Может и 8-байт.

Цитата(major @ 03 Nov 2008, 20:47)
Как быть???

Если это стандартный перевод - то поищи в инете. Я где-то даже прогу видел для перевода чисел в разные системы исчисления. При этом можно было ввести длинну и переводить дробные числа.

Либо посмотри как число используется в коде и прикинь чему равно 0,6.
Хмм..
0099999999999998 - вот такое чило получил при переводе в 16-ную систему числа 0,6
Aнгeл
Цитата
Почему любое изменение в ТЕ-шном exe ведет к такой ошибке?

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

Вы можете воспользоваться этим файлом вместо того, что идёт в поставке с ТЕ: http://letitbit.net/download/3f2e6b633237/...th-002.rar.html.

Там же убрана стандартная реакция на ошибки в виде отключения части скрипта, что находится ниже кода, вызвавшего ошибку, а также исправлены недочёты с дорогами, которыми теперь можно управлять через ЕРМ.

Примечательно, что изменяя параметр Road на, например, 5, можно добиться, что чуть ниже указанной клетки будет нарисован обычный стрелочный курсор-метка, которым мы указываем путь героям. Чтобы не было вылета, эту метку стоит убрать до того, как игра продолжится.

Если кого-то из участников интересуют другие неофициальные модификации платформы, то можете посмотреть следующий архив: http://letitbit.net/download/b507f4784499/...1-Demo.RAR.html

Платформа Era базируется на изменённом выполняемом файле, ссылка на который была приведена выше. Среди основных целей:
Код
- Вызов WinAPI из ЕРМ
- Использование авторских внешних DLL
- Интеграция с наноассемблером для написания быстрых функций, для которых сейчас используется !!UN:C (Используется лишь для доступа к самым основным переменных игры)
- Новые события и двусторонняя связь между ЕРМ и бинарным кодом

В данной демонстрационной версии показаны основные аспекты платформы, но ещё не всё реализовано из задуманного.
hippocamus
Цитата
Для распаковки сейва переименуйте его в GOOD BOY.gz и воспользуйтесь WinRar, игнорируя ошибки


Добавлено ([mergetime]1226356131[/mergetime]):
Цитата
Для распаковки сейва переименуйте его в GOOD BOY.gz и воспользуйтесь WinRar, игнорируя ошибки

Вот это верно. Но я не понимаю, почему h3m - это нормальный gz-архив, а gm1 - некорректный. Это уж кому нужно было?

И ещё - я понимаю, что со столькими коментариями не понять - признак тупости, но почему для записи используется триггер музыки?
Aнгeл
Цитата
Вот это верно. Но я не понимаю, почему h3m - это нормальный gz-архив, а gm1 - некорректный. Это уж кому нужно было?

Хиппо, а ты подумай, нужны ли разрабам читеры, что сразу же распакуют и начнут менять сейвы. А так, сейв не распаковывается как бы. Карты тоже в формате GZ, но там верная crc пишется. Разрабы просто попытались защитить сейвы хотя бы от совсем несведущих. Хотя и не ахти вышло.

Цитата
И ещё - я понимаю, что со столькими коментариями не понять - признак тупости, но почему для записи используется триггер музыки?

В Эре триггер SN используется для новых событий. Ресивер SN - для команд.

Вот что было в оригинальной концепции, позже наноассемблер был исключён:

Код
DLL с дополнительным функционалом называется ANGEL.DLL.
Её загрузка происходит сразу после инициализации ВОГа и патчинга нужных функций.
DLL патчит zPlaySound так, что v50..v99 становятся ключевыми переменными.

v50 - номер команды
v51..v99 - параметры.
v99 - результат вызова функции API (Call Proc)

0 - стандартный ZPlaySound
1 - LoadLibrary (команда обнуляется)
2 - GetProcAddress (команда обнуляется)
3 - Call Proc (команда обнуляется)
4 - Call Nasm Function (команда обнуляется)
5 - вызов zPlaySound без ЕРМ-триггера. (команда обнуляется)
Другое: - вызвать !?SN-триггер без вызова функции zPlaySound (команда не обнуляется)


Что происходит?

На zPlaySound, иначе процедуре проигрывания звука, стоит мой перехватчик, а до этого был перехватчик ZVS. Перехватчик анализирует v50 и если это 0, то реакция стандартна, иначе см. выше.

Как программировать. Значение команды (v50) варьируется в небольшом диапазоне:

Код
0 - стандартный ZPlaySound]
[1 - LoadLibrary (команда обнуляется)
Name: ZIndex; VAR Result: VIndex;

[2 - GetProcAddress (команда обнуляется)]
hModule: INTEGER; ProcName: ZIndex; Result: VIndex;

[3 - Call Proc (команда обнуляется)]
Proc: POINTER; PushType: TPushType; Params: TParams;

TParms = RECORD
 Number: INTEGER;
 Params: ARRAY Number OF INTEGER;
END;

Через !!VR:C мы сразу настраиваем команду и параметры. Инициализируем, если нужно, строковые ерм переменные и выполняем команду: !!SN:Pz1; Звука не будет, ЕРМ триггер тоже не активируется. Вдобавок, ядро само обнулит v50.

TParams, если говорить проще - это: кол-во параметров/параметр1/параметр2/...;
В демке Era использует PASCAL-соглашение о передаче параметров в стёк и очистке мусора. В более поздних вариантах соглашение (CDECL, STDCALL, PASCAL) нужно будет указывать после адреса вызываемой функции. Дело в том, что большинство кода Героев юзает STDCALL/REGISTER, Слава - CDECL, а я - PASCAL. Единственное, DELPHI юзает убойный REGISTER (передача параметров через регистры), что, увы, не поддерживается.

Приведу для примера кусок из демки:

Цитата
!!VRz1:S^Angel.dll^; Скрипт получает дескриптор библиотеки ядра технической платформы
!!VRv50:C1/1/2; ...
!!SN:Pz1; ... v2 = дескриптор


!!VRv50:C/1/2;

Если бы демка была под SCVS, что возможно и будет в будущем (скомпилированный вариант тоже будет), то шаблон выглядел бы так:

Код
!!VR$Команда$:C(Загрузить библиотеку)/(Индекс z-переменной с названием)/(индекс v-переменной, куда поместить результат)


Что касается новых событий, то теперь должно быть понятно, что их довольно просто вводить. Я вставляю перехватчики в определённых местах, сохраняю регистры и флаги, устанавливаю v50 в номер события (должен быть > 4, >5 в демке) и вызываю zPlaySound. Ессно, звука нет, а вот ЕРМ триггер ловит событие. Соответственно в скрипте мы пишем:

!?SN&v50=(Событие_Х);
!!VRv50:S0; - это важно, иначе вместо звука (ведь скрипты часто проигрывают реальный звук) мы ещё раз сгенерируем это событие.

Как вывод, всё в принципе довольно стандартно.

Код
!!VRv50:Cкоманды и параметры
!!SN:Pz1; выполнили
....
!?SN&v50=событие_х;
!!VRv50:S0;
....


Например, ты можешь написать тестовую DLL, экспортировать функцию по имени:

Код
EXPORTS
 TestFunc NAME 'TestFunc';


По аналогии подгрузить DLL, получить адрес функции и вызвать её. Не забудь только при объявлении:

Код
FUNCTION TestFunc(i: INTEGER); PASCAL;


Поставить тип соглашения. А то Делфи будет ожидать параметров в регистрах, а мы ей стёк smile.gif
SAG19330184
специалисты, подсткажите: нужен адрес для таблицы героев, поля этой таблицы. В частности это позарез нужно для фиксирования геморройного бага со времен SOD - бага со стартовыми героями непервого уровня на случайных картах. Такой баг проявляется если стартовые герои совпадают с одним из героев в тюрьме (генератор некорректно наполняет тюрьмы). В таблице должно быть поле "доступен герой на карте" и для части героев это поле без галочки (герои из кампаний). Т.е. если пропатчить эту таблицу в момент, когда нажимается кнопка "BEGIN" но до начала генерации карты (пометить стартовых героев недоступными к генерации на карте), то генератор их не засунет в тюрьму и не будет бага smile.gif Если подобный патч можно реализовать не только для ТЕ но и для SOD то всемирную славу создателю патча я обеспечу
GORynytch
А меня прикалывал этот баг... Он срабатывает очень редко, но плохо чтоли стартовать с 15 уровнем, если играешь на высшей сложности...
SAG19330184
он срабатывает очень часто если много тюрем. А тюрем много на картах XL с подземельем. Часто идет 2-3 рестарта подряд, а это лишних 10 минут. Конечно неплохо стартовать с 15 уровнем, но противник почему то считает это слегка нечестным smile.gif На высшей сложности сейчас живые противники не играют, это только замедляет игру и увеличивает влияние совершенно случайных факторов.
Хмм..
А обнулять начальных героев скриптом?
SAG19330184
обнулять теоретически можно, однако есть 2 огромных минуса:
- герои-дупликаты из тюрем никуда от этого не денутся, если их освободить то очень вероятны массовые глюки например типа "серого замка" , который невозможно захватить или просто вылеты карты. Корректно изменить номер героя в тюрьме средствами ERM кажется невозможно?
- надо вручную создавать таблицу начальных скиллов всех героев что не есть просто
gamecreator
кто-нибудь знает где в памяти хранится карта?
MasterOfPuppets
Где в памяти или в exe хранятся заклинания, даваемые артефактами?
tolich
Боюсь, что это не единая таблица, а функция, проверяющая наличие и уровень заклинания у героя, имеет специальные ветки, включающиеся при наличии определенных артефактов (по их номерам). Это проще, чем хранить пустые списки для почти всех артефактов, кроме маленькой группы.
MasterOfPuppets
А у тебя есть конкретные адреса, указатели?
tolich
Нет. Но я подозреваю, искать надо в сегменте кода.
MasterOfPuppets
Почему при изменении указателя на таблицу монстров, даже на +/-116 байт, свойства командиров полностью аннулируются? Как их вернуть?
Astaroth
Цитата
Почему при изменении указателя на таблицу монстров, даже на +/-116 байт, свойства командиров полностью аннулируются? Как их вернуть?

А ты вместо этого какой ставишь указатель? На другую таблицу что ль?

Вопрос совершенно не в тему: кто хорошо умеет работать с графикой в C++ Builder. Просто назревает кое какой проект в миру героев, но с графикой хлопот очень и очень много
Дьяк
Нуты даешь MOP. Ты же смещаешь всех существ на +/- 1, что тут непонятного.

Как их вернуть - не трогать указатель.
MasterOfPuppets
Дьяк, ты не так понял. Я переносил и всю таблицу в доп. память, crAnim тоже. Указатель, естественно, меняю, и не один. Но результаты те же. Менял указатель на начало таблицы вог-монстров - эффекта ноль. Искал возможный указатель на начало таблицы командиров - ничего не нашёл. Как вообще связан указатель на таблицу монстров со свойствами командиров - это меня и интересует. А так всё нормально - новые монстры работают. С проблемой хинта разберусь, возможно, сам, а вот проблема с командирами...
Дьяк
Покажи как ты переносишь - у меня таких проблем не возникало
MasterOfPuppets
Кода при себе нет, обьясню на пальцах:
1. Выделяю буфер памяти (с помощью EraUtils.dll Берсеркера, но неважно как, хоть в z-переменные), запоминаю его адрес.
2. Копирую таблицу монстров через КопиМемори, начиная с 8195216h, в этот буфер.
3. Забиваю в 6768560h ссылку на этот буфер.
Такие же манипуляции с crAnim-ом.

Цитата(Master Of Puppets @ 13 Nov 2009, 21:20)
Где в памяти или в exe хранятся заклинания, даваемые артефактами?

Кстати (память):
004D977Ch - номер заклинания, даваемого Клинком Армагеддона (по умолчанию - 26).
004D9794h - номер заклинания, даваемого Грохотом Титанов (по умолчанию - 57)
Если изменить заклинание, когда артефакт уже надет, то при снятии старое заклинание всё равно исчезает из книжки (если герой его не знает).
Действительно, ничего похожего на таблицу. Но, возможно, на основе этих скудных данных, кто-то сможет создать функцию, чтобы свойство "дать заклинание" можно было применять к любому артефакту?
Дьяк
Можно в виде длл наделить любой артефакт заклом, просто немного расширить цикл case в ехе, который касается артов. На счет командиров - не знаю, не сталкивался. Если в ходе тестирования городов чет всплывет - отпишусь.
Но а вообще адрес 8195216d (он же 7D0C90h) в коде во многих местах (13 раз). Часть адресов - структуры патчинга, часть адреса для ЕРМ и т.п. Я с трудом представляю как они могут конфликтовать, но я думаю, если ты заменишь все 13 адресов указателем на свой буфер, то проблемы пропадут (возможно появятся новые )))), например английское название монстров и т.п. ))))) )
MasterOfPuppets
13 раз? 0_о. Видимо, в большинстве случаев этот адрес представлен в неизвестном мне виде, так как АртМани - даже с использованием любого порядка байт и обхода защиты - нашла у меня только 4 значения, и ни одно проблемы с командирами не решило. Или я плохо ищу...
Хотя в экзешнике значение встречается раз семнадцать.
Дьяк
Ну вот видишь, ты сам сказал, что встречается чаще. Переведи адрес из ехе в виртуальный и проверь в артмани.

Как перевести - вот из этой темы:
http://forum.df2.ru/index.php?showtopic=6803

"1. На самом деле, Славин файл - это exe.
Для WoG 3.58f:
400000 + А, если А < 29C000,
465000 + А, если А >= 29C000."
MasterOfPuppets
Дьяк - покорнейше благодарю. smile.gif Я и подумать не мог, что АртМани не может найти в памяти то, что может найти в экзешнике.
Изменил в общей сложности 19 указателей: 47ADD1h и 6747B0h - только в самой памяти, остальные 17 - от экзешника.
За работу командиров оказался ответственнен указатель mem76C05Ch.
Команда !!EA начинает ругаться лишь тогда, когда номер монстра превышает лимит в 256 существ. Однако, свойства опыта монстрам >196 так просто не даёт. Текстовики тоже не помогают. Очевидно, ограничение есть, но негласное.
Про таблицы особых свойств - знаю. Собственно, их можно задать различными способами, так что не страшно.
Существа нормально добавляются в слоты героя с помощью HE:C.
В общем, реальной осталась только проблема хинта (если это можно назвать проблемой). Глянул твои исходники (Monstr.asm), нашёл там:

Код
BufMonErr1 dd 447466h
BufMonErr2 dd 447467h
BufMonErr3 dd 732CA9h  

...
 
; снятие ограничений
invoke WriteAtCode,offset BufMonErr1,8,4,4  
invoke WriteAtCode,offset BufMonErr2,144,4,4  
invoke WriteAtCode,offset BufMonErr3,MaxMnstr,4,4


Оно? Если да, то что сие значит в переводе на русский? smile.gif
Вообще, я бы, наверное, смог лучше разобраться с этим (глянул хотя бы, что и на что в памяти поменялось), если бы monstr.dll работала на ЭРЕ 1.6. Но почему-то она наотрез отказывается это делать. Проблема в Monstr.bin - с его присутствием в папке плагинов игра просто не запускается. Помнится, на ЭРЕ 1.1 библиотека работала, хотя и давала вылет при вступлении в битву (несмотря на то, что всё было вроде верно сделано, и в AVWATTAK.DEF были дополнительные кадры).
Дьяк
1. Я не знаю на сколько новый у тебя исходник
2. В любом случае подход в том исходнике устаревший, т.к. переписываю все на С++
3. Последний исходник - это исходник к ролику о Бастионе
4. К длл идет еще две папки DATA_*** . Они тоже могут быть устаревшими - это раз, а два - в них могут быть лишние данные.
5. Те 3 адреса - это снятие ограничений с, если мне не изменяет память, хинта и команды ЕРМ, которая меняет существ в замке UN:T или чет тип того. По этим адресам должно находится число монстров. Последний адрес - точно ЕРМ потому, что - это код Славы. Но не факт, что это весь хинт.
6. Снять хинт без отладчика тебе не удасться. Придется учить азы ассемблера. Т.к. в коде идет простая проверка на кол-во монстров 197, т.е. 197 при помощи артманиты найдешь дох...на.
MasterOfPuppets
Цитата
1. Я не знаю на сколько новый у тебя исходник

Я тоже, ибо не подписано. Но точно не этого года.)
Цитата
4. К длл идет еще две папки DATA_***

В курсе. Но папка лишь одна - DATA_MNSTR.
Цитата
5. Те 3 адреса - это снятие ограничений с, если мне не изменяет память, хинта и команды ЕРМ, которая меняет существ в замке UN:T или чет тип того. По этим адресам должно находится число монстров. Последний адрес - точно ЕРМ потому, что - это код Славы. Но не факт, что это весь хинт.

Первые два - ХЗ, и по ним не кол-во монстров. А третий - точно UN:T.
Цитата
6. Снять хинт без отладчика тебе не удасться. Придется учить азы ассемблера. Т.к. в коде идет простая проверка на кол-во монстров 197, т.е. 197 при помощи артманиты найдешь дох...на.

Искать номера заклинаний, даваемых артефактами, было куда труднее. :-)
В exe:
003253E0 - имя существа при вопросе в двеллинге ("Вы хотите нанять...?").
0032544C - подсказка по монстру на карте при наведении мыши.
003257C4 - диалоги при нападении на монстра (предложение о присоединении, предложение догнать)
00325848 - подсказка в окнах героя и обмена героев при наведении мыши.
003258CC - подсказка по кадру дефа в диалогах и сообщениях типа IF:Q
003258FC - подсказка в Обзоре Королевства при наведении мыши на кол-во существ в армии героя.
00325908 - подсказка в Обзоре Королевства при наведении мыши на иконку существа в армии героя.
0032598C - подсказка по монстру на карте по ПКМ.
003259A4 - имя в двеллинге (заголовок "Нанять ..."). Как для уличных двеллингов, так и для городских.
00325B30 - подсказка в городе по иконкам найма - и ПКМ, и при наведении.
00325BA8 - подсказка в городе при наведении мыши на слот героя ("выбор из гарнизона:" или "выбор (визитёр):")
00325C08 - имя существа в окне вражеского стека
00325C14 - имя существа в окне отряда.
Наверняка, есть ещё какие-то хинты, о которых просто так не вспомнишь, но если столкнусь - труда найти не составит.
Помимо этого:
Найдены 4 проверки по адресам 002BF76B, 002B9F50, 002EBD8D и 002BFB15, отвечающие за показ диалога опыта армии в битве и вне её. Также, по адресу 002BFA89 находится проверка на наличие в диалоге кнопки "Просмотр бонуса для Улучш/Неулучш. существ". Правда, проверки какие-то тёмные - снятие ограничения работает лишь для существа 197, а если выше - диалог либо показывает свойства 197-го, либо (намного чаще) всё равно вылетает. Видно, нужно либо ещё что-то найти, либо где-то расширить таблицу. Кнопка просмотра бонуса для улучш. существа показывает диалог Копейщика.
002F1410h - убрать сообщение об ошибке команды !!MA. Убирается только сообщение - сама команда всё равно не работает с параметрами новых существ.
Пока вопросы кончились.
Дьяк
Цитата
003253E0 - имя существа при вопросе в двеллинге ("Вы хотите нанять...?").
0032544C - подсказка по монстру на карте при наведении мыши.
003257C4 - диалоги при нападении на монстра (предложение о присоединении, предложение догнать)
00325848 - подсказка в окнах героя и обмена героев при наведении мыши.
003258CC - подсказка по кадру дефа в диалогах и сообщениях типа IF:Q
003258FC - подсказка в Обзоре Королевства при наведении мыши на кол-во существ в армии героя.
00325908 - подсказка в Обзоре Королевства при наведении мыши на иконку существа в армии героя.
0032598C - подсказка по монстру на карте по ПКМ.
003259A4 - имя в двеллинге (заголовок "Нанять ..."). Как для уличных двеллингов, так и для городских.
00325B30 - подсказка в городе по иконкам найма - и ПКМ, и при наведении.
00325BA8 - подсказка в городе при наведении мыши на слот героя ("выбор из гарнизона:" или "выбор (визитёр):")
00325C08 - имя существа в окне вражеского стека
00325C14 - имя существа в окне отряда.


Эти адреса тебе ничем не помогут. Это динамические адреса и вероятность, что они совпадут на других компах - мизерна (я не удевлюсь, если они у тебя тоже не совпадут при нескольких запусках игры). Ограничения так не снимаются. Я же вроде сказал, что в коде нужно искать кол-во монстров и увеличивать их. Лучше не трать время. Я скоро перепишу монстров на С++ и дам тебе инструмент. Либо начинай изучать ассемблер. Я тоже начинал с артмани не имея о нем представления. Как видишь разобрался - ничего сложного.
MasterOfPuppets
Я же сказал, что эти адреса находятся,
Цитата(Master Of Puppets @ 10 Jan 2010, 06:12)
В exe:

По ним и находится число 197. Увеличиваешь - и хинт приходит в порядок.
Я и ограничения с команд MA снял (у них указатели на таблицу монстров со смещением), и заставил их работать с новыми данными. И с диалогом опыта армии разобрался.
Astaroth
Не знал где написать, поэтому спрошу здесь: Как определить координаты, по которым расставляются здания в городах? Очень и очень нужно. Кто покажет как или хотя бы намекнет как до всего дойти своим умом заранее огромное спасибо yes.gif
MasterOfPuppets
Можешь тут на эту тему посмотреть: http://forum.df2.ru/index.php?showtopic=7070
Координаты любой штуки ищутся довольно легко в АртМани. Но объяснять, как и что искать в каждом отдельном случае - довольно долго. Часто x - в одном байте, а y - в четырёх, и наоборот. В окнах, подобных HeroScreen, координаты ищутся от угла диалога, а не от угла экрана, и т.д.
Лучше, как говорит Дьяк, изучить азы Ассемблера.)
Astaroth
Цитата
Лучше, как говорит Дьяк, изучить азы Ассемблера.)

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

P.S. Спасибо! yes.gif
MasterOfPuppets
Я делаю так: фоткаю скрин, определяю точные координаты левого верхнего угла, потом ищу Артманькой в экзешнике координату, чьё число больше (чем число больше, тем оно обычно встречается реже). Меняю значения поочерёдно (лучше сразу по десятку-два). Загружаю игру, проверяю. И так, пока не найду.
Если координаты слишком малы, можно поискать координаты других объектов диалога. Нужные отыщутся где-то рядом.
Дьяк
BufCastleDCoor1 dd 5C32E9h
BufCastleDCoor2 dd 5C32F6h

Указатель на указатель таблицы располагается по адресу 5C32E9 (там размер координат word ), но игра использует два адреса один для координаты X второй для координаты Y
При помощт OlyDbg координаты можно найти за 2 минуты. Ставишь бряк на указатель имени дефа любого строения и при входе в замок оказываешься в коде на процедуре отрисовки.

Только поменять координаты зданий обычно мало, чтобы изменить положение здания. Есть еще таблица отвечающая за перекрытие одних зданий другими. Там указана отдаленность зданий от игрока.


Добавлено ([mergetime]1271873750[/mergetime]):
Буду дома - посмотрю
tolich
Цитата(Дьяк @ 17 Jan 2010, 10:56)
Там указана отдаленность зданий от игрока.
depth
feanor
Как сделать существо кастером? Трех таблиц, упомянутых в теме, недостаточно: с их помощью можно прибить каст у элементалей/огров/шаманов/архангелов etc, можно поменять им типы заклятий (дать огру-шаману каст как у джиннов etc), но сделать кастером, скажем, дендроида или циклопа - никак sad.gif
Etoprostoya
!!MA:B#/S - не катит?
feanor
Отлично. Теперь хотя бы эксепшн кидает.

Добавлено ([mergetime]1268852643[/mergetime]):
Йахху!!!!!!!!!1111111111111111111111111
Этопростоты, с меня пиво. И как я сразу не додумался, что дело в отсутствии магических зарядов...
MasterOfPuppets
Просьба помочь с Кавалерийским бонусом.
Во-первых, баг есть в самой SUB_L0075D7F5: разбег, заданный опытом (как через текстовик, так и ERM-ом), не работает. Вертишь курсором вокруг вражеского стека - изменение вычисляемого урона в логе отображается. Но урон наносится всегда обычный.
Во-вторых, введение дополнительных проверок, превращение их в case или просто изменение номера существа в проверках - как в ВОГ, так и в СОД - даёт точно такой же результат, что и вышесказанное.
Раз ВОГ всё равно не у дел, рассмотрим СОД. Кавалерийским бонусом там занимается этот участок:

443077 mov eax,[edi+34h]
44307A test eax,eax - проверка на Копейщика
44307C jz L004430A3
44307E cmp eax,00000001h - проверка на Алебардщика
443081 jz L004430A3
443083 fild dword ptr [ebp+08h]
443086 fstp qword ptr [ebp-1Ch]
443089 fild dword ptr [ebp+18h]
44308C fstp qword ptr [ebp-14h]
44308F fld qword ptr [ebp-1Ch]
443092 fmul qword ptr [ebp-14h]
443095 fmul qword ptr [L0063AC58]
44309B call SUB_L00617F94
4430A0 mov [ebp-10h],eax

Сама SUB_L00617F94:

617F94 push ebp
617F95 mov ebp,esp
617F97 add esp,FFFFFFF4h
617F9A fstcw word ptr [ebp-02h]
617F9E wait
617F9F mov ax,[ebp-02h]
617FA3 or ah,0Ch
617FA6 mov [ebp-04h],ax
617FAA fldcw word ptr [ebp-04h]
617FAD fistp qword ptr [ebp-0Ch]
617FB0 fldcw word ptr [ebp-02h]
617FB3 mov eax,[ebp-0Ch]
617FB6 mov edx,[ebp-08h]
617FB9 leave
617FBA retn

Прошу пояснить, каким образом этот код препятствует возможности дать разбег другому существу. Или, если дело не в нём - то в чём?
Etoprostoya
Опять проблемы с этим удалением постов. smile.gif
Дьяк
хм.... не знаю у меня кавалерийский бонус прекрасно работает

Добавлено ([mergetime]1272097845[/mergetime]):
0075D823 833D C0608402 2>CMP [DWORD 28460C0],27
0075D82A 75 0C JNZ SHORT Era_1_6.0075D838
0075D82C C705 20648402 0>MOV [DWORD 2846420],0B
0075D836 EB 28 JMP SHORT Era_1_6.0075D860
0075D838 833D C0608402 0>CMP [DWORD 28460C0],0B
0075D83F 75 0C JNZ SHORT Era_1_6.0075D84D
0075D841 C705 20648402 0>MOV [DWORD 2846420],0B
0075D84B EB 13 JMP SHORT Era_1_6.0075D860

проверка на монстра всего одна. поэтому менять нужно либо в инструкции 75D823 (как я поменял на нагу) либо 75D83F. А лучше вынести весь этот участок в отдельное место и написать нормальную таблицу.
MasterOfPuppets
me просто дурак - проверял на Архангеле, а на летунов разбег не действует. Видимо, их движение сродни телепорту и клетки просто не подсчитываются.
В общем, код я там уже свитчионизировал (0 - нет бонуса, 1 - есть):

Код
0075D823  60                          pushad
0075D824  A1C0608402                  mov    eax,[L028460C0]
0075D829  3DE7030000                  cmp    eax,000003E7h
0075D82E  771C                        ja  CASE_03400FE2_PROC0000
0075D830  33DB                        xor    ebx,ebx
0075D832  8A98FA0B4003                mov    bl,[eax+CASE_03400BFA]
0075D838  FF249DE20F4003              jmp    [CASE_PROCTABLE_03400FE2+ebx*4]
0075D83F                           CASE_03400FE2_PROC0001:
0075D83F  61                          popad
0075D840  C705206484020B000000        mov    dword ptr [L02846420],0000000Bh
0075D84A  EB14                        jmp    L0075D860
0075D84C                           CASE_03400FE2_PROC0000:
0075D84C  61                          popad



Тютелька-в-тютельку влез. smile.gif
MasterOfPuppets
О багах

Баг номер раз:

Cтрельба вплотную:

44267F 6889000000: push 00000089h - Лук Снайпера
442684 mov ecx,eax
442686 call SUB_L004D9460/SUB_L0076718F
44268B test al, al

При запуске игры вызываемая функция заменяется на вог-функцию (поэтому я привожу сразу два номера), из которой затем вызывается первоначальная функция, а далее - проверки, имеет ли стек бонус в качестве абилки опыта. Если да, в al заносится 1 (типа у героя есть Лук Снайпера).
Можно поставить туда проверки или прикрутить таблицу, тем самым сделав возможным дать существу перманентный, независимый от опыта бонус. Тип существа в стеке находится там в [esi+34h].
А сам баг заключается в том, что бродячий монстр вообще не может обладать этим бонусом. Ведь у него нет героя-хозяина, а, стало быть, и артефакта.
Проверьте, если хотите.


Баг номер два:

Кто-нибудь пробовал поставить существу Смертельный Удар со 100%-ым шансом? Он не работает.
Заинтересовавшись, я пришёл к выводу, что шанс рассчитывается и в ВОГ, и дальше, в оставшейся активной проверке СОД. В итоге, по сути, существу просто никак не поставить шанс Смертельного Удара выше 20% (ибо в СОД стоит 20).
Накодил что-то, исправляющее это недоразумение:

CODE

; НАЗВАНИЕ: DeathBlow
; ВЕРСИЯ: 1.0
; АВТОР: Master Of Puppets
; ОПИСАНИЕ: Превращение Смертельного Удара из проверки в таблицу для всех существ
; EXE: MOP

; встроить вог-функцию (только для наглядности)
;435A3 E8F7373200; CALL MOP.00766D9F
;435A8 90; NOP

; 2. Таблица, определяющая шанс срабатывания абилки:
301CE8 8B4834; MOV ECX,DWORD PTR DS:[EAX+34]
301CEB E96FE0C902; JMP MOP.03404D5F
301CF0 9090909090; NOP (5)

384D5F 33D2; XOR EDX,EDX
384D61 8A91804D4003; MOV DL,BYTE PTR DS:[ECX+3404D80]
384D67 8955FC; MOV DWORD PTR SS:[EBP-4],EDX
384D6A E9861F36FD; JMP MOP.00766CF5

; 3. Устранение бага некорректного расчёта шанса выпадения абилки в опыте существ:
; исправление СОД-проверки в соответствии с результатами ВОГ-вычислений:
436DE E98C16FC02; JMP MOP.03404D6F
436E3 90909090; NOP (4)

384D6F 3B0520028602; CMP EAX,DWORD PTR DS:[2860220] - сравнение выпавшего шанса с результатом процентовки, вычисленной в вог-функции
384D75 0F8F13EB03FD; JG MOP.0044388E
384D7B E967E903FD; JMP MOP.004436E7

; Таблица:
384DC3 14; 067 Рыцарь Смерти

В итоге всё вроде заработало правильно - и опыт, и таблицы. Но кому это тоже интересно - пробежитесь глазами. Может, я что-то напутал.
Etoprostoya
feanor, лучи, которые ты исследовал, исходят из какой-то определённой точки, привязанной к координатам экрана? дефа? Работает ли луч для двухгексовых или только одногексовых юнитов?
Собственно нужны и сами координаты начала луча.
feanor
Не успел посмотреть. Помню, что там стремная функция с десятком параметров, которая служит оберткой для другой функции.
pHOMM
Я всегда думал, что местоположение точек выстрела "снаряда" прописано в Cranim.txt в колонках
Upper-right Missile Offset , Right Missile Offset , Lower-right Missile Offset , наклон снаряда прописан далее в секциях Angles (я помню пытался сделать слоумоушн эффект, ошибочно полагая, что эти колонки влияют на скорость полёта снаряда, добился только стрел летаюших плашмя и задом наперёд), большинство остальных колонок отвечают за тайминги анимаций, что и использовано для ускорения анимации в ТЕ. (т.н. ТЕ-краним)
Shihad
Кстати, как ты сделал стрелы задом наперед? Если снаряд архимага полетит назад, от цели к стрелку, это отличная анимация для "забирания души/маны/жизненной силы"
pHOMM
Ай ай ай , видать схалтурил... задом наперед вроде не было... По идее надо подобрать углы для каждого выстрела, там идут стандартно у всех 90 72 45 27 0 -27 -45 -72 -90 , 90 вверх направлен, 0 ровно вправо, можно и подобрать подходящие... но это без графики не будет работать... в графике стреляемых патронов всё равно всего 9 кадров, игра стреляет готовыми кадрами а не поворачивает (((( а вот плашмя хорошо летают, а графику и подредактировать можно )

Кстати у архимага патрон - луч, а вот у мага, да, сгусток )) и уж конечно не снаряд летит назад, а просто графика снаряда берется другая, т.е повернутая
feanor
Код
CPU Disasm
Address   Hex dump          Command                                  Comments
0043F2A4  |.  6A 00         PUSH 0                                  ; /Arg17 = 0
0043F2A6  |.  C1FA 03       SAR EDX,3                               ; |
0043F2A9  |.  8BC2          MOV EAX,EDX                             ; |
0043F2AB  |.  6A 0A         PUSH 0A                                 ; |Arg16 = 0A
0043F2AD  |.  C1E8 1F       SHR EAX,1F                              ; |
0043F2B0  |.  6A 00         PUSH 0                                  ; |Arg15 = 0
0043F2B2  |.  6A 01         PUSH 1                                  ; |Arg14 = 1
0043F2B4  |.  8D5402 0F     LEA EDX,[EAX+EDX+0F]                    ; |
0043F2B8  |.  8B45 CC       MOV EAX,DWORD PTR SS:[LOCAL.13]         ; |
0043F2BB  |.  52            PUSH EDX                                ; |Arg13
0043F2BC  |.  8B55 D0       MOV EDX,DWORD PTR SS:[LOCAL.12]         ; |
0043F2BF  |.  6A 00         PUSH 0                                  ; |Arg12 = 0
0043F2C1  |.  6A 00         PUSH 0                                  ; |Arg11 = 0
0043F2C3  |.  51            PUSH ECX                                ; |Arg10
0043F2C4  |.  8B4D EC       MOV ECX,DWORD PTR SS:[LOCAL.5]          ; |
0043F2C7  |.  6A 04         PUSH 4                                  ; |Arg9 = 4
0043F2C9  |.  6A 05         PUSH 5                                  ; |Arg8 = 5
0043F2CB  |.  6A 00         PUSH 0                                  ; |Arg7 = 0
0043F2CD  |.  6A 00         PUSH 0                                  ; |Arg6 = 0
0043F2CF  |.  50            PUSH EAX                                ; |Arg5 => [LOCAL.13]
0043F2D0  |.  8B45 D4       MOV EAX,DWORD PTR SS:[LOCAL.11]         ; |
0043F2D3  |.  51            PUSH ECX                                ; |Arg4 => [LOCAL.5]
0043F2D4  |.  8B0D 20946900 MOV ECX,DWORD PTR DS:[699420]           ; |
0043F2DA  |.  52            PUSH EDX                                ; |Arg3 => [LOCAL.12]
0043F2DB  |.  50            PUSH EAX                                ; |Arg2 => [LOCAL.11]
0043F2DC  |.  6A 01         PUSH 1                                  ; |Arg1 = 1
0043F2DE  |.  E8 4D6C1600   CALL 005A5F30                           ; \Era_1_6.005A5F30


вот так выглядит милый кусок кода после определения цвета луча. 17 параметров.
Arg10 - цвет.
Arg2-5 - координаты начала и конца. Щас еще с цепнухой поэкспериментирую и скажу про Arg 13.

Офф::щас мне доверять не очень стоит. Я вместо координат начала и конца чуть не написал "координаты углов наклона"

Добавлено ([mergetime]1277122322[/mergetime]):
Аргументы восьмой и девятый - толщины по х и y.

Добавлено ([mergetime]1277122654[/mergetime]):
Аргументы 11 и 12 - изломанность / кривизна линии соответственно. Лучи не только лучи, но и молнии и даже фейрверки (:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.