Дьякон
Posts: 395
|
Вот кстати адреса для СоДа, хотя может уже кто-то и выкладывал:
63AC58 - 5% урон за каждую единицу атаки
63AC28 - 300% - максимальный урон от базового
63B8C0 - 2.5% снижение урона за каждую единицу защиты
63AC50 - 100% база для вычитания урона
63B8B8 - 30% минимальный урон
все данные типа dq
Страус труп (с) Бьерн
|
|
04.03.2015 15:41 |
|
Berserker
Posts: 16657
|
|
04.03.2015 21:27 |
|
gamecreator
Posts: 7107
|
|
04.03.2015 23:57 |
|
major
Posts: 146
|
(04.03.2015 23:57)gamecreator Wrote: (03.03.2015 12:10)major Wrote: Подскажите, где найти функцию регенерации эликсира жизни. В воге/эре она подменяет стандартную, и вместо 50 хп регенит какой-то мусор, как мне кажется.
Посмотри, по адресу 0x446BD6 вызывается какая-то. Это подменяет Вог. После подмены там натуральный реген + опыт отрядов.
Да, это я и нашел, а вот чем это подменяет вог, не могу найти.
|
|
05.03.2015 19:21 |
|
gamecreator
Posts: 7107
|
|
05.03.2015 19:49 |
|
major
Posts: 146
|
Спасибо, более-менее разобрался.
Такой вопрос. Никогда не писал dll. Может кто-нибудь показать на простом примере, как это делается? Допустим, расширить список существ с атакой-возвратом. Т.е. не расширить на всех существ, а просто добавить доп. проверки.
Code:
2F9059 CMP EAX,48
2F905C JE SHORT 2F90BB
2F905E CMP EAX,49
2F9061 JE SHORT 2F90BB
2F9063 CMP EAX,9B
2F9068 JE SHORT 2F908B
Добавить сюда проверку на 44h и 45h.
Или, через ерм_хукер.
(This post was last modified: 09.03.2015 15:12 by major.)
|
|
09.03.2015 15:09 |
|
gamecreator
Posts: 7107
|
|
09.03.2015 15:43 |
|
feanor
Posts: 624
|
У меня сделано как-то так
Code:
#include "targetver.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "..\..\include\patcher_x86_commented.hpp"
#include "..\..\include\HotA\HoMM3.h"
#include "..\..\include\era.h"
Patcher * globalPatcher;
PatcherInstance *patcher;
int __stdcall StrikeAndReturn (LoHook* h, HookContext* c)
{
int unit = c->eax;
if (advanced_properties[unit].strike_n_ret)
{
if(o_CreatureInfo[unit].flags &1)
c->return_address = 0x75E08B;
else
c->return_address = 0x75E0BB;
}
else
{
c->return_address = 0x75E06A;
}
return NO_EXEC_DEFAULT;
}
int __stdcall StrikeAndReturnButton (LoHook* h, HookContext* c)
{
int unit = *(int*)(c->ebp-4);
if(advanced_properties[unit].strike_n_ret)
{
c->return_address = 0x762969;
}
else
{
c->return_address = 0x762955;
}
return NO_EXEC_DEFAULT;
}
void __stdcall PatchIt (PEvent e)
{
patcher->WriteLoHook(0x75E059,(void*)StrikeAndReturn);
patcher->WriteLoHook(0x762940,(void*)StrikeAndReturnButton);
}
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
globalPatcher = GetPatcher();
patcher = globalPatcher->CreateInstance("h2sw_creatures");
ConnectEra();
RegisterHandler(PatchIt,"OnAfterCreateWindow");
}
return TRUE;
}
правда, я еще не проверял))
(This post was last modified: 09.03.2015 18:28 by feanor.)
|
|
09.03.2015 18:27 |
|
major
Posts: 146
|
Для таблицы же тоже место выделить надо в экзешнике? Что значит DLL_PROCESS_ATTACH, т.е. каким образом это сделать?
|
|
09.03.2015 19:04 |
|
gamecreator
Posts: 7107
|
|
09.03.2015 19:10 |
|
Дьякон
Posts: 395
|
Процедура расчета для дипломатии:
0x4A73B0
Коэффициенты для расчета Power_Factor из ФизМига (см. со стр. 303)
63E500 - 7
63AC50 - 1
63B9E0 - 2
63AC70 - 0,5
63E4F8 - 0,333
Страус труп (с) Бьерн
|
|
10.03.2015 18:51 |
|
major
Posts: 146
|
В коде феанора все более-менее понятно, но есть пара вопросов.
1. advanced_properties[unit].strike_n_ret - это свойство юнита определено где-то ранее?
2.
Code:
#include "targetver.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "..\..\include\patcher_x86_commented.hpp"
#include "..\..\include\HotA\HoMM3.h"
#include "..\..\include\era.h"
Чтобы скомпилировать, нужны все эти файлы?
|
|
11.03.2015 13:51 |
|
gamecreator
Posts: 7107
|
|
11.03.2015 14:08 |
|
feanor
Posts: 624
|
(This post was last modified: 11.03.2015 15:12 by feanor.)
|
|
11.03.2015 15:12 |
|
gamecreator
Posts: 7107
|
|
11.03.2015 15:56 |
|