Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

Герои 2 (разные версии) с плагинами

Не запускается игра? Проблемы со звуком? Где, в конце концов, взять игру, скачать патчи, приложения и карты? Как установить все это? Все проблемы обсуждаем в этом разделе
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1212
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 309 раз.

Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 07 окт 2020, 11:42

Добавлена поддержка плагинов для Героев 2 (при этом использован Loader от AlexSpl). Поддерживаемые версии: SW 1.3 (английская), PoL 2.0 (английская), PoL 2.1 (английская), PoL 2.1 (русская), PoL 2.1 (польская), PoL 2.1 (чешская).

Для поддержки плагинов необходимо либо использовать GL Wrapper (версии 1.48 и новее), либо заменить MSS32.dll в корневой папке игры на файл с таким же названием из Героев 3
MSS32.zip
(136.19 КБ) Скачиваний: 214

Кроме того, необходимо скачать архив и распаковать файлы оттуда в корневую папку игры
loader.zip
(106.69 КБ) Скачиваний: 253


Плагины, которые вы хотели бы добавить в игру нужно будет положить в папку Plugins (класть нужно непосредственно DLL файлы, а не папки, содержащие DLL файлы).

Сами плагины смотрите в этой теме ниже этого поста.
Последний раз редактировалось Ben80 30 май 2021, 07:21, всего редактировалось 4 раз(а).
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 07 окт 2020, 11:49

Плагин, исправляющий невозможность для ИИ купить только одно существо какого-то типа в своем замке.
В оригинальной игре эта невозможность в случае с дорогими существами 6 уровня в конечном счете приводит к кумулятивному эффекту, сильно влияющему на геймплей (затруднена покупка ИИ Гигантов и Зеленых Драконов, при этом зачастую в замке ИИ скапливаются невыкупленные Титаны и Черные Драконы).

Сам плагин:
H2_40_BlueGiant.zip
(3.41 КБ) Скачиваний: 152


С поддержкой чешских версий PoL 2.1:
H2_40_BlueGiant.zip
(3.43 КБ) Скачиваний: 121


Исходный код:
 
Код: Выделить всё
#include "../../include2020_v1/patcher_x86.hpp"

Patcher* _P;
PatcherInstance* _PI;

static _bool_ plugin_On = 0;


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("H2_BlueGiant");

            int check;

            // H2 Eng SW 1.3
            check = *(int*)(0x434317+6);
            if(check == 0x14000000)
            {
                _PI->WriteByte(0x43DF14+1, 0x8C);
            }

            // H2 Eng PoL 2.0
            check = *(int*)(0x41BFB7+6);
            if(check == 0x14000000)
            {
                _PI->WriteByte(0x43DF39+1, 0x8C);
            }

            // H2 Eng PoL 2.1
            check = *(int*)(0x484DC1+6);
            if(check == 0x14000000)
            {
                _PI->WriteByte(0x4B0C2E+1, 0x8C);
            }

            // H2 Rus PoL 2.1
            check = *(int*)(0x4710BE+6);
            if(check == 0x14000000)
            {
                _PI->WriteByte(0x483E72, 0x7C);
            }

            // H2 Pol PoL 2.1
            check = *(int*)(0x470C7C+6);
            if(check == 0x14000000)
            {
                _PI->WriteByte(0x483658, 0x7C);
            }

            // H2 Cz (new) PoL 2.1
            check = *(int*)(0x47091E+6);
            if(check == 0x14000000)
            {
                _PI->WriteByte(0x482D12, 0x7C);
            }

            // H2 Cz (old) PoL 2.1
            check = *(int*)(0x47000E+6);
            if(check == 0x14000000)
            {
                _PI->WriteByte(0x482402, 0x7C);
            }
        }
    }

   return TRUE;
}
Последний раз редактировалось Ben80 16 фев 2021, 10:04, всего редактировалось 2 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5075
Зарегистрирован: 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)
Поблагодарили: 1941 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 07 окт 2020, 12:31

Плагин для изменения кол-ва нужного ресурса для покупки существ. Тип и кол-во ресурса (Wood, Mercury, Ore, Sulfur, Crystal, Gems) задаются в файле ChangeResourceCost.ini. Например, пусть Crusaders дополнительно требуют 2 ед. дерева, а Greater Druids - 1 ед. кристаллов:

Код: Выделить всё
[Crusader]
Res=Wood
Num=2

[Greater Druid]
Res=Crystal
Num=1

Максимальное количество ед. ресурса - 255. К сожалению, плагин не умеет менять стоимость существ в золоте :smile14:

 Исходный код
Код: Выделить всё
#include "patcher_x86.hpp"

Patcher* _P;
PatcherInstance* _PI;

static _bool_ plugin_On = 0;

const char MonName[][17] = {
    "Peasant", "Archer", "Ranger", "Pikeman", "Veteran Pikeman", "Swordsman", "Master Swordsman", "Cavalry", "Champion", "Paladin", "Crusader",
    "Goblin", "Orc", "Orc Chief", "Wolf", "Ogre", "Ogre Lord", "Troll", "War Troll", "Cyclops",
    "Sprite", "Dwarf", "Battle Dwarf", "Elf", "Grand Elf", "Druid", "Greater Druid", "Unicorn", "Phoenix",
    "Centaur", "Gargoyle", "Griffin", "Minotaur", "Minotaur King", "Hydra", "Green Dragon", "Red Dragon", "Black Dragon",
    "Halfling", "Boar", "Iron Golem", "Steel Golem", "Roc", "Mage", "Archmage", "Giant", "Titan",
    "Skeleton", "Zombie", "Mutant Zombie", "Mummy", "Royal Mummy", "Vampire", "Vampire Lord", "Lich", "Power Lich", "Bone Dragon",
    "Rogue", "Nomad", "Ghost", "Genie", "Medusa", "Earth Elemental", "Air Elemental", "Fire Elemental", "Water Elemental"
};

const char ResName[][8] = {
    "Wood", "Mercury", "Ore", "Sulfur", "Crystal", "Gems"
};

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("HD.Plugin.H2.AddResourceCost");
                     
           _PI->WriteHexPatch(0x468D4B,
               "8B 4D F8 31 C0 8A 84 09 6A 8D 46 00 31 D2 8A 94" \
               "09 6B 8D 46 00 8B 4D F4 89 14 81 89 EC 5D C3 00" \
               "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 04 01 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00" \
               "00 00 00 00 00 03 01 03 02 03 03 00 00 00 00 00" \
               "00 00 00 00 00 00 00 00 00 05 01 05 02 00 00 00" \
               "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 00 00 05 01 00 00 00 00 00 00 00" \
               "00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90" \
               "90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90" \
               "90 90 90 90 90 90 90");

           char res[8] = "";
           signed char resId, num;
           for (int i = 0; i < 66; ++i) {
               GetPrivateProfileStringA(MonName[i], "Res", "Wood", res, 8, ".\\Plugins\\ChangeResourceCost.ini");
               num = GetPrivateProfileIntA(MonName[i], "Num", 0, ".\\Plugins\\ChangeResourceCost.ini");
               
               if ( num ) {
                    switch ( res[0] ) {
                    case 'W': resId = 0; break;
                    case 'M': resId = 1; break;
                    case 'O': resId = 2; break;
                    case 'S': resId = 3; break;
                    case 'C': resId = 4; break;
                    case 'G': resId = 5; break;
                    default: resId = 0;
                    }
                   
                    _PI->WriteByte(0x468D6A + (i << 1), resId);
                    _PI->WriteByte(0x468D6A + (i << 1) + 1, num);
               }
   
           }
       }
   }

   return TRUE;
}
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 07 окт 2020, 12:35

Тогда, как будет время, я адаптирую для разных версий ? :smile1:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5075
Зарегистрирован: 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)
Поблагодарили: 1941 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 07 окт 2020, 12:48

Ok. Я подумал, что неплохо бы добавить возможность изменения стоимости в золоте (это делается простой заменой табличной стоимости). Например,

Код: Выделить всё
[Crusader]
Gold=1000
Res=Wood
Num=2
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 07 окт 2020, 12:56

Конечно. Gold - это как раз самое главное.

А исходники DMF можете запостить ?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5075
Зарегистрирован: 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)
Поблагодарили: 1941 раз.

Re: Герои 2 (разные версии) с плагинами

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

Добавил возможность изменения золота:

 Исходный код плагина ChangeResourceCost
Код: Выделить всё
#include "patcher_x86.hpp"

Patcher* _P;
PatcherInstance* _PI;

static _bool_ plugin_On = 0;

const char MonName[][17] = {
    "Peasant", "Archer", "Ranger", "Pikeman", "Veteran Pikeman", "Swordsman", "Master Swordsman", "Cavalry", "Champion", "Paladin", "Crusader",
    "Goblin", "Orc", "Orc Chief", "Wolf", "Ogre", "Ogre Lord", "Troll", "War Troll", "Cyclops",
    "Sprite", "Dwarf", "Battle Dwarf", "Elf", "Grand Elf", "Druid", "Greater Druid", "Unicorn", "Phoenix",
    "Centaur", "Gargoyle", "Griffin", "Minotaur", "Minotaur King", "Hydra", "Green Dragon", "Red Dragon", "Black Dragon",
    "Halfling", "Boar", "Iron Golem", "Steel Golem", "Roc", "Mage", "Archmage", "Giant", "Titan",
    "Skeleton", "Zombie", "Mutant Zombie", "Mummy", "Royal Mummy", "Vampire", "Vampire Lord", "Lich", "Power Lich", "Bone Dragon",
    "Rogue", "Nomad", "Ghost", "Genie", "Medusa", "Earth Elemental", "Air Elemental", "Fire Elemental", "Water Elemental"
};

const char ResName[][8] = {
    "Wood", "Mercury", "Ore", "Sulfur", "Crystal", "Gems"
};

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("HD.Plugin.H2.AddResourceCost");
                     
           _PI->WriteHexPatch(0x468D4B,
               "8B 4D F8 31 C0 8A 84 09 6A 8D 46 00 31 D2 8A 94" \
               "09 6B 8D 46 00 8B 4D F4 89 14 81 89 EC 5D C3 00" \
               "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 04 01 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00" \
               "00 00 00 00 00 03 01 03 02 03 03 00 00 00 00 00" \
               "00 00 00 00 00 00 00 00 00 05 01 05 02 00 00 00" \
               "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" \
               "00 00 00 00 00 00 00 05 01 00 00 00 00 00 00 00" \
               "00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90" \
               "90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90" \
               "90 90 90 90 90 90 90");

           char res[8] = "";
           signed char resId, num;
           short gold;

           for (int i = 0; i < 66; ++i) {
               GetPrivateProfileStringA(MonName[i], "Res", "Wood", res, 8, ".\\Plugins\\ChangeResourceCost.ini");
               num = GetPrivateProfileIntA(MonName[i], "Num", 0, ".\\Plugins\\ChangeResourceCost.ini");
               gold = GetPrivateProfileIntA(MonName[i], "Gold", 0, ".\\Plugins\\ChangeResourceCost.ini");
               
               if ( num ) {
                    switch ( res[0] )
                    {
                        case 'W': resId = 0; break;
                        case 'M': resId = 1; break;
                        case 'O': resId = 2; break;
                        case 'S': resId = 3; break;
                        case 'C': resId = 4; break;
                        case 'G': resId = 5; break;
                        default: resId = 0;
                    }
                   
                    _PI->WriteByte(0x468D6A + (i << 1), resId);
                    _PI->WriteByte(0x468D6A + (i << 1) + 1, num);
               }

               if ( gold ) {
                   _PI->WriteWord(0x4FA460 + i * 26, gold);
               }
           }
       }
   }

   return TRUE;
}


 Сам плагин
ChangeResourceCost.zip
(4.5 КБ) Скачиваний: 138
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5075
Зарегистрирован: 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)
Поблагодарили: 1941 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 07 окт 2020, 14:00

Цитата:
А исходники DMF можете запостить ?

Нет, это был бинарный патч, но я его локализовал :smile1: посредством сравнения файлов. Chunk начинается здесь: 0x4BF370.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5075
Зарегистрирован: 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)
Поблагодарили: 1941 раз.

Re: Герои 2 (разные версии) с плагинами

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

Баг версии от "Буки" в том, что она всегда считает положительной эффективность Dispel Magic. В оригинале два кейса.
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 21 окт 2020, 18:14

Плагин для версии PoL 2.1 - запрещает случайное выпадение тн артефактов уровня 3+
(такой же запрет, какой был в PoL 2.0)
Автор патча - AlexSpl

Последняя версия плагина от 16.02.2021
(исправлена ошибка предыдущей версии, благодаря Tyrellsson)

Сам плагин:
H2_42_ProperRandomArts.zip
(3.44 КБ) Скачиваний: 149


Исходный код:
 
Код: Выделить всё
#include "../../include2020_v1/patcher_x86.hpp"

Patcher* _P;
PatcherInstance* _PI;

static _bool_ plugin_On = 0;


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("H2_ProperRandomArts");

            int check;

            // H2 Eng PoL 2.1
            check = *(int*)(0x484DC1+6);
            if(check == 0x14000000)
            {
                _PI->WriteHexPatch(0x427E7E, "90 90 90 90 90 90");
            }

            // H2 Rus PoL 2.1
            check = *(int*)(0x4710BE+6);
            if(check == 0x14000000)
            {
                _PI->WriteHexPatch(0x45AA60, "90 90");
            }

            // H2 Pol PoL 2.1
            check = *(int*)(0x470C7C+6);
            if(check == 0x14000000)
            {
                _PI->WriteHexPatch(0x45B038, "90 90");
            }

            // H2 Cz (new) PoL 2.1
            check = *(int*)(0x47091E+6);
            if(check == 0x14000000)
            {
                _PI->WriteHexPatch(0x45A67D, "90 90");
            }

            // H2 Cz (old) PoL 2.1
            check = *(int*)(0x47000E+6);
            if(check == 0x14000000)
            {
                _PI->WriteHexPatch(0x459D6D, "90 90");
            }
        }
    }

   return TRUE;
}
Последний раз редактировалось Ben80 16 фев 2021, 09:56, всего редактировалось 3 раз(а).
Вернуться к началу

След.

Вернуться в Техническая часть

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

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