Да - извини. Напутал с адресом. 0x4F0156 = 0x4F0516
Добавлено ([mergetime]1284897923[/mergetime]):
Поправил в первом посте, чтоб людей с толку не сбивать больше.
baratorch
19 Sep 2010, 18:24
перед прыжком на 0x4F051B кроме ebp, esp как минимум нужно установить правильные значения esi и edi, т.к они используются далее после 0x4F051B.
попробовал прыгнуть (с 0x66 = загрузить игру) из адвенча менеджера - вроде работает нормально и память никуда не утекает.
попробовал прыгнуть из менеджера обмена - в любой следующей начатой/загруженной игре, после срабатывания стартового события карты имеем активным диалог обмена между теми двумя героями (причем оно не отрисовывается пока мы с ним не повзаимодействуем) при закрытии этого окна обмена оказываемся в главном меню.
попробовал прыгнуть из опций битвы - сразу после появления главного меню Игра вылетает при попытке обратиться к какому-то виртуальному методу какого-то несуществующего диалога.
так что чтобы загрузиться из экрана битвы, надо хотя бы завершить битву и вернуться к главному окну менеджера обмена.
Но всё равно спасибо большое за твое решение, Дьяк! В любом случае это шаг вперед!
esi и edi вроде не используются. Я их специально обнулял и проверял. Адрес можно?
baratorch
19 Sep 2010, 20:43
какой адрес?
вроде как на еди действительно пофиг, а вот еси должен быть равен 0 (далее по коду [697308] должен сравниваться именно с 0). Если еси будет равен 1 при джампе, мы перед тем как увидеть главное меню посмотрим видео проигрыша сценария.
Ну вроде разобрался. Ща выложу свои соображения.
И так. Есть в игре различные менеджеры которые обеспечивают различные функции игры. Так вот:
0x6992D0 dd -> heroWindowManager
0x699414 dd -> soundManager
0x699420 dd -> combatManager
0x699530 dd -> inputManager
0x6992B8 dd -> advManager
0x69954C dd -> townManager
ну вроде все. advManager обнуляется автоматом. Т.к. выход происходит с карты приключений. Остальные должны обнулятся вручную. (Есно, если мы выходим из боя то нужно вдобавок обнулить combatManager).
Итак. Данные адреса - это указатели на класс. Т.е. опишу как классы выглядят (это очень условно, чтоб понятно было как добраться до деструктора):
struct Metod{
int Constructor;
int Destructor;
................
};
struct CombatManager{
Metod met;
.........
}*PMan;
Т.е. чтоб добраться до адреса процедуры деструктора нужно:
int AdressDestructora = PMan->met.Destructor;
Ну вот - теперь вроде должно работать.
Добавлено ([mergetime]1284922899[/mergetime]):
Аргумент передаваемый в функцию деструктора - адресс по которому располагается класс менеджера. Т.е. в ecx должен лежать адрес класса перед вызовом.
И так итог:
по адресу: 0x4F0516 (это начало карты) ставим свой хук и запоминаем esp, edi, esi и ebp в переменные. Это нам нужно будет для выхода с карты. Это самое сложное. Теперь чтобы выйти с карты достаточно сделать jmp из любого места кода на адрес 0x4F051B перезаписав предварительно sp, edi, esi и ebp и положив по адресу 697728 код выхода. 0x66 - код выхода "загрузить игру" 0x6C - код выхода "главное меню".
Обнулить нужные манагеры:
0x6992D0 dd -> heroWindowManager
0x699414 dd -> soundManager
0x699420 dd -> combatManager
0x699530 dd -> inputManager
0x69954C dd -> townManager
На этом пожалуй все. Если чего вдруг и осталось то это мелочи должны быть.
Еще нашел 0x6992B0 dd -> mouseManager. Но вроде его обнулять не нужно.
baratorch
20 Sep 2010, 00:13
для безглючного "загрузить игру" из окна опций битвы (BattleOptionsDlg) мне понадобилось следующее:
1. Вызов WindowManager->RemoveDialog(BattleOptionsDlg)
понятно WindowManager = [0x6992D0]
WindowManager::RemoveDialog = 0x602A60
BattleOptionsDlg = [0x694FE0]
2. вызов только лишь деструктора СombatManager
3. джамп по указанному Дьяком способу.
именно из-за неисполнения пункта 1 происходило это:
Цитата
попробовал прыгнуть из опций битвы - сразу после появления главного меню Игра вылетает при попытке обратиться к какому-то виртуальному методу какого-то несуществующего диалога.
То есть, после джампа диалог опций битвы, видимо, уничтожается, но не исключается из списка WindowManager'a
Как я понял, мы должны ручками исключать из менеджера окон все простые диалоги, вызванные поверх окна како-го либо менеджера (приглючений, битвы, города, обмена, ...). а затем уже вызывать деструктор менеджера.
Не знаю стоит ли перестраховываться и деструктить все подобные менеджеры или удалять только активные (окна которых висят поверх окна адвенча менеджера).
Ну что ж, спустя 11 лет у нас наконец появятся долгожданные кнопки! Ура!!
baratorch
20 Sep 2010, 00:51
Ан нет, глюки после данного способа все-таки есть, будем копать дальше...
Цитата(baratorch @ 20 Sep 2010, 00:13)
для безглючного "загрузить игру" из окна опций битвы (BattleOptionsDlg) мне понадобилось следующее:
1. Вызов WindowManager->RemoveDialog(BattleOptionsDlg)
понятно WindowManager = [0x6992D0]
WindowManager::RemoveDialog = 0x602A60
BattleOptionsDlg = [0x694FE0]
А если вызвать деструктор а потом конструктор. Не прокатит?
Что за глюки?
baratorch
21 Sep 2010, 22:43
Уф! родил, наконец:Цитата
для безглючного "загрузить игру" из окна опций битвы (BattleOptionsDlg) мне понадобилось следующее:
1. Вызов WindowManager->RemoveDialog(BattleOptionsDlg)
понятно WindowManager = [0x6992D0]
WindowManager::RemoveDialog = 0x602A60
BattleOptionsDlg = [0x694FE0]
2.
a) вызов функции 0x4B0950 с первым (ecx) аргументом [0x699550] и вторым аргументом СombatManager = [0x699420]
эта функция вызывает 2-ю функцию из виртуальной таблицы менеджера битвы( - не совсем деструктор, скорее деактиватор) и меняет значения некоторых полей первого и второго аргументов. Если мы вместо этой 0x4B0950 функции просто вызовем деактиватор менеджера битвы, то после первой битвы следом начтого сценария невозможно будет продолжать игру.
b) изменение значений полей AdventureManager = [0x6992B8]:
*(int*)(AdventureManager + 536) = -1;
*(int*)(AdventureManager + 540) = -1;
в этих полях хранятся x и y координаты атакованной клетки, если их не установить в -1, то при рестарте сценария атакованное до этого существо на карте не будет анимировать - будет в позе обороны.
в поле *(int*)(AdventureManager + 544) хранится z-координата атакованной клетки но ее изменение не требуетсяЦитата
3. джамп по указанному Дьяком способу.
ничего лишнего в коде, работает чётко, утечек памяти нет, при сетевой игре кинутые игроки получают относительно адекватную реакцию игры.
baratorch
22 Sep 2010, 00:33
!?
Лентяй
22 Sep 2010, 06:44
Вот! То, что было в 4ке но так не хватало в 3ке!
Throutle
23 Sep 2010, 07:59
Оффтоп. Имхо, то что было в 4-ке и так не хватало в 3-ке это кОрОваны от жилищ...
baratorch
23 Sep 2010, 14:58
Версия 2.50fПрошу прощения у авторов проектов, ориентирующихся на ХД мод, за то что изменил структуру файлов и папок хайреза.
Цитата
[!] Изменена структура папок и файлов в \HiRezData (не совместима с более ранними версиями);
файлы .def, .bmp, .txt, .fnt хранятся в \HiRezData\Common и \HiRezData\Packs\*;
общие для всех версий игры настройки и опции хранятся в файле \HiRezData\HiRez.ini;
специфические настройки разных версий и локализаций хранятся в \HiRezData\Packs\*\Pack.ini;
[+] для разных версий игры теперь не требудется скачивать и устанавливать дополнительные файлы;
[+] утилита Heroes3HDSetup.exe версии 2.50 стала удобнее и полезнее;
[+] дополнительные кнопки "Загрузить игру", "Начать заново", "Главное Меню", "Выйти из игры" в окне опций битвы;
[+] быстрое разделение/объединение отрядов в окне гарнизона;
[+] для того чтобы играть случайные карты игре не требуются файлы h3blade.exe и Data\h3ab_*;
[+] для игры за сопряжение и кампании клинка (AB) в Полном Собрании (Complete) не требуется наличие файла h3blade.exe;
[+] файлы .fnt читаются игрой из \HiRezData\Common;
[+] Текст в файле HiRez.txt для Польского Золтого Издания переведен на польский язык.
[-] в окне обмена героев с в ключенным расширенным управлением армии не работало стандартное разделение отрядов по [shift]+клик;
[-] баг поддержки 32-битного режима мог приводить к краху игры;
[-] в Полном Собрании (Complete) не работала кнопка Об Авторах (Credits);
[-] баг оригинальной игры: при наведении мыши и пкм на артефакт в рюкзаке в окне торговцев артефактами приводил к краху игры, если один первый или больше слотов были пусты. (теперь перед загрузкой окна торговцев в рюкзаке ликвидируются пробелы);
скачать: https://sites.google.com/site/heroes3hd/rus/download
на сайте появилась страничка "История изменений" (чейнджлог стартует с этой версии).
Spartak
23 Sep 2010, 20:35
baratorch, игра у меня виснет, когда играем через хамачи с другом, при передаче хода от него ко мне, если у меня в этот момент активное окно не игра, а другие приложения (например редактор карт - я карту строю или интернет эксплорер)
zmicer
23 Sep 2010, 20:38
На Воге и Эре при загрузке ругается на script00
у меня тоже на скрипт ругаеться только на другой
Berserker
23 Sep 2010, 21:24
Неужели бараторч и в GetSpreadshit вставил хук...имхо вообще хайрезу нельзя хуки на подгрузку ресурсов делать.
baratorch
23 Sep 2010, 21:46
блин хук там давно был, просто код теперь другой, ща верну старый..
baratorch
23 Sep 2010, 22:14
Аларик
23 Sep 2010, 22:42
а для чего в новой менюшке место для четырёх кнопок оставлено? или туда позже планируется что то исчо вставить?
Haart of the Abyss
23 Sep 2010, 23:23
Если вы про
эти, то они были всегда. Если нет — пардон, обознался.
baratorch
24 Sep 2010, 17:53
Цитата(Spartak @ 23 Sep 2010, 23:35)
baratorch, игра у меня виснет, когда играем через хамачи с другом, при передаче хода от него ко мне, если у меня в этот момент активное окно не игра, а другие приложения (например редактор карт - я карту строю или интернет эксплорер)
странно. у кого-нибудь еще это наблюдается?
у меня при игре <сам с собой> всё ок.
не знаю.. попробуй с отключенным 32-bit.
Цитата(Аларик)
а для чего в новой менюшке место для четырёх кнопок оставлено? или туда позже планируется что то исчо вставить?
ну можно туда например воткнуть опцию "быстрая битва", хотя сомневаюсь в полезности этого.
Наверное я переделаю сделанное. Cтандартную кнопку "По умолчанию" сделаю в левом углу, а справа уберу кнопку "выйти из игры", и оставшиеся 4-е кнопки сгруппирую так чтобы "Вернуться в игру" оказалась в правом углу. Представили?
hippocamus
24 Sep 2010, 18:39
Лучше эти 4 кнопки выстроить в ряд.
baratorch
25 Sep 2010, 03:48
2.52fhttp://sites.google.com/site/heroes3hd/rus/downloadЦитата
[+] переделан и доделан диалог Опций битвы
-изменено положение новых и старых кнопок;
-кнопкам "Загрузить игру", "Начать заново", "Главное меню" добавлена стандартная реакция на клик правой;
-в сетевой игре кнопки "Загрузить игру", "Начать заново" недоступны как и в окне Системных Опций в оригинале;
[-] ошибка в английской версии HiRez.txt (слово "whant" исправлено на "want");
[-] для того чтобы играть случайные карты игре не требуются файлы Data\h3ab_* (работало криво, да и не нужно особо).
по-моему так аккуратнее, красивее и удобнее
deadman_blr87
26 Sep 2010, 04:03
Цитата(baratorch @ 24 Sep 2010, 17:53)
Цитата(Spartak @ 23 Sep 2010, 23:35)
baratorch, игра у меня виснет, когда играем через хамачи с другом, при передаче хода от него ко мне, если у меня в этот момент активное окно не игра, а другие приложения (например редактор карт - я карту строю или интернет эксплорер)
странно. у кого-нибудь еще это наблюдается?
у меня при игре <сам с собой> всё ок.
не знаю.. попробуй с отключенным 32-bit.
Такая же ерунда, если сделать активным другое окно во время передачи хода игра виснет
Spektanto
26 Sep 2010, 07:27
Цитата(deadman_blr87 @ 26 Sep 2010, 07:03)
Цитата(baratorch @ 24 Sep 2010, 17:53)
Цитата(Spartak @ 23 Sep 2010, 23:35)
baratorch, игра у меня виснет, когда играем через хамачи с другом, при передаче хода от него ко мне, если у меня в этот момент активное окно не игра, а другие приложения (например редактор карт - я карту строю или интернет эксплорер)
странно. у кого-нибудь еще это наблюдается?
у меня при игре <сам с собой> всё ок.
не знаю.. попробуй с отключенным 32-bit.
Такая же ерунда, если сделать активным другое окно во время передачи хода игра виснет
Только что проверил - игра виснет только в полноэкранном режиме. Если играть в окне - всё нормально.
Причём у меня зависает, только если при альт-табе происходит смена разрешения экрана.
baratorch
26 Sep 2010, 09:08
спрошу все же. Это происходит и с включенной и отключенной встроенной поддержкой 32-bit? Просто мне кроме как 32-bit подозревать нечего.
Spektanto
26 Sep 2010, 10:10
Цитата(baratorch @ 26 Sep 2010, 12:08)
спрошу все же. Это происходит и с включенной и отключенной встроенной поддержкой 32-bit? Просто мне кроме как 32-bit подозревать нечего.
Только что проверил - без 32бит-патча ничего не зависает
baratorch
26 Sep 2010, 12:15
->Спасибо
Throutle
26 Sep 2010, 14:20
Эхъ... спасибы не работают ((( Бараторч! Ты рулишь!
hippocamus
26 Sep 2010, 15:44
baratorch, ты гений!
а ты не мог бы посмотреть, почему игра вылетает, если в карте больше чем 2 уровня? байт #0A в распакованной карте указывает на количество уровней карты.
http://heroes3towns.com/test-2.h3mВ этой карте 4 уровня.
fireman
29 Sep 2010, 19:17
http://sites.google.com/site/heroes3hd/Цитата
2.53f (29.09.2010)
[+] добавлен режим (альтернатива 32-битному), который при запуске игры автоматически меняет цветность экрана на 16-бит, что позволяет играть в окне не меняя режим экрана вручную; при завершении игры (в т.ч. аварийном) восстанавливается исходный цветовой режим.
[-]критический баг сетевой игры при вертикальном разрешении от 600 до 664.
[-]критический баг 32-битного режима.
[ ]перерисовaна малая панель ресурсов
deadman_blr87
29 Sep 2010, 23:10
Baratorch, что в планах сделать еще? Может быть стоит задуматься о нормальном окне чата в сетевой игре?
baratorch
30 Sep 2010, 00:33
В ближайших планах пока отдохнуть )
А вообще последнее чем занимался - это добавлением кнопок обмена артефактами в окно обмена.
Дальше хочу полностью переделать окно обмена, поработать над окном города, добавить в нем кнопки обмена армиями и быстрый найм существ.
Хочу сделать растягиваемое поле битвы. Идеальный проект на эту тему давно придумал.
Ну и наконец скорректировать бывшие полноэкранными окна, что бы их былая полноэкранность не была заметна. тут в основном работа с крафикой.
И про исправление оригинальных ошибок тоже забывать не буду. Надеюсь по мере накопления знаний о внутренностях прогресс в этом направлении будет идти.
После всего этого или параллельно с этим хочу наконец начать делать свой геймплейный мод. Сперва конечно же правка баланса и усиление AI.
вот как-то так
Цитата
Может быть стоит задуматься о нормальном окне чата в сетевой игре?
а поподробнее, я просто по сети не рублюсь и чатом соотв. не пользуюсь.
SAG19330184
30 Sep 2010, 14:14
Цитата(baratorch @ 30 Sep 2010, 01:33)
я просто по сети не рублюсь
попробуй, понравится
SerAlexandr
30 Sep 2010, 15:30
Хотел написать про курицу и яйца, но передумал
hippocamus
30 Sep 2010, 20:29
baratorch, ну вот ты работу с картами сверхбольших размеров наладил, а за многоуровневые не хочешь браться?
Shurup
30 Sep 2010, 21:31
Кстати вопрос: Поставил HD на SOD и обмен/делление стеков существ заработало прекрасно, а у сестры на WOG (3.58f) ни нового экрана обмена, ни дробление стека на равные части, ни перетаскивание всех, кроме одного.
С чем это может быть связано? Что-то нужно дополнительно в воге включать-выключать?
hippocamus
30 Sep 2010, 23:03
Почитай, про это было написано - там конфликт с Опытом существ, и чтобы включить поройся в ini файле.
Shurup
01 Oct 2010, 01:50
Цитата(hippocamus @ 30 Sep 2010, 23:03)
Почитай, про это было написано - там конфликт с Опытом существ, и чтобы включить поройся в ini файле.
Разобрался.
Кстати, если еще принимаются
пожелания , то есть еще два пожелания по поводу обмена.
Суть такова:1.
Просмотр книги заклинаний при обмене.- при обмене войсками между героями невозможно обменяться книжками - это понятно. Но можно ли (опционально) вместо сообщения "
этот предмет не возможно обменять" отбражать книгу этого героя? Было бы удобно при обмене свитками.
2. Обмен между гостем и гарнизонным героями в замке.
- Опциональная возможность вызывать окно обмена не выходя из замка.
baratorch
01 Oct 2010, 20:14
нет никаких ограничений по приему пожеланий.
открытие книги заклинаний при обмене, думаю совсем несложно сделать.
обмен армиями в городе я сделаю, я написал об этом выше.
вызов окна обмена не выходя из города - очевидно необходимая штука, да и реализовать просто. НО! делать ее в хд моде не буду - ибо обмен артефактами в городе без затрат хода - это уже изменение правил игры.
Поэтому разве что сделать так, чтобы при вызове тратился ход обоих героев.. но все равно не буду делать.
Оставлю эту фичу для своего геймплейного мода.
Цитата(SAG19330184 @ 30 Sep 2010, 17:14)
Цитата(baratorch @ 30 Sep 2010, 01:33)
я просто по сети не рублюсь
попробуй, понравится
да я не сомневаюсь, но если я играть буду, кто будет ХД делать?)
вообще меня пугает длительность сражений...
Цитата('hippocamus')
baratorch, ну вот ты работу с картами сверхбольших размеров наладил, а за многоуровневые не хочешь браться?
извини что не отвечал, я поковырялся с этой картой сразу как ты написал, и понял что наскоком проблему не решить, непроста. В будущем если время найдется, попробую снова поковыряться.
Кстати Я когда делал свою отрисовку миникарты столкнулся с дебилизмом программеров:
В большинсве случаев 3 координаты позиции на карте хранятся и передаются в одной четырехбайтовой переменной, побитово выглядит так: 00zzzzxx xxxxxxxx 000000yy yyyyyyyy - целые значения со знаком.
Как можно было додуматься до такого изврата и, главное, зачем я не знаю. Отсюда видно ограничение стандартного кода в 8 ..или 9 уровней карты. Ибо в zzzz можно записать 16 значений со знаком.
Etoprostoya
01 Oct 2010, 22:17
Иногда мне кажется, что проще дизассемблировать весь геройский екзешник нафих, переписав его на C\C++, и не мучиться с патчами а править непосредственно код и перекомпилировать. А потом я вспоминаю, сколько уже всяких патчей наделали, в том числе такой глобальный патч, как WoG, которые после рекомпиляции уже не будут работать и никому это дизассемблирование в принципе не нужно будет...
Haart of the Abyss
02 Oct 2010, 04:55
Лучше вспомни, сколько человек уже брались за переписывание экзешника. И сколько занимаются этим до сих пор.
Цитата
А потом я вспоминаю, сколько уже всяких патчей наделали, в том числе такой глобальный патч, как WoG, которые после рекомпиляции уже не будут работать и никому это дизассемблирование в принципе не нужно будет...
Метко подмечено. Между прочим, именно поэтому тройничный и лицевой нервы иннервируют не только мышцы лица, но и никак, казалось бы, не связанные с ними мышцы в глубине уха (при этом едва не перекрещиваясь друг с другом). И по этой же причине мы испражняемся через отверстие, развивающееся из первичного рта.
baratorch
02 Oct 2010, 18:56
Цитата(etoprostoya)
Иногда мне кажется, что проще дизассемблировать весь геройский екзешник нафих, переписав его на C\C++, и не мучиться с патчами а править непосредственно код и перекомпилировать.
все-таки это не проще. если надо, скажем для какого-то результата поменять всего одну константу в функции, декомпилить и переписывать всю функцию длиной в 500 строк не самое эффективное решение. Да и декомпиляция процесс не такой же легкий и однозначный как дизасм. ибо и HexRays допускает ошибки, которые очень трудно искать. Да и декомпиляция бывает разной: тупо переписать то, что выдает при первом запуске иды хекс рэйс - это одно, а полностью реверснутые классы их иерархия, их методы в т.ч. виртуальные, с полным пониманием назначения каждого поля и каждого метода - это другое если все реверсеры героев соберутся в одну команду, бросят всё модописание и отталкиваясь от общих наработок начнут работать над полным реверсом, то рано или поздно мы получим исходники героев.
Сам я если в функции собираюсь делать значительные изменения и если у меня реверснуты все типы и все функции используемые в этой функции (или почти все), то я естественно ее декомпилю и полностью переписываю на высоком уровне (в с++). Но иногда проще обойтись простым битхакингом.
Думаю так же работают и вог-тим и хота-тим и еще кто-нибудь там...
***
Народ. Требуется помощь. Я ща редизайню окно обмена и пришел к выводу что кнопка "получить от союзника" неоправданно большая (в новый дизайн точно не вписывается). И ей требуется замена с пиктограммой вместо текста. В связи с этим прошу предложить концепции или эскизы пиктограммы "получить от союзника". У меня есть мысли по этому поводу, но я их озвучивать не буду, чтобы не ограничивать вашу фантазию. Спасибо.
Shurup
02 Oct 2010, 20:49
Цитата(baratorch @ 02 Oct 2010, 18:56)
...пришел к выводу что кнопка "получить от союзника" неоправданно большая (в новый дизайн точно не вписывается). И ей требуется замена с пиктограммой вместо текста. В связи с этим прошу предложить концепции или эскизы пиктограммы "получить от союзника". У меня есть мысли по этому поводу, но я их озвучивать не буду, чтобы не ограничивать вашу фантазию. Спасибо.
А где эта кнопка есть/будет?
baratorch
02 Oct 2010, 21:01
есть при игре по сети при обмене с союзником
hippocamus
02 Oct 2010, 21:38
Что, можно будет просить у союзника ресурсы?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.