Wake of Gods Forum | Форум Во Имя Богов
Исследование героев - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Русский Форум (/forumdisplay.php?fid=99)
+--- Forum: Моды для WoG (/forumdisplay.php?fid=104)
+--- Thread: Исследование героев (/showthread.php?tid=862)


Исследование героев - Дьякон - 27.10.2009 21:49

http://wog.nxt.ru/diakon/tutorial_1.html

Задаем вопросы.


RE: Исследование героев - Дьякон - 27.10.2009 22:24

инструмент к туториалу от Корвина ))
http://letitbit.net/download/0532.c028e3281ecbead9ab5c2ad32/Tutor.rar.html


RE: Исследование героев - SAG - 26.11.2009 13:52

очень полезно! ждем примеров динамического патчинга, желательно под Era. В примерах под Era кажется было что то похожее, однако, чем больше примеров тем понятнее!


RE: Исследование героев - NIKr0m@nceR - 12.12.2009 17:13

ссылка на летитбит не канает


RE: Исследование героев - Дьякон - 26.12.2009 16:39

По просьбе трудящихся, небольшой туториал по подгрузке длл в процесс:

http://wog.nxt.ru/diakon/patchexe.rar (размер 364 кб)

Патч в архиве только для ЕХЕ героев (жестко прошит адрес LoadLibrary в таблице импорта). Подправлю выложу, для любого ехе, если кому-то понадобится


RE: Исследование героев - MOP - 05.02.2010 15:34

(27.10.2009 22:24)Дьякон Wrote:  инструмент к туториалу от Корвина ))
http://letitbit.net/download/0532.c028e3281ecbead9ab5c2ad32/Tutor.rar.html
Ссылка сдохла.


RE: Исследование героев - Дьякон - 06.02.2010 00:43

Инструменты можно в инете свободно найти


RE: Исследование героев - MOP - 07.02.2010 10:07

Знаю. Просто интернетного времени у меня очень мало, чтобы быстро всё сразу найти.
Ладно, как-нибудь найду...


RE: Исследование героев - ZURG - 07.02.2010 10:55

Ida pro есть на torrents.ru. OllyDbg на cracklab.ru и wasm.ru


RE: Исследование героев - etoprostoya - 07.02.2010 10:58

Кстати, вот ИДА Про http://forum.df2.ru/index.php?showtopic=933&pid=376276&st=80&#entry376276


RE: Исследование героев - MOP - 07.02.2010 12:57

Спасибо за помощь! Sm
Только ИДА огромна... не ожидал. Траффик (тем более не мой) скачать пока не позволяет.


RE: Исследование героев - etoprostoya - 07.02.2010 13:14

В ИДА включена поддержка множества различных редких платформ, потому и огромна.


RE: Исследование героев - Дьякон - 07.02.2010 20:37

MOP для начала вполне хватит Оли. Там в принципе все что нужно. Иду конечно тоже не плохо иметь. Но думаю тебе и Оли хватит пока. Тем более если ты все через артмани находишь )))))


RE: Исследование героев - feanor - 08.02.2010 01:14

http://cbn.narod.ru/arm.html

Сильно обкорнанная ида допотопной версии Sm
wintel вроде не урезали, впрочем.


RE: Исследование героев - etoprostoya - 08.02.2010 01:17

(08.02.2010 01:14)feanor Wrote:  http://cbn.narod.ru/arm.html

Сильно обкорнанная ида допотопной версии Sm
wintel вроде не урезали, впрочем.

Там написано, что это для АРМ. Уверен что там х86 есть?


RE: Исследование героев - feanor - 08.02.2010 01:47

PE-шники открывает и дизасм вроде показывает. Хотя да, я её в основном для ARM юзал.


RE: Исследование героев - MOP - 11.02.2010 14:17

(07.02.2010 20:37)Дьякон Wrote:  Иду конечно тоже не плохо иметь. Но думаю тебе и Оли хватит пока.
Отвечая в столь же романтическом ключе: эту девушку я снял. Поизвращаемся, если она согласна. 148 Тем более, есть несколько вполне чётких целей...


RE: Исследование героев - SAG - 20.02.2010 23:48

создал dll позволяющую расширить список стартовых героев за счет добавления героев из кампаний. Пока добавляются Мюллих и Катерина и банятся Сильвия и Саня. Потом доделаю, чтобы список динамически расширялся.
Большое спасибо Сергею Роженко, ASM, Дьякон, Берсеркер за большую помощь в создании этой dll.
Скачать можно здесь: http://www.heroes-iii.com/files/sag_dll_v1.zip


RE: Исследование героев - Berserker - 21.02.2010 00:33

SAG, для паблика более интересен адрес массива с героями и принцип.


RE: Исследование героев - SAG - 23.02.2010 17:05

массив по адресу $699538)^+$4DF18
исходники (меняются Оррин Валеска) http://collabedit.com/display?id=15964


RE: Исследование героев - feanor - 23.02.2010 21:26

Благодарю!


RE: Исследование героев - GhostManSD - 01.09.2010 11:57

После того, как увидел то, что можно творить через !!UN:C, очень хочется научиться творить такое самому. В наличии имеются Ida Pro, MASM, Asm_Ed, CodeView, Hiew, OllyDbg, Peid, QuickUnpack. Есть, как видите, многое, но навыка - ноль. Подскажите, пожалуйста, полезную литературу по данному вопросу, поскольку здесь я - даже больший нуб, чем в ERM.
Через АртМани, а потом !!UN:C уже умею менять кое-какие тексты и данные (спасибо огромное MOP'у и gamecreator'у за ценные советы). Однако этого явно недостаточно. Хочется иметь куда большие возможности. В частности, интересует методика создания новых триггеров.


RE: Исследование героев - Sav - 01.09.2010 12:45

Quote:В частности, интересует методика создания новых
триггеров.
Мне тоже это очень хотелось бы знать. Там вроде надо что-то менять в коде, но как найти, где и понять на что?


RE: Исследование героев - GhostManSD - 01.09.2010 12:53

Насколько я понял из исходника dll для Эры, который мне предоставил MOP, отлавливается адрес и при обращении к этому адресу выполняются нужные действия.


RE: Исследование героев - Berserker - 01.09.2010 15:04

Так и есть. Достаточно выучить азы ассемблера. Руководства можно найти на wasm.ru, как и весь нужный интрументарий.
Суть создания "нового триггера" в Эре - это в нужном месте кода героев/вога:
  • Прописать прыжок на свою функцию
  • Сохранить контекст исполнения
  • Сохранить параметры нового события, чтобы их можно было достать через SN:X
  • Вызвать функцию вога: CallFunc с номером функции
  • Вызов приведёт к вызову функции ЕРМ и т.д.
  • Восстановить контекст исполнения (регистры, флаги, чаще всего только регистры через POPAD)
  • Выполнить код героев/вог, затёртый нашим перехватчиком
  • Совершить прыжок на продолжение кода



RE: Исследование героев - MOP - 01.09.2010 15:15

*Чувствует себя змеем-искусителем*

Вот длл с более подробным (откомментированным) исходником. Создаёт триггер на лечение Палаткой.
Константы взяты из исходников ЭРЫ, ибо так удобнее. Авторская процедура - HOOK_tent.
Как пользоваться триггером - написано здесь.


RE: Исследование героев - GhostManSD - 01.09.2010 15:38

Bers, огромное спасибо! А как это же через !!UN:C?


RE: Исследование героев - MOP - 01.09.2010 16:04

Научил плохому...
Через UN:C это фактически и не делается. Просто я для тех, у кого даже ЭРА не стоит, делаю новые события с помощью записи командой UN:C в неиспользуемые игрой участки памяти того же самого ассемблерного кода. Вот те два события (пост-HL и вход в экран города) я записал, кажется, в неиспользуемую после загрузки exe сод-таблицу Трансформатора Скелетов.
Ответ: учить асм, больше никак.


RE: Исследование героев - Berserker - 01.09.2010 16:38

MOP, спасибо за пример. Довольно чётко. Разве что "PTR DS:" лишние...


RE: Исследование героев - GhostManSD - 01.09.2010 17:06

Через dll даже лучше. Но здесь нужны доп. программы. Я пытался скомпилировать исходник MOP'а, заменив номера функций, но мои Турбо и Визуал Паскали выдали ошибку: ТП - что пропущен бегин, ВП -что нет файла win.vpi (ошибка 15). Может, надо через что-то еще? Хотя для файла с расширением pas что еще может быть...


RE: Исследование героев - Berserker - 01.09.2010 17:22

GhostManSD, Virtual Pascal из папки Эры запускал?
/попробуй команду Make вместо Compile.


RE: Исследование героев - MOP - 01.09.2010 18:20

(01.09.2010 16:38)Berserker Wrote:  MOP, спасибо за пример. Довольно чётко. Разве что "PTR DS:" лишние...
Учту. Я просто скопировал комментарий из исходника к бинарнику. Себе-то длл-ок пока не делаю - для этого мне нужна какая-то... глобальная задумка, что ли (как для тебя - ЭРА). А пока всё в exe...


RE: Исследование героев - Sav - 01.09.2010 18:29

(01.09.2010 15:04)Berserker Wrote:  Суть создания "нового триггера" в Эре - это в нужном месте кода героев/вога:
...

Как можно найти это нужное место?


RE: Исследование героев - MOP - 01.09.2010 18:29

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


RE: Исследование героев - Sav - 01.09.2010 18:38

MOP Wrote:... в туториале Дьякона
Это который должен быть по ссылке в первом посте темы? Ссылка не работает.


RE: Исследование героев - feanor - 01.09.2010 18:38

Не портите нервы связкой паскаля и асма, припудренной милыми досовскими средами.
Портите нервы связкой С и асма.
Quote:Как можно найти это нужное место?
Тут надо предметно смотреть - в каждом конкретном случае вопрос особый.
На палатку я бы выходил через давно записанный на бумажке адрес свитча на действия юнитов в бою. Этот свитч я нашел через функцию каста заклинаний. А её я нашел, кажется, через функцию проигрывания звука.


RE: Исследование героев - gamecreator - 01.09.2010 19:23

MOP, а если в том неиспользуемом участке патч какой-то записался? получится каша.


RE: Исследование героев - MOP - 01.09.2010 19:30

+ ещё одна причина делать это по-человечески, а не UN:C.
Но не буду же я объяснять простому человеку, как поставить ЭРУ или прилепить длл к экзешнику.


RE: Исследование героев - Berserker - 01.09.2010 19:30

Quote:Портите нервы связкой С и асма.
Ничем не лучше, если не считать, что из-за крайней низкоуровневости, что-то большое писать без ошибок нереально. По поводу среды - использую Delphi, но не его IDE, а notepad++. Писать можно в чём нравится и как нравится, а компилировать хоть через командную строку. И как сказал ZVS на ag.ru, это не досовское окно, а полноценное win-32 приложение.

Quote:брейкпойнт
Перевожу: точка останова.

Quote:свитча
Перевожу: разветвление/переключатель (серия подряд идущих если..то).


RE: Исследование героев - feanor - 01.09.2010 19:58

Quote:Перевожу: точка останова.
Кстати, о бряках.
В той же оле есть три вида бряков: Int3, Memory и Hardware.

Первый ставится на код и срабатывает, что характерно, при проходе про коду.
Второй ставится на память и срабатывает при чтении\записи в память.
Третий может ставиться и на код, и на память, но имеет ряд ограничений - типа, только четыре бряка такого типа, брячится только до четырех байт (и то, зависит от фактического адреса).

Дык вот..для бряков на код лучше использовать первые.
А вот для бряков на память - третьи, несмотря на все их ограничения.


RE: Исследование героев - Berserker - 01.09.2010 20:11

Аппаратные точки останова обрабатывает процессор (регистры Dr0-Dr3). А Olly реализует это дело через VirtualProtect с нулевыми правами на всю страницу памяти и перехват-обработку исключений. Если доступ к странице нужен редко, то в принципе, терпимо, если постоянно, то тормоза будут существенные.


RE: Исследование героев - GhostManSD - 01.09.2010 20:27

О Боже... Х_Х


RE: Исследование героев - feanor - 01.09.2010 20:32

Quote:если постоянно, то тормоза будут существенные.
если обращения чаще, чем примерно раз в секунду - герои нафиг повисают. Приходится ставить-снимать паузу.
Так что, скажем, изменялку параметров героя с меморибряками выявить удастся только при достаточном терпении.
Quote:О Боже... Х_Х
ась? Все оказалось несколько сложнее, чем представлялось?)
Дык на самом деле все сложнее, чем на самом деле.


RE: Исследование героев - Berserker - 01.09.2010 21:22

Quote:О Боже... Х_Х
Я бы начал с обычного: wasm.ru Введение в крекинг с нуля. Хотя может МОР что посоветует, он вроде как обходился без азов программирования.


RE: Исследование героев - Berserker - 01.09.2010 21:45

Quote:или чистотой языка
В отличие от жаргона корректный литературный перевод уже несёт 90% смысла даже для человека непосвящённого. В СССР было понятие АВОСТ - аварийного останова. Это самый нормальный перевод для halt, например. Тоже самое и с breakpoint. Это и есть точка останова программы. И человек сразу вникает в суть дела. А жаргон используют все, но не везде же и среди тех, кто понимает.

feanor, по твоему уже удалённому посту. 6[a] в си тоже массив, как и 256[a]{b} и т.д. Но это не полноценный массив с двумя/более измерениями, а просто синтаксический сахар для вычисления адреса (собственно, нельзя создать тип-многомерный массив, массив можно использовать как переменную или одномерный и никакого контроля над границами тоже нет). Касаемо передачи параметра для изменения, это был не юмор. Введённая в Алголе60 конструкция VAR означает, что внутри функции работа с переменной/массивом/структурой вполне прозрачна, но реально компилятор имеет дело со ссылкой. Тем не менее проверка типов остаётся жёсткой. В СИ нет возможности передать аргумент для изменения иначе как использованием низкоуровневого средства ссылки. Именно поэтому, несмотря на тотальную популярность СИ-семейства, я бы не советовал людям формировать своё мировоззрение в сфере программирования, начиная с языка, чей основой является близость к ассемблеру и минимальная типизация. И тем более, если нужно что-то реализовать, а навыков нет. И конечно же, не посоветовал начинать с монстров класса СИ++, Ада, на прочтение одной лишь спецификации по которым уйдёт пол жизни, а остальная половина на знакомство с особенностями компиляторов.

P.S В посте была ошибка. Передача аргумента в качестве изменяемой переменной, а не по значению.


RE: Исследование героев - MOP - 01.09.2010 21:57

(01.09.2010 21:22)Berserker Wrote:  Хотя может МОР что посоветует, он вроде как обходился без азов программирования.
Ну... что я делал без азов программирования? Баловался с Артмани и только. Правда, мне удалось увеличить кол-во монстров и артефактов, но ведь это и не требовало знаний асма. Просто перенаправление указателей, перенесение таблиц и увеличение максимального кол-ва по некоторым адресам. Что к чему лежит и что представляют собой циферки в окошке АртМани - оставалось тёмным лесом.
А первое, что я сделал в Olly - отключил Маскировку и передал контроль её колдовства ERM-функции. Просто подсмотрел, как такое проделал Феанор с книжкой колдовства Сказочного Дракона. На тот момент единственной мне понятной командой асма была jmp.


RE: Исследование героев - gamecreator - 01.09.2010 22:00

(01.09.2010 21:45)Berserker Wrote:  на прочтение одной лишь спецификации по которым уйдёт пол жизни
а можно мне эту спецификацию? хоть раз в жизни почитаю.


RE: Исследование героев - Berserker - 01.09.2010 22:06

Страуструп "Язык программирования C++"
Стандарты СИ 89, 99



RE: Исследование героев - GhostManSD - 01.09.2010 22:13

(01.09.2010 21:22)Berserker Wrote:  
Quote:О Боже... Х_Х
Я бы начал с обычного: wasm.ru Введение в крекинг с нуля. Хотя может МОР что посоветует, он вроде как обходился без азов программирования.

Bers, самое интересное, что я с этого и начал. Ab Нравится, хорошее руководство, и впрямь для чайников. А то с Калашниковым как-то не пошло...


RE: Исследование героев - Berserker - 01.09.2010 22:18

Я в своё время Калашникова прочитал, только тольку-то? ДОС уже мёртв, как и 16-битный режим. Фактически, под винду совсем другой ассемблер. Ещё можно глянуть туториалы Изелона. Там, правда, основной упор на WinApi, это чуть позже.


RE: Исследование героев - MOP - 01.09.2010 22:27

У меня тоже Калашников есть. Sm Тоже читал... засыпая над одной и той же главой. То есть, обучение получилось чисто практическое - OllyDbg + справка по командам ассемблера.


RE: Исследование героев - feanor - 01.09.2010 22:37

Собственно, для реверсинженеринга нужен именно язык с близостью к ассемблеру и минимальной типизацией. Паскалевские указатели наводят на меня тоску, необходимость явного приведения типов чуть ли не при перегоне из символа в число - напрягает.
___________________
Я реверсинженерингом Героев занялся после успешной сдачи экзамена по АЭВМ (ну то бишь по основам ассемблера).
До этого правда был небольшой опыт ковыряния дампов мобильников
(брр..отсутствие толковых отладчиков, любая ошибка в коде роняет все к чертям собачьим, никакая плавающая арифметика - короче, адЪ кромешный)
, но ARM таки несколько отличается от x86 96


RE: Исследование героев - gamecreator - 01.09.2010 22:43

(01.09.2010 22:06)Berserker Wrote:  Страуструп "Язык программирования C++"
Стандарты СИ 89, 99
и что там такого страшного?



RE: Исследование героев - Berserker - 01.09.2010 22:51

Quote:Собственно, для реверсинженеринга нужен

   Для обратного инжиниринга нужен отладчкик и/или дизассемблер. А вот писать плагины и серьёзные вещи нужно как раз-таки на безопасных языках. Ассемблер в паскале толковый, приведение типов нужно редко (и уж точно не для перевода символ-код для которых везде есть функции ord/chr), а когда нужно - делается осознанно и остаётся при этом низкоуровневым. Символ ^ - дело привычки. Выглядит не элегантно, но не так ужасно, как, простите, уродливая перегрузка математического оператора "*" или СИ++ вариант перегрузки СИ++ операции И "&". Впрочем, ко всему привыкаешь, я синтаксиса специально не касался.
   Тот, кто пишет часто на динамических языках, понимает, насколько сильно важна строгая типизация для создания хоть сколько-нибудь надёжных систем. Мой опыт программирования на PHP и JavaScript твердит, что даже эмуляция типизации позволяет словить орду ошибок ещё на ранних стадиях выполнения. Иначе мы имеем дело с уже известным законом, что написание кода отнимает 10% времени, отладка 90% + никакой гарантии, что код корректен или в будущем не обвалится.
   В общем всё это субъективный опыт, так что лучше вернёмся к предмету темы.
Добавлено:
Quote:и что там такого страшного?
Ничего, кроме over 1100 страниц текста + бесконечного упоминания, что реализация той или иной фичи зависит от компилятора.



RE: Исследование героев - GhostManSD - 01.09.2010 22:54

Как-то содержание темы немного стало выходить за пределы "Героев". Ab


RE: Исследование героев - GhostManSD - 02.09.2010 01:19

Пфф, прочитал и почти полностью осилил первые 4 статьи из "Введения в крэкинг с нуля". На сегодня хорош, а завтра повторим.



RE: Исследование героев - GhostManSD - 02.09.2010 11:44

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

0x4DAF06 - после повышения уровня любого героя


RE: Исследование героев - feanor - 02.09.2010 12:30

http://forum.df2.ru/index.php?showtopic=6803


RE: Исследование героев - GhostManSD - 04.09.2010 10:53

Камрады, пожалуйста, подскажите, какой адресок отвечает за активацию/деактивацию кнопки "Журнал" на карте приключений. Или, что тоже неплохо, подскажите способ поиска этого адреса. Искать пробовал так: ставил герою 999 копейщиков, ставил штук 20 стражей прохода с требованием принести 1 копейщика и, подходя к очередному стражу, отдавал или не отдавал копейщика. В артмани искал неизвестное значение, и, в зависимости от отдачи или невыдачи копейщика и изменения кнопки "Журнал" (всегда старался, чтобы в журнале было максимум одно задание), нажимал "Отсеять -> значение изменилось/не изменилось". Не нашел. Впрочем, тут и способ дурной.


RE: Исследование героев - MOP - 04.09.2010 10:59

Простейший способ - сменить id кнопки на какой-нибудь незаюзанный:
!#UN:C4200424/1/50 C4210610/1/50;
!?GM;
!!UN:C4200424/1/50 C4210610/1/50;
Кнопка теперь будет иметь CM:I = 50, станет нажимаемой всегда, но утратит свою функцию и подсказки по ПКМ и наведении мыши. Но это, думаю, то, что тебе и надо.


RE: Исследование героев - GhostManSD - 04.09.2010 11:05

MOP, подскажи, пожалуйста, как ты узнал, что для этого нужен адрес 4200424(dec).


RE: Исследование героев - MOP - 04.09.2010 11:08

Попросту вбил "iam004" (деф кнопки) в поиск по дизассемблеру. Сразу пришёл к указателю. А параметры отрисовки элементов диалогов мне как бы уже знакомы - следующим параметром за дефом в функцию идёт id.

Дополнил код выше. Второй адрес - для раскраски кнопки в цвета игрока. Его я не находил - мне Бараторч подсказал.


RE: Исследование героев - GhostManSD - 04.09.2010 13:26

А если изменить указатель, изменится и деф?


RE: Исследование героев - MOP - 04.09.2010 13:27

Аха. Так, например, в TPM сделали (major, наверное).


RE: Исследование героев - GhostManSD - 04.09.2010 18:57

MOP, спасибо огромное!


RE: Исследование героев - GhostManSD - 04.09.2010 20:24

А можно вопрос от нуба? Где в OllyDbg вбивать "iam004" для поиска?


RE: Исследование героев - Berserker - 04.09.2010 20:41

Search - references to text strings - ctrl + L


RE: Исследование героев - gamecreator - 04.09.2010 22:37

в районе 0х01481680 в памяти начинается массив героев (это так, к слову).


RE: Исследование героев - feanor - 04.09.2010 23:53

Quote:в памяти начинается массив героев
Динамические адреса давать таки не гуд.
К тому же адрес этого массива структур уже известен:
[699538h] + 21620h+492h*hero_num


RE: Исследование героев - gamecreator - 05.09.2010 01:30

он статический. по крайней мере, на хл.


RE: Исследование героев - Berserker - 05.09.2010 02:32

gamecreator, он динамический по определению. У тебя неверное представление об организации памяти и структур.


RE: Исследование героев - gamecreator - 05.09.2010 10:42

нет у меня никакого представления.


RE: Исследование героев - GhostManSD - 05.09.2010 23:17

Как инвертировать число -1 в десятичной и получить обратное ему?


RE: Исследование героев - Sav - 05.09.2010 23:27

Инвентировать - в смысле заменить биты на противоположные? 0 будет, вроде.


RE: Исследование героев - GhostManSD - 05.09.2010 23:50

Берс, можешь объяснить суть триггеров входа в окно героя и выхода из оного?
Интересует второй из них. Можешь объяснить, что происходит в строках
Quote:PUSH General.C_ERA_EVENT_HEROSCREEN_EXIT
CALL General.GenerateCustomErmEvent
?
Добавлено:
И как выглядел бы код без обращения к General?
Добавлено:
Поясняю: нужно сделать подобное с



RE: Исследование героев - Berserker - 05.09.2010 23:54

Quote:Берс, можешь объяснить суть триггеров входа в окно героя и выхода из оного?
Тебя интересует, как это юзать в Эре или почему именно так реализовано?


RE: Исследование героев - GhostManSD - 05.09.2010 23:55

Ну, меня интересует, можно ли таким же образом состряпать функцию для кода из второго спойлера. Ab
Добавлено:
Для функции 90002.


RE: Исследование героев - Berserker - 06.09.2010 00:52

C_FUNC_ZVS_CALLFU = $74CE30; // void FUCall(int n)
Я использовал константу для адреса функции обработки события вызова ЕРМ-функции. А феанор тебе просто дал числовое значение адреса, что одно и то же.

У тебя следующие ошибки:
1) Имена экспортируемых в кавычках должны быть.
2) Функции не нужно вызывать, просто пиши ЕРМ обработчики !?FU90001; ...
3) Секция exports должна быть одна и находиться до BEGIN Hook... END.
4) В секции записи друг от друга отделяются ",", а лишь в конце ";"

Code:
EXPORTS
    HOOK_Trigger_TownEnter NAME 'Trigger_TownEnter',
    HOOK_PostTrigger_HeroLevel NAME 'PostTrigger_HeroLevel',
    HOOK_Trigger_RecruitingTroops NAME 'Trigger_RecruitingTroops';



RE: Исследование героев - GhostManSD - 06.09.2010 02:11

Bers, спасибо огромное! Всё работает!


RE: Исследование героев - GhostManSD - 06.09.2010 02:51

Подскажите, пожалуйста, вот какую штуку. Есть желание сделать триггер при найме существ. Нашел деф кнопки "нанять максимум существ", ввел в поиск по ссылкам, попал в ту часть кода, где эта кнопка создается и помещается. Теперь - главное: как выйти от момента создания кнопки в диалоговом окне к тому самому моменту, когда происходит первый запрос на создание диалогового окна?
Иными словами - как выйти на тот адрес, на который и нужно ставить ловушку?
Добавлено:
Кстати, значение адреса 0x74CE30 дал мне не feanor, а MOP, за что ему тысячу раз спасибо!


RE: Исследование героев - Berserker - 06.09.2010 11:29

Там где создаётся, открой стёк вызовов. Либо в этой же функции, либо в одной из родительских генерируется действие.


RE: Исследование героев - GhostManSD - 06.09.2010 11:44

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

Вот есть, например, окошко найма существ. Нужно найти три адреса: один - если игрок нажал кнопку покупки и успешно купил существ, другой - если игрок нажал кнопку покупки, а купить не смог (а-ля не хватает провизии), третий - если игрок нажал кнопку отмены. Порядок действий таков (например, хотя можно наверняка и иначе):
1. Найти в ссылках деф кнопки "нанять всех".
2. Открыть стек вызовов.
3. Поставить точку останова на все вызовы и по одному отсеивать их, снимая эти точки останова, пока не найду нужные.

Я правильно понял?


RE: Исследование героев - Berserker - 06.09.2010 14:59

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


RE: Исследование героев - GhostManSD - 06.09.2010 15:15

А события открытия/закрытия искать в Олли в стеке вызовов? Ставя точки останова на каждом из этих адресов?
Добавлено:
И что имеется в виду под пост-триггером? !$FU%номер функции для открытия окна диалога%?


RE: Исследование героев - Berserker - 06.09.2010 15:18

GhostManSD, не могу помочь, не так много времени. Читай литературу, разбирайся сам по-тихоньку, всё ведь не всегда однозначно, чтобы 100%-ый рецепт выписать. Научившись трассировать программы по шагам, смотреть дамп и состояние переменных, легко сможешь определять то, что тебе нужно. А иначе вопросы будут постоянно.


RE: Исследование героев - feanor - 06.09.2010 18:22

Quote:третий - если игрок нажал кнопку отмены.
ищешь обработчик нажатий кнопок в диалоге. В конкретно данном случае искать легко - через бряк на 4F6C00 (показ сообщения). Кнопка с номером 30721 (дес.) - кнопка закрытия диалога.


RE: Исследование героев - GhostManSD - 06.09.2010 19:39

Номер получен путем опытов или интуитивно (кнопка ОК в CM:I - 30720)?


RE: Исследование героев - GhostManSD - 07.09.2010 03:10

Правильно ли я понял по поводу дефа той или иной кнопки, что данные располагаются в общем и целом примерно так (жирным выделена строка, к которой прихожу по поиску дефа):
Не мог бы кто-нибудь объяснить суть команд, стыдливо прикрытых знаками "???"? Я пробовал поиграться со значением, но вроде ничего не изменилось.
Осталось теперь понять, как от всего этого великолепия выйти к моменту создания самого диалога.


RE: Исследование героев - gamecreator - 07.09.2010 09:26

(07.09.2010 03:10)GhostManSD Wrote:  Не мог бы кто-нибудь объяснить суть команд, стыдливо прикрытых знаками "???"?
там может быть адрес обработчика нажатия (4 байта)


RE: Исследование героев - GhostManSD - 07.09.2010 10:49

Там вроде какие-то маленькие значения в духе 20, 40, 1, 2, etc. Некоторые интересные для меня адреса я нашел в call functions, ставя по очереди на них бряки:
1. Нажатие в окне найма "нанять" или "отмена". Действует почему-то лишь на экране города, в жилище действует лишь "отмена". Не там ищу?
2. Нажатие при заходе в жилище кнопки "ОК" при вопросе "хотите ли вы нанять...?".
3. Адрес перед высвечиванием диалога.

Нужен хук именно на кнопку "нанять".


RE: Исследование героев - GhostManSD - 07.09.2010 10:56

Причем хук на ее нажатие именно в окне жилища. В замке все равно все в гарнизон нанимается. А герою все равно уже туда не попасть. Ab


RE: Исследование героев - feanor - 07.09.2010 21:57

Quote:???
???
положение x -- вероятно, в пикселях
положение y -- вероятно, в пикселях
3 и 4 параметры - ширина и высота нажимаемой области.


RE: Исследование героев - GhostManSD - 07.09.2010 22:55

feanor, спасибо!


RE: Исследование героев - baratorch - 08.09.2010 01:36

Я обычно делаю так:
1. по названию дефа нахожу функцию создающую диалог с этой кнопкой.
2. запоминаю ID кнопки, он PUSHится прямо рядом с PUSHом имени дефа.
3. Ищу функцию обработки сообщений этого диалогового окна, ставя бряк на известную мне функцию, которая точно вызывается и з этого обработчика (например функция показа сообщения)
4. в функции обработки сообщений окна нахожу место где идет проверка на равенство ID нажатой кнопки тому который запомнил и вуаля.

Но не представляю сколько времени потребуется чтобы все это осуществить только с помощью Олли.
HexRays в ИДЕ - это моё всё.


RE: Исследование героев - gamecreator - 08.09.2010 01:57

(08.09.2010 01:36)baratorch Wrote:  Но не представляю сколько времени потребуется чтобы все это осуществить только с помощью Олли.
дилетантам типа меня или GhostManSD - около 15 минут.
Добавлено:
это, конечно, если использовать артмани для поиска текста


RE: Исследование героев - GhostManSD - 08.09.2010 02:29




RE: Исследование героев - Sav - 08.09.2010 17:21

GhostManSD Wrote:Вот ищу я славный момент, когда же у нас
запускается окошко найма существ во внешнем жилище.
Иду этим путем. И что же? Результат для точек останова
сразу на три или четыре адреса - один: при первом же
запросе к окошку срабатывает точка останова. И бес его
знает, какой из адресов мне нужен.
Если тебе надо сделать что-то, не связанное непосредственно с диалогом, наверное, подойдёт любой.
Только лучше проверять на нескольких разных жилищах.


RE: Исследование героев - GhostManSD - 08.09.2010 19:33

Вопрос адресован в первую очередь baratorch. По поводу отлова адреса, где нажимается кнопка. Взять то же окошко найма, например. Ищем деф кнопки покупки. Нашли. Переходим на адрес (например, по адресу AAAAAA). Чуть ниже (по адресу AAAAAB) - то, что я называю BID (button id). BID=7802. Снова иду на строчку дефа, нажимаю стек вызова. Появляется окошко с вызовами, под каждым из вызовов идут строки в духе "[адрес]argument1=x", "[адрес]argument2=y", etc. Вместо x и y написаны адреса. Я так понимаю, мне нужно найти случай, где "argument#=[адрес, где расположен BID]", и поставить на него ловушку. Я верно понял твой способ? Поскольку нигде нет данных типа "если x=7802, прыгнем-ка мы туда...".


RE: Исследование героев - gamecreator - 08.09.2010 19:51

ну как же... сразу после того, как функция, которой передается ид кнопки, отработает, идет проверка возвращаемых значений что-нибудь типа cmp eax,1E7Ah


RE: Исследование героев - GhostManSD - 08.09.2010 20:07

Вот я именно это и имел в виду. Значит, угадал: сравнивается не BID, а его адрес. Спасибо.


RE: Исследование героев - gamecreator - 08.09.2010 22:19

какой еще адрес? сравнивается код кнопки!


RE: Исследование героев - GhostManSD - 08.09.2010 22:48

То есть для кнопки с кодом ID=7802 должно быть cmp eax, 7802?


RE: Исследование героев - GhostManSD - 08.09.2010 23:44

Подскажите, пожалуйста, за что отвечает этот адрес: 0x42437D.
Более подробная информация - здесь.


RE: Исследование героев - gamecreator - 08.09.2010 23:46

(08.09.2010 22:48)GhostManSD Wrote:  То есть для кнопки с кодом ID=7802 должно быть cmp eax, 7802?
я так и написал. но в олли ты увидишь только шестнадцатеричные значения, поэтому для тебя я перевел 7802: будет 1E7A. а буква h в конце значит что число записано в шестнадцатеричной системе исчисления.


RE: Исследование героев - GhostManSD - 08.09.2010 23:51

Quote:для тебя я перевел 7802: будет 1E7A
Лол, мы просто друг друга не поняли. Ab Я и написал в hex, так, как отображается в окне Olly.



RE: Исследование героев - gamecreator - 08.09.2010 23:55

а, так надо ж было или 7802h написать, или 0x7802



RE: Исследование героев - GhostManSD - 09.09.2010 00:56

Каков аналог NOP для команды UN:C?


RE: Исследование героев - Berserker - 09.09.2010 00:59

Опкод нопа - 90h = 144


RE: Исследование героев - baratorch - 09.09.2010 03:12

(08.09.2010 22:48)GhostManSD Wrote:  То есть для кнопки с кодом ID=7802 должно быть cmp eax, 7802?
в большинстве случаев проверяемые ID элементов окна в функции-обработчике находятся внутри switch-ей, поэтому ситуация cmp <ID>, 0x7777 встречается редко.


RE: Исследование героев - gamecreator - 09.09.2010 09:39

так свич - это и есть последовательность сравнений и прыжки на соотв. позиции.


RE: Исследование героев - GhostManSD - 09.09.2010 10:14

Bers, спасибо! Т.е. если я хочу забить адрес NOP-ами, то я должен ввести !!UN:C[адрес] / [размер адреса] / 144;? А где размер адреса смотреть? Артмани подойдет?


RE: Исследование героев - Berserker - 09.09.2010 14:55

nop - однобайтовая команда, а смотреть в оле, там слева от команд пишутся байты опкодов: e7 12345678 - 5 байт, 5 nop-ов нужно по одному.


RE: Исследование героев - feanor - 09.09.2010 19:57

Quote:так свич - это и есть последовательность сравнений и прыжки на соотв. позиции.
не всегда. Скажем, для свитчей на свойства существ используются две таблицы - таблица существ и таблица адресов обработчиков того или иного свитча. А итоговый код выглядит так:
Code:
CPU Disasm
Address   Hex dump          Command                                  Comments
00440906  |.  83C0 C1       ADD EAX,-3F                             ; Switch (cases 3F..87, 6 exits)
00440909  |.  83F8 86       CMP EAX,-7A
0044090C  |.  0F87 99090000 JA 004412AB
00440912  |.  33C9          XOR ECX,ECX
00440914  |.  8A88 4C7A7900 MOV CL,BYTE PTR DS:[EAX+797A4C]
0044091A  |.  FF248D C01244 JMP DWORD PTR DS:[ECX*4+4412C0]
3F - номер первого существа (артефакта, заклинания) в таблице соответствий.
797A4C - адрес таблицы соответствий (хранит номера ветвей-кейсов)
4412C0 - адрес таблицы обработчиков (хранит адреса ветвей-кейсов)


RE: Исследование героев - gamecreator - 09.09.2010 20:33

хм, интересно


RE: Исследование героев - etoprostoya - 09.09.2010 21:01

Таблица NOP'ов с разным числом байт. (Макрос для MS VC)



RE: Исследование героев - gamecreator - 09.09.2010 23:24

db size dup(90h)


RE: Исследование героев - etoprostoya - 09.09.2010 23:41

(09.09.2010 23:24)gamecreator Wrote:  db size dup(90h)
Так не интересно. Ab Хотя, конечно, читается лучше.


RE: Исследование героев - gamecreator - 10.09.2010 01:10

зато сразу видно где забитые байты


RE: Исследование героев - GhostManSD - 10.09.2010 03:12

Подскажите, пожалуйста, как найти адрес стандартного триггера WoG. Например, !?HE.

Кажись, вник. В комментариях - ошибки на неправильный синтаксис. Будем копать оттуда.


RE: Исследование героев - GhostManSD - 10.09.2010 04:09

Нашел место, где сравниваются данные из EBP и номер героя (ввел специально неправильную команду !?HE-1). Вопрос: что теперь делать, чтобы присвоить -1 значение типа "если x=-1, то выполнять для каждого значения от 0 до 156"? Куды иттить, то бишь, где этот гребаный x искать?


RE: Исследование героев - feanor - 10.09.2010 10:47

Quote:+) Добавлено новое событие 77010: Any Hero Interruction (аналог !?HE для всех героев). Параметры события: Герой-Инициатор, Герой-Цель.
Событие, как и оригинальное !?HL, возникает дважды: до и после взаимодействия.
Пример:
!?FU77010;
!!SN:X?y1/?y2;
!!IF:M^Initiator: %Y1, Target: %Y2^;
Не то?


RE: Исследование героев - GhostManSD - 10.09.2010 13:39

Гм, откуда это? Из Era.chm? Мне сейчас интересна не сама функция, а принцип поиска нужных значений для самой функции и ее создание. Пытаюсь учиться.


RE: Исследование героев - Berserker - 10.09.2010 15:28

Из хэлпа по изменениям в Эре 1.8. А так верно идёшь, находишь триггер !?HE ZVS, там он генерит событие в зависимости от нового героя. Ищешь, в каких регистрах герой-источник, герой-приёмник и пишешь свою реализацию. Код из Эры:

Code:
PROCEDURE Hook_HeroesMeet_Call; ASSEMBLER; {$FRAME-}
ASM
    // Если триггер - !?OB, то возвращаемся
    CMP DWORD [EBP+$1C], 34
    JNE @@Exit
    // Получаем номер героя-инициатора
    MOV EAX, [$69CCFC]
    MOV EAX, [EAX+4]
    MOV DWORD [General.EventParams], EAX
    // Получаем номер цели
    LEA ECX, [ECX-30100]
    MOV DWORD [General.EventParams+4], ECX
    // Генерируем ЕРМ-событие
    PUSHAD
    PUSH General.C_ERA_EVENT_HEROMEET
    CALL General.GenerateCustomErmEvent
    POPAD
    // Возвращаем управление ZVS
    @@Exit:
    PUSH $74D760
    PUSH $74C816
END; // .procedure Hook_HeroesMeet_Call

// Патчим вызов триггера !?HE
General.HookCode(POINTER($74D75B), @Hook_HeroesMeet_Call, General.C_HOOKTYPE_JUMP, 5);



RE: Исследование героев - GhostManSD - 10.09.2010 19:20

Bers, я сейчас писал, что я нашел место, где сравнивается номер героя с 0 и со 155. Но это для того, чтобы игра знала, выдавать или не выдавать сообщение об ошибке в духе "баран, героя номер -1 в природе не существует!!111". А мне теперь нужно от этого перейти непосредственно к триггеру !?HE... Вот это-то и представляет сложность: я не знаю соли.


RE: Исследование героев - Sav - 10.09.2010 20:47

Что-то я не понял, как вообще написать dll для создания триггера?

В смысле что надо сделать, чтобы она работала, и по известному мне адресу выполнялся написанный мной код?


RE: Исследование героев - GhostManSD - 10.09.2010 20:48

См. исходник MoP'a. Мне вот куда интереснее, как найти адрес для хука.



RE: Исследование героев - Sav - 10.09.2010 20:52

GhostManSD Wrote:См. исходник MoPa.
Там есть какие-то непонятные мне константы.
А когда я попробовал просто заменить адрес и код на свой, это работать отказалось.


RE: Исследование героев - GhostManSD - 10.09.2010 21:02

Так адрес не любой нужен, а тот, что нарыт в ассемблере.


RE: Исследование героев - Sav - 10.09.2010 21:03

Так я и нарыл.


RE: Исследование героев - GhostManSD - 10.09.2010 21:06

Посмотри ещё исходники Эры.


RE: Исследование героев - Sav - 10.09.2010 22:44

Всё, получилось.


RE: Исследование героев - GhostManSD - 11.09.2010 00:12

Так, ошибку при чтении игрой команды "!?HE-1;" затёр. Если кому нужно, вот исходник. Код, на самом-то деле, ничтожен, но приятно, что хоть это сумел...
Подскажите, пожалуйста, как всё-таки искать оригинальный триггер !?HE. Часа четыре пытался что-нибудь сообразить, но никак.


RE: Исследование героев - Berserker - 11.09.2010 00:37

GhostManSD, такие вещи проще и универсальнее через бинарные патчи делать. Например, нужно занопить 5 байт: адрес 9090909090.


RE: Исследование героев - GhostManSD - 11.09.2010 00:52

Berserker, спасибо! Осталось теперь узнать, как это делать...
Добавлено:
А с поиском триггера никто не подскажет?


RE: Исследование героев - Berserker - 11.09.2010 01:14

Quote:Осталось теперь узнать, как это делать...
Создаёшь txt файл, в котором пишешь: адрес байты в хекс-формате. Далее BinGen.exe file.txt => file.bin. Бинарный файл просто кидаешь в папку EraPlugins.


RE: Исследование героев - GhostManSD - 12.09.2010 20:56

Долго думал, куда кинуть. Сперва хотел в тему по ERM, но, думаю, лучше сюда.
Функция для изменения типа и количества существ в армии героя. Зачем это нужно? Ну, например, это позволяет без ритуальных плясок устанавливать отрицательное количество существ.

Code:
; Функция для изменения существ в армии героя
; x1 - номер героя
; x2 - номер слота
; x3 - тип существ
; x4 - кол-во существ

!?FU80001;
!!VRy1:S1170 *x1; Указать номер героя
!!VRy2:S4 *x2; Указать номер слота
!!VRy3:S71112441 +y1 +y2; Вычислить адрес типа существ
!!VRy4:S71112469 +y1 +y2; Вычислить адрес количества существ
!!UN:Cy3/4/x3; Установить новый тип
!!UN:Cy4/4/x4; Установить новое кол-во
Исходные адреса в hex:
[[43D16F9]+492*x1+4*x2] - тип существ
[[43D1715]+492*x1+4*x2] - количество существ


RE: Исследование героев - GhostManSD - 12.09.2010 22:35

Обновил функцию. Теперь в x3 устанавливается тип существ, в x4 - количество.


RE: Исследование героев - feanor - 13.09.2010 20:43

Quote:43D16F9
адрес динамический. У меня, к примеру, там FFFFFFFF.
Расово кошерный православного вида указатель на структуру героя:
[699538]+21620+492*<hero>


RE: Исследование героев - Sav - 13.09.2010 21:00

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


RE: Исследование героев - GhostManSD - 13.09.2010 21:00

feanor, а теперь, пожалуйста, расшифруй. Ab Это такой же указатель, как те, в которых меняется текст?
Ну, например, раньше я в артмани искал, например, текст "Лорд", менял значения для всех по возрастанию, смотрел нужный адрес и искал по нему указатель. Находил нужный и уже адрес самого указателя использовал в функциях.


RE: Исследование героев - baratorch - 14.09.2010 15:57

Статическая память - это секция данных в экзешнике. Эта память выделяется сразу при запуске экзешника. Для самого экзешника адрес этой памяти (и следовательно всех данных в этой памяти) всегда один и тот же (от запуска к запуску и во время выполнения ехе) и всегда существует (пока экзешник работает).
(Например массивы свойств существ, видео, координат строений в городе хранятся в статической памяти, так как длина этих массивов и размер их элементов (да и содержание тоже кстати) не меняется в процессе выполнения программы.

Динамическая память выделяется/освобождается под те или иные нужды в процессе выполнения екзе в зависимости от тех или иных событий. То есть адрес такой памяти (выделенной под какие-то определенные данные) может менятся не только от запуска к запуску, но и от выделения к выделению в процессе выполнения программы.(Например для списков запущенных диалоговых окон и списков элементов этих диалоговых окон память выделяется динамически, так как длина этих списков и размер элементов этих списков меняется в процессе выполнения программы)
Поэтому запоминать такой адрес не имеет смысла, так как при следующем запуске или даже например при старте другого сценария по этому адресу могут находится совершенно другие данные или вообще память недоступная для чтения/записи для этого процесса и тогда при попытке обращения к памяти по этому адесу мы получим крах программы с сообщением о "насилии над доступом" и что "память не может быть Read(Write)".


RE: Исследование героев - GhostManSD - 16.09.2010 01:50

Появилось три вопроса.

1. Как можно узнать статический адрес? Например, для того же динамического 43D16F9 пробовал искать указатель в Артмани - не находит. И вообще у меня этот адрес не меняется никогда и всегда хранит одну и ту же информацию, а именно - тип существ в первом слоте Оррина. Может, он и не динамический вовсе?

2. Если я добавлю деф в h3sprite.lod, для него появится свой адрес? Иными словами, смогу ли я обращаться к дефу в дизассемблере? Например, менять деф кнопки на MYDEF.DEF?

3. Самое важное. Я поставил хук на какой-либо адрес. Добавил функцию 90004. Как мне сделать, чтобы, если x1=0, эта функция меняла содержимое адреса на одно значение, а если x1=1, то меняла ла бы содержимое того же адреса на другое значение?


RE: Исследование героев - Prayer - 16.09.2010 08:38

Чем defки лучше смотреть?


RE: Исследование героев - Sav - 16.09.2010 11:27

Quote:Я поставил хук на какой-либо адрес.
Добавил функцию 90004. Как мне сделать, чтобы, если
x1=0, эта функция меняла содержимое адреса на одно
значение, а если x1=1, то меняла ла бы содержимое того
же адреса на другое значение?

Это после вызова функции, но перед popad.

mov ax, [$91DA38]
cmp ax, 0
jne @@m1
mov bx, zn1;Если x1=0, помещаем 1 значение в регистр.
@@m1:
mov bx, zn2;Если x1<>0, помещаем 2 значение в регистр.
mov perem, bx;Записываем нужное значение в переменную.


RE: Исследование героев - Дьякон - 16.09.2010 11:55

(16.09.2010 01:50)GhostManSD Wrote:  1. Как можно узнать статический адрес? Например, для того же динамического 43D16F9 пробовал искать указатель в Артмани - не находит. И вообще у меня этот адрес не меняется никогда и всегда хранит одну и ту же информацию, а именно - тип существ в первом слоте Оррина. Может, он и не динамический вовсе?
На твоей машине просто совпадает. На многих других работать не будет. Если ищешь через артмани то попробуй искать указатели на начало блока. А если через отладчик или дизассемблер, то в коде часто видно как идет обращение к этому адресу. Либо перехватывай все memalloc и смотри куда записывается указатель на выделенный блок.

(16.09.2010 01:50)GhostManSD Wrote:  2. Если я добавлю деф в h3sprite.lod, для него появится свой адрес? Иными словами, смогу ли я обращаться к дефу в дизассемблере? Например, менять деф кнопки на MYDEF.DEF?

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

(16.09.2010 01:50)GhostManSD Wrote:  3. Самое важное. Я поставил хук на какой-либо адрес. Добавил функцию 90004. Как мне сделать, чтобы, если x1=0, эта функция меняла содержимое адреса на одно значение, а если x1=1, то меняла ла бы содержимое того же адреса на другое значение?
Ммм... берем справочник по нужному тебе языку программирования и смотрим условные операторы.


RE: Исследование героев - feanor - 16.09.2010 12:49

Quote:Как можно узнать статический адрес?
Самый грубый способ - шестизначные - статические, семизначные - динамические.
Quote: А если через отладчик или дизассемблер, то в коде часто видно как идет обращение к этому адресу.
Хардвер брякпойнт на чтение интересующих байтов. Когда сработает - смотреть в брякнувшем участке кода, как происходит обращение.


RE: Исследование героев - Дьякон - 16.09.2010 13:34

(16.09.2010 12:49)feanor Wrote:  Самый грубый способ - шестизначные - статические, семизначные - динамические.
Есть и 6-е не статические.

(16.09.2010 12:49)feanor Wrote:  Хардвер брякпойнт на чтение интересующих байтов. Когда сработает - смотреть в брякнувшем участке кода, как происходит обращение.
Иногда указатель кочует из процедуры в процедуру в виде аргументов. Поэтому докопаться до истины не всегда так просто.


RE: Исследование героев - feanor - 16.09.2010 18:06

Quote:Иногда указатель кочует из процедуры в процедуру в виде аргументов. Поэтому докопаться до истины не всегда так просто.
Знаю. В таком случае идем по вызвавшим процедурам. Ну и параллельно смотрим код в HexRays'e


RE: Исследование героев - Sav - 16.09.2010 18:30

Quote:Ну и параллельно смотрим код в HexRays'e
Что такое Hex Rays?Ab


RE: Исследование героев - etoprostoya - 16.09.2010 19:47

(16.09.2010 08:38)Prayer Wrote:  Чем defки лучше смотреть?
Def Preview. http://wogarchive.ru/files/%D1%EE%F4%F2/%C3%F0%E0%F4%E8%EA%E0/DefPreview%201.1.rar
А вообще, вопрос не по теме.


RE: Исследование героев - Дьякон - 16.09.2010 20:11

(16.09.2010 18:30)Sav Wrote:  
Quote:Ну и параллельно смотрим код в HexRays'e
Что такое Hex Rays?Ab
Это страшная вещь Fie. Это Шестнадцатиричные Лучи ))) разрушающие оболочку головного мозга.

А вообще гугл в помощь. Это дополнение к ИДА с С-подобным синтаксисом.


RE: Исследование героев - gamecreator - 16.09.2010 20:28

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


RE: Исследование героев - feanor - 17.09.2010 12:08

Quote:Что такое Hex Rays?
Плагин к Иде, декомпилятор.


RE: Исследование героев - GhostManSD - 18.09.2010 22:56

Спасибо, с динамическими и статическими адресами вроде разобрался.
NB: по адресу 0x67D86C+40*hero_class находится название класса героя.


RE: Исследование героев - GhostManSD - 18.09.2010 23:23

Подскажите, пожалуйста, как выйти на адрес, отлавливающий движение мыши по карте... Не координаты x/y/l (их я уже вроде нашел), а при любом движении.


RE: Исследование героев - GhostManSD - 19.09.2010 03:09

Блин, так и не выходит. Вот есть у меня адрес "71112441(dec)", нахожу два указателя - 42149612(dec) и 42149612(dec). Ни один из них не работает, а вот при обращении по прямой все отлично.


RE: Исследование героев - Дьякон - 19.09.2010 11:05

GetCursorPos и ScreenToClient
Добавлено:
Чтоб не было лишних вопросов - дополню. Вероятнее всего оконная процедура героев реагирует на событие WM_MOUSEMOVE (или чет типа того. Лень лезть в MSDN). Т.е. при изменении положения мыши хоть на пиксель вызывается участок кода ответственный за обработку данного события и вызываются вышеуказанные процедуры. Хочешь иметь координаты мыши перехватывай процедуры. Координаты хранятся в локальных переменных, поэтому не найдешь ты адреса никакого.


RE: Исследование героев - gamecreator - 20.09.2010 21:19

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


RE: Исследование героев - GhostManSD - 20.09.2010 21:32

Надо отображать в подсказке координаты (как по ПКМ, так и в строке).


RE: Исследование героев - gamecreator - 20.09.2010 21:37

а, ну тогда хз


RE: Исследование героев - feanor - 20.09.2010 23:08

Координаты мыши или координаты на карте?

И да, если надо найти функцию вывода хинтов - то ставь бряк на чтение указателя на какую-нить хинтовую строку и лови через него.


RE: Исследование героев - GhostManSD - 20.09.2010 23:10

Координаты на карте. Спасибо, завтра попробую.


RE: Исследование героев - feanor - 21.09.2010 00:08

Quote:Координаты на карте. Спасибо, завтра попробую.
Quote:!!UN:C6916632/4/9; (698A18: 09)
включает указание координат в подсказке для почвы/объектов.
я это..энтузиазм не убиваю?


RE: Исследование героев - GhostManSD - 21.09.2010 23:07

feanor, да нет, скорее, наоборот! Ab Спасибо!

Подскажите, пожалуйста, каков код в Virtual Pascal для того, чтобы сохранить в функции 90005 (которая является ловушкой для одного адреса) x1=[значение адреса A], а x2=[значение адреса B]? Дабы можно было выполнять, например, вот такое:

!?FU90005;
!!IF:M^%X1 %X2^;


RE: Исследование героев - feanor - 21.09.2010 23:27

Ассемблер или паскаль?
MOV EAX,DWORD PTR DS:[address A]
MOV DWORD PTR DS:[91DA38],EAX //x1
MOV EAX,DWORD PTR DS:[address B]
MOV DWORD PTR DS:[91DA3C],EAX //x2

как-то так в общем, ассемблер я благополучно позабыл Bad


RE: Исследование героев - GhostManSD - 22.09.2010 00:08

(21.09.2010 23:07)GhostManSD Wrote:  Подскажите, пожалуйста, каков код в Virtual Pascal



RE: Исследование героев - Berserker - 22.09.2010 00:25

И? Ты же триггер скорее всего в асме вызываешь? Где код события?


RE: Исследование героев - GhostManSD - 22.09.2010 00:40

Тьфу ты. Все, я включился. Сильно завис. Спасибо!



RE: Исследование героев - GhostManSD - 25.09.2010 15:43

Подскажите, пожалуйста, адрес, где располагается номер текущего города.
А-ля !!CA-1:U.


RE: Исследование героев - Sav - 25.09.2010 15:54

Поищи в ArtMoney.

С помощью, скажем:
!?CM1;
!!CA-1:U?y-1;
!!IF:M^%Y-1^;
Определяешь номер текущего города и ищешь его в ArtMoney.
Затем заходишь в другой город и отсеиваешь по его номеру.


RE: Исследование героев - GhostManSD - 25.09.2010 15:58

Sav, да пробовал я. С типом города адрес нашел сразу же, а вот с номером как-то лаговато выходит.
Code:
!?CM1;
!!CM:S?y1 F?y2 I?y3 P?y4/?y5/?y6 H?y7/?y8; Запомнить подтип клика, флаг для клика, место клика, позицию в x/y/l и номера героев
!!CA-1:U?y9 T?y10;
!!IF&y1=12/y2=0/y3=123:M^Номер - %Y9, тип - %Y10^;



RE: Исследование героев - Sav - 25.09.2010 16:07

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


RE: Исследование героев - GhostManSD - 25.09.2010 16:22

Лаговато - значит, не находится.
В процессе изысканий обнаружил забавную вещь: у нас есть адрес 0x043D0B57. Он вроде как равен номеру города, который выбран активным в списке справа на экране приключений. Выберите город номер 0. Ставьте заморозку. Попробуйте зайти в город с другим номером. Итог: независимо от того, в какой город вы пытаетесь зайти, будет отображаться экран города 0.



RE: Исследование героев - GhostManSD - 25.09.2010 16:44

Понял частично, в чем дело: AM отыскивает не номер текущего города, а номер города, который был последним выбран нажатием мышки в окошке города.
Если перемещаться между экранами города по стрелкам "Вверх" и "Вниз", то AM упорно отказывается искать номер текущего города.


RE: Исследование героев - feanor - 25.09.2010 23:36

Указатель на структуру текущего города -
[69954C]+38.
Первый байт в ней похож на номер города.


RE: Исследование героев - GhostManSD - 26.09.2010 01:22

Как изменять количество существ в армии игрока, я вроде бы нашел. Возможно ли отключить отображение количества существ в нужном слоте вообще? Помогите, пожалуйста, с составлением функции в духе
!!FU90004:Px1/x2/x3, где
x1 - номер героя
x2 - номер слота
x3 - включить/выключить (1/0) отображение количества


RE: Исследование героев - feanor - 26.09.2010 01:27

Ищи отрисовку диалога, в ней отрисовку этого искомого числа, и правь, скажем, координаты.


RE: Исследование героев - GhostManSD - 26.09.2010 03:37

Момент открытия диалога найти нетрудно. А как найти момент его закрытия? Например, момент закрытия окна покупки существ в форте (где отображаются все юниты города).


RE: Исследование героев - GhostManSD - 26.09.2010 20:41

Разъясните, пожалуйста, как найти адрес закрытия диалога форта в городе. Адрес открытия окна форта - 5D8AF0h (на платформе ERA, по крайней мере). Нужно найти тот адрес, который задействуется при выходе из диалога. Или при нажатии "ОК".


RE: Исследование героев - GhostManSD - 27.09.2010 01:23

Сразу вопрос вдогонку: могу ли я как-то при посещении объекта показать диалог из числа стандартных? Например, тот же диалог захода в форт города номер 0.


RE: Исследование героев - Sav - 04.10.2010 01:15

Частенько в коде Героев встречаются команды типа:
lea eax, [eax + 8*eax]
.

Я правильно понимаю, что они нужны для упрощения написания вычислений (вместо:
push ebx
push edx
mov ebx, eax
mov edx, 0
mov eax, 8
mul ebx
add eax, ebx
pop edx
pop ebx
)?

При выполнении есть ли разница между этими командами?


И такой тупой вопрос: можно ли в Иде изменять команды не через Hex-view и как?


RE: Исследование героев - etoprostoya - 04.10.2010 01:39

Да, примерно так и есть. Разница очевидна - с командой LEA ты не изменяешь другие регистры и не работаешь со стеком.


RE: Исследование героев - Sav - 04.10.2010 01:48

А когда процессор одинаково быстро выполняет эту lea-команду и "нормальный" код?


RE: Исследование героев - etoprostoya - 04.10.2010 16:32

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


RE: Исследование героев - Sav - 04.10.2010 17:49

Но процессору всё равно же надо вычислить, чему равно, eax+8*eax, он что, как-то по-особому вычисляет это в lea-команде?


RE: Исследование героев - etoprostoya - 04.10.2010 19:38

Именно по-особому.
К тому же в твоём "нормальном" примере изменяются три регистра, а значит их нельзя использовать в других командах, что замедляет выполнение программы (регистры-то часто используемые). Используется стек, то есть идёт обращение к кеш-памяти, на что отводятся дополнительные такты процессора, а в случае с полным кешем, этот кеш нужно выгружать в оперативную память (десятки тактов). Используются три подряд команды mov, что полностью блокирует на несколько тактов блок ввода-вывода, хотя это и не важно, так как дальше идёт длительная команда MUL. Эта команда MUL сама по себе плохая, особенно если в твоём случае блокирует использование сразу трёх регистров и все конвееры процессора или ядра останавливаются, ожидая завершения этой команды.

А команда LEA специально оптимизирована для вычисления формул вида
REG = REG+REG*2N+CONST.
Современные процессоры вычисляют за такт несколько таких команд.


RE: Исследование героев - Sav - 04.10.2010 20:08

Тогда понятно и то, почему там eax+8*eax вместо 9*eax.
Спасибо.


RE: Исследование героев - ZVS - 05.10.2010 00:51

Если память мне не изменяет, то множители (2^N) могут быть только 2, 4 и 8. Этот модификатор команды появился только с i386. Ну и понятно, что умножение на 2^N суть сдвиг на N битов влево. Т.е. *9 и *8 две большие разницы (должно быть). Хотя современные процессоры и умножают уже за 1-2 такта.


RE: Исследование героев - etoprostoya - 05.10.2010 14:03

(05.10.2010 00:51)ZVS Wrote:  Если память мне не изменяет, то множители (2^N) могут быть только 2, 4 и 8.
Ну, может быть и 1. То есть РЕГ = РЕГ + РЕГ. Ноль не считается.

Не знаю как самые-самые последние процессоры, но пару лет назад умножение было не меньше 3-4 тактов. Правда могло проходить сразу два умножения параллельно. Это про 32-разрядное умножение.


RE: Исследование героев - ZVS - 05.10.2010 14:56

РЕГ+РЕГ - это стандартный модификатор, который был еще в 80x86, а множители появились, начиная с i386 специально для быстрого обращения к элементам массивов.


RE: Исследование героев - Sav - 16.10.2010 17:02

Может, кому-нибудь пригодится:

по адресу [6919480]+1170n+137020, где n - номер героя,
находится байт, в котором хранится 1, если герой спит (кнопка "Усыпить/разбудить героя" на карте приключений), иначе - 0.


RE: Исследование героев - SAG - 24.10.2010 12:36

(01.09.2010 15:15)MOP Wrote:  Вот длл с более подробным (откомментированным) исходником. Создаёт триггер на лечение Палаткой.
большая просьба прислать мне почтой на randommaps (@) yandex (.) ru. ибо период полураспада файлообменников очень мал и сцылка уже нерабочая


RE: Исследование героев - Sav - 24.10.2010 15:50

Вот исходник:

Я уже отправил SAG-у файл на почту.



RE: Исследование героев - GhostManSD - 24.10.2010 21:48

Подскажите, пожалуйста, как затереть/вызвать определенное диалоговое окно (алгоритм). Например, дабы вместо окна таверны вызывалось окно рынка.


RE: Исследование героев - Дьякон - 24.10.2010 22:57

Элементарно. Менять таблицу jmp-ов для case - а идентификатора зданий.


RE: Исследование героев - GhostManSD - 24.10.2010 23:11

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


RE: Исследование героев - feanor - 25.10.2010 00:10

В любом не получится. Тот же диалог оставления войск (HE:C) не вызвать в окне города.

Для городских зданий - http://forum.df2.ru/index.php?s=&showtopic=6813&view=findpost&p=452636
Адреса функций показа разных и хороших диалогов лежат в обработчике кликов (0x5D3640). Как правило, они thiscall'овские, от townManager'a


RE: Исследование героев - GhostManSD - 25.10.2010 02:10

Возможно ли узнать адрес стандартных триггеров? Например, !?TM1 и !?TM2.
feanor, спасибо! Буду разбираться!


RE: Исследование героев - GhostManSD - 25.10.2010 02:19

С тем, как искать диалог по кнопке, разобрался. А как найти диалог по тексту?
P.S. Объясните, пожалуйста (если не сложно), как дауну, - пошагово. Потому что иначе не пойму. :-(


RE: Исследование героев - SAG - 29.10.2010 13:12

кто из гуру может подсказать: как создать статический текст на карте приключений (типа количества ресурсов внизу экрана).
по идее это не должно быть сложно


RE: Исследование героев - Sav - 03.11.2010 21:21

Каковы адреса v-переменных?


RE: Исследование героев - Berserker - 03.11.2010 22:32

0x887668


RE: Исследование героев - Sav - 03.11.2010 22:35

Спасибо.


RE: Исследование героев - Berserker - 03.11.2010 23:45

Мы рады потенциальным клиентам Rolleyes


RE: Исследование героев - GhostManSD - 08.11.2010 00:27

Подскажите, пожалуйста, по какому адресу находится тип заклинания у Альянса Ангелов.


RE: Исследование героев - feanor - 08.11.2010 10:50

0x464FEF


RE: Исследование героев - Sav - 14.11.2010 21:48

Кто-нибудь может сказать, с чем может быть связано то, что Герои (Era 1.8) сами по себе нормально работают с моей dll-кой, а при отладке (с такими же скриптами и т. п.) работают по-другому и неправильно?


RE: Исследование героев - Berserker - 14.11.2010 22:04

Как по-другому и как не правильно? С какой длл и в чём заключается отладка?


RE: Исследование героев - Sav - 14.11.2010 22:22

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

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

Если же запустить тот же экзешник (с теми же скриптами и т. п., той же dll, включённым режимом немодифицирования) через отладчик Иды (в моём случае Windbg debugger), то в определённом месте будет попытка считать что-то из недоступного участка памяти (чего нет при обычном запуске). Если удалить dll и запустить Герои через отладчик, всё будет нормально.


RE: Исследование героев - Дьякон - 14.11.2010 23:08

Тут без экспертого навыка экстросенсорики и пол литра не разобраться. С кодом длл и принтскрином ошибки как-то проще бы было.


RE: Исследование героев - Sav - 14.11.2010 23:25

Без проблем.

Ошибка по адресу 0x004417A4 (MOV EAX, [ESI+34h]) - попытка прочесть память по адресу 34h.
Ещё - отклонение, вызвавшее, скорее всего, эту ошибку - неправильная работа функции sub_5242E0, вызванной по адресу 0x00440064. Там идёт работа со стеком напрямую и извлекается неверное значение (по адресу 0x0052430F (MOV EBX, [EBP+arg_0]; arg_0 = 8])).

Но фишка-то в том, что всё это только при отладке. Просто в игре ничего такого нет.

P.S. Без включенного режима немодифицируемости (отключить - 32-й бит переменной v9501 = 1) ошибка будет в любом случае (правда, разная в игре и отладчике), но с этим я как-нибудь сам разберусь.


RE: Исследование героев - Дьякон - 15.11.2010 00:08

@@Exit:
    TEST ECX, EAX//Восстанавливаем испорченную команду.
    PUSH $440057

Духи говорят, что чего-то здесь не хватает.


RE: Исследование героев - Sav - 15.11.2010 00:13

А чего именно, они не говорят?


RE: Исследование героев - Дьякон - 15.11.2010 00:15

Говорят ))))

00440052 |. 8B4D 08 |MOV ECX,DWORD PTR SS:[ARG.1]


RE: Исследование героев - Sav - 15.11.2010 00:27

...
    JNZ @@Modify

    //Восстановление изначального кода: получение всех позиций рядом, на которых кто-то стоит побитно (Запись в ECX).
    MOV ECX, [EBP+8]
    JMP @@Exit
   
    //Модифицирование кода: запись 0 (будто на всех клетках рядом кто-то стоит) в возвращаемый результат.
    @@Modify:
    MOV ECX, 0
   
    @@Exit:
...

Эта функция, для того и нужна, чтобы либо выполнить MOV ECX,DWORD PTR SS:[ARG.1], что, как я понял равно MOV ECX, [EBP+8], либо поместить в ECX 0.
В моём случае она всегда выполняет первое.


RE: Исследование героев - Дьякон - 15.11.2010 00:56

А данная проца тоже мутная

PROCEDURE Damage_stack; ASSEMBLER; {$FRAME-}
ASM
    //Если 32-й бит в v9501 = 1, модифицируем.
    MOV EAX, DWORD PTR DS:[$890AD8]
    SHR EAX, 31
    TEST EAX, EAX
    JNZ @@Modify
   
    //Восстановление изначального кода: вызов функции, вычисляющей адрес конструкций для атакованного на определённой позиции (запись в EAX).
    MOV EAX, $4E7230
    CALL EAX
    JMP @@Exit
   
    //Модифицирование кода: проверка, надо ли атаковать текущий стек и запись адреса его конструкций или 0 в EAX.
    @@Modify:
    //Проверяем, какой стороне принадлежит проверяемый стек.
    CMP EBX, 21
    JAE @@Def_st
   
    //Если стек принадлежит атакующей стороне, помещаем в EAX соответствующий стеку бит из v9501.
    MOV EAX, DWORD PTR DS:[$890AD8]
    MOV CL, BL
    SHR EAX, CL
    JMP @@All_st
   
    //Если стек принадлежит защищающейся стороне, помещаем в EAX соответствующий стеку бит из v9502.
    @@Def_st:
    MOV EAX, DWORD PTR DS:[$890ADC]
    SUB EBX, 21
    MOV CL, BL
    SHR EAX, CL
    ADD EBX, 21

    //Оставляем в EAX 0 или помещаем в него адрес конструкций стека (в зависимости от начального значкния EAX, т. е. бита v-переменной).
    @@All_st:
    AND EAX, 1
    JZ @@Exit
    //EAX = $699420 + 1352*EBX + 21708.
    LEA ECX, DS:0[EBX*8]
    SUB ECX, EBX
    LEA EDX, [ECX+ECX*2]
    MOV ECX, DWORD PTR DS:[$699420]
    LEA EAX, [EBX+EDX*8]
    LEA EAX, [ECX+EAX*8+21708]
   
    @@Exit:
    PUSH $44009A
END;

Затирается вызов процедуры. Если переходим по JNZ @@Modify то там черт ногу сломит. Однозначно могу сказать только одно: если что-то не работает после твоего вмешательства, значит сам виноват. Проверяй код отладчиком.


RE: Исследование героев - Sav - 15.11.2010 01:30

Всё, что в modify сейчас не важно (на самом деле там выполняестся часть затёртой функции, но номер стека берётся не от адреса инфы о гексе, а из EBX), там действительно, возможно, есть ошибки, но на данном этапе всегда выполняется то, что не modify.


Проблема в том, что если я запущу игру с этой dll-кой, то всё будет работать. А при отладке - выдавать ошибку.
Короче, попробую отлаживать в Olly.


RE: Исследование героев - Berserker - 15.11.2010 02:57

Без отладчика может работать, имея скрытые дефекты, нарушения целостности структур. А под отладчиком диапазон выделяемых адресов сдвигается и лажа даёт о себе знать.


RE: Исследование героев - Sav - 15.11.2010 11:24

Berserker Wrote:А под
отладчиком диапазон выделяемых адресов
сдвигается
Это как?


RE: Исследование героев - Дьякон - 15.11.2010 20:27

BEGIN
    HookCode(POINTER($440052), @Damage_ability, C_HOOKTYPE_JUMP);
    HookCode(POINTER($440064), @Damage_position, C_HOOKTYPE_JUMP);
    HookCode(POINTER($440095), @Damage_stack, C_HOOKTYPE_JUMP);
    HookCode(POINTER($440194), @Damage_target, C_HOOKTYPE_JUMP);
END.

Из всех врезок оставляй по одной и смотри при какой вылетает, а потом мудри.


RE: Исследование героев - Sav - 15.11.2010 22:03

Да, это мне стоило сделать с самого начала.Sm


RE: Исследование героев - Berserker - 16.11.2010 00:06

Quote:Это как?
Отладчик выделяет память в процессе для своих нужд. Динамическую. То есть если без отладчика Angel.dll грузилась по адресу $3000000, то с отладчикаом запросто может по $300F000.


RE: Исследование героев - Sav - 21.11.2010 00:22

На участке кода:
Code:
.text:0044008E                 lea     ecx, [ecx+edx+1C4h]
.text:00440095                 call    sub_4E7230
.text:0044009A
.text:0044009A loc_44009A:
.text:0044009A
.text:0044009A                 mov     esi, eax
не должно меняться ESP.

Если же я делаю так:
то ESP послее выполнения выходит уменьшенным на 4. Почему?


RE: Исследование героев - Berserker - 21.11.2010 02:20

На вид всё корректно. В упор не вижу ошибки. Попробуй трассировать по шагам.


RE: Исследование героев - etoprostoya - 21.11.2010 12:16

SHR EAX, 31
    TEST EAX, EAX
    JNZ @@Modify

=>
    TEST EAX, EAX
    JS @@Modify

А вообще, мне не нравится, когда в одной процедуре стоят PUSH'и без POP'ов. Зачем так сделали?


RE: Исследование героев - Berserker - 21.11.2010 15:26

Quote:А вообще, мне не нравится, когда в одной процедуре стоят PUSH'и без POP'ов. Зачем так сделали?
RET всегда идёт в конце асмовской процедуры. PUSH + RET = JMP


RE: Исследование героев - Дьякон - 21.11.2010 16:17

PROCEDURE Damage_stack; ASSEMBLER; {$FRAME-}

Приведи вид данной процедуры в отладчике


RE: Исследование героев - Berserker - 21.11.2010 16:54

Code:
код процедуры на асме, указанный в сорцах
RET



RE: Исследование героев - GhostManSD - 21.11.2010 19:17

Подскажите, пожалуйста, такую вот вещь: в DL кнока с номером 30721 реагирует на нажатие Esc, закрывая окно. Возможно ли сделать так, чтобы кнопка с номером 30720 реагировала так же на Enter?


RE: Исследование героев - Дьякон - 21.11.2010 20:08

(21.11.2010 16:54)Berserker Wrote:  
Code:
код процедуры на асме, указанный в сорцах
RET

тогда что с esp ?


RE: Исследование героев - Sav - 21.11.2010 20:23

Вот так выглядит место, где он вызывается:
Code:
.text:0044008E lea     ecx, [ecx+edx+1C4h]
.text:00440095 loc_440095:
.text:00440095 call    loc_3C91070
.text:0044009A loc_44009A:
.text:0044009A mov     esi, eax
Вот как выглядит сам код:
Code:
Damage_s:03C91070 loc_3C91070:
Damage_s:03C91070 mov     eax, ds:dword_890AD8
Damage_s:03C91075 shr     eax, 1Fh
Damage_s:03C91078 test    eax, eax
Damage_s:03C9107A jnz     short loc_3C91085
Damage_s:03C9107C mov     eax, offset sub_4E7230
Damage_s:03C91081 call    eax ; sub_4E7230
Damage_s:03C91083 jmp     short $+2
Damage_s:03C91085
Damage_s:03C91085 loc_3C91085:
Damage_s:03C91085 push    offset loc_44009A
Damage_s:03C9108A retn

Перед вызовом ESP = 0x00228CF0, а после 0x00228CEC.


RE: Исследование героев - Berserker - 21.11.2010 20:28

Выложи dll.


RE: Исследование героев - Sav - 21.11.2010 20:32

Исходник: (Click to View)
Скомпилированная: удалено за ненадобностью.


RE: Исследование героев - Дьякон - 21.11.2010 21:20

ну так блин
call loc_3C91070

C_HOOKTYPE_JUMP


RE: Исследование героев - Sav - 21.11.2010 21:30

А как это исправить?
Я не умею создавать "каркас" dll - его я тупо скопировал с MoP-овского исходника.

Code:
HookCode(POINTER($440095), @Damage_stack, C_HOOKTYPE_JUMP);
Тут и так C_HOOKTYPE_JUMP. И он равен False, как и в исходниках Эры.


RE: Исследование героев - Berserker - 21.11.2010 21:33

Quote:ну так блин
call loc_3C91070
C_HOOKTYPE_JUMP
Раньше был вызов, а перехват сделан прыжком - всё верно.

Sav, я попробую сейчас в отладчике выяснить.


RE: Исследование героев - Дьякон - 21.11.2010 21:35

та нифига перехват сделан call - ом

раньше было
.text:00440095 call sub_4E7230

а стало

call loc_3C91070

почувствуй разницу. откуда в геройской секции такие адреса могут быть?


RE: Исследование героев - Berserker - 21.11.2010 21:43

У меня функция вообще не получает управления. Пробовал обычными монстрами и гидрами хаоса. Как вызвать событие?


RE: Исследование героев - Sav - 21.11.2010 21:45

Должна вызываться при ударе существа с флагом "бить всех вокруг". У меня при ударе горыныча вызывалась.


RE: Исследование героев - Дьякон - 21.11.2010 21:46

Не пойму откуда call взялся. В исходниках вроде все правильно.


RE: Исследование героев - Berserker - 21.11.2010 21:47

Понял, в чём проблема события. У тебя и МОРа установка заплаток происходит по сто раз )))
Сейчас ищу ошибку стёка.
Добавлено:
Ответ: под нормальным отладчиком всё чисто.


RE: Исследование героев - Berserker - 21.11.2010 21:53

Quote:почувствуй разницу. откуда в геройской секции такие адреса могут быть?
А у меня JMP в оле)


RE: Исследование героев - Дьякон - 21.11.2010 21:56

Sav, признайся ты специально? 10896


RE: Исследование героев - Sav - 21.11.2010 21:56

В Иде, если через другой отладчик тоже jmp, оказывается. Но этот другой виснет после 3-х повторяющихся breakpoint-ов, поэтому я его не использовал.


RE: Исследование героев - Berserker - 21.11.2010 21:58

Поправить исходники нужно:
USES Win, Utils, SysUtils, VPUtils; => USES Win;

BEGIN
    [hooks...]
END.

=>

BEGIN
    Win.DisableThreadLibraryCalls(Win.GetModuleHandle('Damage_s.dll'));
    [hooks...]
END.

Код запретит вызывать основую процедуру DLL, которая иначе будет при создании и удалении потоков в программе заново устанавливать хуки, тем самым перезаписывая точки останова в отладчике.
Добавлено:
И точку останова можно ставить только после выполнения кода инициализации Эры, иначе она будет переписана хуком. Зы, точка останова = запись 0xCC по адресу, если что.


RE: Исследование героев - Sav - 21.11.2010 22:08

Теперь всё нормально.
Большое спасибо!


RE: Исследование героев - Sav - 21.11.2010 22:48

Quote:USES Win, Utils, SysUtils, VPUtils;
Это, видимо, было сделано специально - иначе файл получается слишком маленький и на него ругается антивирус (Avira, по крайней мере).


RE: Исследование героев - Berserker - 21.11.2010 22:54

Quote:Теперь всё нормально.
Большое спасибо!
Не за что.

Quote:Это, видимо, было сделано специально - иначе файл получается слишком маленький и на него ругается антивирус (Avira, по крайней мере).
Нет. Просто эти модули у тебя и МОРа вообще не используются, а в Эре использовались.
А ругаться на маленький файл глупо. Меньше размер - лучше компилятор.


RE: Исследование героев - Sav - 21.11.2010 23:23

Berserker Wrote:А ругаться на маленький файл глупо. Меньше размер - лучше компилятор.
Авире скажи.Sm
Мне проще включить туда эти модули, чем разбираться с антивирусом. Поставлю только туда комментарий-напоминание, чтобы не забыть, если что, что можно убрать это.


RE: Исследование героев - Berserker - 21.11.2010 23:54

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


RE: Исследование героев - Sav - 22.11.2010 00:00

Здесь уже сталкивались подобной проблемой: http://forum.df2.ru/index.php?s=&showtopic=15700&view=findpost&p=381860.
Поэтому я и подумал именно на размер.


RE: Исследование героев - Berserker - 22.11.2010 00:07

Такой подход даже эвристикой назвать сложно.


RE: Исследование героев - MOP - 27.12.2010 16:42

Помогите заполнить пробел в знании ассемблера: как работать с командами fild, fstp, fld, fmul, fdivr, fstp и прочими «f…»? Я понимаю, что они предназначены для операций над float – числами с плавающей запятой (как переменные e и e- в ERM). Но что конкретно они делают, что в каких регистрах/ячейках памяти должно находиться и куда возвращается результат – не знаю.


RE: Исследование героев - etoprostoya - 27.12.2010 16:59

Небольшой хэлп по операциям с плавающей точкой x86:
http://zalil.ru/30233173
Собственно не хэлп, а описание операций.
Ещё рекомендую почитать мануалы от Agner'а http://www.agner.org/optimize/
И от Intel http://www.intel.com/design/pentiumii/manuals/245127.htm

А так, если ввести ограничение на неиспользование процессоров ниже Пентиум 3 или Пентиум 4, то лучше использовать гораздо более удобные регистровые инструкции SSE и SSE2 и забить на стековые операции.


RE: Исследование героев - MOP - 27.12.2010 17:06

(21.11.2010 21:58)Berserker Wrote:  Поправить исходники нужно:
USES Win, Utils, SysUtils, VPUtils; => USES Win;
О, кстати. Я этот пост не видел, а как-то сам допёр, когда делал dwellings.dll. Просто меня озадачило, что длл-ки Феанора весят почти в два раза меньше, а делают больше. Подумал: язык тут вряд ли играет особую роль, значит, что-то явно лишнее. Поубирал последовательно используемые средства - длл отказалась компилироваться только без win, а с ней одной работает нормально.
Такой вот метод тыка. 96-copy

etoprostoya, спасибо!


RE: Исследование героев - GhostManSD - 16.01.2011 02:21

Подскажите, как быть. Нашел временный адрес, где хранится нужное значение. В АМ на него более 200 указателей. И как узнать, какой из них нужен?
В Олли щелкал по тому же адресу references, нашел опять-таки за 200 адресов. Но как там искать нужное - тем более не знаю.


RE: Исследование героев - Sav - 16.01.2011 20:00

Найди участок кода, где используется адрес и посмотри там, с помощью какого указателя он получен.


RE: Исследование героев - GhostManSD - 28.01.2011 01:37

Как при обращении к адресу A (на который стоит хук) заменить процедуру в адресе B? Например, изначально в адресе B стоит "MOV ECX 4", а надо, чтобы было "MOV 8". Имеется в виду код в Паскале.


RE: Исследование героев - Berserker - 28.01.2011 01:45

Посмотри в Оле, сколько байтов занимает сама команда, а сколько константа. Например, если 2 байта команда, то прибавь к адресу 2, а затем напиши: PINTEGER(адрес)^:=8. Если константа однобайтовая, то PBYTE(адрес)^:=4;


RE: Исследование героев - etoprostoya - 28.01.2011 01:56

Ссылка в первом сообщении темы не работает.


RE: Исследование героев - GhostManSD - 28.01.2011 02:37

Berserker, можно подробнее для идиота?
1. Что подразумевается под константой? Адрес хука?
2. Где смотреть, что сколько байт занимает?
Простите, если мои вопросы кажутся непроходимо тупыми...


RE: Исследование героев - Berserker - 28.01.2011 03:43

Для идиота смысла нет, а умному человеку почему бы не объяснить? Sm
Image: original.jpg
Видишь, B9 - байт-команда = MOV ECX, SomeConst, а сама константа занимает 4 байта и находится, естественно, байтом правее от адреса команды. Соответственно, нужно записать по адресу 701001(в моём случае) 8.
PINTEGER($701001)^:=8.

Однако это только для кода вога, для которого разрешена запись. Для остального нужно использовать процедуру:

Code:
PROCEDURE WriteAtCode (Addr: POINTER; Buf: POINTER; Count: INTEGER);
VAR
    OldPageProtect:    INTEGER;

BEGIN
    {!} ASSERT(CodeAddr <> NIL);
    {!} ASSERT(Buf <> NIL);
    {!} ASSERT(Count > 0);
    Windows.VirtualProtect(CodeAddr, Count, PAGE_READWRITE, @OldPageProtect);
    MOVE(Buf^, CodeAddr^, Count);
    Windows.VirtualProtect(CodeAddr, Count, OldPageProtect, NIL);
END; // .PROCEDURE WriteAtCode

Вызывать так.

Code:
VAR
  Patch: INTEGER;

Patch:=8;
WriteAtCode(Ptr(адрес), @Patch, 4);



RE: Исследование героев - feanor - 28.01.2011 17:19

Quote:Однако это только для кода вога, для которого разрешена запись.
А разве то ли в ТЕ, то ли в Эре защита со всех секций не снята?
___________
Где хранятся записи о требованиях к отстройке? Раскуривание CD:B результатов не дало.


RE: Исследование героев - Berserker - 28.01.2011 19:17

Не снята. Просто воговская часть имеет флаг на запись и расценивается как данные. А вот содовская, как и ранее, сгенерит исключение.


RE: Исследование героев - feanor - 28.01.2011 19:45

Quote:А вот содовская, как и ранее, сгенерит исключение.
Хм..у меня не генерит, не смотря на то, что я делаю, скажем, так:
Code:
*(int*)(0x59F898+1) = CREATURE_ENERGY_ELEM;



RE: Исследование героев - Berserker - 28.01.2011 19:47

Перепроверил. Был не прав. Очень странно. Выходит теперь любая ошибка запросто портит код, а когда уже будет исключение, анализировать будет нечего.


RE: Исследование героев - GhostManSD - 03.02.2011 06:08

Подскажите, пожалуйста, каков адрес x-переменных функций? Возможно ли вывести какую-нибудь общую формулу в духе [адрес функции 1 * номер функции] + [адрес x1 * номер x]?


RE: Исследование героев - Prayer - 03.02.2011 10:25

Здравствуйте!
Никто случаем не занимался изменением главного меню игры? Меня интересует дизабил некоторых кнопок. Как, например, это реализовано, если ваш компьютер клиент в сетевой игре:

Image: 8397f4f51de37314eb76b6f63954a254.jpeg

Позарез нужно отключить или убрать из меню вообще кнопку "Показать дополнительные опции", чтоб на серваке ее тоже нельзя было использовать. Нашел дефку кнопки - gspbutt.def, текста на ней в genrltxt.txt.

Почитал данную ветку, полез на wasm.ru начал читать "Крекинг с нуля" 141, скачал Olly. Даже бряк поставил на gspbutt.def 147
И только потом понял, что я вообще не соображаю, что дальше делать105 Видать в моем возрасте уже позновато с нуля начать програмировать, при том что общие навыки в этом деле + знание языков = 0,000108


RE: Исследование героев - GhostManSD - 03.02.2011 13:46

На фига бряк-то? Смещай координаты просто за пределы экрана.

Или забей нопами отрисовку.


RE: Исследование героев - GhostManSD - 03.02.2011 15:12

Мастера, подскажите, пожалуйста, как по умному сделать. Нужно, чтобы при хуке на адресе A:
1) сравнивалось значение по адресу B с -1 (CMP DWORD [адресB], -1);
2) если по адресу B и вправду -1, то команда по адресу C будет MOV ECX, DWORD [EDX*4+$68A36C];
3) если по адресу B отличное от -1 значение, то команда по адресу C будет MOV ECX, DWORD [адресB*4+$68A36C].

Я пробовал менять опкод и аргумент через PINTEGER, но у меня выходит хрень какая-то. Помогите, пожалуйста!


RE: Исследование героев - Sav - 03.02.2011 15:37

По-моему, лучше в хуке по адресу A запомнить значение по-адресу B, а проверять в хуке по адресу C, если я правильно понял, что тебе надо.


RE: Исследование героев - Prayer - 03.02.2011 20:13

(03.02.2011 13:46)GhostManSD Wrote:  На фига бряк-то? Смещай координаты просто за пределы экрана.

Или забей нопами отрисовку.
Хммм... А это как? Где искать координаты? Отрисовку?
Я же писал что делитант...


RE: Исследование героев - GhostManSD - 03.02.2011 20:31

Нашел свою кнопку? Перейди на адрес, где она прописывается (в Олли: search > text references > твоя кнопка.def. Нажимаешь на ней лкм. Ты попадешь в CPU. Там рядом с названием кнопки будут прочие аргументы. Координаты находятся на пару строчек ниже (2 адреса: отступ сверху и отступ слева). Они - в шестнадцатеричном формате. Для перевода используй калькулятор Windows в инженерном режиме. Поставь большие координаты, чтобы кнопка "уехала" за пределы экрана. Вроде все.


RE: Исследование героев - GhostManSD - 03.02.2011 20:37

Sav, попробую. Мне тоже приходила в голову такая мысль, но я думал, есть способ сделать без второго хука.


RE: Исследование героев - Дьякон - 03.02.2011 21:57

покажи код


RE: Исследование героев - GhostManSD - 04.02.2011 00:00

Адреса для хука (точнее, для хука - верхний, а остальные прописываю для восстановления оригинальных команд); при хуке происходит вызов функции 90003 (это я уже прописал в плагине).
Code:
005CCD80  /$ 55                PUSH EBP
005CCD81  |. 8BEC              MOV EBP, ESP
005CCD83  |. 6A FF             PUSH -1
005CCD85  |. 68 575F6300       PUSH 00635F57                            ;  SE handler installation

Следующий код - тип подложки гильдии магов. Вычисляется здесь.
Code:
005CCEC5  |. 8B15 4C956900  MOV EDX, DWORD PTR DS:[69954C]
005CCECB  |. 68 00080000    PUSH 800                                 ; /Arg7 = 00000800
005CCED0  |. 8B4A 38        MOV ECX, DWORD PTR DS:[EDX+38]           ; |
005CCED3  |. 0FBE51 04      MOVSX EDX, BYTE PTR DS:[ECX+4]           ; |
005CCED7  |. 8B0C95 6CA3680>MOV ECX, DWORD PTR DS:[EDX*4+68A36C]     ; |
005CCEDE  |. 51             PUSH ECX                                 ; |Arg6

В функции 90003 игрок может установить параметр SN:X1 от -1 до 8. Если X1=-1, то значение ECX из кода №2 остается неизменным и соответствует реальному типу города. Если 0<X1<8, то устанавливается подложка соответствующего типа города.

Было бы еще здорово узнать, как эти параметры выставлять. При попытке прописать в своей dll нечто в духе MOV DWORD General.EventParams, 1 Паскаль говорит, что никакого General в природе нет.


RE: Исследование героев - Sav - 04.02.2011 00:07

Здесь Берс показывал мне, как использовать для передачи и приёма параметров SN:X.


RE: Исследование героев - Дьякон - 04.02.2011 00:08

ты мне свой код выложи


RE: Исследование героев - GhostManSD - 04.02.2011 00:22

Code:
PROCEDURE MageGuildBackground; ASSEMBLER; {$FRAME-}
    ASM
    PUSHAD// Push all registers
    CMP DWORD [$887668], -1 // Compare -1 with v1
    JZ @@Leave
    MOV EAX, DWORD [$887668] // Move v1 to EAX
    MOV DWORD [$5CCED7], $8B0C85 // Change opcode
    MOV DWORD [$5CCED8], $68A36C // Change parameter
    POPAD // Restore all registers
    @@Leave:
    POPAD // Restore all registers

PROCEDURE HOOK_MageGuildEnter; ASSEMBLER; {$FRAME-}
    ASM
    PUSHAD // Push all registers
    CALL MageGuildBackground
    PUSH 90003 // Push function number
    MOV EAX, $74CE30 // Move $74CE30 to EAX
    CALL EAX // Call ERM-function
    ADD ESP, 4 // Add 4 to ESP
    POPAD // Restore all registers
    PUSH EBP // Push EBP
    MOV EBP, ESP // Move ESP to EBP
    PUSH -1 // Push -1
    PUSH $5CCD85 // Push $5CCD85
END; // .PROCEDURE HOOK_MageGuildEnter

BEGIN
    HookCode(POINTER($5CCD80), @HOOK_MageGuildEnter, C_HOOKTYPE_JUMP); // 90003
END.


До этого вместо MOV устанавливал через PINTEGER таким же образом значения по адресам.


RE: Исследование героев - etoprostoya - 04.02.2011 01:36

А что у тебя подряд два POPAD в MageGuildBackground? Причём один то выполняется, то нет.


RE: Исследование героев - GhostManSD - 04.02.2011 01:51

Ну так вроде же надо восстанавливать регистры независимо от итога. Хотя во втором случае никакие регистры вроде не меняются, так что там и правда нет нужды. Но проблема-то не в этом.
Гм. Сейчас вот на свежую голову все это посмотрел и увидел, что если вручную в Олли поменять процедуру в нужном мне адресе, получается вот что:
БЫЛО
Code:
005CCED7     8B0C95 6CA36800     MOV ECX, DWORD PTR DS:[EDX*4+68A36C]
005CCEDE     51                  PUSH ECX
005CCEDF  |. 6A 01               PUSH 1
СТАЛО
Code:
005CCED7     3E:8B0C85 6CA36800  MOV ECX, DWORD PTR DS:[EAX*4+68A36C]
005CCEDF  |. 6A 01               PUSH 1
Выходит, происходит сдвиг, и команда PUSH ECX затирается. Как бороться?


RE: Исследование героев - Sav - 04.02.2011 02:02

Если что-то затирается, надо в конце процедуры хука push-ить адрес первой незатираемой команды, а все затираемые выполнять в процедуре.


В процедуре MageBuildBackgroung убери popad перед "@@leave:" - другой popad и так будет выполняться всегда.


RE: Исследование героев - etoprostoya - 04.02.2011 02:07

Если у тебя
Code:
JZ @@Leave
выполняется, то идёт один POPAD, иначе - два. Ты уверен, что так и должно быть?


RE: Исследование героев - GhostManSD - 04.02.2011 03:16

Попробовал поменять код. Вместо двух процедур сделал одну.
Code:
PROCEDURE HOOK_MageGuildEnter; ASSEMBLER; {$FRAME-}
    ASM
    PUSHAD // Push all registers
    PUSH 90003 // Push function number
    MOV EAX, $74CE30 // Move $74CE30 to EAX
    CALL EAX // Call ERM-function
    ADD ESP, 4 // Add 4 to ESP
    POPAD // Restore all registers
    MOV EDX, DWORD [$69954C]
    PUSH 800
    MOV ECX, DWORD [EDX+$38]
    MOVSX EDX, BYTE [ECX+4]
    CMP DWORD [$887668], -1
    JNZ @@Change
    PUSH ECX
    PUSH $5CCEDF
    @@Change:
    MOV EAX, DWORD [$887668]
    MOV ECX, DWORD [EAX*4+$68A36C]
END; // .PROCEDURE HOOK_MageGuildEnter
Ошибка, чсх, все так же вылазит. Выкладываю ее в спойлере.
Используемый код в ERM:
!?FU90003;
!!VRv1:S-1;


RE: Исследование героев - etoprostoya - 04.02.2011 03:45

Ты вообще в курсе, что PUSH(AD) и POP(AD) изменяют значение ESP?


RE: Исследование героев - GhostManSD - 04.02.2011 04:00

В курсе. Но стандартный метод вроде такой:
1. При срабатывании хука - PUSHAD.
2. Далее прописать вызов функции.
3. POPAD.
4. Выполнить затертые команды.

Может, проблема в том, что у меня выполняется больше команд, чем я затираю?


RE: Исследование героев - Sav - 04.02.2011 12:17

Затёртые команды и push адреса должны выполняться в любом случае (т. е. стоять в конце кода после всех меток). У тебя же не так.


RE: Исследование героев - etoprostoya - 04.02.2011 12:24

(04.02.2011 04:00)GhostManSD Wrote:  В курсе.
Тогда ты должен быть в курсе, что такие конструкции, как у тебя:
Code:
CMP DWORD [$887668], -1
    JNZ @@Change
    PUSH ECX
    PUSH $5CCEDF
    @@Change:
    MOV EAX, DW
    ...
    MOV REG, [ESP+OFFSET]
Будут работать совершенно по-разному, в зависимости от первого CMP. В одном случае возьмётся одно значение из стека, а в другом - другое. И так для всего кода программы, то есть ты делаешь ВЕСЬ код неправильным.
Нужно сделать так, чтобы ESP на метке @@Change был одинаков, независимо от проверки.


RE: Исследование героев - GhostManSD - 04.02.2011 14:40

Как? MOV EBP, ESP; затем в нужном месте (после метки) - MOV ESP, EBP?


RE: Исследование героев - Sav - 04.02.2011 15:08

ESP - регистр, отвечающий за заполненность стека.
Чтобы он не сбивался, надо, чтобы push было столько же, сколько и pop вне зависимости от, того, как будет выполняться код.
Как-то так, хотя я не понимаю, что делает push 800 в таоём коде.

PROCEDURE HOOK_MageGuildEnter; ASSEMBLER; {$FRAME-}
    ASM
    PUSHAD // Push all registers
    PUSH 90003 // Push function number
    MOV EAX, $74CE30 // Move $74CE30 to EAX
    CALL EAX // Call ERM-function
    ADD ESP, 4 // Add 4 to ESP
    POPAD // Restore all registers
    MOV EDX, DWORD [$69954C]
    PUSH 800
    MOV ECX, DWORD [EDX+$38]
    MOVSX EDX, BYTE [ECX+4]
    CMP DWORD [$887668], -1
    JE @@L
    MOV EAX, DWORD [$887668]
    MOV ECX, DWORD [EAX*4+$68A36C]
    @@L:
    PUSH ECX
    PUSH $5CCEDF
END; // .PROCEDURE HOOK_MageGuildEnter


RE: Исследование героев - MOP - 04.02.2011 15:29

(13.09.2010 21:00)Sav Wrote:  Прошу прощения за тупой вопрос: динамический адрес может меняться при нескольких запусках программы на одном компьютере или только на разных компьютерах? И вообще, может кто-нибудь дать мне точное определение этого понятия?
Что-то никто не дал нормальный ответ. Теперь попробую я.
Для этого маленького исследования потребуется (из прог, которые мне знакомы):
либо PE Explorer,
либо не так давно найденная мной замечательная и очень компактная программка LordPE,
либо супермаленькая прога Икзелиона, некогда выложенная Дьяконом в приложение к одному из туториалов,
да почти любой дизасм.
В любом случае, нужна программа, позволяющая посмотреть сегментацию экзешника, его деление на секции. В принципе, подходит та же IDA, только там почему-то не видна секция .rsrc (видимо, за ненадобностью).
Мне лично нравится отображение секций в PE Explorer. Поэтому приведу скрин с него:
Image: 7d6cfc22c277.jpg
Size of Raw Data – размер секции непосредственно в файле.
Virtual Size – размер секции во время работы приложения. Включает в себя Raw Size.
Virtual Adress – адрес начала секции в запущенном приложении.
Pointer of Raw Data – адрес начала секции в файле.
Нетрудно заметить, что для сод-секций Virtual Adress = Pointer of Raw Data + 400000h, а для вог-секций Virtual Adress = Pointer of Raw Data + 465000h.
Для записи/чтения требуется знать только статическое виртуальное пространство, подходящее для этих целей. Достаточно нескольких минут, чтобы понять, что есть три НЕподходящих области:
1. < 401000h. В этих адресах работает система, поддерживая работу запущенного приложения. Также там находится стек. Запись/чтение там просто бесполезны и могут убить приложение.
2. >=6AD000/<701000. Иначе говоря, вся секция .rsrc. Этой секции просто не выставлены флаги Readable/Writeable, поэтому никаких операций с ней не выйдет и всё закончится вылетом (хотя можно выставить флаги и юзать, но лучше уж добавить новую секцию). Львиную долю её занимают иконки экзешника, также там информация о файле, менюшка, доступная в оконном режиме, и прочее.
3. >=293512Ch (21AE12C + 787000). Основная динамическая память. Сюда подгружаются библиотеки, здесь создаёт свои аллоки экзешник.
Существует закономерность: чем больше размер буфера, выделяемого в динамической памяти, тем больше шансов, что его адрес будет более статичен. Отюда многие заблуждения и принятие динамических адресов за статические. Достаточно запустить игру под отладчиком, подгрузить дополнительную длл или ресурс, запустить exe на другой системе или машине – и адрес окажется вовсе не таким.

Вот и всё.
Дополнения и уточнения принимаются, так как этот пост написан на основе личного практического знания.


RE: Исследование героев - GhostManSD - 04.02.2011 16:09

(04.02.2011 15:08)Sav Wrote:  Как-то так, хотя я не понимаю, что делает push 800 в таоём коде.
Code:
MOV EDX, DWORD [$69954C]
    PUSH 800
    MOV ECX, DWORD [EDX+$38]
    MOVSX EDX, BYTE [ECX+4]
Эти строки - оригинальный код. В т.ч. PUSH 800.
Попробовал твой код, Sav. Тоже вылет, только ошибка другая. А причина одна - безблагодатность. Ab Прикладываю crashlog.



RE: Исследование героев - Sav - 04.02.2011 17:29

Если у тебя хук на 5CCDD7, то эти строчки не затираются, а значит - убери их. Лишний mov может и не страшно, а вот лишний push - страшно почти всегда.


RE: Исследование героев - Дьякон - 05.02.2011 00:23

MOP, динамическая память - это память выделенная в процессе выполнения программы, такими функциями как GlobalAlloc, VirtualAlloc и др. Все секции exe являются статическими.


RE: Исследование героев - Дьякон - 05.02.2011 00:34

MOV DWORD [$5CCED7], $8B0C85 // Change opcode
    MOV DWORD [$5CCED8], $68A36C // Change parameter

ты меняешь смещение на 1 байт а записываешь по 4 байта - определись.


RE: Исследование героев - GhostManSD - 05.02.2011 18:17

Дьякон, спасибо!
Теперь новый вопрос (скорее всего, к Берсу). В коде делаю вот так...

MOV EAX, DWORD [Адрес]
MOV DWORD [EventsParam], EAX

...и, по идее, код

!?FU90003;
!!SN:X?v1;
!!IF:M^%V1^;

должен выдавать сохраненное значение. Но ни фига, выдает какую-то постороннюю чушь. А если занести то же в v1...

MOV EAX, DWORD [Адрес]
MOV DWORD [$887668]

...и код прописать вот такой...

!?FU90003;
!!IF:M^%V1^;

...все выдается верно. Что я делаю не так?


RE: Исследование героев - Berserker - 05.02.2011 18:43

Code:
TYPE
    PEventParams    =    ^TEventParams;
    TEventParams    =    ARRAY[0..63] OF INTEGER;

VAR
  EventParams:        PEventParams;

BEGIN
    EventParams    :=    Win.GetProcAddr(Win.GetModuleHandle('Angel.dll'), 'EventParams');
END.
Не забыл про это?

MOV EAX, [Адрес]
MOV ECX, [EventParams]
MOV [ECX], EAX

EventParams - только указатель на массив, а не сам массив.


RE: Исследование героев - MOP - 05.02.2011 19:16

(05.02.2011 00:23)Дьякон Wrote:  MOP, динамическая память - это память выделенная в процессе выполнения программы, такими функциями как GlobalAlloc, VirtualAlloc и др. Все секции exe являются статическими.
А я что-то другое написал?


RE: Исследование героев - GhostManSD - 05.02.2011 21:56

Берс, спасибо огромное! Тысячный раз уже выручаешь! Вот только есть одна такая вот нехорошая штука... Как быть, если мне нужно поместить значение в X1 в одном хуке, а считывать - с другого? Например, в одном из адресов вычисляется что-то и заносится в EAX.
Hook1
    mov ecx, [EventParams]
    mov [ecx], eax
.Hook1

Hook2
    [моя функция]
.Hook2

При попытке считать SN:X он выдает всякую хрень. Как быть? В хуке 1 сохранять в левый адрес (типа v1) значение параметра, а в хуке 2 - передавать из этого адреса?


RE: Исследование героев - Berserker - 05.02.2011 22:19

Считывание:
mov ecx, [EventParams]
mov eax, [ecx] // eax = X1


RE: Исследование героев - Sav - 05.02.2011 22:33

Quote:TEventParams = ARRAY[0..63]
Я смотрел в исходниках Эры, там только 16.

GhostManSD Wrote:Как быть, если мне нужно поместить значение в X1 в одном хуке, а считывать - с другого?
Лучше завести отдельную переменную: мало ли как может использоваться SN:X между хуками (даже если не используется - ради совместимости с потенциальными другими модами).


RE: Исследование героев - Berserker - 05.02.2011 22:47

Quote:Я смотрел в исходниках Эры, там только 16.
Извиняюсь, скопировал с черновика 2.0.


RE: Исследование героев - GhostManSD - 05.02.2011 22:53

Берс, не о том речь, хотя это тоже пригодится.
Вот что я имел в виду... (Click to View)

Sav, попробую сейчас.

Верно ли я понял суть? (Click to View)



RE: Исследование героев - Berserker - 05.02.2011 23:13

Вроде бы да.


RE: Исследование героев - Дьякон - 06.02.2011 03:11

(04.02.2011 15:29)MOP Wrote:  3. >=293512Ch (21AE12C + 787000). Основная динамическая память.

еще раз. Все секции - статические.


RE: Исследование героев - GhostManSD - 06.02.2011 07:42

Подскажите, пожалуйста, где ошибка (в X1 не появляются нужные параметры)...



RE: Исследование героев - Sav - 06.02.2011 09:57

Когда ты используешь переменную, не надо ставить квадратные скобки:
mov var, eax
mov ecx, var


RE: Исследование героев - Дьякон - 06.02.2011 14:41

квадратные скобки играют роль только для регистров.


RE: Исследование героев - GhostManSD - 06.02.2011 16:49

Не выходит, хоть убей. Все время по запросу !!SN:X?v1 выдается 139. Хук стоит на $5C6C70.



RE: Исследование героев - Berserker - 06.02.2011 16:59

Выложи библиотеку.


RE: Исследование героев - GhostManSD - 06.02.2011 19:01

GMSDLib.dll
GMSDLib.pas
Спасибо большое!


RE: Исследование героев - GhostManSD - 07.02.2011 01:01

Спасибо большое, проблему решил самостоятельно, что радует еще больше. Ab


RE: Исследование героев - Berserker - 07.02.2011 02:13

Хорошо. Я уже как раз разобрался с остальными делами и собирался проверить dll в отладчике. А что было не так?


RE: Исследование героев - GhostManSD - 07.02.2011 02:23

Code:
MOV EAX, [$6AAAB8]
MOV ECX, EventParams
MOV [ECX], EAX
вместо
(05.02.2011 18:43)Berserker Wrote:  MOV EAX, [Адрес]
MOV ECX, [EventParams]
MOV [ECX], EAX



RE: Исследование героев - GhostManSD - 07.02.2011 02:35

Все это, конечно, здорово. Но указатель порой находится далеко от места, на которое срабатывает хард брейкпойнт. Допустим, я никак не могу найти адрес типа текущего города, хотя знаю, что в момент срабатывания бряка по адресу $741B7C тип города заносится в ECX. Можно ли мне быстро найти место, где значение заносится в ECX? Я листал долго, но ничего в духе MOV ECX, [Адрес] не обнаружил. Нашел MOV ECX, [EBP-8], но где ставится EBP, найти не могу. Quod autem facere, то бишь, делать-то что?


RE: Исследование героев - Дьякон - 07.02.2011 10:00

А чем тебя ecx не устраивает? Полистай код, найди процедуру, в которую передается тип города, в зависимости от твоих потребностей, и меняй себе на здоровье.


RE: Исследование героев - GhostManSD - 07.02.2011 20:55

Дьякон, я не совсем понял, что ты имеешь в виду. Можешь пояснить или привести примерный код?


RE: Исследование героев - Дьякон - 07.02.2011 23:48

приведи код и поставь задачу


RE: Исследование героев - GhostManSD - 08.02.2011 00:40

Опять нашел ответы на свои вопросы. Ab Размещаю здесь, авось кому пригодится.
Code:
[$6AAAB8] - номер города
[[$69954C]+$110] - тип города


Дьякон, спасибо, уже не надо. Ab Научился вроде искать указатели. АртМани тут и впрямь не помощник.


RE: Исследование героев - GhostManSD - 08.02.2011 02:58

Мне может кто-нибудь объяснить, что означает эта команда?
Code:
MOV DWORD PTR FS:[0], ECX
При попытке поставить хук в ту область, где она выполняется, происходит вылет при записи.


RE: Исследование героев - Berserker - 08.02.2011 03:03

Установка обработчика структурных исключений. Если очень хочется мозголома, то гугл: Structured Exceptions Handling.
Обычно тебе этот код не должен быть нужен.


RE: Исследование героев - GhostManSD - 08.02.2011 03:37

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


RE: Исследование героев - GhostManSD - 08.02.2011 16:52

Такой вот вопрос: когда заклинания Гильдии магов добавляются герою? Если нет книги, то, по идее, сразу после покупки оной. А если есть книга, то при заходе в город?


RE: Исследование героев - SAG - 09.02.2011 18:04

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


RE: Исследование героев - GhostManSD - 09.02.2011 22:36

SAG, проверю.
Товарищи, поставил хук на получение уровня и после получения уровня (огромное спасибо MOP). Есть один досадный минус: почему-то лишь раз показывается окошко получения нового уровня (независимо от опыта), а уровень героя приравнивается к 34. Помогите отыскать жука.



RE: Исследование героев - Berserker - 09.02.2011 23:51

Quote:на получение уровня
!?HL?
X1 - Erm x1?


RE: Исследование героев - GhostManSD - 09.02.2011 23:52

Да. Но только для любого героя.


RE: Исследование героев - GhostManSD - 10.02.2011 00:43

(09.02.2011 23:51)Berserker Wrote:  
Quote:на получение уровня
!?HL?
X1 - Erm x1?
Угу. Ибо с EventParams у меня опять какая-то херь выходит. Потом поменяю, пока что хватает и этого. Так, код
Code:
!?FU90000;
!!IF:M^%X1 - герой, %X2 - уровень^;
выводит все правильно.

А код
Code:
!?FU90001;
!!HEx1:Ed/x2;
не работает.


RE: Исследование героев - Berserker - 10.02.2011 01:11

Установить уровень в x2?

Quote:Да. Но только для любого героя.
!?HL-1;


RE: Исследование героев - Sav - 10.02.2011 01:16

Так в HE:E при установке уровня окна и не должны вроде появляться.


Откуда появляются значения в переменных LevelUp_HeroNumber и LevelUp_HeroLevel?


RE: Исследование героев - Berserker - 10.02.2011 01:18

Quote:Так в HE:E при установке уровня окна и не должны вроде появляться.
Конечно не должны. А в x2 - мусор по ходу.


RE: Исследование героев - GhostManSD - 10.02.2011 03:35

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

(10.02.2011 01:16)Sav Wrote:  Откуда появляются значения в переменных LevelUp_HeroNumber и LevelUp_HeroLevel?
Из указателей. Дело не в этом.


RE: Исследование героев - GhostManSD - 10.02.2011 04:05

(10.02.2011 01:18)Berserker Wrote:  
Quote:Так в HE:E при установке уровня окна и не должны вроде появляться.
Конечно не должны. А в x2 - мусор по ходу.

Почему же мусор? Показывает, какого уровня достиг герой.


RE: Исследование героев - Sav - 10.02.2011 14:04

Уровни до 34 накидываются всегда или только при использовании HE:E?


RE: Исследование героев - GhostManSD - 10.02.2011 14:49

Всегда. А HE:E было призвано исправить ситуацию, сменив уровень героя на тот, которого он достигает. Но ситуация не меняется. Я бы пошел иным путем: устанавливал бы значение в ассемблере, но я никак не могу найти указатель на реальный уровень героя (а не получаемый).
При вводе чита woggandalfwhite все проходит нормально, кстати. Получаемый уровень соответствует реальному.


RE: Исследование героев - Sav - 10.02.2011 15:03

А зачем ты восстанавливаешь так много кода? Хуку же одного call хватает, чтобы больше ничего не затирать.


RE: Исследование героев - GhostManSD - 10.02.2011 15:13

Sav, не понял. Можешь пояснить? Или показать, как должен выглядеть мой код?


RE: Исследование героев - Sav - 10.02.2011 15:41

    HookCode(POINTER($4DAC9B), @HookTrigger_LevelUp, C_HOOKTYPE_JUMP); // 90000
***
    // Restore default code
    MOV DataTemp, $59A890
    CALL DataTemp
    MOV EAX, DWORD PTR DS:[$69959C]
    MOVSX ECX, AX
***
    PUSH $4DACA7

Можно было бы сделать адресом хука адрес call-а и не восстанавливать ничего, кроме него.
И push-ить адрес call-а + 5.
Как это точно сделать - не знаю (нет кода игры перед глазами).
Здесь не видно связи с твоей ошибкой, но иногда при исправлении понятных недочётов исправляются и непонятные ошибки


RE: Исследование героев - GhostManSD - 10.02.2011 18:07

Sav, спасибо, помогло. Теперь всегда буду ставить хук на CALL.
З.Ы. X2 - и впрямь мусор. Точнее, не совсем мусор, но не то, что нужно. Не совсем то я искал. Ab

(10.02.2011 18:07)GhostManSD Wrote:  З.Ы. X2 - и впрямь мусор. Точнее, не совсем мусор, но не то, что нужно. Не совсем то я искал. Ab

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


RE: Исследование героев - GhostManSD - 10.02.2011 23:55

Допустим, в адресе A идет значение (по дампу) [01 00 00 04 00 08 1F 00]. Могу ли я загнать в EAX только начало этого значения, т.е. (в данном случае) 01?


RE: Исследование героев - Sav - 11.02.2011 00:31

mov eax, byte ptr [A]


RE: Исследование героев - GhostManSD - 11.02.2011 00:38

А если надо закинуть второй байт? mov eax, byte ptr [A+1]?

Error 45: Operand types do not match.


RE: Исследование героев - Sav - 11.02.2011 00:45

Да. Кроме того можно использовать не весь eax (4 байта), а только его четвертинку al:
mov al, [A]


RE: Исследование героев - Berserker - 11.02.2011 01:08

A - константа?


RE: Исследование героев - GhostManSD - 11.02.2011 01:09

Sav, спасибо, работает!


RE: Исследование героев - etoprostoya - 11.02.2011 01:28

Лучше
MOVZX EAX, [A];
Потому что команда
MOV AL, [A];
не изменяет старшие 24 бита и если там что-то было, то так и останется.
EAX = 0x12345678; MOV AL, BYTE PTR [A]; => EAX = 0x12345601;
EAX = 0x12345678; MOVZX EAX, BYTE PTR [A]; => EAX = 0x00000001;


RE: Исследование героев - GhostManSD - 11.02.2011 01:37

(11.02.2011 01:08)Berserker Wrote:  A - константа?
Нет. Вычисляется из указателя.


RE: Исследование героев - Sav - 11.02.2011 01:51

etoprostoya Wrote:MOVZX EAX, [A];
А для word есть аналогичная?


RE: Исследование героев - GhostManSD - 11.02.2011 01:51

etoprostoya, исправил и взял на заметку. Ab

Sav, похоже, есть: http://faydoc.tripod.com/cpu/movzx.htm


RE: Исследование героев - Sav - 11.02.2011 01:59

А управлять через ассемблер как? Код разный, а команда одна и та же.
movzx eax, x
где x - переменная запишет в eax байт или слово?


RE: Исследование героев - GhostManSD - 11.02.2011 02:17

Думаю, MOVZX EAX, BYTE [x] // MOVZX EAX, WORD [x] // MOVZX EAX, DWORD [x].


RE: Исследование героев - etoprostoya - 11.02.2011 02:17

Quote:0F B6 / r MOVZX r16,r/m8 Move byte to word with zero-extension
0F B6 / r MOVZX r32,r/m8 Move byte to doubleword, zero-extension
0F B7 / r MOVZX r32,r/m16 Move word to doubleword, zero-extension
MOVZX EAX, BYTE PTR [MEM]
и
MOVZX EAX, WORD PTR [MEM]
имеют разный код в 32-битном моде.

(11.02.2011 02:17)GhostManSD Wrote:  Думаю, MOVZX EAX, BYTE [x] // MOVZX EAX, WORD [x] // MOVZX EAX, DWORD [x].

Смысл последнего? Ab Нет такого


RE: Исследование героев - Sav - 11.02.2011 10:51

movzx eax, word ptr x

mov eax, word ptr x

Разница, выгода первого?


RE: Исследование героев - etoprostoya - 11.02.2011 12:30

Выгода первого в том, что компилятор его правильно обработает, так как для второго выдаст ошибку - команды MOV eax, word ptr x не существует.


RE: Исследование героев - Sav - 11.02.2011 13:30

Понятно, спасибо.


RE: Исследование героев - MOP - 12.02.2011 17:11

(06.02.2011 03:11)Дьякон Wrote:  
(04.02.2011 15:29)MOP Wrote:  3. >=293512Ch (21AE12C + 787000). Основная динамическая память.
еще раз. Все секции - статические.
Ещё раз - а я что-то другое написал? Rolleyes
21AE12C + 787000 = 293512C = конец секции .data ВОГа, последней секции экзешника. Здесь кончается определённость и начинается динамический хаос.
Ладно, проехали.


RE: Исследование героев - GrayFace - 12.02.2011 18:30

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

(13.09.2010 21:00)Sav Wrote:  Прошу прощения за тупой вопрос: динамический адрес может меняться при нескольких запусках программы на одном компьютере или только на разных компьютерах?
Может. На одном компе он часто остается одинаковым от запуска к запуску, но если, например, установить другой антивирус и т.п., легко может поменяться.

(04.02.2011 15:29)MOP Wrote:  1. < 401000h. В этих адресах работает система, поддерживая работу запущенного приложения. Также там находится стек. Запись/чтение там просто бесполезны и могут убить приложение.
Система на низком уровне использует адреса >7fffffffh (хотя может использовать только половину, если выставить это в манифесте ехе), системные библиотеки грузятся по адресам ниже 7fffffffh, но близким к этой границе. Адреса от 10000h до 401000h могут использоваться, у меня патч к редактору какое-то время, пока не вырос в размере, грузился по адресу 320000h - в этот адрес его поставил сам загрузчик Винды, я так и выставил. Только что для интереса сделал базовый адрес проги 30000h, где обычно стек - стек получился по адресу A0000h.

Подробнее про память и другие интересные вещи можно почитать у Рихтера: http://rouse.drkb.ru/books/rihter_2008.zip


RE: Исследование героев - GrayFace - 13.02.2011 00:31

(03.02.2011 10:25)Prayer Wrote:  Позарез нужно отключить или убрать из меню вообще кнопку "Показать дополнительные опции", чтоб на серваке ее тоже нельзя было использовать. Нашел дефку кнопки - gspbutt.def, текста на ней в genrltxt.txt.
Лучше для этого спользовать IDA (на IsoHunt можно взять). Там в Shift+F12 найти gspbutt.def, по xrefs перейти на место, где используется. Потом нажми Tab. Там же будут передаваться и координаты, и горячая клавиша, правда коды клавишь в Героях свои. Можно занулить её и сделть запредельными координаты, а лучше полностью перепрыгнуть код по созданию кнопки. Чтобы эти изменения внести, нужно сделать патч для Эры.


RE: Исследование героев - GrayFace - 14.02.2011 00:40

По Асму вот эта книга должна быть хорошей: http://rouse.drkb.ru/books/marek.zip


RE: Исследование героев - GhostManSD - 14.02.2011 19:09

GrayFace, спасибо огромное!


RE: Исследование героев - MOP - 20.02.2011 16:55

GhostManSD Wrote:005CCED7 8B0C95 6CA36800 MOV ECX, DWORD PTR DS:[EDX*4+68A36C]
005CCEDE 51 PUSH ECX
005CCEDF |. 6A 01 PUSH 1
СТАЛО
Код:
005CCED7 3E:8B0C85 6CA36800 MOV ECX, DWORD PTR DS:[EAX*4+68A36C]
005CCEDF |. 6A 01 PUSH 1
Во избежание дальнейших недоразумений...
Если кодишь в Олли, да и не только в ней - не указывай лишних данных. В данном случае надо было убрать "DWORD PTR DS:", но ты указал Олли эту дополнительную ненужную инфу. В результате смысл команды не изменился, но машкод её вырос на 1 байт и затёр "PUSH ECX".
То есть, в затирании ты сам виноват. Внимательнее.


RE: Исследование героев - GhostManSD - 26.02.2011 07:09

Подскажите, пожалуйста, реально ли заставить WoG обращаться к текстовому файлу. Выглядит примерно так...
Сам файл (Click to View)
Формат файла (Click to View)

Например, чтобы при !!SN:X0/3/25/78 в переменную z78 подставлялось значение из строки №25 раздела №3 файла GMSDData...
...а при !!SN:X1/5/78/25 значение переменной z78 подставлялось в строку №25 раздела №5.


RE: Исследование героев - Sav - 26.02.2011 10:25

Думаю, можно, только алгоритм обращения к файлу и поиска строки придётся писать самому.


RE: Исследование героев - Berserker - 26.02.2011 18:39

ini-вариант не катит? Уже встроен в ЕРМ.


RE: Исследование героев - Sav - 26.02.2011 18:44

В смысле встроен?


RE: Исследование героев - Berserker - 26.02.2011 19:13

Команда есть в UN для чтения и записи в/из ini.


RE: Исследование героев - etoprostoya - 26.02.2011 21:06

Quote:!!UN:N5/#1/#2/#3/#4
Записать z-переменную в общую секцию файла wog.ini
Quote:!!UN:N6/#1/#2//#3/#4
Прочитать z-переменную из общей секции файла wog.ini
Quote:Так, для записи переменной z-1, названной "Главная_переменная", в файл "Мой.var" в папку GAMES (секция "MyLocalSettings") с опцией 4, используйте:
!!VRy1:S4;
!!VRz-1:S^Главная_переменная^;
!!VRz-2:S^MyLocalSettings^;
!!VRz-3:S^GAMES\My.var^;
!!UN:N5/z-1/y1/-2/-3;



RE: Исследование героев - MOP - 28.02.2011 16:33

Это что вообще?
Code:
Вог-хук №301:
00619BB1   E8 FA2E1600                        CALL mop.0077CAB0
00619BB6   90                                 NOP

0077CAB0   8B7424 0C                          MOV ESI,DWORD PTR SS:[ESP+C]
0077CAB4   8935 C4389302                      MOV DWORD PTR DS:[29338C4],ESI
0077CABA   60                                 PUSHAD
0077CABB   B8 00007000                        MOV EAX,mop.00700000
0077CAC0   3BC6                               CMP EAX,ESI
0077CAC2   77 11                              JA SHORT mop.0077CAD5
0077CAC4   8D05 C0389302                      LEA EAX,DWORD PTR DS:[29338C0]
0077CACA   3BF0                               CMP ESI,EAX
0077CACC   77 07                              JA SHORT mop.0077CAD5
0077CACE   33C0                               XOR EAX,EAX
0077CAD0   A3 C4389302                        MOV DWORD PTR DS:[29338C4],EAX
0077CAD5   61                                 POPAD
0077CAD6   8B35 C4389302                      MOV ESI,DWORD PTR DS:[29338C4]
0077CADC   85F6                               TEST ESI,ESI
0077CADE   C3                                 RETN
У меня из-за этого хука жёсткий баг прямо на старте игры, причём только тогда, если включены wav-звуки, а скрипт создаёт аллоки с помощью erautils.dll.
Если выпилить хук и восстановить ориг. код – всё абсолютно нормально.


RE: Исследование героев - baratorch - 02.07.2011 23:55

Хочу сделать для оффлайна заказ героя в таверне (герой который будет появляться в таверне после нанятого).
В связи с этим вопрос: как узнать какие герои доступны/недоступны для появления в таверне у игрока?
Может подскажет кто?


RE: Исследование героев - Berserker - 03.07.2011 01:11

Может.


RE: Исследование героев - gamecreator - 03.07.2011 01:26

Очевидно, проверить владельца и разрешение на карте.


RE: Исследование героев - baratorch - 03.07.2011 01:48

Berserker, спасибо.


RE: Исследование героев - Berserker - 03.07.2011 03:09

Тебе спасибо 118


RE: ERA II - MaGoth - 07.07.2011 23:13

Berserker,
Не могбы ты пояснить по какому принципу сортируются карты в игре, как их лучше и проще каталогизировать?

И еще один момент хотел бы у вас спросить, никто не планировал присобачить костыль или хук для Хиросов на предмет расшерения каталога maps, до вида как это реализовано в Хиросах 4?
Т.е. Чтобы можно было нормально систематизировать карты по их принадлежности к частям/дополнениям, примерно до такого вида:

...\Герои Меча и Магии III Полное собрание\Maps
\maps:
..\(RoE) - Restoration of Erathia
..\(AB) - Armageddon's Blade
..\(SoD) - Shadow of Death
..\(WoG) - in the Wake of Gods
..\(ТЕ) - Tournament Edition

Т.е. все карты и компании этих частей и типов изданий распаковать по соответствующим каталогам ?!
При большом объеме карт это хотя бы частично решило бы проблему вылетов с числом карт в каталоге больше предназначенного. Имхо.


RE: ERA II - hippocamus - 08.07.2011 00:08

Так ведь есть кнопки для фильтрации!..


RE: ERA II - MaGoth - 08.07.2011 00:17

hippocamus,
Фильтрации где, в игре?! А на кой эта убогая и кастрированная система нужна? Я немного про другое говорил, про каталоги ориентированные конкретно на определенный аддон, с предназначенным ему содержимым. Тогда часть проблемы с количественным содержимым в одном каталоге файлов разрешилась бы, хоть от части. Эта наверное проще реализовать, чем лохматить двиг на предмет поддержи например 30 000 карт в одном каталоге?!


RE: ERA II - hippocamus - 08.07.2011 00:22

Тогда лучше в ini-файле указывать перечень путей с допустимыми для аддона картами.
А для таких модов как Атлантис, 300 спартанцев, A Tribute to Warcraft - будет по 1 карте.


RE: ERA II - MaGoth - 08.07.2011 00:30

Да и еще, помощь треба по этому вопросу:

Нужны адреса где хранятся нужные значения, например, по адресу 0x000D в RescuingAsh(AB).h3m и [Ligue-AB] 22 - Envol des Behemoths.h3m одинаковое, а в Lucky Fate (AB).h3m другое. Вот что оно значит я без понятия.
Может ктонить эти моменты пояснить?

Зы, если не в той теме отписал, соррь, укажите на нужную.


RE: Исследование героев - Berserker - 08.07.2011 00:48

   У меня определённый сжимающийся список для реализации, так что подобные предложения перенаправляю авторам плагинов и иным добровольцам. Моя задача выпустить относительно безбажную платформу, минимальный инструментарий и sdk в целях конкуренции с vcmi/wog для упрощения и стандартизации развития игры Sorry


RE: Исследование героев - MaGoth - 08.07.2011 00:56

Berserker,
а с адресами не подсобишь в плане пояснений ?

Зы, и все-же, возможность расширенного каталога для мапов, многим пришлась бы по душе. имхо.


RE: Исследование героев - etoprostoya - 08.07.2011 00:59

Quote:Нужны адреса где хранятся нужные значения, например, по адресу 0x000D в RescuingAsh(AB).h3m и [Ligue-AB] 22 - Envol des Behemoths.h3m одинаковое, а в Lucky Fate (AB).h3m другое. Вот что оно значит я без понятия.
Я вообще не понял, о чём ты спросил. Sm Идентификаторы принадлежности к аддону (RoE, AB, SoD, WoG)? Что-то другое?


RE: Исследование героев - MaGoth - 08.07.2011 01:10

etoprostoya,
Quote:Идентификаторы принадлежности к аддону (RoE, AB, SoD, WoG)?
да, мне нужно понять как двиг игры читает карты по их принадлежности к той или иной версии части игры. Где эти значения хранятся для каждой из частей и т.д. и т.п.


RE: Исследование героев - etoprostoya - 08.07.2011 01:17

Это самый первый байт. В Воге он 33h, в СоД - 1Ch.


RE: Исследование героев - MaGoth - 08.07.2011 01:24

etoprostoya,
Спасиб, а в остальных?
AB, RoE?


RE: Исследование героев - etoprostoya - 08.07.2011 01:26

15h - RoE, 0Eh - AB, видимо. Сейчас посмотрел.


RE: Исследование героев - MaGoth - 08.07.2011 01:28

Спасибо, будем ковырятся в коде далее. Sm


RE: Исследование героев - baratorch - 08.07.2011 08:32

у меня давно маячит мысля добавить в список сэйвов папки и возможность по ним переходить (дабл клик и кнопка "вверх"). Можно то же сделать и для списка карт. Но не знаю, найдется у меня на это время когда-нибудь.


RE: Исследование героев - etoprostoya - 08.07.2011 10:10

Quote: Длина Описание (код)

 4 Идентификатор формата
   0E 00 00 00 - RoE
   15 00 00 00 - AB
   1C 00 00 00 - SoD
   33 00 00 00 - WoG
 1 ??? Устанавливается в { 01 }, когда на карте присутствует хотя бы один герой.
 4 Высота и ширина карты в клетках (карта квадратная)
 1 0-Одноуровневая карта, 1-Двухуровневая
 4 Длина названия карты в байтах
 * Название карты
 4 Длина описания карты
 * Описание карты
 1 Сложность карты (0-Easy,1-Normal,2-Hard,3-Expert,4-Impossible)



RE: Исследование героев - MaGoth - 08.07.2011 13:14

baratorch,
Quote:у меня давно маячит мысля добавить в список сэйвов папки и возможность по ним переходить (дабл клик и кнопка "вверх"). Можно то же сделать и для списка карт. Но не знаю, найдется у меня на это время когда-нибудь
Вот какраз об этом я просил в соседней теме чтобы реализовали, а в купе с сортировщиком карт, + нормально реализованным инсталлером это было бы оч хорошим решением.
Нет желания начать действия/разработку в этом направлении?

etoprostoya, спасиб еще раз. Sm


RE: Исследование героев - FallenAngel - 09.07.2011 14:09

Такая вещь будет незаменима для судей разных турниров.


RE: Исследование героев - hippocamus - 11.07.2011 13:18

(08.07.2011 10:10)etoprostoya Wrote:   4 Идентификатор формата
   0E 00 00 00 - RoE
   15 00 00 00 - AB
   1C 00 00 00 - SoD
   33 00 00 00 - WoG

   1D 00 00 00 - Heroes Chronicles


RE: Исследование героев - MOP - 06.08.2011 17:12

(28.02.2011 16:33)MOP Wrote:  Это что вообще?
Code:
Вог-хук №301:
00619BB1   E8 FA2E1600                        CALL mop.0077CAB0
00619BB6   90                                 NOP

0077CAB0   8B7424 0C                          MOV ESI,DWORD PTR SS:[ESP+C]
0077CAB4   8935 C4389302                      MOV DWORD PTR DS:[29338C4],ESI
0077CABA   60                                 PUSHAD
0077CABB   B8 00007000                        MOV EAX,mop.00700000
0077CAC0   3BC6                               CMP EAX,ESI
0077CAC2   77 11                              JA SHORT mop.0077CAD5
0077CAC4   8D05 C0389302                      LEA EAX,DWORD PTR DS:[29338C0]
0077CACA   3BF0                               CMP ESI,EAX
0077CACC   77 07                              JA SHORT mop.0077CAD5
0077CACE   33C0                               XOR EAX,EAX
0077CAD0   A3 C4389302                        MOV DWORD PTR DS:[29338C4],EAX
0077CAD5   61                                 POPAD
0077CAD6   8B35 C4389302                      MOV ESI,DWORD PTR DS:[29338C4]
0077CADC   85F6                               TEST ESI,ESI
0077CADE   C3                                 RETN
У меня из-за этого хука жёсткий баг прямо на старте игры, причём только тогда, если включены wav-звуки, а скрипт создаёт аллоки с помощью erautils.dll.
Если выпилить хук и восстановить ориг. код – всё абсолютно нормально.
Так что, никто не знает?
Это хотя бы нужная вещь?


RE: Исследование героев - Berserker - 06.08.2011 17:17




RE: Исследование героев - AKuHAK - 13.08.2011 22:59

можно такой вопрос - как сделать чтобы карты из Хроник героев открывались в стандартном редакторе? Просто выдаёт вот такую ошибку Image: 1313258109-clip-11kb.jpg?nocache=1
Вот к примеру карта, буду очень благодарен, если будет указан адрес и правило, по которому надо его менять.


RE: Исследование героев - Berserker - 13.08.2011 23:19

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


RE: Исследование героев - etoprostoya - 13.08.2011 23:37

http://zalil.ru/31549674 - вот исправил карту, открывается редактором карт Дыхания Смерти. Там всего-то нужно было распаковать карту и исправить первый байт с 1Dh на 1Ch.
Сразу скажу, изменять и сохранять карту не пробовал.


RE: Исследование героев - AKuHAK - 14.08.2011 01:01

(13.08.2011 23:37)etoprostoya Wrote:  http://zalil.ru/31549674 - вот исправил карту, открывается редактором карт Дыхания Смерти. Там всего-то нужно было распаковать карту и исправить первый байт с 1Dh на 1Ch.
Сразу скажу, изменять и сохранять карту не пробовал.
Большое Спасибо!! Ещё вопрос - чем надо распаковывать?


RE: Исследование героев - etoprostoya - 14.08.2011 01:04

Это GZIP-архив, распаковывается, соответственно, его распаковщиками. Я распаковывал в тотал коммандере. ВинРар и 7z должны поддерживать этот формат, хотя и могут выдавать ошибки.


RE: Исследование героев - AKuHAK - 14.08.2011 01:08

(14.08.2011 01:04)etoprostoya Wrote:  Это GZIP-архив, распаковывается, соответственно, его распаковщиками. Я распаковывал в тотал коммандере. ВинРар и 7z должны поддерживать этот формат, хотя и могут выдавать ошибки.
ооо гигантское спасибо!!! вопросов пока больше не имею!!!


RE: Исследование героев - AKuHAK - 14.08.2011 02:19

Только вопрос совсем уж дурацкий - как упаковать файлы обратно? карты упаковываются нормально (если выбрать режим сжатия нормальный), а вот кампании уже нет. То есть мне пока не удалось запаковать кампанию обратно, чтобы она стала читаемой. Речь сейчас не о хрониках, а о стандартных кампаниях для третьих героев.


RE: Исследование героев - Flashback - 14.08.2011 14:07

сейвы тоже сжаты в гзип и после распаковки их можно обратно не упаковывать, мб, и карты тоже можно не жать.


RE: Исследование героев - etoprostoya - 14.08.2011 14:22

Можно открыть карту в редакторе SoD и пересохранить: она автоматически упакуется.


RE: Исследование героев - AKuHAK - 14.08.2011 16:23

О проделал исследование и выяснил, что карты и кампании сжаты в гзип без сохранения заголовков
Code:
gzip -n

   при распаковке и сжатии обратно файлы идентичны. Кстати, если запаковать без использования флага -n, то карта будет открываться в игре, только если мы не будем переименовывать файл.
Кампании сперва следует разбить на части, можно просто открыв в гекс редакторе и найдя gzip заголовки, я лично использовал H3RExtrator.exe, так как это намного быстрее. Потом можно при желании отредактировать карты, каждую запаковать при помощи команды выше и склеить их (например при помощи copy /b ...+...+... ...). При распаковке кампаний видно, что они построены весьма просто - сперва идут свойства всей миссии в целом, а затем уже тупо по очереди идут карты. К сожалению частенько после таких махинаций редактор кампаний отказывается открывать их, но ничего страшного - в игре никаких багов не наблюдается и кампании остаются вполне играбельными. Сейчас борюсь со свойствами всей миссии в целом...

upd Распакованные кампании не признаются игрой. Карты признаются.


RE: Исследование героев - hippocamus - 18.08.2011 21:46

А что - Хроники могут открывать карты?
Я знаю, что у них первый байт другой, 1D.
Вообще отличие этих карт от СОДовских вроде только в уменьшенном количестве героев (127?). И в наличии героя с именем Тарнум. В общем я точно не помню, но вроде в Хрониках нет никаких особых объектов, ни особых условий побед-поражений-переходов в кампаниях. Или есть? Просто самого интересует, я ведь редактор делаю.


RE: Исследование героев - etoprostoya - 18.08.2011 22:02

Новых каких-то объектов там нет, я даже лоды Хроник и Дыхания Смерти сравнивал: все объекты, что есть в Хрониках, есть и в Дыхании Смерти.
А там с Тарнумом? Он кого заменяет?


RE: Исследование героев - AKuHAK - 19.08.2011 01:22

В общем проделал ещё немного исследований и выяснил, что кампании полностью совместимы, если проделать некоторые изменения:
  • сперва разрезать каждую кампанию на 9 частей (ну кроме древа и луны), можно с помощью h3extractor'a, можно ручками найдя гзип сигнатуры;
  • распаковать все 9 частей;
  • во всех кроме первой заменить первый байт на
  • снова запаковать все карты с помощью gzip -n;
  • открыть первую карту (в редакторе карт) и поменять портрет Тарнуму, сохранить карту
    Вот этого кстати делать не надо - надо менять номера портретов вручную, редактор много отсебятины вносит.

    теперь самое сложное - редактирование собственно свойств кампании, для этого откройте её в гексе
  • первый байт меняем на 06 (07 кампании Хроник, 06 кампании клинка Армагеддона, дальше мне стало лень искать сигнатуры)
  • пятый байт меняем на 0D (это метка кампании Армаггеддон, каждая из стандартных шаблогов кампаний имеет свой номер). Насколько мне известно, только в ней 8 карт. У всех Хроник он равен 0, так как там в принципе нету этих миникарт с захваченными областями.
  • ищем по очереди названия карт (всякие там glory a.h3m), переименовываем наши карты соответственно в порядке распаковки (в принципе необязательный пункт, но желательный для полной идентичности).
  • !!!и наконец самый главный пункт - надо поменять размеры карт. Берём наше название (например glory a.h3m) опять находим его в коде и редактируем следующие 4 байта. Так как после редактирования даже одного байта и упаковки карты обычно меняют размер, то придётся его прописать заново. Например, если новый размер будет 11198 байт, то в гекс вписываем BE 2B 00 00. И так для каждой из карт.
  • сохраняем свойства кампании, упаковываем их с помощью gzip -n.
  • склеиваем все кусочки при помощи
    Code:
    copy /b ... + ... + ... out.h3m
  • Готово!
В принципе игра понимает и распакованные файлы, только тогда надо не забывать про прописывание размеров после названия карты (естественно, что для распакованных карт размеры возрастут). То есть по идее можно вставить и распакованные файлы карт, да и свойства кампании не паковать. Только надо учесть, что кампания хоть и отлично откроется в редакторе карт, но после сохранения свойства кампании сожмутся (карты останутся распакованными).
С Тарнумом вообще дело тёмное. Если открыть первую карту в редакторе и тут же сохранить её, то обнаружится, что 12 байтов связанных с Тарнумом и Рабаком изменились по непонятным причинам. Карта по прежнему не загрузится, поскольку игре нужны не эти непонятные 10 байтов, а "легальный" портрет Тарнума. Портрет вообще хранится в другом месте и занимает ровно два байта, если отредактировать его вручную и не трогать эти непонятные 10 байтов, то карта превосходно загружается. К сожалению надо тестировать не произойдёт ли чего плохого во время геймплея, а это долго и нудно. Так что по идее можно сократить количество изменённых байтов ещё на 12 штук. Итого набирается 12 байтов обязательных и ещё где-то 16 байт на размеры карт.
Вот кому интересно, может глянуть http://zalil.ru/31574865, я пока не нашёл подвоха.
На выходных выложу хроники. Кстати интересно нельзя ли расширить список портретов вместо того чтобы тупо заменять уже существующие?
upd - в хрониках же наоборот больше портретов или я что-то путаю?


RE: Исследование героев - hippocamus - 19.08.2011 02:01

Портретов больше, героев меньше?
Тарнум заменяет вроде первого из героев кампании СОД.
Хотя я не уверен.


RE: Исследование героев - baratorch - 19.08.2011 08:38

AKuHAK, спасибо большое, очень полезная информация. Давно хочу сделать пак для ХД, полноценно добавляющий хроники в СоД.


RE: Исследование героев - AKuHAK - 19.08.2011 21:46

http://zalil.ru/31578703
Вот хроники героев практически идентичные, с самыми минимальными изменениями. Номера портретов уменьшены на 0Е. Тарнум в каждой кампании заменяет нового героя (это в хрониках так, это не моё творчество) )) По поводу редактора карт он меняет все карты хроник по одинаковому, так что я менял только портреты. Заголовок кампании распакованный, а карты упакованные.


RE: Исследование героев - AKuHAK - 10.09.2011 22:20

Вопрос - никто не знает, где хранятся координаты кусочков карты показываемой перед кампанией? Вот например здесь Image: 04611e1cabc6t.jpg
К примеру я узнал, что координаты левого верхнего угла "верхнего" острова 170 пикселей от верхнего края и 55 пикселей от левого, в каком виде это хранится в игре? Мне бы хотя бы гекс отображение.


RE: Исследование героев - baratorch - 11.09.2011 14:18

Quote:Вот хроники героев практически идентичные, с самыми минимальными изменениями. Номера портретов уменьшены на 0Е. Тарнум в каждой кампании заменяет нового героя (это в хрониках так, это не моё творчество) )) По поводу редактора карт он меняет все карты хроник по одинаковому, так что я менял только портреты. Заголовок кампании распакованный, а карты упакованные.
файл не найден 105


RE: Исследование героев - AKuHAK - 11.09.2011 16:00

Вот закончил перевод английских хроник и поправил портрет в Хронике Восстания.
http://depositfiles.com/files/lmxh4ntl2


RE: Исследование героев - Berserker - 11.09.2011 16:04

Скачал, спасибо!
Одна проблема - не распаковать архив. Новый 7z что-ли?


RE: Исследование героев - AKuHAK - 11.09.2011 16:24

(11.09.2011 16:04)Berserker Wrote:  Скачал, спасибо!
Одна проблема - не распаковать архив. Новый 7z что-ли?

ага ))) 9.23 альфа
вот перезалил


RE: Исследование героев - Berserker - 11.09.2011 17:53

Теперь ок, открылось в редакторе.


RE: Исследование героев - solitaire345 - 14.09.2011 22:14

(10.09.2011 22:20)AKuHAK Wrote:  Вопрос - никто не знает, где хранятся координаты кусочков карты показываемой перед кампанией? Вот например здесь Image: 04611e1cabc6t.jpg
К примеру я узнал, что координаты левого верхнего угла "верхнего" острова 170 пикселей от верхнего края и 55 пикселей от левого, в каком виде это хранится в игре? Мне бы хотя бы гекс отображение.

The pointers for campaign areas are at 0063BC50. Each entry points to tables for each campaign map. Each table holds n structures, where n is number of scenarios in particular campaign map. The structures are like this:
Code:
00000000 X               dd ?
00000004 Y               dd ?
00000008 Enabled_Red     dd ?
0000000C Enabled_Blue    dd ?
00000010 Enabled_Tan     dd ?
00000014 Enabled_Green   dd ?
00000018 Enabled_Orange  dd ?
0000001C Enabled_Violet  dd ?
00000020 Enabled_Teal    dd ?
00000024 Enabled_Pink    dd ?
00000028 Selected_Red    dd ?
0000002C Selected_Blue   dd ?
00000030 Selected_Tan    dd ?
00000034 Selected_Green  dd ?
00000038 Selected_Orange dd ?
0000003C Selected_Violet dd ?
00000040 Selected_Teal   dd ?
00000044 Selected_Pink   dd ?
00000048 Completed_Red   dd ?
0000004C Completed_Blue  dd ?
00000050 Completed_Tan   dd ?
00000054 Completed_Green dd ?
00000058 Completed_Orange dd ?
0000005C Completed_Violet dd ?
00000060 Completed_Teal  dd ?
00000064 Completed_Pink  dd ?

X and Y are coordinates, other entries are addresses of image file names.


RE: Исследование героев - AKuHAK - 18.09.2011 19:11

solitaire345, спасибо, но мне всего лишь надо было узнать в каком формате хранятся координаты ))

Выкладываю свою версию Хроник Героев. Будут какие недочёты - пишите, исправлю. Полный список изменений внутри архива в папке Help. Ставится только на Эру 1.9
http://depositfiles.com/files/swt3fm083
44d0e78b1fad9a53ff223565987a93b0 *HeroesCronicles.exe 92,2Мб
Image: d648aaa9f43ft.jpg Image: 6a94916d1d70t.jpg
Вот отзеркалил, но прошу по возможноости качать с депозита:
http://www.multiupload.com/WQ6FGS69F4



RE: Исследование героев - Berserker - 18.09.2011 19:22

Спасибо за проделанную работу!


RE: Исследование героев - AKuHAK - 24.09.2011 19:01

Выкладываю немного пофиксенную версию Хроник Героев для Эры. Добавил кампании дыхания смерти. Вынес звуки и видео в отдельные архивы. В общем уже вполне играбельная версия с возможностью чистого удаления. Полный список под катом.

http://www.putlocker.com/file/66D70642447C3EB3 94.3Mb MD5 0C3DD7FCEA4DDBF0209715CD735C77B5 - полная версия 0.2
http://www.putlocker.com/file/FA160C2C2C9CF26C 25.2Mb MD5 9E39F153458946D5A7E46E89763E669D - облегчённая версия 0.2 (отличается от обычной только отсутствием herchron.vid)

Список изменений в версии 0.2 (Click to View)



RE: Исследование героев - Sav - 25.09.2011 22:57

Кто-нибудь знает, что делает воговский хук на адрес 0x04C4141 (вернее, с этого места начинается правка, а сам хук чуть дальше)? Неужели только исключает из списка карт карты с идентефикатором, большим 0x33?


RE: Исследование героев - Berserker - 26.09.2011 00:36

// проверка на защищенную карту
{0x4C4143,0,DP(LoadProtected)}

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


RE: Исследование героев - Sav - 26.09.2011 02:18

Ясно, спасибо.


RE: Исследование героев - hippocamus - 02.10.2011 15:14

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


RE: Исследование героев - Berserker - 02.10.2011 15:23

Я бы предположил мусор с где-то указанной длиной.


RE: Исследование героев - kostya_76 - 10.12.2011 13:18

Может кто-нибудь подсказать, как правильно скомпилировать эту длл MoP'а в Дельфи7?

Quote:

Изменяю название библиотеки Win на Windows, остальные вроде не нужны, но можно и оставить, кроме VPUtils.
Еще не понятно, что такое {$FRAME-} в строке: PROCEDURE HOOK_tent; ASSEMBLER; {$FRAME-}, чтобы компилятор не ругался, приходится убирать.
Пробовал в разных папках компилить, в том числе и в папке с Эрой.

Компилится нормально, но адрес в созданном хуке получается левый - соответственно вылет при обращении. Если в Olly адрес перехода на функцию HOOK_tent поменять на нормальный - все работает.


RE: Исследование героев - Berserker - 10.12.2011 13:50

kostya_76, скомпилировал на VirtualPascal:
http://wikisend.com/download/110454/Tent.dll

FRAME соответствует опции W в Delphi. Utils не нужен.


RE: Исследование героев - kostya_76 - 10.12.2011 16:07

Berserker, спасибо, скачал, работает.
Только цель как-бы в другом: получить работоспособный пример-шаблон подключения длл к Эре. Причем на удобной для меня платформе. В этом смысле больше бы подошел билдерAb, но хотя-бы на дельфи для начала.
Пробовал скомпилировать эту длл в Virtual Pascal v2.1 - вообще ничего не получилось. Да и после попыток работы с ним вообще всякое желание пропадает этим заниматься.

Добавил эту самую директиву W- вместо FRAME- - не помогло.
Хотя бы знать в каком направлении копать Sm.
Имеет ли смысл пытаться в отладчике докопаться до алгоритма получения этого адреса: @HOOK_tent? Думаю, это не самый верный путь.


RE: Исследование героев - Berserker - 10.12.2011 16:22

Quote:получить работоспособный пример-шаблон подключения длл к Эре
Есть пример для GNU C++ и для Delphi.

В Эре 1.9+ Tools\Era\SDK


RE: Исследование героев - kostya_76 - 10.12.2011 17:35

Berserker, Так в примере подключение через длл ЕРМ-инструкций, я естественно смотрел этот пример и пробовал подключать.
Но интересует именно встраивание хуков, в частности создание с их помощью триггеров, как в примере МоР'а. Поэтому и хочу разобраться, почему не получается.

Или вот прикладной пример: нужно встраивать программу создания зеркальной карты для подмены исходной карты, созданной генератором прямо в игре. Может когда-нибудь до этого доберусь.


RE: Исследование героев - Berserker - 10.12.2011 18:53

Попробуйте посмотреть в Era\Tools\Era\Sources\Era 1.9 Delphi:
triggers.pas

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


RE: Исследование героев - Berserker - 18.12.2011 21:42

Обновим тень перемещения:
493350 - F (0, 1); THISCALL;


Теперь если поменять скриптом скорость монстра, можно и сеточку обновить...


RE: Исследование героев - Al_Mualim - 23.12.2011 02:04

(10.12.2011 13:50)Berserker Wrote:  kostya_76, скомпилировал на VirtualPascal:
http://wikisend.com/download/110454/Tent.dll
What this dll do?


RE: Исследование героев - Berserker - 23.12.2011 02:17

New !?FU29500 trigger for tent I suppose.


RE: Исследование героев - MOP - 10.02.2012 18:26

Уже несколько человек спрашивало…
Code:
; Обновить экран встречи героев
!!UN:C6962576/4/?y1; [6A3D90h] - swapManager
!!SN:E5957888/2/y1;
Не помню, но артефакты в слотах, вроде, обновляются отдельно.


RE: Исследование героев - kostya_76 - 12.02.2012 00:26

(10.12.2011 16:22)Berserker Wrote:  
Quote:получить работоспособный пример-шаблон подключения длл к Эре
Есть пример для GNU C++ и для Delphi.

В Эре 1.9+ Tools\Era\SDK
Как создать хук с помощью этого инструмента я понял. Вот только в Делфи у меня не получается создать форму в длл. Вылетает игра. В книгах обычно примеры создания форм в длл с вызовом из приложения, также написанного на Делфи .

В билдере получается форму создавать, в Делфи - хуки)

А код для GNU С++ в билдере не компилится.

Есть длл с хуком для подмены файла карты. После генерации карты, до загрузки. Подменял под отладчиком - работает.
Создаю форму. Вызываю Form1.Show(); хоть в обработчике хука, хоть при загрузке длл - вылет.
Так тоже не получается:
VAR AOwner: TComponent;
Form1 := TForm1.Create(AOwner);
Form1.Show();

Хотя в любом случае, программа для обработки карты написана на С++, и подключать ее в Делфи - это извращение.


RE: Исследование героев - kostya_76 - 12.02.2012 00:54

(12.02.2012 00:33)GreyGhost Wrote:  делфи это всего навсего расширение паскаля
Я как-бы в курсе)


(12.02.2012 00:33)GreyGhost Wrote:  а вот создание FORM(окна) для перехвата функции - это извращение.

   
Откуда такое смелое предположение о цели создания формы?
Кроме как для организации интерфейса, она мне не нужна)
В приведенном мною примере особой связи между хуком и созданием формы нет.

А вообще, спасибо за содержательный комментарий.


RE: Исследование героев - Berserker - 12.02.2012 13:16

GreyGhost, да брось. И чего ты пост потёр из Кино/Сериалы? )
kostya_76, а какие ошибки в билдере?


RE: Исследование героев - gamecreator - 12.02.2012 14:08

(12.02.2012 00:26)kostya_76 Wrote:  В билдере получается форму создавать, в Делфи - хуки)
так сделай две библиотеки Sm и вызывай одну из другой


RE: Исследование героев - kostya_76 - 12.02.2012 15:10

(12.02.2012 13:16)Berserker Wrote:  kostya_76, а какие ошибки в билдере?

Вот такие:
Я вообще не понимаю, что означает после подстановки строка:
typedef __declspec(align(1)) struct TTxtFile
А именно - что такое (align(1))

gamecreator Wrote:так сделай две библиотеки Sm и вызывай одну из другой

Если бы знал как, то наверное и хук смог бы написать на С++ без использования SDK.


RE: Исследование героев - Berserker - 12.02.2012 15:29

kostya_76, запрещает выравнивание полей в структуре по границе в 4 байта или более. Для билдера попробуй убрать мой макрос и обернуть эти структуры в:
Code:
#pragma pack(1)
...описание типа...
#pragma pack()



RE: Исследование героев - kostya_76 - 12.02.2012 16:10

Berserker, Так?
Ошибки указывают на строки с закрывающими фигурными скобками структур


RE: Исследование героев - gamecreator - 12.02.2012 16:33

обернуть - значит вложить в открывающую и закрывающую конструкцию
Code:
#pragma pack(1)
struct foobar
{
int foo;
double bar;
};
#pragma pack()


и вообще, почему там typedef?


RE: Исследование героев - Berserker - 12.02.2012 16:46

сишный стиль объявления.


RE: Исследование героев - gamecreator - 12.02.2012 16:53

не может того быть. нет typedef с одним параметром.


RE: Исследование героев - Berserker - 12.02.2012 17:45

Может.
http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c


RE: Исследование героев - gamecreator - 12.02.2012 18:13

там у typedef 2 параметра.


RE: Исследование героев - AVS - 12.02.2012 18:16

Интересно насколько сложно полностью перехватить создание случайных карт? (=встроить свой генератор, если я его допишу всетаки %) )


RE: Исследование героев - Sav - 12.02.2012 18:44

Если ты действительно напишешь хороший генератор, думаю желающие его встроить найдутся.


RE: Исследование героев - kostya_76 - 12.02.2012 20:08

Berserker, Еще ошибку выдает:



RE: Исследование героев - AVS - 12.02.2012 20:15

(12.02.2012 00:26)kostya_76 Wrote:  Создаю форму. Вызываю Form1.Show(); хоть в обработчике хука, хоть при загрузке длл - вылет.
Так тоже не получается:
VAR AOwner: TComponent;
Form1 := TForm1.Create(AOwner);
Form1.Show();

И не получится. Убери формы вообще и все связи с VCL.

Хотя в теории подружить VCL с героями возможно (но формы будут открываться отдельно от окна героев), а вот встроить их внутрь интерфейса нереально (если бы у окон героев были оконные хендлы, а их там AFAIK нет, то можно было бы вообще вставлять праактически любой виджет из VCL прямо на любое окно в игре)


RE: Исследование героев - kostya_76 - 12.02.2012 20:40

(12.02.2012 20:15)AVS Wrote:  И не получится. Убери формы вообще и все связи с VCL.

Хотя в теории подружить VCL с героями возможно (но формы будут открываться отдельно от окна героев), а вот встроить их внутрь интерфейса нереально (если бы у окон героев были оконные хендлы, а их там AFAIK нет, то можно было бы вообще вставлять праактически любой виджет из VCL прямо на любое окно в игре)

Само-собой это окно отдельно от окна героев должно открываться.


RE: Исследование героев - Berserker - 12.02.2012 21:02

Реквизит встроила VCL-ые формы в игру. zvslib1 использует формы билдера для новых воговских диалогов. Я, к сожалению, добился только глючного модального запуска и бросил.
kostya_76, замените __stdcall на WINAPI.


RE: Исследование героев - kostya_76 - 12.02.2012 21:10

Berserker, Не помогает - такое сообщение об ошибке.
Собственно, мне пока нужен только хук, попробую сейчас функцию
typedef __stdcall void (*THook) (void* HandlerAddr, int HookType, int PatchSize, void* CodeAddr);


RE: Исследование героев - AVS - 12.02.2012 21:22

(12.02.2012 20:40)kostya_76 Wrote:  Само-собой это окно отдельно от окна героев должно открываться.

Тогда при запуске в хуке Application.Initialize. Еще возможно необходимо установить Application.Handle на реальный хендл героев.
Формы создавать Tform1.Create(nil) и ставить FreeOnRelease. Уже это должно работать.

(12.02.2012 21:02)Berserker Wrote:  Реквизит встроила VCL-ые формы в игру.

Ну если хукнуть главный цикл и "подсунуть под" окно героев VCL форму (чтобы окно героев было дочерним) потом наверное переписав обрабтку мыши и клавиатуры может и получится.

(12.02.2012 21:02)Berserker Wrote:  zvslib1 использует формы билдера для новых воговских диалогов. Я, к сожалению, добился только глючного модального запуска и бросил.

Увы я только мельком поглядел на исходники самого вога - этой либы в них нет - а в самом воге диалоги реализованы через грязные хаки с VMT классов внурти движка героев.


RE: Исследование героев - baratorch - 12.02.2012 21:43

kostya_76
__stdcall void замени на void __stdcall


RE: Исследование героев - kostya_76 - 12.02.2012 22:01

(12.02.2012 21:43)baratorch Wrote:  kostya_76
__stdcall void замени на void __stdcall

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


RE: Исследование героев - kostya_76 - 13.02.2012 00:39

А при попытке создания хука ошибки линковщика:



RE: Исследование героев - Sav - 13.02.2012 00:54

Мне для работы пришлось переименовать era.cpp в era.h.


RE: Исследование героев - kostya_76 - 13.02.2012 18:25

(13.02.2012 00:54)Sav Wrote:  Мне для работы пришлось переименовать era.cpp в era.h.

От появления предупреждений при линковке это действительно избавило. Но не более того.

От ошибок линковщика, приведенных на последнем скрине удалось избавиться, убрав галочки "Use VCL" и "Multi Threaded" при создании шаблона библиотеки мастером.
Но хук не создается, и вообще секции этой длл в памяти не появляются.

В предыдущем примере с удалением объектов с помощью ЕРМ-инструкций также в памяти длл не видно, но тем не менее объекты удаляются.


RE: Исследование героев - Berserker - 13.02.2012 20:45

Я залью сегодня обновлённый вариант.


RE: Исследование героев - Berserker - 13.02.2012 22:50

http://wikisend.com/download/364322/SDK.rar
Переписан заголовочный файл, обновлён пример, добавлена демонстрация установки перехватчика.

Code:
#include <windows.h>
#include "Era.h"
  
using namespace Era;
  
const int ADV_MAP   = 37;
const int CTRL_LMB  = 4;
const int LMB_PUSH  = 12;

void __stdcall OnAdventureMapLeftMouseClick (TEvent* Event)
{
  ExecErmCmd("CM:I?y1 F?y2 S?y3;");
  if ((y[1] == ADV_MAP) && (y[2] == CTRL_LMB) && (y[3] == LMB_PUSH))
  {
    ExecErmCmd("CM:R0 P?y1/?y2/?y3;");
    ExecErmCmd("UN:Ey1/y2/y3;");
    if (f[1])
    {
      ExecErmCmd("UN:Oy1/y2/y3/1;");
      ExecErmCmd("IF:L^{~red}Object was deleted!{~}^;");
    }
  }
}

BOOL __stdcall Hook_BattleMouseHint (THookContext* Context)
{
  ExecErmCmd("IF:L^{~gold}This is a battle hint!{~}^;");
  return EXEC_DEF_CODE;
}

extern "C" __declspec(dllexport) BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID lpReserved)
{
  if (reason == DLL_PROCESS_ATTACH)
  {
    ConnectEra();
    RegisterHandler(OnAdventureMapLeftMouseClick, "OnAdventureMapLeftMouseClick");
    ApiHook((void*) Hook_BattleMouseHint, HOOKTYPE_BRIDGE, (void*) 0x74fd1e);
  }
  return TRUE;
};



RE: Исследование героев - kostya_76 - 14.02.2012 00:12

Berserker, Все равно не получается )
В смысле, компилится нормально, только это предупреждение также осталось:
[C++ Warning] Era.h(130): W8058 Cannot create pre-compiled header: initialized data in header
При запуске то же сообщение:
И в памяти, соответственно , длл не появляется.
Может я что-то не так делаю? Бросаю созданную длл в папку EraPlagins. Все остальные плагины работают.


RE: Исследование героев - Berserker - 14.02.2012 01:38

Плагин должен иметь расширение *.era. Ну а предупреждение компилятора нормальное.


RE: Исследование героев - kostya_76 - 14.02.2012 16:03

(14.02.2012 01:38)Berserker Wrote:  Плагин должен иметь расширение *.era. Ну а предупреждение компилятора нормальное.

На работоспособные длл изменение расширения на .era никак не влияет: работают и так и так.
А вот в данном примере смена расширения приводит к вылету после сообщения об исключении.
Если в DllMain оставить только вызов ConnectEra() , тогда нормально загружается.

Berserker, а ты пробовал сам скомпилировать и запустить этот пример? Работает?


RE: Исследование героев - Berserker - 14.02.2012 17:02

kostya_76, да, причём как часы. 20 КБ размер выходит.

Quote:На работоспособные длл изменение расширения на .era никак не влияет: работают и так и так.
Не так. *.dll - это старые плагины, *.era - новые. Новые грузятся ДО вога и основаны на системе событий.

А вы вообще на какой версии эры экспериментируете? Я видел в пути WT.


RE: Исследование героев - kostya_76 - 14.02.2012 17:20

(14.02.2012 17:02)Berserker Wrote:  kostya_76, да, причём как часы. 20 КБ размер выходит.

Это, я так понимаю, в GNU компилилось , а не в билдере? У меня весит 9 КБ.

(14.02.2012 17:02)Berserker Wrote:  Не так. *.dll - это старые плагины, *.era - новые. Новые грузятся ДО вога и основаны на системе событий.
В данном примере это принципиально? Пример на Делфи прекрасно работает без переименований.

(14.02.2012 17:02)Berserker Wrote:  А вы вообще на какой версии эры экспериментируете? Я видел в пути WT.
Era 1.9, экзешник насколько помню потом еще отдельно скачивал.
А установлено в папку с WT.


RE: Исследование героев - Berserker - 14.02.2012 17:52

Я не знаю, что там чудим билдер, но суть проста. Era.dll загружается, получаются адреса её функций и вызываются. Если мне предоставится возможность проверить на билдере, я попробую. Дома его нет.


RE: Исследование героев - kostya_76 - 14.02.2012 18:20

(14.02.2012 17:52)Berserker Wrote:  Я не знаю, что там чудим билдер, но суть проста. Era.dll загружается, получаются адреса её функций и вызываются. Если мне предоставится возможность проверить на билдере, я попробую. Дома его нет.

Для меня это не так уж просто) Попробую еще поковыряться в опциях. Можно еще мап-файл поизучать)


RE: Исследование героев - kostya_76 - 16.02.2012 02:56

Berserker, Если поменять hEra = (HINSTANCE) v[1]; на hEra = LoadLibrary("era.dll");,
то все работает, кроме функции ApiHook - Вероятно ее нет в библиотеке)
А Функция Hook работает, ну и остальные вроде тоже.

Адрес hEra указывал куда-то в середину секции, и в результата все GetProcAddress возвращали нули.


RE: Исследование героев - Berserker - 16.02.2012 12:11

ApiHook в Эре 2)


RE: Исследование героев - totkotoriy - 19.02.2012 13:00

Может у кого есть рабочий код на с++ какого-либо хука, который затем передает управление ERM триггеру?


RE: Исследование героев - gamecreator - 19.02.2012 13:22

так в Эре вроде есть функция, выполняющая ерм. вот с помощью нее и вызвать триггер.


RE: Исследование героев - totkotoriy - 19.02.2012 13:24

(19.02.2012 13:22)gamecreator Wrote:  так в Эре вроде есть функция, выполняющая ерм. вот с помощью нее и вызвать триггер.
Как?


RE: Исследование героев - Sav - 19.02.2012 13:27

ExecErmCmd ("FUxxxx:P;");


RE: Исследование героев - totkotoriy - 19.02.2012 14:01

(19.02.2012 13:27)Sav Wrote:  ExecErmCmd ("FUxxxx:P;");
Дык можете рабочий пример написать? А то я так долго мучатся буду. Что эта функция делает? Вызывает хук и запускает по нему триггер?


RE: Исследование героев - gamecreator - 19.02.2012 14:26

функция выполняет ЕРМ-код. рабочий пример:
ExecErmCmd ("FU12345:P;");
выполнит ЕРМ-код !!FU12345:P;


RE: Исследование героев - gamecreator - 19.02.2012 14:36

http://wforum.heroes35.net/showthread.php?tid=3155&pid=62813#pid62813


RE: Исследование героев - totkotoriy - 19.02.2012 14:43

(19.02.2012 14:26)gamecreator Wrote:  функция выполняет ЕРМ-код. рабочий пример:
ExecErmCmd ("FU12345:P;");
выполнит ЕРМ-код !!FU12345:P;
А где взять era.cpp тогда? И надо ли восстанавливать данные затертого хука?


RE: Исследование героев - gamecreator - 19.02.2012 14:58

причем тут era.cpp? причем тут хук? это не хук вообще, это блокирующая функция, которая выполняет команду ерм


RE: Исследование героев - Sav - 19.02.2012 14:59

totkotoriy, не пойму, что тебе нужно. Я создавал триггер на паскале, но основная часть там - ассемблер, поэтому я могу без особых затрат времени перевести его на c++ и показать тебе код. Нужно?


RE: Исследование героев - totkotoriy - 19.02.2012 15:51

(19.02.2012 14:59)Sav Wrote:  totkotoriy, не пойму, что тебе нужно. Я создавал триггер на паскале, но основная часть там - ассемблер, поэтому я могу без особых затрат времени перевести его на c++ и показать тебе код. Нужно?
Да, я про это и говорю. Код хука на С++ я уже написал, мне нужен теперь рабочий код на ассемблере для вызова триггера в ERM.


RE: Исследование героев - gamecreator - 19.02.2012 16:21

что и откуда ты вообще хочешь вызвать?


RE: Исследование героев - Sav - 19.02.2012 18:45

totkotoriy, смотри там: http://wforum.heroes35.net/showthread.php?tid=2587


RE: Исследование героев - kostya_76 - 19.02.2012 19:21

(19.02.2012 15:51)totkotoriy Wrote:  Да, я про это и говорю. Код хука на С++ я уже написал, мне нужен теперь рабочий код на ассемблере для вызова триггера в ERM.

Я ж тебе показывал пример. Весь код создания триггера это 4 строчки:

PUSH 29500 //номер ERM-функции. Меняйте на любой доступный.
MOV EAX, 0x74CE30
CALL EAX //вызываем C_FUNC_ZVS_CALLFU
ADD ESP, 4

Просто в примере с палаткой добавлены дополнительные операции по вызову параметров для использования в создаваемом триггере.

Вот пример, работающий с адресом 4074AC, который ты давал:
Добавил в скрипт триггер - срабатывает где-то после генерации карты.
Только хук в этом примере создан с помощью Эры 1.9. То есть еще файл Era.h нужен. Немного выше есть ссылка на него от Берсеркера.


RE: Исследование героев - totkotoriy - 22.02.2012 17:38

(19.02.2012 19:21)kostya_76 Wrote:  файл Era.h нужен. Немного выше есть ссылка на него от Берсеркера.
Спасибо, но я не могу нигде найти эту библиотеку.

И еще хотел спросить что за адрес 6992D0 в этой команде mov eax,DWORD PTR DS:[0X6992D0]? Он для другого хука будет такой же?
Костян, и можешь еще прислать скомпилиный этот код? я скомпилил его чуть по другому (без era.h) и у меня все равно в игре вылетает(


RE: Исследование героев - MOP - 22.02.2012 19:30

(22.02.2012 17:38)totkotoriy Wrote:  И еще хотел спросить что за адрес 6992D0 в этой команде mov eax,DWORD PTR DS:[0X6992D0]? Он для другого хука будет такой же?
heroWindowManager.
Для каждого хука свой затираемый этим хуком код.


RE: Исследование героев - Sav - 22.02.2012 21:48

era.h, которую точно принимает MSVC++ 9.0 прилагается к тому, что я делал выше.

totkotoriy, если ты не осилил плагин, которыя я для тебя переписал, вот упрощённый и чуть более плотно прокомментированный вариант. Тут создаётся триггер, в него передаются и из него принимаются параметры !!SN:X. Разумеется, тут ничего особенного не происходит, но триггер вызывается.
Это код на MSVC++ 9.0, по идее должен компилироваться, если положить рядом era.h, расширение плагина для работоспособности нужно изменять на "era" после компиляции.



RE: Исследование героев - Berserker - 22.02.2012 22:22

//DisableThreadLibraryCalls(hInst);
Автоматом вызывается для *.era модулей.


RE: Исследование героев - Sav - 22.02.2012 22:39

Да, я отстал от жизни, и SDK у меня там для 1.9. Sm Ну, впрочем это непринципиально, старое, по крайней мере, то, что я использовал, не менялось.


RE: Исследование героев - kostya_76 - 22.02.2012 23:14

(22.02.2012 17:38)totkotoriy Wrote:  Костян, и можешь еще прислать скомпилиный этот код? я скомпилил его чуть по другому (без era.h) и у меня все равно в игре вылетает(

Вот
Только работать будет лишь под Эрой, коль скоро функция оттуда вызывается.

Кстати, имена людей коверкать нехорошо Moral


RE: Исследование героев - totkotoriy - 23.02.2012 13:37

(22.02.2012 21:48)Sav Wrote:  totkotoriy, если ты не осилил плагин, которыя я для тебя переписал, вот упрощённый...
Попробуй тут осилить когда кто на чем пишет, а ты ни того не другого не знаешь... Спасибо, будем разбираться...

(22.02.2012 23:14)kostya_76 Wrote:  
(22.02.2012 17:38)totkotoriy Wrote:  Костян, и можешь еще прислать скомпилиный этот код? я скомпилил его чуть по другому (без era.h) и у меня все равно в игре вылетает(

Вот
Только работать будет лишь под Эрой, коль скоро функция оттуда вызывается.

Кстати, имена людей коверкать нехорошо Moral
По мне так Костян - это ещё уважительнее чем просто Костя...
Спасибо, всё работает, наверное я ещё и неправильно код на С++ в прошлый раз написал.
Может ещё обясните как вычесляется адрес (например 0X6992D0), который затирается хуком?


RE: Исследование героев - Sav - 23.02.2012 14:27

totkotoriy Wrote:Может ещё обясните как вычесляется адрес (например 0X6992D0), который затирается хуком?
Эм, смотрится в дизассемблере, что находится по адресу, куда будет ставиться хук и дописывается в начало или конец кода хука.


RE: Исследование героев - Sav - 04.03.2012 12:37

Кто-нибудь может дать описание всем полям из cranim.txt или хотя бы некоторым (кроме x-смещения прямоугольника с количеством существ, периода между проигрываниями анимации кривляния и периода анимации движения)? В принципе я и сам разберусь, но если кто это уже сделал, не хотелось бы зря тратить время.


RE: Исследование героев - totkotoriy - 06.03.2012 23:51

(10.02.2012 18:26)MOP Wrote:  Уже несколько человек спрашивало…
Code:
; Обновить экран встречи героев
!!UN:C6962576/4/?y1; [6A3D90h] - swapManager
!!SN:E5957888/2/y1;
Не помню, но артефакты в слотах, вроде, обновляются отдельно.
А может подскажите тогда ещё как обновлять отряды у героев в экране встречи? А то почему-то они таки не обновляются 33...


RE: Исследование героев - Sav - 09.03.2012 21:29

Раз никто не знает насчёт cranim.txt, вот я разобрал структуру, к которой это сводится в игре:


Такие структуры хранятся для каждого существа по адресу, записанному в 0x67FF74, а так же входят в структуру стеков в бою по смещению 110h.


RE: Исследование героев - Berserker - 09.03.2012 21:30

Ценное исследование, спасибо!


RE: Исследование героев - Berserker - 20.03.2012 15:13

В оконном режиме без ХД:
1) Нажать на усыпить героя.
2) Свернуть окно мышкой
3) Развернуть
4) Панель ресурсов и статистики героя пустая - неперерисованнная.


Правый щелчок на карте приключений красит кнопку усыпления в зелёный цвет и правильно обновляет экран.


RE: Исследование героев - Berserker - 20.03.2012 15:21


Домик вместо кнопки "усыпить".


RE: Исследование героев - Sav - 20.03.2012 16:24

Структура стрелковой башни в бою.

Хранится в виде 3-элементного массива структур в структуре BattleMgr (*(0x699420)) по смещению 81272. Индекс башни в массиве определяется dword`ом по +38h в структуре её стека (для остальных стеков это поле - позиция на поле боя). 254 - индекс 0, 251 - индекс 1, 255 - индекс 2.


RE: Исследование героев - Berserker - 20.03.2012 16:30

Quote:254 - индекс 0, 251 - индекс 1, 255 - индекс 2.
Угу, где-то писал об этом. Тоже хак.


RE: Исследование героев - Sav - 20.03.2012 23:18

Функция, рассчитывающая бонус к урону для башни.

Code:
double __thiscall A0_Battle_Stack_Get_ArrowTower_DamageBonus_To_sub_443AB0(struct_BattleStack *this, char IsShot)
{
  double Shild_Spells_Mult_v2; // st7@3
  int Controller_v3; // eax@10
  int Hero_v4; // eax@12
  double Base_mult_v6; // [sp+0h] [bp-8h]@1

  *(_QWORD *)&Base_mult_v6 = 0x3FF0000000000000ui64;// double 1.0
  if ( IsShot )
  {
    if ( !this->Spells_Lengths_adword198[28] )  // Воздушный щит
      goto CHECK_STONE_SPELL_L7;
    Shild_Spells_Mult_v2 = this->AirShieldSpell_Modif_dword4BC;
  }
  else
  {
    if ( !this->Spells_Lengths_adword198[27] )  // Щит
      goto CHECK_STONE_SPELL_L7;
    Shild_Spells_Mult_v2 = this->ShieldSpell_Modif_dword4B8;
  }
  Base_mult_v6 = Shild_Spells_Mult_v2;
CHECK_STONE_SPELL_L7:
  if ( this->Spells_Lengths_adword198[70] )     // Окаменение
    Base_mult_v6 = Base_mult_v6 * 0.5;
  if ( this->Spells_Lengths_adword198[60] )     // Гипноз
    Controller_v3 = 1 - this->Owner_dwordF4;
  else
    Controller_v3 = this->Owner_dwordF4;
  Hero_v4 = *(_DWORD *)(A0_BattleMgr_dword_699420 + 4 * Controller_v3 + 21452);
  if ( Hero_v4 )
    Base_mult_v6 = A0_Hero_GetDefense_SecSkill_sub_4E4580(Hero_v4) * Base_mult_v6;
  return Base_mult_v6;
}

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

Так же несложно заметить, что в функции рассчитывается всего 3 вещи - воздушный щит (IsShot во всех стандартных вызовах = 1), окаменение и вторичный навык Защита (со специализацией) героя-хозяина цели. Ни атака (а ведь у башни заявлено 10 атаки) с защитой, ни вторичные навыки героя-хозяина башни не учитываются.

Для Хоты я заменил все 3 вызова этой функции на нормальную A0_Battle_Stack_CalcDamageModifs_sub_443C60 (пришлось искать недостающие параметры, но это несложно). Это и исправит баги, и несколько усилит башни (учитывающиеся 10 атаки - не так мало + учёт атаки обороняющегося героя).


RE: Исследование героев - Berserker - 20.03.2012 23:26

Хотелось бы в Эру по умолчанию встроить. Двоичной заплаткой не обойтись?


RE: Исследование героев - Sav - 20.03.2012 23:28

Могу дать код, но он основан на Patcher_x86. Там несколько хуков.
Да, и он на C++.


RE: Исследование героев - Berserker - 20.03.2012 23:59

Давай.


RE: Исследование героев - etoprostoya - 21.03.2012 00:36

(20.03.2012 23:18)Sav Wrote:  Функция, рассчитывающая бонус к урону для башни.

Code:
double __thiscall A0_Battle_Stack_Get_ArrowTower_DamageBonus_To_sub_443AB0(struct_BattleStack *this, char IsShot)
{
  double Shild_Spells_Mult_v2; // st7@3
  int Controller_v3; // eax@10
  int Hero_v4; // eax@12
  double Base_mult_v6; // [sp+0h] [bp-8h]@1

  *(_QWORD *)&Base_mult_v6 = 0x3FF0000000000000ui64;// double 1.0
...

А там точно double, а не float? Раньше думал, что в игре используется только float32.


RE: Исследование героев - Sav - 21.03.2012 00:52

Code:
// При подсчёте бонуса к урону стрелковой башни...
int __stdcall HookOn_ArrowTowerCalcDamageBonuses(LoHook* h, HookContext* c)
{
  // Вызываем общую функцию подсчёта урона.
  c->eax = (*(_BattleStack_**)(c->ebp - 36))->Calc_Damage_Bonuses((_BattleStack_*)(c->ebx), *(_int32_*)(c->ebp + 8), TRUE, FALSE, 0, 0);
  
  c->return_address = 0x46594B;
  
  return NO_EXEC_DEFAULT;
}



// При подсчёте бонуса к урону стрелковой башни ИИ (1)...
int __stdcall HookOn_ArrowTowerCalcDamageBonusesAI1(LoHook* h, HookContext* c)
{
  // Выполняем затёртую команду.
  c->edi = c->esi - 688;
  
  // Вызываем общую функцию подсчёта урона.
  c->eax = ((*(_BattleMgr_**)(c->ebp - 16))->stack[(*(_BattleMgr_**)(c->ebp - 16))->current_side][(*(_BattleMgr_**)(c->ebp - 16))->current_stack_ix]).Calc_Damage_Bonuses((_BattleStack_*)(c->edi), *(_int32_*)(c->ebp + 16), TRUE, TRUE, 0, 0);
  
  c->return_address = 0x41E3AB;
  
  return NO_EXEC_DEFAULT;
}


// При подсчёте бонуса к урону стрелковой башни ИИ (2)...
int __stdcall HookOn_ArrowTowerCalcDamageBonusesAI2(LoHook* h, HookContext* c)
{
  // Выполняем затёртую команду.
  c->edi = c->esi - 688;
  
  // Вызываем общую функцию подсчёта урона.
  c->eax = ((*(_BattleMgr_**)(c->ebp - 16))->stack[(*(_BattleMgr_**)(c->ebp - 16))->current_side][(*(_BattleMgr_**)(c->ebp - 16))->current_stack_ix]).Calc_Damage_Bonuses((_BattleStack_*)(c->edi), *(_int32_*)(c->ebp + 16), TRUE, TRUE, 0, 0);
  
  c->return_address = 0x41E4E7;
  
  return NO_EXEC_DEFAULT;
}
Code:
Patcher* _P = GetPatcher();
PatcherInstance* _PI = _P->CreateInstance("Choose_Name");
Code:
// При подсчёте бонуса к урону стрелковой башни...
_PI->WriteLoHook(0x465934, HookOn_ArrowTowerCalcDamageBonuses);

// При подсчёте бонуса к урону стрелковой башни ИИ (1)...
_PI->WriteLoHook(0x41E38E, HookOn_ArrowTowerCalcDamageBonusesAI1);

// При подсчёте бонуса к урону стрелковой башни ИИ (2)...
_PI->WriteLoHook(0x41E4CA, HookOn_ArrowTowerCalcDamageBonusesAI2);

Не хочу менять сам код (наделаю синтаксических ошибок ещё), поэтому поясню отдельно: _int32_ = int; TRUE = 1; FALSE = 0.
Code:
struct _BattleStack_
{
...
    // Подсчёт добавок к наносимому урону (возвращается новый урон).
    // Enemy - указатель на атакуемый стек.
    // BaseDamage - начальный урон.
    // IsShot - является ли атака выстрелом (TRUE - является).
    // Virtual - является ли подсчёт производимым ИИ (TRUE - является).
    // WayLength - пройденный путь до цели (для расчёта кавалерийского бонуса).
    // out_FireshieldDamage - указатель на переменную, в которую в результате работы функции запишется урон от огненного щита (0 - не подсчитывать).
    inline _int32_ Calc_Damage_Bonuses(_BattleStack_* Enemy, _int32_ BaseDamage, _bool8_ IsShot, _bool8_ Virtual, _int32_ WayLength, _int32_* out_FireshieldDamage)
    {
      return CALL_7(_int32_, __thiscall, 0x443C60, this, Enemy, BaseDamage, IsShot, Virtual, WayLength, out_FireshieldDamage);
    }
...
}
_BattleMgr_.stack = +21708, массив 2 на 21 стеков (каждый - по 1352 байта).
_BattleMgr_.curr_stack_ix = +78524
_BattleMgr_.current_side = +78528


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

etoprostoya Wrote:А там точно double, а не float? Раньше думал, что в игре используется только float32.
64 тоже используется, в основном в промежуточных вычислениях. Хотя конкретно в этом случае не знаю, но, думаю, Ида правильно определила, тем более в такой маленькой функции.


RE: Исследование героев - etoprostoya - 21.03.2012 10:58

Понятно. Ида просто не может отличить код для double от кода для float, если это не SSEx. Код для 64- и 32- битных плавающих числе отличается только в инициализации.


RE: Исследование героев - kostya_76 - 21.03.2012 23:33

Подскажет кто-нибудь, почему триггер в данной функции срабатывает только со второй генерации случайной карты?

Врезка идет сразу после нажатия кнопки "начать" перед генерацией карты по адресу 0x5863ba.
Если то же самое сделать с помощью функции Эры ExecErmCmd, то срабатывает нормально - при первой же генерации.

В данном случае нужно получить значение одной из ВОГ-опций.
Это можно попробовать сделать и без ЕРМ, но возни много.
И, самое главное, что дальше после генерации карты нужно будет организовать интерфейс с помощью ВОГ-диалога, там уже по любому ЕРМ нужен.

Зависимость от Эры не устраивает, т.к. скорее всего программа будет использоваться в ТЕ/WT.


RE: Исследование героев - gamecreator - 22.03.2012 01:12

кто-нибудь знает как получить указатель на массив героев?


RE: Исследование героев - Sav - 22.03.2012 11:43

Разная инфа хранится в разных массивах. Основной: *(_ptr_*)0x699538 + 0x21620 (размер элемента: 1170 байт).


RE: Исследование героев - totkotoriy - 24.03.2012 13:07

У меня ещё пару вопросов к знатокам Ab если позволите:
Как нормально задать цветовую гамму портретам чтобы некоторые пиксели не были прозрачными? Или может есть список цветов, которые нельзя использовать? Делаю индексированные цвета, но всё равно некоторые пиксели приходиться перерисовывать. Может уже есть какой-то нормальный метод или программа?

И не знаете случайно как расшифровать в файлах objcts.txt параметры объекта? Что они означают? 111111111 000000001 5 10 4 0
перевые 2 параметра по 8 я как понимаю разрешение на размещение на каких либо почвах, но что где? и почему 2 настройки?...
потом номер, подтип объекта... а дальше две цифры что означают? Вроде это как-то связано с тенью, но я не уверен.


RE: Исследование героев - Berserker - 24.03.2012 13:19

Список цветов точно есть. Нужно попросить Bes'а или другого знатока скинуть файл палитры для фотошопа (pal).


RE: Исследование героев - totkotoriy - 24.03.2012 13:45

(24.03.2012 13:19)Berserker Wrote:  Список цветов точно есть. Нужно попросить Bes'а или другого знатока скинуть файл палитры для фотошопа (pal).
Было бы вобще хорошо, а то так по несколько портретов проверять и потом перерисовывать замучаешься.


RE: Исследование героев - totkotoriy - 25.03.2012 03:16

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


RE: Исследование героев - gamecreator - 25.03.2012 03:22

попробуй deftool


RE: Исследование героев - Berserker - 25.03.2012 13:35

gamecreator, речь идёт о портретах.


RE: Исследование героев - totkotoriy - 25.03.2012 13:41

Нашёл я более-менее приемлемый способ чтоб не было прозрачных цветов: в фотошопе при перекодировании надо ставить заказную таблицу цветов и какой-нибудь цвет кроме чисто белого и чисто черного на первое место в таблице, например бирюзовый (в героя который цвет фона), тогда очень маловероятно, что данный цвет будет индексирован при конвертировании в этот. По крайней мере не нашел ни одного портрета точно с этим цветом для даже близких по гамме портретов. Вот вам и метод Ab


RE: Исследование героев - gamecreator - 25.03.2012 14:49

(25.03.2012 13:35)Berserker Wrote:  gamecreator, речь идёт о портретах.
я понял, но дефтул приводит палитру еще на этапе кадра. если потом изменения можно сохранить, то для портретов вполне подходит.


RE: Исследование героев - Berserker - 25.03.2012 14:57

Quote:надо ставить заказную таблицу цветов
Через файл pal это и делалось, просто у меня он уже давно вроде как потерялся.


RE: Исследование героев - totkotoriy - 25.03.2012 15:10

(25.03.2012 14:49)gamecreator Wrote:  
(25.03.2012 13:35)Berserker Wrote:  gamecreator, речь идёт о портретах.
я понял, но дефтул приводит палитру еще на этапе кадра. если потом изменения можно сохранить, то для портретов вполне подходит.
По моему дефтул определяет цвета только для файлов def, но не для bmp, хотя точно не знаю.


RE: Исследование героев - gamecreator - 25.03.2012 15:16

дефтул собирает деф


RE: Исследование героев - Sav - 28.03.2012 16:37

В начале 2^32 - 1 раунда все непризванные стеки на поле боя погибнут (призванные сделают это в начале 2^32 - 1 раунда, считая с момента призыва). Это связано с полем, отвечающим за оставшиеся раунды жизни клонов, которое при инициализации -1, для клона отдельно устанавливается, и при уменьшении которого нет никаких проверок.


RE: Исследование героев - Algor - 28.03.2012 18:20

(28.03.2012 16:37)Sav Wrote:  В начале 2^32 - 1 раунда все непризванные стеки на поле боя погибнут
От черт.... значит нельзя бесконечно смотреть на 2х дерущихся троллей 118
Я кстати на df2 упоминал о подобном "переполнении" при споре, можно ли гарпией ведьмой при определенном сочетании препятствий на поле боя завалить 100500 бегемотов. Хотя, за миллиард ходов конкретно 100500 бегемотов лягут...


RE: Исследование героев - Sav - 28.03.2012 19:25

Ну, бегемоты-то всё равно умрут в результате. Sm


RE: Исследование героев - ILYA1980 - 28.03.2012 22:24

Может быть подскажет кто-нибудь, как убрать у грааля в башне открытие всей карты?


RE: Исследование героев - gamecreator - 29.03.2012 21:36

(28.03.2012 18:20)Algor Wrote:  От черт.... значит нельзя бесконечно смотреть на 2х дерущихся троллей 118
даже если раунд будет занимать 1 секунду, тебе хватит раундов для непрерывного просмотра в течении 136 лет Sm


RE: Исследование героев - Sav - 29.03.2012 23:06

Возможно, быстрая битва не предусматривает другого выхода из подобных ситуаций.


RE: Исследование героев - Berserker - 01.04.2012 15:55

Sav, надеюсь это корректно, я просто 3 байта меняю для башен, превращая 3 деления в три умножения.
В битве работает.


RE: Исследование героев - Sav - 01.04.2012 18:00

Это корректно, но в этом случае не учитывается атака башен (заявленная как 10 и на самом деле такая) и защита цели.


RE: Исследование героев - kostya_76 - 01.04.2012 21:15

Есть у кого мысли по поводу этого вопроса?
Не стесняемся, если кто подскажет, тому за это ничего не будет )

А то подключение программы зеркалирования карт практически готово, только вышеозначенная проблема возникла.
Пробовал разобраться, как в Эре реализована функция ExecErmCmd, но слишком сложно для меня, да и нет необходимости ее повторять. Нужно как-то инициировать выполнение ЕРМ кода из скрипта.


RE: Исследование героев - Berserker - 01.04.2012 21:32

Quote:Это корректно, но в этом случае не учитывается атака башен (заявленная как 10 и на самом деле такая) и защита цели.
Так она и без нас, по ходу, не считается. Просто деление на умножение вернуть уже достаточно. А ещё микробонус от разницы между атакой и защитой считать....имхо не стоит.

kostya_76, вы закомментировали получение опции, поэтому в v1 у вас мусор. Найдите адрес массива опций и обращайтесь к нему напрямую.


RE: Исследование героев - kostya_76 - 01.04.2012 21:59

(01.04.2012 21:32)Berserker Wrote:  kostya_76, вы закомментировали получение опции, поэтому в v1 у вас мусор. Найдите адрес массива опций и обращайтесь к нему напрямую.

Да нет, это я закомментировал строчку с функцией Эры, чтобы показать, что с ней работает с первого раза. А получение опции идет с помощью той же ЕРМ команды, расположенной в скрипте в функции 29501, вызов которой есть в коде.
Все работает, но только со второй генерации после загрузки героев.

А адрес опции найти-то нетрудно, но обращение к ней нужно делать так, чтобы это работало впоследствии при любом изменении количества ВОГ-опций. Что у меня с ходу не получилось. Не знаю, как по номеру опции найти адрес.

И дело не в ВОГ-опции, это как пример - дальше мне нужен ВОГ-диалог для бана героев, ввода еще некоторых параметров.

Может быть загрузка скриптов идет только после загрузки карты?
Тогда получается нужно все-таки делать аналог ExecErmCmd из Эры?
Или может быть как-то инициировать загрузку скриптов до загрузки карты?


RE: Исследование героев - Berserker - 01.04.2012 23:10

Quote:Может быть загрузка скриптов идет только после загрузки карты?
Да.

Quote:Тогда получается нужно все-таки делать аналог ExecErmCmd из Эры?
Да. При чём скорее всего ещё и вызывать процедуры очистки и инициализации ЕРМ. Только диалог - это ещё и события, а события - уже Эра или полноценно загруженный скрипт.

Quote:Или может быть как-то инициировать загрузку скриптов до загрузки карты?
Думал уже над этим не раз, но на деле воговская процедура FindErm очень уж привязана к карте/сохранёнке.


RE: Исследование героев - kostya_76 - 01.04.2012 23:59

(01.04.2012 23:10)Berserker Wrote:  Да. При чём скорее всего ещё и вызывать процедуры очистки и инициализации ЕРМ. Только диалог - это ещё и события, а события - уже Эра или полноценно загруженный скрипт.

А события для чего? Вот пример скрипта выбора героев:
Тут вроде нет событий никаких.

А Эру к WT подключить можно как-нибудь?

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


RE: Исследование героев - Sav - 02.04.2012 00:05

Berserker Wrote:Так она и без нас, по ходу, не считается. А ещё микробонус от разницы между атакой и защитой считать....имхо не стоит.
Да, не считается. Но это ошибка, иначе бы не писалось в описании по ПКМ, что у башен атака 10.
Бонус не такой уж и мелкий, по слабым существам на треть вполне урон может увеличить. А если есть опыт башен и т. п., то уж и тем более. Кроме того, в общей функции теоретически могут срабатывать какие-нибудь новые защитные способности существ, поэтому её следует использовать, чтобы башня их не ломала. Разницы в скорости я не заметил.
Ну, во всяком случае, в Хоте я реализовал так, как считаю нужным. А в Эре, учитывая, что перед ней изначально не ставились задачи модификации геймплея, и мини-исправления может быть вполне достаточно.


RE: Исследование героев - Berserker - 02.04.2012 20:39

Quote:А события для чего?
Trigger = событие. Список событий формируется при загрузки скриптов уже после загрузки карты.

Quote:А Эру к WT подключить можно как-нибудь?
Без понятия, как там Асм сделал.


RE: Исследование героев - Sav - 03.04.2012 20:07

Кто-нибудь знает, чем занимается IFC20.dll, функции CImmProject__CreateEffect, CImmCompoundEffect__Start (вызовы в функции 0x4B6750)? У меня они вроде бы вообще не выполняются из-за неуспешного вызова инциализации этого CImmProject, поэтому я не могу так определить, что они делают.


RE: Исследование героев - Sav - 04.04.2012 19:50

Похоже, IFC - это Immersion Foundation Classes, 20 - видимо, версия 2.0. Но что это всё же такое по сути, я так и не смог разобрать.


RE: Исследование героев - solitaire345 - 04.04.2012 23:30

IFC library is responsible for kinetic feedback on gamepads/wheels and other game controllers. Quite strange that it is used for turn-based game. I managed to trigger that function on spell casting and hovering mouse on town buildings.

The branch that calls IFC functions is never executed because dword at 0x00696DD4 is always null and the function returns immediately to not dereference that pointer. 0x00696DD4 is probably pointer to device that supports Immersion Foundation Classes.
Trying to jump to other branch results in access violation.


RE: Исследование героев - Sav - 05.04.2012 00:44

Thank you for explanation.


RE: Исследование героев - totkotoriy - 16.04.2012 01:14

Может ещё кто знает адреса вкл/выкл кнопок в меню кампаний?
Что то подобное ведь должно быть?


RE: Исследование героев - Sav - 05.05.2012 23:34

Кто-нибудь знает, зачем нужно поле setup (первые 4 байта) у структур, таких, как банк существ, и зачем в конструкторе этому полю присваивается значение неинициализированной стековой переменной?


RE: Исследование героев - Berserker - 06.05.2012 00:17

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

typedef void* TObject;
...
TObject Create (x, y, z, frames, colors, wtf, ...);
void Draw (TObject Obj, args...);
void Move (TObject Obj, args...);

То есть все методы - это функции, принимающие сам объект (указатель) в качестве одного из параметров. Для внешнего кода ссылка на твой объект - это чёрный ящик.


RE: Исследование героев - Sav - 06.05.2012 00:31

Тогда надо писать методы для доступа к каждому полю. Мне не жалко того, что структура объекта открыта, я бы и код открыл, если бы он содержал только мои исследования (кстати, адреса устанавливающихся хуков можно считать открытыми - их элементарно посмотреть извне, используя patcher_x86). Пусть пользователь делает с объектом что хочет, а о том, что трогать не надо, я предупредил, и эти поля объявлены как private. Или закрытость структуры должна быть более удобной пользователю? В этом случае сделаю так.


RE: Исследование героев - Berserker - 06.05.2012 00:59

В текущем варианте ты ограничил применение языком Си++. К другим даже обёртки не сделать.


RE: Исследование героев - Sav - 06.05.2012 01:09

Т. е. чтобы не ограничивать надо обязательно создать такие функции? Хорошо, тогда я сделаю это.


RE: Исследование героев - Berserker - 06.05.2012 01:13

Да. Тогда я их прямо экспортирую в целевом языке программирования и используя, абсолютно не интересуясь двоичной структурой объекта (для меня это указатель).


RE: Исследование героев - Berserker - 18.05.2012 22:43

solitaire345 Wrote:I found a table which holds setup of arrow towers. It is located at 0x63CF88 and stores the following values:

Code:
00000000 CreatureID      dd ?                    ; base 10
00000004 MainTowerX      dd ?                    ; base 10
00000008 MainTowerY      dd ?                    ; base 10
0000000C LowTowerX       dd ?                    ; base 10
00000010 LowTowerY       dd ?                    ; base 10
00000014 UpTowerX        dd ?                    ; base 10
00000018 UpTowerY        dd ?                    ; base 10
0000001C MissileName  dd ?                    ; offset (00000000)

Here's a function to change graphics of any town. The paremeters are:
x1 - town type; x2 - shooter ID; x3-x8 - X; Y coordinates for turrets (middle, lower, upper); x9 - pointer to missile def.

A value of -1 means "do not change"

Code:
!?FU1;
!!FU&x1<0|x1>8:E;
!!VRv1:S4*8*x1+6541192; 0x63CF88

!!if&x2<>-1;
  !!MA:Xx2/?v2;
  !!VRv2:&4;
  !!IF&v2<>4:M^Trying to set nonshoting creature as arrow tower. Exiting to avoid crash^;
  !!FU&v2<>4:E;
  !!UN:Cv1/4/x2;
!!en;
!!VRv1:+4; !!UN&x3<>-1:Cv1/4/x3;
!!VRv1:+4; !!UN&x4<>-1:Cv1/4/x4;
!!VRv1:+4; !!UN&x5<>-1:Cv1/4/x5;
!!VRv1:+4; !!UN&x6<>-1:Cv1/4/x6;
!!VRv1:+4; !!UN&x7<>-1:Cv1/4/x7;
!!VRv1:+4; !!UN&x8<>-1:Cv1/4/x8;
!!VRv1:+4; !!UN&x9<>-1:Cv1/4/x9;

The pointers to missile names (parameter 9) are these (use numbers from the first column):

Code:
6686972 (0x6608FC) titan's bolt
6686984 (0x660908) Ice elemental's shard
6686996 (ox660914) Mage's missile
6687008 (0x660920) Catapult's rock
6687020 (0x66092C) Ballista's bolt
6687032 (0x660938) lizardman's arrow
6687044 (0x660944) Cyclop's boulder
6687056 (0x660950) orc's axe
6687068 (0x66095C) Medusa's arrow
6687080 (0x660968) lich's missile
6687092 (0x660974) Gog's fireball
6687104 (0x660980) Halfling's stone
6687116 (0x66098C) Gremlin's ball
6687128 (0x660998) Elf's arrow
6687140 (0x6609A4) Zealot's missile
6687152 (0x6609B0) Crosbowman's arrow
8002324 (0x7A1B14) Dracolich's missile

Notes:
1. There is no backup, so once changed, the setup will remain until h3era.exe is restarted.
2. Changing creature does not affect the power of arrow towers.
3. Using this function after BA0 trigger will have no effect in battle, because that table is copied to temporary location for the duration of combat.
4. creature images are cropped, so some creatures will look wrong (like this).



RE: Исследование героев - Berserker - 11.06.2012 17:54

solitaire345 Wrote:0x642EA0 - Table of creatures displayed in blacksmith screen. Gold cost is also taken from that creature.
0x6AAA60 - Table of artifacts that are sold in blacksmith. Stangely this table has two ints per town (second is always -1 and changing it has no effect).



RE: Исследование героев - Berserker - 16.06.2012 14:11

63BD18 - таблица урона от рвов.

Code:
5a7bf0 - расчёт урона от заклинания
  базовый урон: включает силу магии и уровень навыка,
  номер заклинания,
  структура колдующего героя,
  структура героя монстра или 0,
  структура целевого монстра,
  одиночная выборочная цель? (0, 1)
ecx = combat manager



RE: Исследование героев - Berserker - 16.06.2012 21:47

fastcall
44A1A0 (spell, creature id, resist table?, 0)


Code:
thiscall (combatman)
Получить спротивление как у Гномов
5a83a0 (заклинание, 0, структура монстра, 0, 1, 0): сопротивление (0.0..1.0)



RE: Исследование героев - Sav - 17.06.2012 01:10

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


RE: Исследование героев - Berserker - 17.06.2012 02:22

Да, если нахожу что-то по просьбе или для Эры.
Толк есть. В своё время я все сообщения обошёл, вычленяя то, что можно использовать или довести до ума.


RE: Исследование героев - Sav - 17.06.2012 12:04

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




RE: Исследование героев - GrayFace - 17.06.2012 13:23

Стрельба и удар по всем гидр, как я помню, тоже другими проигрываются.


RE: Исследование героев - Sav - 17.06.2012 13:56

Я перепроверю, но вроде тем же. Анимация самого выстрела проигрывается отдельно, а вот получения урона от него - этим.


RE: Исследование героев - Berserker - 17.06.2012 15:49

Sav, нехило 118


RE: Исследование героев - Sav - 17.06.2012 21:50

Посмотрел, DrawAction_Play вызывается и для любого удара, и для стрельбы.

Удар (Enemy_Gex_Around_Stack - номер атакуемого гекса вокруг стека - т. е. 0-6 (0-8), с учётом того, что гексы, окружающие стек, пронумерованы по определённому принципу):
PHP Code:
char __thiscall A0_Battle_Stack_MakeHit_sub_441330(_BattleStack_ *this_BattleStack_ *Enemyint Enemy_Gex_Around_Stack)
{
  
int Enemy_Gex_Around_Stack_v3// ebx@1
  
_BattleStack_ *this_v4// esi@1
  
char v5// al@6
  
char v6// zf@6
  
int v7// edx@7
  
int v8// edi@9
  
int v9// edx@10
  
signed int SomeGexNum_v10// eax@14
  
signed int EnemyGex_Num_v11// eax@14
  
_BattleStack_ *GexStack_v12// eax@16
  
int v13// ebx@20
  
int v14// edi@20
  
_BattleMgr_ *BattleMgr_v15// ebx@23
  
int v16// eax@24
  
signed int *v17// ebx@25
  
int v18// eax@29
  
unsigned int v19// edx@31
  
_BattleStack_ *v20// ebx@32
  
_BattleStack_ *Enemy_v21// edi@32
  
int v22// ecx@33
  
int v23// edi@33
  
int v24// ebx@37
  
int v25// edi@37
  
signed int v26// eax@41
  
_BattleStack_ *Enemy_v27// eax@44
  
int Damage_v28// eax@45
  
int v29// eax@49
  
int v30// eax@50
  
void *v31// eax@59
  
void *v32// eax@66
  
void *v33// eax@72
  
int v34// eax@82
  
char *Attacker_Name_v35// eax@85
  
int Attacker_type_v36// eax@89
  
char result// al@100
  
int Attacker_count_v38// [sp-10h] [bp-40h]@88
  
int v39// [sp-Ch] [bp-3Ch]@3
  
int Damage_v40// [sp-Ch] [bp-3Ch]@88
  
int Type_v41// [sp-8h] [bp-38h]@3
  
_BattleStack_ *Enemy_v42// [sp-8h] [bp-38h]@88
  
int Dead_v43// [sp-4h] [bp-34h]@88
  
signed int a5// [sp+Ch] [bp-24h]@9
  
int v45// [sp+10h] [bp-20h]@25
  
int v46// [sp+14h] [bp-1Ch]@31
  
_BattleStack_ *Enemy_v47// [sp+18h] [bp-18h]@31
  
int v48// [sp+1Ch] [bp-14h]@5
  
signed int a3// [sp+20h] [bp-10h]@31
  
int Num// [sp+24h] [bp-Ch]@31
  
_BattleStack_ *DragonBreathAttackedStack_v51// [sp+28h] [bp-8h]@1
  
char v52// [sp+2Fh] [bp-1h]@6

  
this_v4 this;
  
DragonBreathAttackedStack_v51 0;
  
A0_Battle_ClearStacksWereHitted_sub_465BC0(A0_BattleMgr_dword_699420);
  
Enemy_Gex_Around_Stack_v3 Enemy_Gex_Around_Stack;
  if ( (
this_v4->Creature_29dword74.Flags_dword10 >> 19) & )// Атакует всех врагов вокруг
  
{
    if ( 
this_v4->Spells_Lengths_adword198[59] )// Берсерк
    
{
      
Type_v41 2;
      
v39 this_v4->GexNum_dword38;
    }
    else
    {
      
Type_v41 1;
      
v39 this_v4->GexNum_dword38;
    }
    
v48 sub_524010(this_v4v39Type_v41, -1);
    if ( 
this_v4->CreatureType_dword34 == 47 )  // Цербер
    
{
      
v5 this_v4->Creature_29dword74.Flags_dword10 1;
      
v6 = (this_v4->Creature_29dword74.Flags_dword10 1) == 0;
      
v52 this_v4->Creature_29dword74.Flags_dword10 1;
      if ( 
v6 )
      {
        
v7 = (Enemy_Gex_Around_Stack_v3 5) % 6;
        
v5 v52;
      }
      else
      {
        
v7 dword_660898[(dword_660878[Enemy_Gex_Around_Stack_v3] + 7) % 8];
      }
      
a5 1;
      
v8 = ~(<< v7) & (unsigned __int8)~(unsigned __int8)(<< Enemy_Gex_Around_Stack_v3);
      if ( 
v5 )
        
v9 dword_660898[(dword_660878[Enemy_Gex_Around_Stack_v3] + 1) % 8];
      else
        
v9 = (Enemy_Gex_Around_Stack_v3 1) % 6;
      
v48 |= v8 & ~(<< v9);
    }
  }
  else
  {
    
Enemy->IsTarget_OfNonRoundHit_byteF0 1;
    if ( (
this_v4->Creature_29dword74.Flags_dword10 >> 3) & )// Атакующий стек обладает драконьим дыханием
    
{
      
EnemyGex_Num_v11 A0_Battle_Stack_Get_AroungGexNum_sub_5242E0(
                           
this_v4,
                           
this_v4->GexNum_dword38,
                           
Enemy_Gex_Around_Stack_v3);
      
SomeGexNum_v10 sub_524280(this_v4EnemyGex_Num_v11Enemy_Gex_Around_Stack_v3);
      if ( 
SomeGexNum_v10 >= )
      {
        if ( 
SomeGexNum_v10 187 )
        {
          
GexStack_v12 A0_Battle_get_StackByGex_sub_4E7230((int)&A0_BattleMgr_dword_699420->hex[SomeGexNum_v10]);
          
DragonBreathAttackedStack_v51 GexStack_v12;
          if ( 
GexStack_v12 )
          {
            if ( 
GexStack_v12->IsTarget_OfNonRoundHit_byteF0 )
              
DragonBreathAttackedStack_v51 0;
            else
              
GexStack_v12->IsTarget_OfNonRoundHit_byteF0 1;
          }
        }
      }
    }
  }
  
A0_Battle_ClearRedrawNeeds_sub_493290(A0_BattleMgr_dword_699420);
  
v14 this_v4->Owner_dwordF4;
  
v13 this_v4->StackNum_dwordF8;
  if ( 
A0_BattleMgr_dword_699420->stack[0][v13 14 v14 v14].CreatureType_dword34 == 149 )// Стрелковая башня
    
A0_Battle_SetArrowTowerRedraw_sub_46A040(
      
A0_BattleMgr_dword_699420,
      (
_BattleStack_ *)A0_BattleMgr_dword_699420->stack v13 14 v14 v14);
  else
    *(&
A0_BattleMgr_dword_699420->field_0[* (v14 20480)] + v13) = 1;
  
this_v4->CurrAttack_Is_Lucky_dword70 0;
  
BattleMgr_v15 A0_BattleMgr_dword_699420;
  if ( 
A0_BattleMgr_dword_699420->hero[A0_Battle_Stack_Get_Controller_sub_43FE60(this_v4)] )
  {
    
v16 this_v4->Luck_dword4EC;
    if ( 
v16 )
    {
      
v45 this_v4->Luck_dword4EC;
      
a5 3;
      
v17 = &a5;
      if ( 
v16 <= )
        
v17 = &v45;
      if ( 
A0_Rand_Int_sub_50C7C0(124) <= *v17 )
      {
        
this_v4->CurrAttack_Is_Lucky_dword70 1;
        if ( !
A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) )
        {
          
A0_StartAndPlaySample_Parallel_sub_59A890("goodluck.82m", -13);
          
v18 = (int)A0_Get_CreatureName_by_Type_adn_Count_sub_43FE20(
                       
this_v4->CreatureType_dword34,
                       
this_v4->Count_dword4C);
          
sprintf((int)A0_TempText_unk_697428, *(char **)(*((_DWORD *)off_6A5DC4 8) + 184), v18);
          
A0_Battle_MessageToLog_sub_4729D0(A0_BattleMgr_dword_699420->dlgA0_TempText_unk_69742810);
          
A0_Battle_Play_Std_BattleAnimation_sub_4963C0(A0_BattleMgr_dword_69942018this_v41000);
        }
      }
      
BattleMgr_v15 A0_BattleMgr_dword_699420;
    }
  }
  
v19 this_v4->Creature_29dword74.Flags_dword10;
  
a3 0;
  
Num 0;
  
v45 0;
  
v46 0;
  
Enemy_v47 0;
  
a5 0;
  if ( (
v19 >> 19) & )
  {
    
A0_Battle_Stack_RoundHit_MakeDamage_sub_440030(this_v4v48, &a3, &Num, (int)&Enemy_v47);
    
Enemy_v21 Enemy;
    
v20 DragonBreathAttackedStack_v51;
  }
  else
  {
    
v23 Enemy->Owner_dwordF4;
    
v22 Enemy->StackNum_dwordF8;
    if ( 
BattleMgr_v15->stack[0][v22 14 v23 v23].CreatureType_dword34 == 149 )
      
A0_Battle_SetArrowTowerRedraw_sub_46A040(
        
BattleMgr_v15,
        (
_BattleStack_ *)BattleMgr_v15->stack v22 14 v23 v23);
    else
      *(&
BattleMgr_v15->field_0[* (v23 20480)] + v22) = 1;
    if ( 
DragonBreathAttackedStack_v51 )
    {
      
v25 DragonBreathAttackedStack_v51->Owner_dwordF4;
      
v24 DragonBreathAttackedStack_v51->StackNum_dwordF8;
      if ( 
A0_BattleMgr_dword_699420->stack[0][v24 14 v25 v25].CreatureType_dword34 == 149 )
        
A0_Battle_SetArrowTowerRedraw_sub_46A040(
          
A0_BattleMgr_dword_699420,
          (
_BattleStack_ *)A0_BattleMgr_dword_699420->stack v24 14 v25 v25);
      else
        *(&
A0_BattleMgr_dword_699420->field_0[* (v25 20480)] + v24) = 1;
    }
    
Enemy_v21 Enemy;
    if ( (
Enemy->Creature_29dword74.Flags_dword10 >> 23) & )
      
v26 1;
    else
      
v26 Enemy->Count_dword4C Enemy->Creature_29dword74.Health_dword4C Enemy->HealthLoses_dword58;
    
a5 v26;
    
Enemy 0;
    if ( 
Enemy_v21 )
    {
      
Damage_v28 A0_Battle_Stack_CalcDamage_sub_442E80((int)this_v40);
      
a3 A0_Battle_Stack_CalcDamageModifs_sub_443C60(
             
this_v4,
             
Enemy_v21,
             
Damage_v28,
             
0,
             
0,
             
this_v4->GexesWay_Length_dword490,
             (
int *)&Enemy);
      
Num A0_Battle_Stack_MakeDamage_sub_443DB0(Enemy_v21a3);
      
Enemy_v27 Enemy;
      
this_v4->CurrAttack_Is_Lucky_dword70 0;
    }
    else
    {
      
Enemy_v27 0;
    }
    
Enemy_v47 Enemy_v27;
    if ( (
signed int)Enemy_v27 )
      
Enemy_v21->CurrHit_WasDamagedByFireshield_byteE8 1;
    
v20 DragonBreathAttackedStack_v51;
    if ( 
DragonBreathAttackedStack_v51 )
    {
      
Enemy 0;
      
v29 A0_Battle_Stack_CalcDamage_sub_442E80((int)this_v40);
      
v45 A0_Battle_Stack_CalcDamageModifs_sub_443C60(
              
this_v4,
              
v20,
              
v29,
              
0,
              
0,
              
this_v4->GexesWay_Length_dword490,
              (
int *)&Enemy);
      
v46 A0_Battle_Stack_MakeDamage_sub_443DB0(v20v45);
      
this_v4->CurrAttack_Is_Lucky_dword70 0;
    }
  }
  
A0_Battle_Set_RedrawBorders_sub_495770((int)A0_BattleMgr_dword_699420);
  
v30 this_v4->CreatureType_dword34;
  
this_v4->CurrDrawAct_IsAttacker_byte0 1;
  if ( 
v30 == 110 || v30 == 111 || A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) )// Гидра, гидра хаоса.
    
goto LABEL_78;
  if ( 
Enemy_Gex_Around_Stack != && Enemy_Gex_Around_Stack != && Enemy_Gex_Around_Stack )
  {
    if ( 
Enemy_Gex_Around_Stack != && Enemy_Gex_Around_Stack != )
    {
      if ( 
v20 && (v31 this_v4->Def_dword164, *((_DWORD *)v31 10) > 19) && *(_DWORD *)(*((_DWORD *)v31 11) + 76) )
      {
        
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 19;
      }
      else
      {
        if ( 
this_v4->CreatureType_dword34 == 146 )// Баллиста.
          
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 16;
        else
          
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 13;
      }
      goto 
LABEL_79;
    }
    if ( 
v20 )
    {
      
v32 this_v4->Def_dword164;
      if ( *((
_DWORD *)v32 10) > 18 )
      {
        if ( *(
_DWORD *)(*((_DWORD *)v32 11) + 72) )
        {
          
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 18;
          goto 
LABEL_79;
        }
      }
    }
    if ( 
this_v4->CreatureType_dword34 == 146 // Баллиста.
    
{
      
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 15;
      goto 
LABEL_79;
    }
LABEL_78:
    
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 12;
    goto 
LABEL_79;
  }
  if ( 
v20 && (v33 this_v4->Def_dword164, *((_DWORD *)v33 10) > 17) && *(_DWORD *)(*((_DWORD *)v33 11) + 68) )
  {
    
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 17;
  }
  else
  {
    if ( 
this_v4->CreatureType_dword34 == 146 // Баллиста.
      
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 14;
    else
      
this_v4->CurrDrawAct_AttackAnimFrameSection_byte2 11;
  }
LABEL_79:
  
Enemy->CurrDrawAct_AnimFrameSection_byte3 A0_Battle_Stack_After_Hit_Spells_sub_440220(this_v4Enemy_v21);// Глюк, это другая переменная
  
A0_Battle_DrawAction_Play_sub_468570(A0_BattleMgr_dword_699420, -10);
  if ( !((
this_v4->Creature_29dword74.Flags_dword10 >> 19) & 1) )// Атакует всех вогруг
  
{
    if ( 
v20 && v20->CreatureType_dword34 != Enemy_v21->CreatureType_dword34 )
    {
      
v34 this_v4->CreatureType_dword34;
      if ( 
v34 || v34 150 )
      {
        
Attacker_Name_v35 A0_Empty_dword_691260;
      }
      else
      {
        if ( 
this_v4->Count_dword4C == )
          
Attacker_Name_v35 = (*Main_MonsersTable_off_6747B0)[v34].NameSingle_dword14;
        else
          
Attacker_Name_v35 = (*Main_MonsersTable_off_6747B0)[v34].NameMulti_dword18;
      }
      
Dead_v43 Num v46;
      
Enemy_v42 0;
      
Damage_v40 a3 v45;
      
Attacker_count_v38 this_v4->Count_dword4C;
    }
    else
    {
      
Attacker_type_v36 this_v4->CreatureType_dword34;
      if ( 
Attacker_type_v36 || Attacker_type_v36 150 )
      {
        
Attacker_Name_v35 A0_Empty_dword_691260;
      }
      else
      {
        if ( 
this_v4->Count_dword4C == )
          
Attacker_Name_v35 = (*Main_MonsersTable_off_6747B0)[Attacker_type_v36].NameSingle_dword14;
        else
          
Attacker_Name_v35 = (*Main_MonsersTable_off_6747B0)[Attacker_type_v36].NameMulti_dword18;
      }
      
Dead_v43 Num;
      
Enemy_v42 Enemy_v21;
      
Damage_v40 a3;
      
Attacker_count_v38 this_v4->Count_dword4C;
    }
    
A0_Battle_Attacking_Log_Message_sub_469670(
      (int)
A0_BattleMgr_dword_699420,
      (
char)Attacker_Name_v35,
      
Attacker_count_v38,
      
Damage_v40,
      
Enemy_v42,
      
Dead_v43);
  }
  
A0_Battle_After_Attack_Abilities_sub_4408E0(this_v4Enemy_v21a3Numa5);
  if ( (
signed int)Enemy_v47 )
    
A0_Battle_Stack_GetFireshieldDamage_sub_4406E0(this_v4Enemy_v47);
  if ( !
Enemy_v21->CurrHit_IsBlinded_byte4C0 || (result 1Enemy_v21->BlindSpell_Modif_dword49C != 0.0) )
    
result Enemy->CurrDrawAct_AnimFrameSection_byte3;// Глюк, это другая переменная
  
return result;


Выстрел:
PHP Code:
void __thiscall A0_Battle_Stack_MakeShot_sub_43F620(_BattleStack_ *thisint Enemy)
{
  
int v2// ebx@1
  
_BattleStack_ *this_v3// esi@1
  
int v4// eax@2
  
int *v5// edi@3
  
int v6// eax@7
  
_Hero_ *Hero_v7// ecx@8
  
_BattleStack_ *Enemy_v8// edi@8
  
int CreatureType_v9// eax@11
  
int v10// ecx@14
  
int v11// ebx@14
  
int v12// edi@16
  
int v13// ecx@16
  
int v14// eax@19
  
signed int v15// edi@24
  
int v16// eax@26
  
int v17// ecx@28
  
char v18// al@30
  
char *v19// eax@31
  
_BattleStack_ *Stack_v20// edi@31
  
int v21// ebx@31
  
int v22// ebx@37
  
int v23// eax@37
  
_BattleStack_ *v24// ecx@44
  
int v25// eax@46
  
char *v26// eax@49
  
int v27// ebx@56
  
int v28// eax@56
  
int v29// eax@58
  
char *v30// eax@61
  
int v31// esi@66
  
int v32// ebx@68
  
int v33// ecx@70
  
int v34// ebx@70
  
int v35// edi@72
  
int v36// ecx@72
  
int v37// eax@75
  
int v38// eax@82
  
int v39// ecx@84
  
char v40// al@86
  
int v41// ebx@87
  
_BattleStack_ *v42// edi@87
  
char *v43// eax@89
  
int v44// eax@91
  
unsigned __int8 v45// sf@96
  
unsigned __int8 v46// of@96
  
int v47// eax@100
  
char *v48// eax@103
  
int v49// [sp+Ch] [bp-20h]@37
  
int v50// [sp+10h] [bp-1Ch]@37
  
int v51// [sp+14h] [bp-18h]@31
  
int v52// [sp+18h] [bp-14h]@3
  
int v53// [sp+1Ch] [bp-10h]@3
  
int v54// [sp+20h] [bp-Ch]@24
  
_BattleStack_ *v55// [sp+24h] [bp-8h]@24
  
_BattleStack_ *v56// [sp+28h] [bp-4h]@24

  
this_v3 this;
  
v2 0;
  
this->CurrAttack_Is_Lucky_dword70 0;
  if ( 
A0_BattleMgr_dword_699420->hero[A0_Battle_Stack_Get_Controller_sub_43FE60(this)] )
  {
    
v4 this_v3->Luck_dword4EC;
    if ( 
v4 )
    {
      
v53 this_v3->Luck_dword4EC;
      
v52 3;
      
v5 = &v52;
      if ( 
v4 <= )
        
v5 = &v53;
      if ( 
A0_Rand_Int_sub_50C7C0(124) <= *v5 )
      {
        
this_v3->CurrAttack_Is_Lucky_dword70 1;
        if ( !
A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) )
        {
          
A0_StartAndPlaySample_Parallel_sub_59A890("goodluck.82m", -13);
          
v6 = (int)A0_Get_CreatureName_by_Type_adn_Count_sub_43FE20(
                      
this_v3->CreatureType_dword34,
                      
this_v3->Count_dword4C);
          
sprintf((int)A0_TempText_unk_697428, *(char **)(*((_DWORD *)off_6A5DC4 8) + 184), v6);
          
A0_Battle_MessageToLog_sub_4729D0(A0_BattleMgr_dword_699420->dlgA0_TempText_unk_69742810);
          
A0_Battle_Play_Std_BattleAnimation_sub_4963C0(A0_BattleMgr_dword_69942018this_v31000);
        }
      }
    }
  }
  
Enemy_v8 = (_BattleStack_ *)Enemy;
  
A0_Battle_Stack_DrawShot_Bullet_sub_43EFE0(this_v3, (_BattleStack_ *)Enemy);
  
Hero_v7 A0_BattleMgr_dword_699420->hero[this_v3->Owner_dwordF4];
  if ( !
Hero_v7 || !A0_Hero_Check_Has_Artifact_Weared_sub_4D9460(Hero_v75) )// Повода с боеприпасами
    
--this_v3->Creature_29dword74.Ammo_dword64;
  
CreatureType_v9 this_v3->CreatureType_dword34;
  if ( 
CreatureType_v9 == 45 )                  // Магог
  
{
    
v52 off_687FA8[716];
    if ( 
v52 != -)
    {
      if ( !
A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) )
      {
        
A0_StartAndPlaySample_Parallel_sub_59A890((char *)off_687FA8[715], -13);
        
v11 A0_Load_Def_sub_55C9C0(A0_BattleAnims_off_641E18[v52]);
        
Enemy = (int)((char *)A0_BattleMgr_dword_699420 112 Enemy_v8->GexNum_dword38);
        
v10 = *(_WORD *)(Enemy 452);
        if ( 
Enemy_v8->Creature_29dword74.Flags_dword10 )
          
v10 += (Enemy_v8->Orientation_dword44 != 0x2C 0) - 22;
        
v53 v10 - *(_DWORD *)(v11 48) / 2;
        
v13 = *(_WORD *)(Enemy 454) - Enemy_v8->CreatureImageHeight_dword16C - *(_DWORD *)(v11 52) / 2;
        
v12 0;
        
Enemy v13;
        while ( 
)
        {
          
v14 = *(_DWORD *)(v11 40) > && **(_DWORD **)(v11 44) ? ***(_DWORD ***)(v11 28) : 0;
          if ( 
v12 >= v14 )
            break;
          
A0_Battle_Draw_sub_493FC0((int)A0_BattleMgr_dword_6994200005011);
          
A0_Battle_DrawOrSetBorders_TranparentDef_sub_494F30(
            (int)
A0_BattleMgr_dword_699420,
            
v11,
            
v12,
            
v53,
            
Enemy,
            
0,
            
0);
          
A0_FlipBattle_sub_493300((int)A0_BattleMgr_dword_699420);
          ++
v12;
        }
        
A0_Battle_Draw_sub_493FC0((int)A0_BattleMgr_dword_699420100010);
        (*(
void (__thiscall **)(int))(*(_DWORD *)v11 4))(v11);
        
v2 0;
      }
    }
    
A0_Battle_Clear_Stacks_Redraw_Needs_sub_5A69C0(A0_BattleMgr_dword_699420);
    
v15 0;
    
v53 v2;
    
v55 = (_BattleStack_ *)v2;
    
v56 = (_BattleStack_ *)v2;
    
BYTE3(Enemy) = 0;
    
v54 0;
    do
    {
      if ( 
v15 == )
        
v16 this_v3->Attacked_Or_MoveTarget_Gex_Num_dword1C;
      else
        
v16 sub_524370(this_v3->Attacked_Or_MoveTarget_Gex_Num_dword1Cv15);
      
v17 = (int)&A0_BattleMgr_dword_699420->hex[v16];
      if ( 
v16 >= )
      {
        if ( 
v16 187 )
        {
          
v18 A0_BattleMgr_dword_699420->hex[v16].bstack_side;
          if ( 
v18 >= )
          {
            
v51 = *(_BYTE *)(v17 25);
            
v21 v18;
            
Stack_v20 A0_Battle_get_StackByGex_sub_4E7230(v17);
            
v19 = &A0_BattleMgr_dword_699420->field_53D4[20 v21 168] + v51;
            if ( !*
v19 )
            {
              *
v19 1;
              if ( 
v56 )
              {
                if ( 
v56->CreatureType_dword34 != Stack_v20->CreatureType_dword34 )
                  
BYTE3(Enemy) = 1;
              }
              else
              {
                
v56 Stack_v20;
              }
              
v51 0;
              if ( 
Stack_v20 )
              {
                
v23 A0_Battle_Stack_CalcDamage_sub_442E80((int)this_v30);
                
v22 A0_Battle_Stack_CalcDamageModifs_sub_443C60(
                        
this_v3,
                        
Stack_v20,
                        
v23,
                        
1,
                        
0,
                        
this_v3->GexesWay_Length_dword490,
                        &
v51);
                
v50 v22;
                
v49 A0_Battle_Stack_MakeDamage_sub_443DB0(Stack_v20v22);
                
this_v3->CurrAttack_Is_Lucky_dword70 0;
              }
              else
              {
                
v22 v50;
              }
              
v55 = (_BattleStack_ *)((char *)v55 v22);
              
v53 += v49;
            }
            
v15 v54;
          }
        }
      }
      ++
v15;
      
v54 v15;
    }
    while ( 
v15 );
    if ( (
signed int)v55 )
    {
      if ( 
BYTE3(Enemy) )
        
v24 0;
      else
        
v24 v56;
      
v25 this_v3->CreatureType_dword34;
      if ( 
v25 || v25 150 )
      {
        
v26 A0_Empty_dword_691260;
      }
      else
      {
        if ( 
this_v3->Count_dword4C == )
          
v26 = (*Main_MonsersTable_off_6747B0)[v25].NameSingle_dword14;
        else
          
v26 = (*Main_MonsersTable_off_6747B0)[v25].NameMulti_dword18;
      }
      
A0_Battle_Attacking_Log_Message_sub_469670(
        (int)
A0_BattleMgr_dword_699420,
        (
char)v26,
        
this_v3->Count_dword4C,
        (int)
v55,
        
v24,
        
v53);
      
A0_Battle_DrawAction_Play_sub_468570(A0_BattleMgr_dword_699420v521);
    }
  }
  else
  {
    if ( 
CreatureType_v9 == 64 || CreatureType_v9 == 65 )// Лич, могущественный лич
    
{
      
v32 off_687FA8[2586];
      if ( 
v32 != -)
      {
        if ( !
A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) )
        {
          
A0_StartAndPlaySample_Parallel_sub_59A890((char *)off_687FA8[2585], -13);
          
v34 A0_Load_Def_sub_55C9C0(A0_BattleAnims_off_641E18[v32]);
          
Enemy = (int)((char *)A0_BattleMgr_dword_699420 112 Enemy_v8->GexNum_dword38);
          
v33 = *(_WORD *)(Enemy 452);
          if ( 
Enemy_v8->Creature_29dword74.Flags_dword10 )
            
v33 += (Enemy_v8->Orientation_dword44 != 0x2C 0) - 22;
          
v49 v33 - *(_DWORD *)(v34 48) / 2;
          
v36 = *(_WORD *)(Enemy 454) - Enemy_v8->CreatureImageHeight_dword16C - *(_DWORD *)(v34 52) / 2;
          
v35 0;
          
Enemy v36;
          while ( 
)
          {
            
v37 = *(_DWORD *)(v34 40) > && **(_DWORD **)(v34 44) ? ***(_DWORD ***)(v34 28) : 0;
            if ( 
v35 >= v37 )
              break;
            
A0_Battle_Draw_sub_493FC0((int)A0_BattleMgr_dword_69942000010011);
            
A0_Battle_DrawOrSetBorders_TranparentDef_sub_494F30(
              (int)
A0_BattleMgr_dword_699420,
              
v34,
              
v35,
              
v49,
              
Enemy,
              
0,
              
0);
            
A0_FlipBattle_sub_493300((int)A0_BattleMgr_dword_699420);
            ++
v35;
          }
          
A0_Battle_Draw_sub_493FC0((int)A0_BattleMgr_dword_699420100010);
          (*(
void (__thiscall **)(int))(*(_DWORD *)v34 4))(v34);
        }
      }
      
A0_Battle_Clear_Stacks_Redraw_Needs_sub_5A69C0(A0_BattleMgr_dword_699420);
      
v53 0;
      
v54 0;
      
v55 0;
      
BYTE3(Enemy) = 0;
      
v56 0;
      do
      {
        if ( 
v56 == (_BattleStack_ *))
          
v38 this_v3->Attacked_Or_MoveTarget_Gex_Num_dword1C;
        else
          
v38 sub_524370(this_v3->Attacked_Or_MoveTarget_Gex_Num_dword1Cv56);
        
v39 = (int)&A0_BattleMgr_dword_699420->hex[v38];
        if ( 
v38 >= )
        {
          if ( 
v38 187 )
          {
            
v40 A0_BattleMgr_dword_699420->hex[v38].bstack_side;
            if ( 
v40 >= )
            {
              
v49 = *(_BYTE *)(v39 25);
              
v41 v40;
              
v42 A0_Battle_get_StackByGex_sub_4E7230(v39);
              if ( 
v56 == (_BattleStack_ *)|| (v42->Creature_29dword74.Flags_dword10 >> 4) & )
              {
                
v43 = &A0_BattleMgr_dword_699420->field_53D4[20 v41 168] + v49;
                if ( !*
v43 )
                {
                  *
v43 1;
                  
v49 0;
                  if ( 
v42 )
                  {
                    
v44 A0_Battle_Stack_CalcDamage_sub_442E80((int)this_v30);
                    
v50 A0_Battle_Stack_CalcDamageModifs_sub_443C60(
                            
this_v3,
                            
v42,
                            
v44,
                            
1,
                            
0,
                            
this_v3->GexesWay_Length_dword490,
                            &
v49);
                    
v51 A0_Battle_Stack_MakeDamage_sub_443DB0(v42v50);
                    
this_v3->CurrAttack_Is_Lucky_dword70 0;
                  }
                  
v54 += v50;
                  
v53 += v51;
                  if ( 
v55 )
                  {
                    if ( 
v55->CreatureType_dword34 != v42->CreatureType_dword34 )
                      
BYTE3(Enemy) = 1;
                  }
                  else
                  {
                    
v55 v42;
                  }
                }
              }
            }
          }
        }
        
v46 __SETO__(&v56->CurrDrawAct_IsShooter_byte17);
        
v45 = (signed int)((char *)v56 6) < 0;
        
v56 = (_BattleStack_ *)((char *)v56 1);
      }
      while ( 
v45 v46 );
      if ( 
v54 )
      {
        if ( 
BYTE3(Enemy) )
          
v55 0;
        
v47 this_v3->CreatureType_dword34;
        if ( 
v47 || v47 150 )
        {
          
v48 A0_Empty_dword_691260;
        }
        else
        {
          if ( 
this_v3->Count_dword4C == )
            
v48 = (*Main_MonsersTable_off_6747B0)[v47].NameSingle_dword14;
          else
            
v48 = (*Main_MonsersTable_off_6747B0)[v47].NameMulti_dword18;
        }
        
A0_Battle_Attacking_Log_Message_sub_469670(
          (int)
A0_BattleMgr_dword_699420,
          (
char)v48,
          
this_v3->Count_dword4C,
          
v54,
          
v55,
          
v53);
        
A0_Battle_DrawAction_Play_sub_468570(A0_BattleMgr_dword_699420, -11);
      }
    }
    else
    {
      
Enemy 0;
      if ( 
Enemy_v8 )
      {
        
v28 A0_Battle_Stack_CalcDamage_sub_442E80((int)this_v30);
        
v27 A0_Battle_Stack_CalcDamageModifs_sub_443C60(
                
this_v3,
                
Enemy_v8,
                
v28,
                
1,
                
0,
                
this_v3->GexesWay_Length_dword490,
                &
Enemy);
        
Enemy A0_Battle_Stack_MakeDamage_sub_443DB0(Enemy_v8v27);
        
this_v3->CurrAttack_Is_Lucky_dword70 0;
      }
      else
      {
        
v27 Enemy;
      }
      
A0_Battle_DrawAction_Play_sub_468570(A0_BattleMgr_dword_699420, -10);
      
v29 this_v3->CreatureType_dword34;
      if ( 
v29 || v29 150 )
      {
        
v30 A0_Empty_dword_691260;
      }
      else
      {
        if ( 
this_v3->Count_dword4C == )
          
v30 = (*Main_MonsersTable_off_6747B0)[v29].NameSingle_dword14;
        else
          
v30 = (*Main_MonsersTable_off_6747B0)[v29].NameMulti_dword18;
      }
      
A0_Battle_Attacking_Log_Message_sub_469670(
        (int)
A0_BattleMgr_dword_699420,
        (
char)v30,
        
this_v3->Count_dword4C,
        
v27,
        
Enemy_v8,
        
Enemy);
      if ( !
A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) )
      {
        if ( !
A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) )
        {
          
v31 = (int)this_v3->Shot_Sound_dword17C;
          if ( 
v31 )
            
A0_Wait_Sample_sub_59A1C0((void *)A0_SoundMgr_dword_699414, *(_DWORD *)(v31 28), -1);
        }
      }
    }
  }


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


RE: Исследование героев - totkotoriy - 04.07.2012 21:52

Может кто знает как можно убрать врожденную воговскую абилку-заклинание существа?
Например "Защита от ...."
Очень надо Bad


RE: Исследование героев - Berserker - 04.07.2012 22:55

У кого именно? Где-то на hc феанор писал код для смены заклинания монстрам.


RE: Исследование героев - totkotoriy - 04.07.2012 23:34

У посланников всех


RE: Исследование героев - totkotoriy - 05.07.2012 22:15

(04.07.2012 22:55)Berserker Wrote:  У кого именно? Где-то на hc феанор писал код для смены заклинания монстрам.
А подскажи пожалуйста: как там тема то называется?
ERM discussion? И какой у него там ник?


RE: Исследование героев - Berserker - 05.07.2012 22:45

0xFEA, тема скорее всего ERM Help and Discussion.


RE: Исследование героев - Sav - 06.07.2012 18:30

Отрисовка текста на изображение.



RE: Исследование героев - Berserker - 21.08.2012 15:42

Sav Wrote:
Berserker Wrote:Sav, а вот это уже интересно. Как сделать деф, чтобы при замене дефа страха он проигрывался полупрозрачным?
Специального дефа не нужно, полупрозрачность работает с любым. Это параметр у функции, которая отрисовывает анимации, (0x47BA90) любую анимацию можно отрисовывать полупрозрачно. Ну, разумеется, полупрозрачность не регулируемая, одинакова для каждого пикселя.

Вот, как устроена таблица боевых анимаций.
PHP Code:
// Структура боевой анимации.
NOALIGN struct _BattleAnim_
{
  
_cstr_ DefName// Имя def`а анимации
  
_cstr_ TouchEffect_Name// Имя тактильного эффекта анимации (для его воспроизведения на нестандартных элементах управления с помощью IFC20.dll)
  
_dword_ Properties// Свойства боевой анимации (по несколько битов)
  // ***
  // Начало описания свойств анимации
  // ***
    // (сдвиг - размер в битах - значение) 
    // 0 - 4 - Позиция отображения (0 - от земли на стеке или гексе, 1 - посередине гекса или стека, 2 - выше стека, 3 - перед стеком, 4 - с нижней и левой границы гекса, -1 - нет позиции)
    // 4 - 4 - Не используется
    // 8 - 1 - Прозрачность (0 - нет, 1 - есть)
    // 9 - 23 - Не используется
  // ***
  // Конец описания свойств анимации
  // ***
}; 
PHP Code:
_BattleAnim_o_BattleAnimation = ((_BattleAnim_*)0x641E18);

_int_ BattleAnims_Count 83
В Воге таблица, перенесена на адрес 0x7B6980. Номера анимаций соответствую номерам в таблице BM:V в ERM-help. С помощью UN:C можно легко на время изменить параметры любой анимации.



RE: Исследование героев - totkotoriy - 28.09.2012 01:40

Подскажите пожалуйста как можно отловить ошибку в моде если вылетает там где не должно вылетать... на проверке включена опция игры или нет. Может какие то текстовики корявые сделал?


RE: Исследование героев - GrayFace - 01.10.2012 16:07

На UN:P чтоли?


RE: Исследование героев - totkotoriy - 01.10.2012 16:44

(01.10.2012 16:07)GrayFace Wrote:  На UN:P чтоли?
Да.... я вот замечал что если какие то текстовики корявые то часто вылетает на проверке опций... а вот как узнать даже в каком месте что-то в них не так... редактора нормального для них нету... только HEX едитором приходиться редактировать.

Еще хотел тоже спросить:
Можно ли поменять родную почву для замков? Это в RMG шаблонах можно сделать?

И как убрать окошки благословений и проклятий от ZVS в окне героя? Я как думаю это сделано в ZVSlib.dll
Поместить поверх кнопку от ЭРЫ не получается, все равно первое окно вылазиет наверх.


RE: Исследование героев - GrayFace - 01.10.2012 17:23

На UN:P, по идее, не может вылетать. Он ни от каких текстовиков не зависит.
Все текстовики ВоГа редактируются ERM Scripter'ом. Txt таблицы - моим TxtEdit http://sites.google.com/site/sergroj/wog/
Родная почва, используемая при генерации - 0x6408D8. Используемая в игре - 0x6436A8. В RMG.txt можно задать только конкретную почву, не зависящую от замка.


RE: Исследование героев - totkotoriy - 01.10.2012 19:17

(01.10.2012 17:23)GrayFace Wrote:  На UN:P, по идее, не может вылетать. Он ни от каких текстовиков не зависит.
Все текстовики ВоГа редактируются ERM Scripter'ом. Txt таблицы - моим TxtEdit http://sites.google.com/site/sergroj/wog/
Родная почва, используемая при генерации - 0x6408D8. Используемая в игре - 0x6436A8. В RMG.txt можно задать только конкретную почву, не зависящую от замка.
Это да, сам связи не пойму...
А можно например в ТхтEdit добавить строку куда нибудь в середину, а не только в конец?

А как понять используемая при генерации и используемая в игре? В чем разница?


RE: Исследование героев - Sav - 01.10.2012 19:42

totkotoriy Wrote:А как понять используемая при генерации и используемая в игре? В чем разница?
В игре - это родная почва города. При генерации - это почва, которая сгенерируется под городом, если в rmg будет стоять match to town. Она соответствует родной у всех, кроме темницы, у которой грязь. Ну и если город оказался в подземке (а для городов игрока это может случиться только с инферно, некрополисом и темницей), то любая почва, кроме лавы, заменется на подземелье.


RE: Исследование героев - gamecreator - 01.10.2012 20:16

еще текстовики можно экселем редактировать


RE: Исследование героев - GrayFace - 01.10.2012 20:34

(01.10.2012 19:17)totkotoriy Wrote:  А можно например в ТхтEdit добавить строку куда нибудь в середину, а не только в конец?
Ctrl+Enter


RE: Исследование героев - totkotoriy - 01.10.2012 20:48

(01.10.2012 19:42)Sav Wrote:  
totkotoriy Wrote:А как понять используемая при генерации и используемая в игре? В чем разница?
В игре - это родная почва города. При генерации - это почва, которая сгенерируется под городом, если в rmg будет стоять match to town. Она соответствует родной у всех, кроме темницы, у которой грязь. Ну и если город оказался в подземке (а для городов игрока это может случиться только с инферно, некрополисом и темницей), то любая почва, кроме лавы, заменется на подземелье.
Опять ничего не понял... Что такое родная почва города в игре? И где это учитывается, на что влияет?

(01.10.2012 20:34)GrayFace Wrote:  
(01.10.2012 19:17)totkotoriy Wrote:  А можно например в ТхтEdit добавить строку куда нибудь в середину, а не только в конец?
Ctrl+Enter
Это если нажать редактирование строки так можно сделать... а вот чтоб просто можно было вставить строку, например ниже выделенной
Image: string.jpg


RE: Исследование героев - Berserker - 01.10.2012 21:03

Файл -> открыть как таблицу.


RE: Исследование героев - totkotoriy - 01.10.2012 21:40

(01.10.2012 21:03)Berserker Wrote:  Файл -> открыть как таблицу.
Спасибо! Даже не знал, а корректно со строками работает? А то может там другой какой-нибудь формат, не как у героев. Какой-нибудь там символ неправильно в конце строки поставит и кранты.

Надо бы конечно вообще всеобъемлющий FAQ по модингу сделать, а то столько мучился, даже не знал про ТХТ в ErmScriptor'e...


RE: Исследование героев - Berserker - 01.10.2012 22:07

Да мы уже давно говорили, что TextEdit и ErmEditor нормально работают с геройскими текстовиками. Формат там простой.


RE: Исследование героев - Sav - 01.10.2012 22:24

totkotoriy Wrote:Опять ничего не понял... Что такое родная почва города в игре? И где это учитывается, на что влияет?
У каждого города есть родная почва (существа без городов соответственно родной почвы не имеют). Замок, Оплот, Сопряжение - трава; Башня - снег; Инферно - лава; Некрополис - грязь; Темница - подземелье; Цитадель - камни; Крепость - болото. Если у какого-то героя все существа принадлежат только тем городам, для которых некая почва - родная, то он ходит по этой земле без штрафа, как с экспертным поиском пути. В бою на родной земле все существа получают +1 к атаке, защите и скорости, видят и игнорируют мины. Почва при осаде всегда соответствует родной почве осаждаемого города.


RE: Исследование героев - totkotoriy - 01.10.2012 22:24

(01.10.2012 22:24)Sav Wrote:  У каждого города есть родная почва (существа без городов соответственно родной почвы не имеют). Замок, Оплот, Сопряжение - трава; Башня - снег; Инферно - лава; Некрополис - грязь; Темница - подземелье; Цитадель - камни; Крепость - болото. Если у какого-то героя все существа принадлежат только тем городам, для которых некая почва - родная, то он ходит по этой земле без штрафа, как с экспертным поиском пути. В бою на родной земле все существа получают +1 к атаке, защите и скорости, видят и игнорируют мины. Почва при осаде всегда соответствует родной почве осаждаемого города.
Точно, спасибо. Как я сам не додумался?....

(01.10.2012 22:07)Berserker Wrote:  Да мы уже давно говорили, что TextEdit и ErmEditor нормально работают с геройскими текстовиками. Формат там простой.
Ладно, будем надеяться..... просто помню, что какой-то редактор некорректно строки вставлял, а какой не помню (т.к. посмотрел в HEX редакторе, а там другие символы в конце строки были)...

А можете мне сказать адреса почв у замка и у сопряжения для генератора карт и родные в игре.
А то я так с этим всем и не разобрался Sorry и уже навряд ли разберусь...


RE: Исследование героев - Sav - 01.10.2012 22:25

Было на прошлой странице.


RE: Исследование героев - totkotoriy - 01.10.2012 22:40

(01.10.2012 22:25)Sav Wrote:  Было на прошлой странице.
Это те адреса, которые GrayFace написал?
А как от них отсчитать нужный замок?


RE: Исследование героев - Sav - 01.10.2012 22:46

Ну, +x или +x*4, посмотри сам, что там в памяти лежит.


RE: Исследование героев - gamecreator - 02.10.2012 00:45

разве почвы существ не отдельно для каждого существа заданы?


RE: Исследование героев - totkotoriy - 02.10.2012 01:14

GreyFace, Sav спасибо! Всё получилось...

(02.10.2012 00:45)gamecreator Wrote:  разве почвы существ не отдельно для каждого существа заданы?
Я так понимаю у существ принадлежность к замку, а замок уже к почве.


RE: Исследование героев - GrayFace - 02.10.2012 05:53

(01.10.2012 20:48)totkotoriy Wrote:  Это если нажать редактирование строки так можно сделать... а вот чтоб просто можно было вставить строку, например ниже выделенной
Это не TxtEdit.


RE: Исследование героев - Sav - 02.10.2012 09:55

gamecreator Wrote:разве почвы существ не отдельно для каждого существа заданы?
Нет, только для городов.


RE: Исследование героев - totkotoriy - 02.10.2012 12:29

(02.10.2012 05:53)GrayFace Wrote:  Это не TxtEdit.
Аааааа... вот оно что...
Sm просто названия сильно похожи

Хотя даже в последней ЭРЕ каталог называется TextEdit, а программа лежит TxtEdit.


RE: Исследование героев - totkotoriy - 12.10.2012 11:07

(02.10.2012 05:53)GrayFace Wrote:  Это не TxtEdit.
Очень жаль что нет поиска, очень неудобно. Или все таки есть?


RE: Исследование героев - gamecreator - 12.10.2012 13:09

все не пойму чем тебя не устроил эксель. и поиск есть, и строки можно вставлять куда угодно.


RE: Исследование героев - GrayFace - 12.10.2012 13:28

Да, поиска нету.


RE: Исследование героев - Berserker - 12.10.2012 14:22

Erm editor поддерживает поиск.


RE: Исследование героев - totkotoriy - 12.10.2012 21:59

(12.10.2012 14:22)Berserker Wrote:  Erm editor поддерживает поиск.
Но почему то, когда делаю открыть какой-нибудь *objects.txt как таблицу, показывается только первая строчка и всё....


RE: Исследование героев - Berserker - 13.10.2012 01:52

Значит остальные скрыты. Поэкспериментируйте с кнопками, там можно открыть.


RE: Исследование героев - totkotoriy - 21.10.2012 17:29

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

По сему ухожу в глубокую депрессию...
Может есть какие-нибудь мысли по этому поводу?


RE: Исследование героев - Sav - 21.10.2012 17:53

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


RE: Исследование героев - totkotoriy - 21.10.2012 17:57

(21.10.2012 17:53)Sav Wrote:  Менять надо не имя, а номер кадра. Имя - это касается загруженного ресурса, а не кнопки, его трогать нельзя, т. к. там двоичное дерево, поиск по которому основывается на том, что они должны быть в определённом порядке.
Спасибо! А не знаешь как находить номер кадра если это все постоянно в разные места загружается при запуске игры


RE: Исследование героев - Berserker - 21.10.2012 18:08

В в чём проблема описать кнопку в txt как в Secondary Skills Scrolling?


RE: Исследование героев - totkotoriy - 21.10.2012 18:22

(21.10.2012 18:08)Berserker Wrote:  В в чём проблема описать кнопку в txt как в Secondary Skills Scrolling?
Не пойму... а при чем тут эти кнопки?
Мне нужно чтоб при определенных условия кнопка остава