Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 10 окт 2020, 11:04

По-моему, вот это все, что касается отрицательной Удачи в Героях 3:
Разграбленная Пирамида: -2 к Удаче героя
Фонтан Удачи: от -1 до +3 к Удаче героя
Дьяволы/Архидьволы: -1 к Удаче врага
Заклинание "Неудача" (Misfortune): -1/-2 к Удаче выбранного вражеского отряда / всех вражеских отрядов

Лучше бы, конечно, разработчики не вырезали отрицательную Удачу, а добавили бы вторичный навык Неудача, который снижает Удачу врага на -1/-2/-3 (подобный навык есть в 5 Героях), например, и плюс нескольков артов, которые бы снижали Удачу врага, а также Мораль.
Ведь в игре есть 4-5 артов, которые повышаюют Мораль и Удачу героя.
А вот таких артов, которые бы снижали Мораль и Удачу врага, нет... В то время как в 5 Героях таких полно.

Видимо, именно потому, что получить отрицательную Мораль и уж тем более отрицательную Удачу гораздо сложнее, вероятности их выпадения в два раза выше, чем положительных (1/12 против 1/24).

Интересно было еще глянуть как работает Мораль/Удача в Героях 4 и Героях 5. Потому что первые были последними Героями от NWC, а последние (Герои 5) разрабатывались русскими разработчиками (Nival Interactive) и являються наиболее успешной частью среди всей серии (Герои 1-7), если не считать 3 Героев.

Так вот в 4 Героях:
Мораль и Удача изменяются в пределах от -10 до +10. С вероятностью 1/10 на 1 ед. То есть при -10/+10, мы имеем 100% шанс.
Но снижение и увеличение урона при выпадаении Удачи/Неудачи идет не в 2 раза, а в 1,5.
А Мораль там вообще совсем иначе работает. Влияет на Атаку (-25% или +25% к Атаке), на очередность хода и на очередность ответного удара.

А вот в 5 Героях все ближе к 3-ке:
Мораль и Удача изменяются в пределах от -5 до +5. Все что выше копится и отображается как текущая Мораль/Удача, но фактически в бою работает на уровне 5.
Полезно, если враг снижает Мораль/Удачу в бою (снижение идет не от 5, а от текущей, которая может быть более 5).
Выпадает с вероятностью 1/10 на 1 ед. То есть при -5/+5 (или ниже/выше), мы имеем 50% шанс.
Увеличение или снижение урона при выпадаении Удачи/Неудачи идет как и в 3 Героях, в 2 раза.
И здесь шансы выпадения отрицательной Морали/Удачи равны шансам положительной, так как в отличии от 3 Героев, здесь имеется некий баланс по модификаторам.

PS: Кстати, можно немного отбалансить отрицательную Удачу не добавляя при этом новых объектов, навыков и артефактов. Написать плагин, чтобы Фонтан Удачи случайно добавлял к Удаче героя не от -1 до +3, а от -3 до +3. Фонтаны попадаються куда чаще Пирамид.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 13 окт 2020, 18:07

Пока никак не доберусь до Неудачи. После работы "погамать" :smile1: хочется. Попробую на неделе написать.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 13 окт 2020, 18:22

AlexSpl писал(а):

Пока никак не доберусь до Неудачи. После работы "погамать" :smile1: хочется. Попробую на неделе написать.

Будем ждать. Плагина (Отрицательной Удачи) к моду для SoD/Complete я пока еще нигде не встречал. Это действительно полезная и нужная штука. Все верно подметил Ben80: :smile1:
Ben80 писал(а):

Мое мнение насчет отрицат. удачи - это та вещь, которая достаточно канонична, плюс скорее улучшает игру, чем ухудшает (приводит "в порядок" случаи с Misfortune и Дьяволами).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 14 окт 2020, 12:47

Плагин для отрицательной удачи:

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include "..\..\HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall BadLuckAnim(LoHook* h, HookContext* c)
{
    int Luck = c->eax;
       
    if ( Luck < 0 )
    {
        if ( Luck < -3 ) Luck = -3;
        // RandomInt(1, 12);
        if ( CALL_2(int, __fastcall, 0x50C7C0, 1, 12) <= -Luck )
        {
            _BattleStack_* stack = (_BattleStack_*)c->esi;
            // Setting Luck flag to Bad Luck state (-1)
            stack->field_70 = -1;
            // Is battle visible?
            if ( !CALL_1(bool, __thiscall, 0x46A080, o_BattleMgr) )
            {
                // Play sound
                CALL_3(void, __fastcall, 0x59A890, (const char*)"badluck.82m", -1, 3);
                // Show message
                sprintf(o_TextBuffer, o_GENRLTXT_TXT->GetString(45),
                    CALL_2(const char*, __fastcall, 0x43FE20, stack->creature_id, stack->count_current));
                CALL_4(void, __thiscall, 0x4729D0, o_BattleMgr->dlg, o_TextBuffer, 1, 0);
                // Play animation
                CALL_5(void, __thiscall, 0x4963C0, o_BattleMgr, 48, stack, 100, 0);
                   
            }
        }
        c->eax = 0;
    }

    return EXEC_DEFAULT;
}

int __stdcall HalveBasicDamage(HiHook* hook, _BattleStack_* stack, int a1)
{
    int BasicDamage = CALL_2(int, __thiscall, hook->GetDefaultFunc(), stack, a1);
    if ( stack->field_70 = -1 )
    {
        BasicDamage /= 2;
        if ( BasicDamage < 1 ) BasicDamage = 1;
    }

    return BasicDamage;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance((char*)"HD.Plugin.BadLuck");
            _PI->WriteLoHook(0x43F64E, BadLuckAnim);
            _PI->WriteLoHook(0x441530, BadLuckAnim);
            _PI->WriteHiHook(0x442E80, SPLICE_, EXTENDED_, THISCALL_, HalveBasicDamage);
        }
    }

    return TRUE;
}


Замените ( CALL_2(int, __fastcall, 0x50C7C0, 1, 12) <= -Luck ) на ( true ), если хотите быстро потестить.

Цитата:
Можно вместе с dll-кой подгружать lod, как это делает SOD_SP, там SoD_SP.lod с 5 своими def-ками.

DEF-ки можно просто кинуть в папку "_HD3_Data\Common".

* * *
Насчёт правильного уполовинивания урона можно подискутировать. В оригинале, если выпадает Удача, базовый урон просто прибавляется в определённом месте кода, т.е. не идёт его немедленное удвоение (иными словами, нет удвоения суммы бросков кости уронов в случае выпадения Удачи). Можно такое и для Неудачи запилить лоухуком: отнимать в том же месте кода половину базового урона. В плагине выше идёт уполовинивание суммы бросков кости уронов.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 14 окт 2020, 16:32

Спасибо за плагин.

Потестил. Нашел пару багов:
1. Урон при атаке у всех существ с подключенным плагином всегда уполовинивается независимо от того, выпала Неудача или нет.
2. С нейтралами не работает. Если, например, Архидьяволами нападаешь на нейтралов и ставишь на них закл Неудачи, как бы отображается, что их Удача -3, но она никогда не срабатывает.

AlexSpl писал(а):

Насчёт правильного уполовинивания урона можно подискутировать. В оригинале, если выпадает Удача, базовый урон просто прибавляется в определённом месте кода, т.е. не идёт его немедленное удвоение (иными словами, нет удвоения суммы бросков кости уронов в случае выпадения Удачи). Можно такое и для Неудачи запилить лоухуком: отнимать в том же месте кода половину базового урона. В плагине выше идёт уполовинивание суммы бросков кости уронов.

А как лучше? Может сделать так, как идет в оригинале с положительной Удачей?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 14 окт 2020, 16:39

Цитата:
2. С нейтралами не работает. Если, например, Архидьяволами нападаешь на нейтралов и ставишь на них закл Неудачи, как бы отображается, что их Удача -3, но она никогда не срабатывает.

С нейтралами, скорее всего, тот же баг, что с Удачей. Удача на них тоже не работает. Где-то видел фикс.

Цитата:
1. Урон при атаке у всех существ с подключенным плагином всегда уполовинивается независимо от того, выпала Неудача или нет.

Это странно. Флаг stack->field_70 устанавливается в случае срабатывания Удачи/Неудачи и сбрасывается в 0 после атаки. Нужно смотреть.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 14 окт 2020, 16:49

Короч, нашёл ошибку. Исправьте условие: if ( stack->field_70 == -1 )
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 14 окт 2020, 16:53

AlexSpl писал(а):

Насчёт правильного уполовинивания урона можно подискутировать. В оригинале, если выпадает Удача, базовый урон просто прибавляется в определённом месте кода, т.е. не идёт его немедленное удвоение (иными словами, нет удвоения суммы бросков кости уронов в случае выпадения Удачи). Можно такое и для Неудачи запилить лоухуком: отнимать в том же месте кода половину базового урона. В плагине выше идёт уполовинивание суммы бросков кости уронов.


В плагине Феанора такой вариант первоначально и был - судя по закомментированному коду. Отказались от этого, видимо, из-за слишком слабого эффекта. Например, бьет герой, у которого половину урона составляет базовый, а половину - надбавка, благодаря показателям атаки. В случае срабатывания удачи удар усиливается в 1.5 раза. А вот в случае срабатывания неудачи - удар ослабляется всего лишь в 1.33 раза.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 14 окт 2020, 16:58

Ben80, мне кажется, что даже в случае Удачи следует удваивать именно сумму бросков кости уронов.

С нейтралами попробуйте добавить патч: _PI->WriteHexPatch(0x43F642, "90 90 90 90 90 90");
Последний раз редактировалось AlexSpl 14 окт 2020, 17:03, всего редактировалось 1 раз.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 14 окт 2020, 17:02

Цитата:
С нейтралами, скорее всего, тот же баг, что с Удачей. Удача на них тоже не работает. Где-то видел фикс.

Если есть готовый код этого фикса, то может его даже лучше будет включить в этот плагин. Хотя надо разобраться это вообще баг или так и было задумано и с нейтралами не должно работать?
Последний раз редактировалось Rolex 14 окт 2020, 17:06, всего редактировалось 1 раз.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6