IPB

Здравствуйте, гость ( Вход | Регистрация )

29 страниц V  « < 21 22 23 24 25 > »   
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 30 Dec 2016, 20:15
Сообщение #441

God
Сообщений: 267
Спасибо сказали: 25 раз




если я правильно понимаю, теперь надо на адрес 00444928 поставить лоу хук
в ф-ии сделать другие цифры. И вернуть дефолтное?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 20:17
Сообщение #442

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Теперь LoHook на 44493Ch и пишете свой код.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 20:22
Сообщение #443

God
Сообщений: 267
Спасибо сказали: 25 раз




c->esi это у нас монстр?
Ибо не работает так:
Код
int __stdcall spellPray(LoHook* h, HookContext* c)
{
    *(int*)(c->esi + 200) += 2;

    return EXEC_DEFAULT;
}

Код
_PI->WriteLoHook(0x44493C, spellPray);
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 20:26
Сообщение #444

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Например, безусловно увеличиваем атаку дополнительно на +2:

Код
{
    c->ecx +=2;
    return EXEC_DEFAULT;
}


Если нужно не дополнительно (т.е. без стандартного бонуса к атаке), а прописать значение, то LoHook ставить нужно выше: 44493A. И скиповать инструкцию add ecx, eax.

Код
{
    c->ecx =10;
    c->return_address = 0x44493C;
    return NO_EXEC_DEFAULT;
}


Ещё нужно учесть, чтобы бонус корректно снимался. Просто кастуете молитву и ждёте, пока не сработает второй брейкпоинт: там бонус убирается. Соответственно, туда тоже LoHook. Например,

Код
{
    c->ecx -=2;
    return EXEC_DEFAULT;
}


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 20:39
Сообщение #445

God
Сообщений: 267
Спасибо сказали: 25 раз




А как проверить школу и уровень школы кастуемого заклинания?
Как я понимаю благо надо будет прописывать в ручную. И если герой кастует молитву базовую то и давать базовое благо
И ещё ... улучшеное благо это:
1. максимальная атака += 1;
2. минимальная атака = максимальная атака?

Или какая-то другая логика
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 20:40 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 20:43)
Сообщение #446

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Если удобнее через указатель на отряд, то вот код, который добавляет +6 к атаке:

Код
{
    *(int*)(c->esi + 200) += 6;
        c->return_address = 0x444942;
    return NO_EXEC_DEFAULT;
}


LoHook на 44493Ch (!)

Поправил. Стандартный бонус нужно пропустить.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 20:47
Сообщение #447

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 19:40) *
Если удобнее через указатель на отряд, то вот код, который добавляет +6 к атаке:

Код
{
    *(int*)(c->esi + 200) += 6;
        c->return_address = 0x444942;
    return NO_EXEC_DEFAULT;
}


LoHook на 44493Ch (!)

Поправил. Стандартный бонус нужно пропустить.

Вот если пропускаем стандартный бонус то возникает вопрос проверки школы..
Ибо базовый должен давать +4/4/2, улучшеный +6/6/4, эксперта то же самое что и улучшеный, но на всех
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 20:47 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 20:49)
Сообщение #448

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




А вот простейшее решение, если нужно поднять атаку и защиту одновременно, как это делает игра:

Код
{
    c->eax = bonus; // не += !
    return EXEC_DEFAULT;
}


LoHook на 44492Eh.

* * *
Цитата
Вот если пропускаем стандартный бонус то возникает вопрос проверки школы..
Ибо базовый должен давать +4/4/2, улучшеный +6/6/4, эксперта то же самое что и улучшеный, но на всех


Тогда так:

Код
{
    c->eax += relative bonus;
    return EXEC_DEFAULT;
}


LoHook на 44492Eh.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 20:56 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 20:56)
Сообщение #449

God
Сообщений: 267
Спасибо сказали: 25 раз




Так как школу(точнее уровень 0-1-2-3. Где 3 - эксперт, 0 - нет школы даже базовой) каста узнать то? smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 21:15 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 21:00)
Сообщение #450

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Так как школу(точнее уровень 0-1-2-3. Где 3 - эксперт, 0 - нет школы даже базовой) каста узнать то?

Лучше всего поставить брейкпоинт на +478h и найти место, где этот бонус прописывается. Тогда, наверное, и массовая версия работать будет нормально. Вот там школу будет проще получить.

Т.е. тот же алгоритм, только смещение добавляйте +478h, а не +0С8h.

Кстати, перед тем как ставить новый брейкпоинт на память рекомендую удалить старые: Ctrl+Alt+B. Иначе при следующем запуске игры будем получать останов в рандомном месте кода.

Короче, тут и искать не надо )

Всё рядом.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 21:18
Сообщение #451

God
Сообщений: 267
Спасибо сказали: 25 раз




Честно говоря пока что не понял про определение левела школы. Но массовая версия работает верно.

Вот кстати код отвечающий за снятие бонусов:
Код
.text:004443DF loc_004443DF:                                              ; CODE XREF: combatMonster_ResetSpellFromStack+4Ej
.text:004443DF                                                            ; DATA XREF: .text:off_004445C4o
.text:004443DF mov     eax, [esi+478h]                                    ; jumptable 0044427E case 3
.text:004443E5 mov     ecx, [esi+0C8h]
.text:004443EB mov     ebx, [esi+0CCh]
.text:004443F1 sub     ecx, eax                                           ; Integer Subtraction
.text:004443F3 mov     [esi+0C8h], ecx
.text:004443F9 mov     ecx, [esi+84h]
.text:004443FF shr     ecx, 6                                             ; Shift Logical Right
.text:00444402 sub     ebx, eax                                           ; Integer Subtraction
.text:00444404 test    cl, 1                                              ; Logical Compare
.text:00444407 mov     [esi+0CCh], ebx
.text:0044440D jnz     loc_004444E1                                       ; default
.text:0044440D                                                            ; jumptable 0044427E cases 2,4-7,10-14,16-26,29
.text:00444413 sub     [esi+0C4h], eax                                    ; Integer Subtraction
.text:00444419 jmp     loc_004444E1                                       ; default


Но я не до конца разобрался на какие адресса лоу хуки ставить... этот - 004443F1? Т.е. адерес после всех переменных
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 21:30
Сообщение #452

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




* * *
LoHook на 44490Ah.

В контексте хука c->ecx - указатель (адрес) на героя. Соответственно, скиллы доступны. с->edi - бонус Молитвы.

Т.е. задаём бонусы Молитвы:

Код
{
    if ( *(char*)(c->ecx + 201 + оффсет_школы_воды) == _уровень_ ) bonus = _такой-то_; // здесь идея, а не реализация )
    c->edi =  bonus;
    return EXEC_DEFAULT;
}


LoHook на 44490Ah.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 21:32
Сообщение #453

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 20:30) *
* * *
LoHook на 44490Ah.

В контексте хука c->ecx - указатель (адрес) на героя. Соответственно, скиллы доступны. с->edi - бонус Молитвы.

Т.е. задаём бонусы Молитвы:

Код
{
    if ( *(char*)(c->ecx + 201 + оффсет_школы_воды) == _уровень_ ) bonus = _такой-то_; // здесь идея, а не реализация )
    c->edi =  bonus;
    return EXEC_DEFAULT;
}


LoHook на 44490Ah.

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

Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 21:38 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 21:45)
Сообщение #454

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Но c->edi - это бонус сразу к атаке, защите и скорости. Если нужно дифференцировать бонусы, то придётся повозиться немного.

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

Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 21:53 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 21:53)
Сообщение #455

God
Сообщений: 267
Спасибо сказали: 25 раз




Пока что так получилось:
Код
int __stdcall spellPray(LoHook* h, HookContext* c)
{
    c->ecx += 2;
    c->ebx += 2;

    return EXEC_DEFAULT;
}

int __stdcall spellPrayEnd(LoHook* h, HookContext* c)
{
    c->ecx -= 2;
    c->ebx -= 2;

    return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x44493C, spellPray);
_PI->WriteLoHook(0x4443F1, spellPrayEnd);


Вроде работает

PS:
А вот и смещения для благо:
//_int_ damage_min; //+208 0xD0
//_int_ damage_max; //+212 0xD4


-----------

хм... не пойму пока как сделать благо
Как оно работает- все атаки наносят максимальный урон. Если улучшеное и выше, то макс. урон +1.
т.е. урон 4-7, после улучшеного блага всегда 8

Соотв. Как сделать благо - понятно, а как вернуть?)


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 21:59 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 22:07)
Сообщение #456

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Да, так должно работать. Метод есть. Дерзайте )

Цитата
хм... не пойму пока как сделать благо

У отряда есть поле, где хранится инфа о всех висящих на нём заклах. Попробуйте найти его и в коде для Молитвы добавить Bless. Хотя тогда в инфе об отряде Bless видно будет.

Есть ещё поля мин. урон и макс. урон - их изменить будет проще и правильнее. Если, конечно, не нужны фишки Bless типа +1 урону. Но и это реализовать можно, если проверять навык воды.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 22:06
Сообщение #457

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 20:59) *
Цитата
хм... не пойму пока как сделать благо

У отряда есть поле, где хранится инфа о всех висящих на нём заклах. Попробуйте найти его и в коде для Молитвы добавить Bless. Хотя тогда в инфе об отряде Bless видно будет.

Есть ещё поля мин. урон и макс. урон - их изменить будет проще и правильнее. Если, конечно, не нужны фишки Bless типа +1 урону.

Я ж выше написал. Даже +1 сделать не проблема
Вопрос в том как это вернуть после окончания действия
Ибо значения переписаны, я не знаю на сколько изменилось оно. Ибо может и не изменится вовсе (аля ангел). А может сильно (гидра 25-45 урон)

После блесса получится "46" и минимальный и максимальный. Максимальный какой понятно. Если улучшеный и выше - тогда текущий максимальный -1
А вот как минимальный получить?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 22:11 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 22:18)
Сообщение #458

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




На отряде и другие модификаторы атаки/защиты висеть могут. Тогда либо вешать одновременно с Mолитвой Блесс. Либо искать код, который считает урон и изменять условие:

if ( spell == Bless ) на if ( (spell == Bless) || (spell == Prayer) )

По опыту исследования кода Героев 2 скажу, что, вероятнее всего, игра так и делает. Т.е. не модифицирует мин. и макс. урон, а именно проверяет, висит ли Bless, и просто использует изменённые значения при расчёте урона или если требуется в окошке урон показать.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 22:32 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 22:36)
Сообщение #459

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 21:11) *
На отряде и другие модификаторы атаки/защиты висеть могут. Тогда либо вешать одновременно с Mолитвой Блесс. Либо искать код, который считает урон и изменять условие:

if ( spell == Bless ) на if ( (spell == Bless) || (spell == Prayer) )

По опыту исследования кода Героев 2 скажу, что, вероятнее всего, игра так и делает. Т.е. не модифицирует мин. и макс. урон, а именно проверяет, висит ли Bless, и просто использует изменённые значения при расчёте урона или если требуется в окошке урон показать.

попробую найти где ставится статус заклинаний. И добавить туда благо

Есть ещё, на крайняк идея - найти пустое место и туда записать минимальный урон каждого юнита. Всего надо 42 значения. По 21 на каждую сторону
Во время каста молитвы - это поля предварительно очищать. А когда отрабатывает код завершение бонусов молитвы - из этого места брать оригиналы минимального урона
Но это слишком сложное и муторное решение

Или вариант 3: по анналогии со скоростью. Есть скорость а есть модификатор скорости.
Может так же существует минимальный урон и модификатор миниального урона. Но в базе Феанора этого не нашел. Да и модификатора скорости тоже smile.gif Его как-то Игрик писал
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 22:34 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 22:41)
Сообщение #460

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




А хедерах нет описания структуры стека? Счас посмотрю.

Не, куда-то я их засунул, теперь не помню куда. Можно скачать на WoG-форуме.
Go to the top of the pageAdd Nick
 
+Quote Post

29 страниц V  « < 21 22 23 24 25 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 5 October 2025 - 03:07
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика