Wake of Gods Forum | Форум Во Имя Богов

Full Version: Исследование героев
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Вот кстати адреса для СоДа, хотя может уже кто-то и выкладывал:

63AC58 - 5% урон за каждую единицу атаки
63AC28 - 300% - максимальный урон от базового
63B8C0 - 2.5% снижение урона за каждую единицу защиты
63AC50 - 100% база для вычитания урона
63B8B8 - 30% минимальный урон

все данные типа dq
У приведения не полный реген, а очков 35, кажется.

Дьякон Wrote:Вот кстати адреса для СоДа, хотя может уже кто-то и выкладывал:

63AC58 - 5% урон за каждую единицу атаки
63AC28 - 300% - максимальный урон от базового
63B8C0 - 2.5% снижение урона за каждую единицу защиты
63AC50 - 100% база для вычитания урона
63B8B8 - 30% минимальный урон
(03.03.2015 12:10)major Wrote: [ -> ]Подскажите, где найти функцию регенерации эликсира жизни. В воге/эре она подменяет стандартную, и вместо 50 хп регенит какой-то мусор, как мне кажется.
Посмотри, по адресу 0x446BD6 вызывается какая-то. Это подменяет Вог. После подмены там натуральный реген + опыт отрядов.
(04.03.2015 23:57)gamecreator Wrote: [ -> ]
(03.03.2015 12:10)major Wrote: [ -> ]Подскажите, где найти функцию регенерации эликсира жизни. В воге/эре она подменяет стандартную, и вместо 50 хп регенит какой-то мусор, как мне кажется.
Посмотри, по адресу 0x446BD6 вызывается какая-то. Это подменяет Вог. После подмены там натуральный реген + опыт отрядов.
Да, это я и нашел, а вот чем это подменяет вог, не могу найти.
Так запусти Вог, он и подменит этот вызов на свой. Ничего искать тут не надо.
Если надо, то можно бинарный патч сделать, который бы это отключал.
Спасибо, более-менее разобрался.
Такой вопрос. Никогда не писал 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.
Или, через ерм_хукер.
Проще расширить на всех существ. Думаю, даже поместится вместо оригинального кода. Что-то типа
Code:
cmp [таблица+eax], 0
je short 2f908b
Перезаписываешь это в DLL_PROCESS_ATTACH или OnAfterWog.
У меня сделано как-то так

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;
}

правда, я еще не проверял))
Для таблицы же тоже место выделить надо в экзешнике? Что значит DLL_PROCESS_ATTACH, т.е. каким образом это сделать?
Не обязательно в экзешнике, в твоей длл тоже можно. Что такое DLL_PROCESS_ATTACH у feanorа в примере очень понятно написано.
Процедура расчета для дипломатии:
0x4A73B0

Коэффициенты для расчета Power_Factor из ФизМига (см. со стр. 303)
63E500 - 7
63AC50 - 1
63B9E0 - 2
63AC70 - 0,5
63E4F8 - 0,333
В коде феанора все более-менее понятно, но есть пара вопросов.
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"
Чтобы скомпилировать, нужны все эти файлы?
Судя по всему, advanced_properties - просто новый массив из Хоты. Если тебе не хочется ничего расширять, то напиши свою проверку в условии, без массивов.
Quote:1. advanced_properties[unit].strike_n_ret - это свойство юнита определено где-то ранее?
да

Quote:Чтобы скомпилировать, нужны все эти файлы?
где-то я уже выкладывал свою папку с инклудами
https://dl.dropboxusercontent.com/u/6175...nclude.zip

а, и заодно сам пример (MSVS 2008)
https://dl.dropboxusercontent.com/u/6175...sample.zip

единственно что, я его написал, но еще не проверял в работе))
Вообще польза от использования патчера в этом конкретном случае достаточно сомнительна. Если два мода независимо добавляют атаку с возвратом, то никакой патчер их совместимыми не сделает.
Reference URL's