-
Catastrophe
имя: Alex
- Посвященный
-
- Сообщения: 88
- Зарегистрирован: 07 мар 2019, 11:50
- Пол:
- Поблагодарили: 22 раз.
|
Catastrophe » 07 июн 2019, 04:24
Изменение специализаций, пока только по вторичным навыкам. Теперь все они предоставляют фиксированный бонус в 50% и 100%. Код написан с условием, что вы не меняли оригинальный бонус за лвл в 0.05, его вообще лучше не трогать. Принцип работы: перед умножением 0.05 на уровень героя происходит подмена уровня героя на нужное нам значение. Для специализаций по лидерству и удаче лучше отредачить GENRLTXT.txt, заменив "временно до следующей битвы" на "от других источников" - Код: Выделить всё
#include homm3.h
int __stdcall c_spec_leader(LoHook* h, HookContext* c) { c->ecx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_luck(LoHook* h, HookContext* c) { c->edx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_necro(LoHook* h, HookContext* c) { c->edx = 10; return EXEC_DEFAULT; }
int __stdcall c_spec_archery(LoHook* h, HookContext* c) { c->edx = 10; return EXEC_DEFAULT; }
int __stdcall c_spec_offense(LoHook* h, HookContext* c) { c->eax = 10; return EXEC_DEFAULT; }
int __stdcall c_spec_estates(LoHook* h, HookContext* c) { c->edx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_eye(LoHook* h, HookContext* c) { c->edx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_diplomacy(LoHook* h, HookContext* c) { c->edx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_resistance(LoHook* h, HookContext* c) { c->edx = 10; return EXEC_DEFAULT; }
int __stdcall c_spec_learning(LoHook* h, HookContext* c) { c->eax = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_intelligence(LoHook* h, HookContext* c) { c->eax = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_aid(LoHook* h, HookContext* c) { c->eax = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_mysticism(LoHook* h, HookContext* c) { c->ecx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_navigation(LoHook* h, HookContext* c) { c->ecx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_logistics(LoHook* h, HookContext* c) { c->edx = 20; return EXEC_DEFAULT; }
int __stdcall c_spec_scouting(LoHook* h, HookContext* c) { c->ecx = 10; return EXEC_DEFAULT; }
int __stdcall c_spec_sorcery(LoHook* h, HookContext* c) { c->edx = 10; return EXEC_DEFAULT; }
// bool apientry dllmain
_PI->WriteLoHook(0x4E3C73, c_spec_leader); // 2x _PI->WriteLoHook(0x4E3A1D, c_spec_luck); // 2x _PI->WriteLoHook(0x4E3F84, c_spec_necro); // 1.5x _PI->WriteLoHook(0x4E4412, c_spec_archery); // 1.5x _PI->WriteLoHook(0x4E455B, c_spec_offense); // 1.5x _PI->WriteLoHook(0x4E4641, c_spec_estates); // 2x _PI->WriteLoHook(0x4E46D2, c_spec_eye); // 2x _PI->WriteLoHook(0x4E482E, c_spec_diplomacy); // 2x _PI->WriteLoHook(0x4E498E, c_spec_resistance); // 1.5x _PI->WriteLoHook(0x4E4AEB, c_spec_learning); // 2x _PI->WriteLoHook(0x4E4B5B, c_spec_intelligence); // 2x _PI->WriteLoHook(0x4E4BCB, c_spec_aid); // 2x _PI->WriteLoHook(0x4E41F0, c_spec_mysticism); // 2x _PI->WriteLoHook(0x4E4C64, c_spec_navigation); // 2x _PI->WriteLoHook(0x4E4F10, c_spec_logistics); // 2x _PI->WriteLoHook(0x4E4320, c_spec_scouting); // 1.5x _PI->WriteLoHook(0x4E5B53, c_spec_sorcery); // 1.5x
То же самое, только для специализаций по спеллам, наносящим урон: - Код: Выделить всё
#include homm3.h
int __stdcall c_spec_nukes1(LoHook* h, HookContext* c) { c->eax = 10; return EXEC_DEFAULT; }
int __stdcall c_spec_nukes2(LoHook* h, HookContext* c) { c->edx = 0; return EXEC_DEFAULT; }
// bool apientry dllmain
_PI->WriteLoHook(0x4E6301, c_spec_nukes1); // 1.3x _PI->WriteLoHook(0x4E6304, c_spec_nukes2); // check will treat all creatures as lvl 1 ones
Так же можно тупо заменить их на специализацию по волшебной стреле (фиксированный 50% бонус): - Код: Выделить всё
_PI->WriteJmp(0x4E62FD, 0x4E62F1);
Ну и с остальным так же: - Код: Выделить всё
_PI->WriteJmp(0x4E62CA, 0x4E62A8); // disrupting ray formula to default _PI->WriteJmp(0x4E62DB, 0x4E62F1); // fire wall formula to magic arrow _PI->WriteJmp(0x4E62E5, 0x4E62A8); // luck spell formula to default
И небольшой десерт из моего мода: - Код: Выделить всё
// this requires some explaining _PI->WriteHexPatch(0x4E6291, "8D 46 E5"); // lea eax, [esi-13] -> lea eax, [esi-27] // spell spec table is limited to 43 entries + it skips first 13 entries (non-battle ones) // spells which are not included in this table will use id 06 (default damage formula) // this change makes the game skip first 27 entries instead of 13, to include ALL spells _PI->WriteByte(0x4E6296, 69); // spells with id more than 42 -> 69 are not included
// spell spec table - looks like it only enables fire shield specialty, specialties on spells like mirth/sorrow/misfortune still doesn't work _PI->WriteHexPatch(0x4E6358, "00 00 00 00 00 00 00 00 00 01 00 01 01 01 01 01 02 02 02 02 02 02 02 02 02 02 02 00 05 01 00 00 00 01 00 00 00 00 00 01 01 01 01"); // 00 - 2.0x, 01 - 1.5x, 02 - 3/2/1, 03 - unused (fortune), 04 - unused (disrupting ray), 05 - 9/6/3 (slayer, 4/3/2/1 in original game), 06 - unused (default)
// spell specialties _PI->WriteJmp(0x4E62FD, 0x4E62F1); // damage spells spec use magic arrow formula (1.5x fixed multiplier)
// replacing luck spell specialty, currently makes it a dummy one _PI->WriteHexPatch(0x4E62E5, "8B 45 10 90 90"); // mov eax, 2 -> mov eax, [ebp+0x10] // _PI->WriteLoHook(0x4E62EA, c_spec_spell); // stub for future possible specialty
Последний раз редактировалось Catastrophe 07 июн 2019, 13:50, всего редактировалось 8 раз(а).
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
|