IPB

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

2 страниц V   1 2 >  
Reply to this topicStart new topic
> Небольшие моды и плагины.
feanor
сообщение 25 Jul 2012, 11:30 (Сообщение отредактировал Iv - 10 Nov 2015, 21:49)
Сообщение #1

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Эта тема предназначена для небольших модов, не требующих оформления отдельной темы.
Все обсуждения - в соседней теме.

При выкладке указывайте:
  • краткое описание. Скриншот - факультативно
  • авторство (если не свое - особенно)
  • формат (инсталлятор, архив или одиночный плагин),
  • язык (или его отсутствие в случае безтекстового мода).
  • разумеется, ссылку на скачивание. Не рекомендуются как zalil, rghost и подобные обменники с кратким сроком жизни файла, так и depositfiles, letitbit и прочие многоэтапные файлопохранилища.


Замена воговского таймера для Эры

Всегда убивали воговские таймеры (которые TM, не TL).

Их мало (сто, из них изрядная часть зарезервирована), они перегружены и вообще мастдай.
В дллках оно еще более усугубляется - совершенно не хочется делать лишний хэндл для инициализации таймера, долбаться с его резервированием etc etc..


Поэтому для удобства написания дллок я набросал простенькую библиотеку, которая хукает RunTimer и посылает сообщение плагинам и ERM'у.
Требует Бараторчевский патчер, ибо он трушный.

Плагин: timerevent.era
Проект: eratimer_code.rar

Интерфейс:
Простой как топор.

Для ерм: функция !?FU4074700, в x1 - номер игрока (0..7), в x2 - день (1,2,3,4,5,6,7,8..)
Для эры: событие OnGlobalTimer с двумя аналогичными параметрами. См. пример ниже.

Повторю еще раз, требует patcher_x86.dll в корне папки с героями!!

Пример (Си)
Код
void __stdcall TimerTest (PEvent e)
{
    char buf[128];
    int i = *(int*)(e->Data);
    sprintf(buf,"IF:L^%i %i^;",*(int*)(e->Data), *(1+(int*)(e->Data)));
    ExecErmCmd(buf);
}
..
RegisterHandler(TimerTest,"OnGlobalTimer");



Код:
<div class="sp-wrap"><div class="sp-body" title="Код">
Код
#include <windows.h>
#include <stdio.h>
#include "....includeera.h"
#include "....includeheroes.h"
#include "....includepatcher_x86_commented.hpp"

Patcher * globalPatcher;
PatcherInstance *patcher;


int __cdecl OnAnyTimer(HiHook* h, int owner)
{
    ErmX[1]=owner;
    ErmX[2]=CALL_0(int, __cdecl ,0x7103D2);
    FireErmEvent(4074700);

    int param[2] = {owner,CALL_0(int, __cdecl ,0x7103D2)};
    FireEvent("OnGlobalTimer",(void*)param,8);

    

    return EXEC_DEFAULT;
}


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

        patcher->WriteHiHook(0x74DC74, SPLICE_, EXTENDED_, CDECL_, (void*)OnAnyTimer);
    }
    return TRUE;
}
</div></div>

Просьба здесь особо не обсуждать. Мне куда более доставляет складывать добро в чистую тему.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Aug 2012, 22:10 (Сообщение отредактировал feanor - 24 Aug 2012, 01:45)
Сообщение #2

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Обработка копания (granite.dll)

Плагин: granite.era
Проект: granite.rar

Интерфейс: только для ERM.

События:
!?FU4074001 - происходит до раскопок (сразу после нажатия на "D")
x1 - номер героя
x2 - указатель на флаг отмены раскопок. !!UN:Cx2/4/0; для запрета, !!UN:Cx2/4/1; для разрешения (вариант по умолчанию)

!?FU4074003 - происходит при показе какого-либо сообщения в процессе раскопок.
x1 - номер героя
x2 - указатель на флаг отмены показа сообщения (действие типа появления ямы не отменится!). Работа с ним опять же, через UN:C
x3 - тип сообщения:
0 - "раскопки займут целый день. Приходите завтра."
1 - "инвентарь полон и раскопки будут бесполезны" (при собстна забитом инвентаре)
2 - "ищите Грааль на суше!" (при попытке выкопать яму в море)
3 - "ищите Грааль в чистом поле" (при поиске на каком-либо объекте)
4 - "поздравляем! вы нашли Грааль" (первое сообщение при успешной находке)
5 - "принесите Грааль в город.." (второе сообщение)
6 - "ничего нет. Куда подевалось?"

!?FU4074002 - происходит после раскопок
x1 - номер героя
x2 - результат. Аналогичен x3 для FU4074003, но c добавлением варианта -1 - "раскопки отменены в 4074001"

Пример (ERM)

Код
!?FU4074003;
!!if&x3=6:;
!!UN:Cx2/4/0;
!!IF:M^Держитесь подальше от торфяных болот!^;
!!HE-1:Tv998/v999/v1000/47/1;
!!el:;
!!en:;


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Aug 2012, 22:41 (Сообщение отредактировал feanor - 24 Aug 2012, 01:45)
Сообщение #3

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Работа с датой (malachite.dll)

Плагин: malachite.era

Дает возможность устанавливать внутригровую дату (экспортируемая функция SetDate(short day, short week, short month)), изменять анимацию нового дня/недели.

При загрузке анимации нового дня/недели запускается событие OnNewDayAnimation с первым параметром - указателем на строку с именем анимации и ERM-функция 4074218, которой передаются день/неделя/месяц в x1-x3 и имя анимации в z1.

Пример (ERM)

Код
!?FU4074218;
!!VRz1&x2=4/x3=6:S^midsumm.def^;


Пример (Си)

Код
void __stdcall Testt (PEvent e)
{
    if (EventParams[1]==4 && EventParams[2]==6)
        strcpy((char*)(e->Data),"midsumm.def");
}

RegisterHandler(Testt,"OnNewDayAnimation");


Код
// dllmain.cpp: определяет точку входа для приложения DLL.

#include <windows.h>
#include <stdio.h>
#include "..\..\include\era.h"
#include "..\..\include\heroes.h"
#include "..\..\include\patcher_x86_commented.hpp"


Patcher * globalPatcher;
PatcherInstance *patcher;

extern "C" __declspec(dllexport) void SetDate(short day, short week, short month)
{
    *(short*)(0x1F63E+*(int*)0x699538) = day;
    *(short*)(0x1F640+*(int*)0x699538) = week;
    *(short*)(0x1F642+*(int*)0x699538) = month;
}



void* __fastcall BuildAndLoadNewDayDef(void* _this, int edx, int posX, int posY, int sizeX, int sizeY, int itemId, char *defname, int cadre, int group, int mirror, int closeDialog, int flags)
{
    short day =    *(short*)(0x1F63E+*(int*)0x699538);
    short week =    *(short*)(0x1F640+*(int*)0x699538);
    short month =    *(short*)(0x1F642+*(int*)0x699538);

    strncpy(ErmZ[1],defname,512);

    EventParams[0]=day;
    EventParams[1]=week;
    EventParams[2]=month;
    FireEvent("OnNewDayAnimation",(void*)(ErmZ+1),4);

    ErmX[1]=day;
    ErmX[2]=week;
    ErmX[3]=month;
    FireErmEvent(4074218);


    return CALL_12(void*, __thiscall, 0x4EA800,_this, posX, posY, sizeX, sizeY, itemId, ErmZ[1], cadre, group, mirror, closeDialog, flags);

}

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("malachite");
        ConnectEra();
        
        patcher->WriteHiHook(0x450CB7,CALL_,DIRECT_,THISCALL_,(void*)BuildAndLoadNewDayDef);
    }
    return TRUE;
}



--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 19 Oct 2012, 20:35
Сообщение #4

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза






Контроль восьмого слота (obsidian.dll)

Плагин: obsidian.era

События:
!?FU4074810 (OnAdditionalMonsterAvailable) - происходит при каждой проверке на доступность восьмого слота.
x1 - номер замка
x2 - адрес его структуры
x3 - указатель на флаг наличия/отсутствия оного слота. Ну, как обычно.

!?FU4074811 (OnAdditionalMonsterSetting) - происходит после установки обитателей в жилище. В этом событии можно записать этих самых обитателей.
x1 - номер замка
x2 - адрес его структуры
x3 - указатель на тип монстров
x4 - указатель на количество монстров. Количество монстров записывается в два байта!!
(пояснение: при помощи последних двух полей можно установить "постояльцев", не прибегая к экспортируемым функциям)

Экспортируемые функции:

extern "C" __declspec(dllexport) void SetAdditionalMonster(int castle_id, int type, int amount) - устанавливает в замок castle_id монстров type числом amount
extern "C" __declspec(dllexport) int GetAdditionalMonsterType(int castle_id) - возвращает индекс монстра из восьмого слота замка castle_id
extern "C" __declspec(dllexport) int GetAdditionalMonsterAmount(int castle_id) - возвращает количество монстров из восьмого слота замка castle_id

Ну понятно по сигнатурам, да.

Пример (ERM)
Во всех Инферно можно нанимать 5 Монахов Баа каждую неделю.
Код
ZVSE

!?FU4074811;
!!CA0/x1:T?y10;
!!SN&y10=3:L^obsidian.era^/?y10 Ay10/^SetAdditionalMonster^/?y20 Ey20/1/x1/169/5;

!?FU4074810;
!!CA0/x1:T?y10;
!!UN&y10=3:Cx3/4/1;


!?PI;
!!MA:O169/3;
!!VRz47:S^Монах Баа^;
!!VRz48:S^Монахи Баа^;
!!UN:G1/169/0/47 G1/169/1/48;


Другой вариант первого триггера:
Код
!?FU4074811;
!!CA0/x1:T?y10;
!!UN&y10=3:Cx3/4/169;
!!UN&y10=3:Cx4/2/5;




Код
// dllmain.cpp: определяет точку входа для приложения DLL.

#include <windows.h>
#include <stdio.h>
#include "..\..\include\era.h"
#include "..\..\include\heroes.h"
#include "..\..\include\patcher_x86_commented.hpp"


Patcher * globalPatcher;
PatcherInstance *patcher;

extern "C" __declspec(dllexport) void SetAdditionalMonster(int castle_id, int type, int amount)
{
    CASTLE *cstl = ((CASTLE*)(*(int*)((*(int*)0x699538) + 0x21614) + sizeof(CASTLE) * castle_id));
    cstl->EightMonsterAmount = amount;
    cstl->EightMonsterType = type;
}

extern "C" __declspec(dllexport) int GetAdditionalMonsterType(int castle_id)
{
    CASTLE *cstl = ((CASTLE*)(*(int*)((*(int*)0x699538) + 0x21614) + sizeof(CASTLE) * castle_id));
    return cstl->EightMonsterType;
}

extern "C" __declspec(dllexport) int GetAdditionalMonsterAmount(int castle_id)
{
    CASTLE *cstl = ((CASTLE*)(*(int*)((*(int*)0x699538) + 0x21614) + sizeof(CASTLE) * castle_id));
    return cstl->EightMonsterAmount;
}


int IsEighthSlotAvailable(CASTLE* cstl)
{
    int ret = false;

    if (cstl->Type == 5 && cstl->Built[2]&64)
        ret = true;

    EventParams[0]=cstl->Number;
    EventParams[1]=(int)cstl;
    EventParams[2]=(int)&ret;
    FireEvent("OnAdditionalMonsterAvailable",0,0);

    ErmX[1]=cstl->Number;
    ErmX[2]=(int)cstl;
    ErmX[3]=(int)&ret;
    FireErmEvent(4074810);

    return ret;
}


int __stdcall hook_5BDCBF(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->ecx;

    
    EventParams[0]=cstl->Number;
    EventParams[1]=(int)cstl;
    EventParams[2]=0x3C+(int)cstl;
    EventParams[3]=0x40+(int)cstl;
    FireEvent("OnAdditionalMonsterSetting",0,0);

    ErmX[1]=cstl->Number;
    ErmX[2]=(int)cstl;
    ErmX[3]=0x3C+(int)cstl;
    ErmX[4]=0x40+(int)cstl;
    FireErmEvent(4074811);

    return EXEC_DEFAULT;
}


int __stdcall hook_4C8B39(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->ecx;
    
    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x4C8B62;
    else
        c->return_address = 0x4C8B5D;


    return NO_EXEC_DEFAULT;
}

int __stdcall hook_51D2AE(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->esi;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x51E79B;
    else
        c->return_address = 0x51D2DB;
    return NO_EXEC_DEFAULT;
}

int __stdcall hook_5C651F(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->esi;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x5C66D9;
    else
        c->return_address = 0x5C654D;
    return NO_EXEC_DEFAULT;
}

int __stdcall hook_5D8BD8(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->ecx;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x5D8C08;
    else
        c->return_address = 0x5D8BFE;
    return NO_EXEC_DEFAULT;
}

int __stdcall hook_5D8C11(LoHook* h, HookContext* c)
{
    CASTLE *cstl = (CASTLE*)c->edx;

    if (!IsEighthSlotAvailable(cstl))
        c->return_address = 0x5D8C95;
    else
        c->return_address = 0x5D8C37;
    return NO_EXEC_DEFAULT;
}



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("obsidian");
        ConnectEra();
        
        patcher->WriteLoHook(0x4C8B39,(void*)hook_4C8B39); //JNE SHORT 004C8B62
        patcher->WriteLoHook(0x51D2AE,(void*)hook_51D2AE); //JNE 0051E79B
        patcher->WriteLoHook(0x5C651F,(void*)hook_5C651F); //JNE 005C66D9
        patcher->WriteLoHook(0x5D8BD8,(void*)hook_5D8BD8); //JNE SHORT 005D8C08
        patcher->WriteLoHook(0x5D8C11,(void*)hook_5D8C11); //JNE SHORT 005D8C08

        patcher->WriteLoHook(0x5BDCBB,(void*)hook_5BDCBF); //после записи в новый день
        

        //RegisterHandler(TimerTest,"OnGlobalTimer");
    }
    return TRUE;
}


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 03 Jan 2013, 00:10 (Сообщение отредактировал Iv - 19 Feb 2018, 10:02)
Сообщение #5

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Отрицательная удача (badluck.dll) (с) Sav, feanor

Плагин (SoD, Era): badluck.era, зеркало



Чуть-чуть информации о функционировании удачи вообще:

"удачливость" стека определяется во время атаки (собстна, немногим ранее проигрывания анимации) и записывается в структуру стека, в поле со смещением +0x70 (1 - удача, 0 - обычная атака, добавляемое плагином -1 - неудача).
Проверять через ERM, соответственно, можно пресловутой командой !!BM:G, подсунув ей в качестве номера заклинания индекс -74.

Потом, при нанесении ущерба это поле проверяется и уже подсчитывается собственно ущерб.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 08 Feb 2013, 15:55 (Сообщение отредактировал Iv - 19 Feb 2018, 10:04)
Сообщение #6

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Настраиваемые имена классов (turquoise.dll)

Плагин: turquoise.zip, зеркало

Позволяет настраивать индивидуальное имя класса для каждого героя (аналогично Джем из стандартных кампаний SoD), как с помощью конфигурационного файла (приложен в архиве), так и динамически, с помощью SN:W-переменных с именем hero_class_name_<hero_id>.

Иллюстрация:


Код
Patcher * globalPatcher;
PatcherInstance *patcher;

_ptr_ GetClassNameDefault;

char* GetClassName(HERO* hero)
{
    char tmp[64];
    sprintf(tmp,"SN:W^hero_class_name_%i^/?z1;", hero->Number);
    ExecErmCmd(tmp);
    
    if(ErmZ[1][0]!=0)
    {
        return ErmZ[1];
    }
    return CALL_1(char*, __thiscall, GetClassNameDefault, hero);
}

void __stdcall InitNames(PEvent e)
{
    char tmp[1024];
    char tmp_erm[1024];
    for(int i=0; i!=256;i++)
    {
        sprintf(tmp,"Hero%i",i);
        ReadStrFromIni(tmp, "Classnames", "turquoise.ini", (char*)tmp);
        if (*tmp)
        {
            sprintf(tmp_erm,"SN:W^hero_class_name_%i^/^%s^;", i, tmp);
            ExecErmCmd(tmp_erm);
        }
    }
}


char* __stdcall GetClassName_hook(HiHook* h, HERO* hero)
{
    return GetClassName(hero);
}

int __stdcall hook_4E1(LoHook* h, HookContext* c)
{
    c->ecx = (int)GetClassName((HERO*)(c->eax));
    return EXEC_DEFAULT;
}

int __stdcall hook_4DB(LoHook* h, HookContext* c)
{
    c->eax = (int)GetClassName((HERO*)(c->ecx));
    return EXEC_DEFAULT;
}

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(PINSTANCE_MAIN);
        ConnectEra();

        RegisterHandler(InitNames, "OnBeforeErmInstructions");
        RegisterHandler(InitNames, "OnAfterCreateWindow");

        HiHook *h = patcher->WriteHiHook(0x4D91E0,SPLICE_,EXTENDED_,THISCALL_,(void*)GetClassName_hook);
        GetClassNameDefault = h->GetDefaultFunc();
        
        patcher->WriteLoHook(0x4E1DE6, (void*)hook_4E1);
        patcher->WriteLoHook(0x4DB980, (void*)hook_4DB);
        patcher->WriteLoHook(0x4DBDF7, (void*)hook_4DB);
    }
    return TRUE;
}




--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 28 Mar 2013, 14:27
Сообщение #7

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Вызовы элементалей (summoniots.dll)

Плагин: summoniots.dll

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

События: !?FU4074520 - попытка вызова.
x1 - указатель на флаг того, сработает ли заклинание (не сработавшее заклинание тратит ману и магический ход, но ничего не делает)
x2 - указатель на номер заклинания
x3 - указатель на номер существа
x4 - указатель на уровень колдовской силы, используемый при расчете количества вызванных.

Пример (ERM):

Вызов чародеев вместо любого из элементалей.
Код
ZVSE
!?FU4074520;
!!UN:Cx3/4/?y1; --кого вызываем
!!BG:H?y3;
!!IF:L^Hero %Y3 trying to summon %Y1..^;
!!UN:Cx3/4/136;
!!UN:Cx4/4/999;
!!UN:Cx3/4/?y1;
!!IF:L^..but summons horde of %Y1^;


Код
Patcher * globalPatcher;
PatcherInstance *citrine;

int __stdcall SummonHook(HiHook* h, _BattleMgr_ *combatman, int spell, int creature, int spellpower, int unk)
{
    int flag = 1;
    ((int*)0x91DA34)[1] = (int)(&flag);
    ((int*)0x91DA34)[2] = (int)(&spell);
    ((int*)0x91DA34)[3] = (int)(&creature);
    ((int*)0x91DA34)[4] = (int)(&spellpower);
    ((int*)0x91DA34)[5] = (int)(&unk);
    ((int*)0x91DA34)[6] = (int)combatman+combatman->current_side*4+0x132C0;

    CallERM(4074520);

    return flag?CALL_5(int, __thiscall, h->GetDefaultFunc(), (int)combatman, spell, creature, spellpower, unk):-1;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
        globalPatcher = GetPatcher();
        citrine =  globalPatcher->CreateInstance("summon_elems");

        citrine->WriteHiHook(0x5A7390, SPLICE_, EXTENDED_, THISCALL_, (void*)SummonHook);
        citrine->WriteByte(0x59F887,0xEB);
        citrine->WriteWord(0x5A96D0, 0x9090);        
    }
    return TRUE;
}


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 17 Jul 2013, 18:31 (Сообщение отредактировал feanor - 17 Jul 2013, 18:31)
Сообщение #8

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Гильдия воров вместо "Братства меча" в Замке.

Надстройка над таверной теперь исполняет функции представительства Гильдии Воров: при её постройке соответствующее меню в таверне будет показывать полную информацию о противниках и союзниках. Цена строения - прежняя, 500 золота и 5 дерева.

Автор: feanor
Язык: русский (изменена одна строчка в bldgspec.txt)
Формат: zip-архив с папкой мода.

thiefguild.zip (3,32 Кб)


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 18 Jul 2013, 13:31 (Сообщение отредактировал Iv - 18 Jul 2013, 13:33)
Сообщение #9

Immortal
Сообщений: 6 158
Спасибо сказали: 12377 раз




Другие флаги игроков


Автор: Iv (с участием Algor)
Язык: нет
Формат: pac-файл для Era 2.*. Кинуть в папку любого мода

http://sites.google.com/site/hommfun/files...ive%20flags.pac (390 кб)


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 25 Jul 2013, 08:00 (Сообщение отредактировал feanor - 25 Jul 2013, 16:18)
Сообщение #10

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Несколько небольших патчей.

Автор: feanor
Язык: нет
Формат: bin-файлы. Установка через копирование в eraplugins/afterwog любого мода.

Нет подземелий в подземельях.

Тип поля боя на подземном уровне будет определяться типом почвы. В оригинале все бои в подземке проходили на подземной почве.
no_underground_at_underground.bin

Исправление вылета при проигрыше битвы в ERM-событии

При проигрыше битвы, вызванной в триггере !?HM, игра вылетала. Теперь - нет.
fix_encounter_crash.bin

Отключение исключений при старте карты

При рестарте карты OllyDbg отвлекается на какое-то исключение, что вынуждает переключаться между игрой и отладчиком. Теперь - нет.
Плагин нужен лишь при анализе игры! Не уверен в отсутствии побочных эффектов.
no_raise_exception_at_map_loading.bin


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 25 Jul 2013, 16:02
Сообщение #11

Immortal
Сообщений: 6 158
Спасибо сказали: 12377 раз




Зомбивод (39 б)
Автор: Master of puppets
Язык: нет
Формат: bin-арник для Эры. Кинуть в папку eraplugins/afterwog
Описание: Стракер поднимает не скелетов, а зомби





--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 01 Aug 2013, 14:30 (Сообщение отредактировал feanor - 01 Aug 2013, 14:32)
Сообщение #12

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Часы реального времени.



ПКМ по дате на экране карты выведет реальное время и заряд батареи (при наличии таковой). Для играющих в полноэкранном режиме.

Автор: feanor
Язык: английский
Формат: erm-скрипт. Установка через копирование в data/s любого мода.

clock.erm (1,13 Кб)


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 16 Sep 2013, 00:59
Сообщение #13

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Еженедельная газета "Голос из-под стойки".



В начале каждой недели в чат выводятся текущие слухи и имена героев-наемников.

Автор: feanor
Язык: русский.
Формат: zip-архив с папкой мода.

daily_event.zip (5.36 кб)


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 19 Sep 2013, 23:55 (Сообщение отредактировал Iv - 10 Nov 2015, 21:46)
Причина редактирования: Дополнил описание
Сообщение #14

Immortal
Сообщений: 6 158
Спасибо сказали: 12377 раз




-Why do you call your software "beta"?
-'coz it's beta than nothing.


Замена вызовов, версия 0.3
Прикрепленное изображение

Вызовы элементалей заменяются на вызовы других существ
В мод включена измененная раскладка заклинаний.

Автор: Iv (с участием Algor)
Язык: русский
Формат: архив с папкой мода для Эры 2.х

https://dl.dropboxusercontent.com/u/5852703.../H3IVsummon.exe


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 21 Sep 2013, 23:13 (Сообщение отредактировал igrik - 03 Dec 2013, 15:37)
Сообщение #15

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




Рюкзак героя
Версия 1.04.
Автор: igrik
Язык: русский и английский
Формат: архив с папкой мода для ERA II

Спасибо Berserker, baratoch.
Функция аналогичная функции в HDmod, но с меньшим функционалом (не реализована и не планируется передача артов по Ctrl, Shift, Alt)
Совместима с большинством модов (за исключением Феникс-Мода! ввиду пересечения расположения кнопок)
Поддерживает Hot Seat, TCP/IP, новые артефакты от feanor'a "emerald.dll v2.01" и т.п.
Спасибо: Berserker, baratorch.
Скачать Rus
Скачать Eng







*********
Исправлено:
[+] Нормальное отображение описания артефактов! За что огромное спасобо Berserker'у!
[-] Больше не используется файл "artifact.def", который мог перекрывать аналогичный из других модов.
[-] Исправлен баг, при котором игра вылетала если в рюкзаке лежала книга заклинаний.
[-] Исправлен баг вследствие некорректного действия команды "HE:A1".
[+] Улучшена подложка
[+] Подсказка при наведении мыши на элемент диалога. (для временного хранения используются переменные z1 - z65)


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 13 Mar 2014, 13:14
Сообщение #16

Immortal
Сообщений: 6 158
Спасибо сказали: 12377 раз




Случайные нейтральные герои

Нейтралы с вероятностью 10/20/30/40/50% в зависимости от уровня сложности получают героя-предводителя,
который будет сражаться на их стороне в бою против игрока-человека.


Автор: Algor, Iv
Формат: sfx-архив с папкой мода.

Randomhero.exe (306 Кб)


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 22 Apr 2014, 20:39 (Сообщение отредактировал feanor - 22 Apr 2014, 20:42)
Сообщение #17

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Статуя Ленина в Инферно вместо Бога Огня

Автор: feanor
Формат: архив с папкой мода.



https://dl.dropboxusercontent.com/u/61759222/HoMM/lenin.zip


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Iv
сообщение 15 Jun 2014, 20:37
Сообщение #18

Immortal
Сообщений: 6 158
Спасибо сказали: 12377 раз




Родная грязь (dirt) для Подземелья

Маленький патчик для рандомок без подземного уровня. На них Подземелье генерится на грязи, но бонуса родной земли не получает. Патчик исправляет эту несправедливость.

Автор: Iv
Формат: bin-файл для Era II. Класть в \EraPlugins\AfterWoG\


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Orzie
сообщение 15 Jul 2014, 13:12 (Сообщение отредактировал Orzie - 15 Jul 2014, 13:23)
Сообщение #19

Reinventing the Steel
Сообщений: 7 750
Спасибо сказали: 15672 раза




Культ Вождя Мирового Пролетариата

Авторы: feanor, Orzie, Docent Picolan, Bes
Формат: SFX-архив мода для ERA II, спрашивающий директорию установленной игры.

Апгрейд мода "Статуя Ленина в Инферно вместо Бога Огня"
Определённые строения в Инферно, Некрополисе и Замке будут содержать различные образы вождя пролетариата - В.И.Ленина.



https://app.box.com/s/qmfj3km81roz85tutojf


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 31 Jul 2014, 22:57 (Сообщение отредактировал feanor - 01 Aug 2014, 00:09)
Сообщение #20

laughed as one fey
Сообщений: 11 811
Спасибо сказали: 19674 раза




Магические сундуки

Сундуки с артефактами теперь отличаются по виду от сундуков с золотом.

Автор: Axolotl, feanor
Язык: нет
Формат: zip-архив с папкой мода.

magechest.zip (14 Кб)



--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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