UN:C - igrik - 13.01.2017 16:30
Данная тема посвящена UN:C скриптам, которые дают возможность изменять в игре то, что не возможно сделать через "обычный" ERM. Тема также будет затрагивать и команду SN:E.
Простые наборы UN:C-команд можно преобразовать в bin-патч онлайн, воспользовавшись следующим сервисом
Команда UN:C#1/#2/$3 позволяет прочитать/записать участок памяти, начиная с адреса #1, длиной #2 в/из переменную $3. Первые 2 параметра самые важные. Неправильная запись в них почти всегда гарантированно вызовет вылет из игры.
Разберем подробнее параметры:
#1 - это адрес участка памяти. Он может быть как статический, так и динамический. Тут всегда будут указаны статические адреса (эти адреса всегда одинаковы при запуске игры как на твоём, так и на моём компьютере). Если же нужно будет изменить что-то в динамическом адресе (это адреса, которые на твоём и на моём компьютере всегда разные), то тут будут указаны способы выхода на последние через статический адрес. По другому выйти на динамический адрес на разных компьютерах невозможно.
#2 - это размер третьего параметра или количество байт, которые нам необходимо изменить. Тут может быть 1, 2 или 4 байта.
$3 - это непосредственно сам параметр, который мы и намереваемся изменить чтобы добиться какой то плюшки. Может иметь как положительное число, так и отрицательное.
Пример использования:
!!UN:C7783293/4/37; командир Паладин (заклинание "лечение")
В коде игры WoG по адресу 0x76C37D установлено заклинание №25h для командира Паладин. Данные адреса имеют шестнадцетиричную систему исчисления. Команда UN:C поддерживает только десятичную систему. Чтобы перевести эти числа в десятичную: включите обычный виндовский калькулятор, нажмите "Вид->Программист", поставьте галочку на "Hex", введите "76C37D", после этого нажмите "dec". В итоге результат будет представлен числом 7783293. Вот мы и научились переводить шестнадцетиричное число в десятичное.
Итак:
7783293 - это адрес, в котором мы меняем интересующее нас значение/параметр;
4 - количество байт для изменения;
37 - то, что именно нам нужно поменить.
Итак, !!UN:C7783293/4/48; позволит Паладину накладывать на дружественных существ молитву (48).
Новички, и в особенности Guest, не забывайте!, что почти все указанные в теме константные ресиверы UN:C необходимо грузить в триггере !?FU(OnGameEnter);
Например:
UN:C - igrik - 14.01.2017 00:22
Работа с HD-модом:
Диалоги, интерфейс:
Code:
; параметры любого элемента диалога
; текст, картинки, кнопки и т.д.
+16 (2 байта) id элемента; by daemon_n
+18 (2 байта) если я правильно понял, то это косвенный id элемента в этом диалоге; by daemon_n
+20 (2 байта) флаги;
+22 (2 байта) состояние;
+24 (2 байта) x;
+26 (2 байта) y;
+28 (2 байта) ширина;
+30 (2 байта) высота;
+32 (4 байта) указатель на текст в статус_баре;
+36 (4 байта) указатель на текст по ПКМ;
; только для дефов и кнопок
+48 (4 байта) указатель на структуру defа;
+52 (4 байта) номер кадра дефа;
+56 (4 байта) номер кадра дефа при нажатии (если кнопка);
+60 (4 байта) отобразить зеркально: 0-нет, 1-да; [b]daemon_n[/b] думает, что это номер кадра дефа при отключенной кнопке (если кнопка);
+68 (2 байта) закрывает ли диалог: 0-нет, 1-да;
Активация кнопки "Следующий герой", отключенной в ТЕ.
RE: UN:C - igrik - 14.01.2017 00:41
Окно найма существ/боевых машин героем
Fix бага, возникающего при открывании окна героя в диалоге присоединения существ
RE: UN:C - igrik - 15.01.2017 17:02
Герои:
; 0 - Голова
; 1 - Плечи
; 2 - Шея
; 3 - Правая рука
; 4 - Левая рука
; 5 - Торс
; 6 - Левое кольцо / Правое кольцо [замки = 0...2]
; 7 - Ноги
; 8 - Разное 5...1 [замки = 0...5]
; 9 - Баллиста
;10 - Тележка с боеприпасами
;11 - Палатка первой помощи
;12 - Катапульта (фигушки, я всегда с вами)
;13 - Книга Заклинаий
Герои: меняем названия классов
RE: UN:C - igrik - 16.01.2017 14:48
Всякие разные константные значения (не боевые):
RE: UN:C - igrik - 16.01.2017 20:21
Всякие разные константные значения (боевые):
СПРАВКА
Номер типа снаряда:
0 — лучника
1 — монаха
2 — эльфа
3 — мастер-гремлина
4 — мага
5 — титана
6 — гога
7 — лича
8 — медузы
9 — орка
10 — циклопа
11 — ящера
12 — ледяного элементаля
13 — полурослика
14 — катапульты
15 — баллисты
16 - ВЫЛЕТ ИЗ ИГРЫ.
RE: UN:C - igrik - 16.01.2017 20:30
Города:
Граали:
RE: UN:C - igrik - 25.01.2017 13:38
Битва: стеки:
PHP Code:
NOALIGN struct _BattleStack_ : public _Struct_ // размер 0x548 { _byte_ already_attack; // +0 ? _byte_ field_01; // +1 ? _byte_ field_02; // +2 ? _byte_ field_03; // +3 ? _byte_ field_04[4]; // +4 ?
_int32_ all_stacks_count; // +8 //полное число стеков у игрока
_byte_ field_0C[4]; // +12 0x0C _dword_ field_10; // +16 0x10 //=-1 после атаки и/или ответа(????) _byte_ field_14[8]; // +20 0x14 ?
_int32_ aim_to_move_or_shoot; // 28 +0x1C //позиция на поле боя (куда бежать/стрелять) _byte_ fireshield; // +32 0x20 // огненный щит
_byte_ field_21[7]; // +33 0x21 ?
_int32_ clone_index; // +40 0x28 //номер стэка клона этого
_byte_ field_2C[4]; // +44 0x2C ? _dword_ field_30; // +48 0x30 ?
_int32_ creature_id; // +52 0x34 // тип монстра _int32_ hex_ix; // +56 0x38 //позиция на поле боя _int32_ def_group_ix; // +60 0x3C _int32_ def_frame_ix; // +64 0x40
_dword_ second_hex_is_right; // +68 0x44 //(=1) сдвиг в сторону второй занятой клетки для монстра с двумя клетками _dword_ field_48; // +72 0x48 ?
_int32_ count_current; // +76 0x4C // число монстров _int32_ count_before_attack; // +80 +0x50 // число монстров до удара по ним в тек. атаку _dword_ field_54; // +84 0x54 ? _int32_ lost_hp; // +88 0x58 потери здоровья последнего монстра _int32_ army_slot_ix; // +92 0x5C номер слота of _Army_ (0...6), -1 - будет удален после битвы _int32_ count_at_start; // +96 0x60 число монстров в начале битвы _dword_ field_64; // +100 0x64 ? _dword_ anim_value; // +104 0x68 = cranim.f[15] при инициализации _int32_ full_hp; // +108 0x6C полное здоровье (исп. как база для лечения) _bool32_ field_70; // +112 0x70 ?
////////////////////////////////////////////////////////////////////////////////// _CreatureInfo_ creature; ////////////////////////////////////////////////////////////////////////////////// //_int_ town; //+116 0x74 //_int_ level; //+120 0x78 //_char_* sound_name; //+124 0x7C //_char_* def_name; //+128 0x80 //_int_ flags; //+132 0x84 //_char_* name_single; //+136 0x88 //_char_* name_plural; //+140 0x8C //_char_* specification_description; //+144 0x90 //_int_ cost_wood; //+148 0x94 //_int_ cost_mercury; //+152 0x98 //_int_ cost_ore; //+156 0x9C //_int_ cost_sulfur; //+160 0xA0 //_int_ cost_crystal; //+164 0xA4 //_int_ cost_jems; //+168 0xA8 //_int_ cost_gold; //+172 0xAC //_int_ fight_value; //+176 0xB0 //_int_ AI_value; //+180 0xB4 //_int_ growth; //+184 0xB8 //_int_ horde_growth; //+188 0xBC //_int_ hit_points; //+192 0xC0 //_int_ speed; //+196 0xC4 //_int_ attack; //+200 0xC8 //_int_ defence; //+204 0xCC //_int_ damage_min; //+208 0xD0 //_int_ damage_max; //+212 0xD4 //_int_ shots; //+216 0xD8 //_int_ spells_count; //+220 0xDC //_int_ advmap_low; //+224 0xE0 //_int_ advmap_high; //+228 0xE4 ///////////////////////////////////////////////////////////////////////////////
_byte_ field_E8; // +232 0xE8 ?
_bool8_ is_1_killed; // +233 0xE9 =1, если умирал хоть один _bool8_ is_killed; // +234 0xEA =1, если был убит весь стэк
_byte_ field_EB; // +235 0xEB ?
_int32_ current_creatures_spell_id; // +236 0xEC номер заклинания существа в тек раунде 0x50 Acid breath _int32_ field_F0; // +240 0xF0 _byte_=1 перед атакой на него 441434 _int32_ side; // +244 0xF4 0 - attacker, 1 - defender _dword_ index_on_side; // +248 F8 dd = номер стэка у стороны на поле боя _dword_ field_FC; // +252 FC dd = ? что-то с магией _dword_ field_100; // +256 100 dd 43DEA4 _dword_ field_104; // +260 104 dd 43DEAD _dword_ field_108; // +264 108 dd _dword_ field_10C; // +268 10C dd _CreatureAnim_ cr_anim; // +272 0x110 _Def_* def; // +356 0x164 def монстра, загрузка: 43DA8E _Def_* def_shot; // +360 0x168 def выстрела, загрузка: 43DA8E _dword_ field_16C; // +364 0x16С ? _Wav_* wav_move; // +368 0x170 звук перемещения (move), загрузка: 43DA8E _Wav_* wav_attack; // +372 0x174 звук атаки (attk/wnce/shot), загрузка: 43DA8E _Wav_* wav_wnce; // +376 0x178 звук 'колдует' (wnce), загрузка: 43DA8E _Wav_* wav_shot; // +380 0x17C звук выстрела (shot), загрузка: 43DA8E _Wav_* wav_kill; // +384 0x180 звук смерти (kill), загрузка: 43DA8E _Wav_* wav_defend; // +388 0x184 звук обороны (wnce/dfnd), загрузка: 43DA8E _Wav_* wav_ext1; // +392 0x188 звук дополнительный 1 (ext1), загрузка: 43DA8E _Wav_* wav_ext2; // +396 0x18С звук дополнительный 2 (ext2), загрузка: 43DA8E _dword_ field_190; // +400 0x190 ? _int32_ active_spells_count; // +404 0x194 dd = количество уже наложенных заклинаний _int32_ active_spell_duration[81]; // +408 0x198 есть заклинание (длительность) или нет _int32_ active_spells_power[81]; // +732 0x2DC (сила действия заклинания) _byte_ field_420[52]; // +1056 0x420 ? _int32_ retaliations; // +1108 0x454 // 441B17 (кол-во ответов на атаку 0= не отв. на атаку)// настройка для грифонов 46D6A0 _int32_ bless_value; // +1112 0x458 Bless добавка к Max. Damage _int32_ curse_value; // +1116 0x45C Curse убавка к Min. Damage _int32_ field_460; // +1120 0x460 ? _int32_ bloodlast_value;// +1124 0x464 Bloodlast добавка к Атаке с бонусами _int32_ precision_value;// +1128 0x468 Precision добавка к Атаке с бонусами _byte_ field_46C[32]; // +1132 0x46C ? _int32_ king_type; // +1164 0x48C dd KING_123 тип (1=KING_1,2=KING_2,3=KING_3) // исп для расчета Slayer. Бонус 8 к Атаке: 0x4421D2 _int32_ field_490; // +1168 0x490 dd номер атакера по порядку??? уже атаковал??? (сбрасывается после первого удара) _int32_ counerstrike_retaliations; // +1172 0x494 dd кол. доп. ответов на атаку, добавленных Counerstrike заклом _byte_ field_498[40]; // +1176 0x498 ? _bool8_ blinded; // +1216 0x4C0 db Blinded - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом) _bool8_ paralized; // +1217 0x4C1 db Paralized - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом) _bool8_ forgetfulness; // +1218 0x4C2 dd Forgetfulness - уровень (>2 - не может стрелять) _byte_ field_4C3[25]; // +1219 0x4C3 ? _int32_ defend_bonus; // +1244 0x4DC dd = величина бонуса при выборе защиты _int32_ faerie_dragon_spell;// +1248 0x4E0 dd заклинание для сказ дракона
_byte_ field_4E4[100];
// +4EC dd 44152A // +4F1 db 43DF88
// +514 dd // +518 dd -> dd first \ adjusted stacks pointers // +51C dd -> dd last /
// +524 dd // +528 dd -> dd first \ adjusted to wich stacks pointers // +52C dd -> dd last /
};
Или описание от ZVS.
PHP Code:
struct _CombatMon_{ // размер 0x548 // +00 db (1) когда отаковал уже(?) // +01 db // +02 db (0C) 44188C // +03 db // +08 dd = полное число стеков у игрока // +10 dd =-1 после атаки и/или ответа(????) // +1С dd = позиция на поле боя (куда бежать/стрелять) // +20 db = огненный щит // +28 dd = -1 (номер стэка клона этого) // +30 db 43E33C int Type; // +34 dd = тип монстра int Pos; // +38 dd = позиция монстра на поле боя (куда атакует) // +3C dd = заклинания // +40 dd 43E236 // +44 dd (=1) сдвиг в сторону второй занятой клетки для монстра с двумя клетками int MonNum; // +4C - число монстров // +50 - число монстров до удара по ним в тек. атаку int LostLastHP; // +58 - потери здоровья последнего монстра // +5C - номер слота героя (0...6), -1 - будет удален после битвы int MonNum0; // +60 - число монстров в начале битвы // +6C - полное здоровье (исп. как база для лечения) // +70 dd 44150F 441744 // +74 dd -1 для продвинутых элементалей // +78 dd = уровень существа (0...6) Dword Flags; // +84 // 00000001 - 0x00 DOUBLE_WIDE - занимает 2 клетки // 00000002 - 0x01 летает // 00000004 - 0x02 стреляет // 00000008 - 0x03 расширенный радиус атаки (на две клетки) // 00000010 - 0x04 живое существо (можно восстанавливаться вампиру) // 00000020 - 0x05 CATAPULT - может разрушать стены // 00000040 - 0x06 SIEGE_WEAPON - осадное оружие - не двигается (5508CB) // 00000080 - 0x07 KING_1 // 00000100 - 0x08 KING_2 // 00000200 - 0x09 KING_3 // 00000400 - 0x0A ??? 00020000 + 40,41,83 - не чуствителен к псих атаке // 00000800 - 0x0B нет описания (35,74,75) // 00001000 - 0x0C в ближнем бою бьет как в дальнем // 00002000 - 0x0D ---- // 00004000 - 0x0E ??? IMMUNE_TO_FIRE_SPELLS // 00008000 - 0x0F стреляет дважды // 00010000 - 0x10 атака без ответа // 00020000 - 0x11 ... не подвержен низкой морали (?) // 32,33,56-69,112-117,120,121,123,,125,127,129,141,145-149 // 00040000 - 0x12 нечисть // 00080000 - 0x13 бьет всех врагов рядом // 00100000 - 0x14 расширенный радиус стреляющих юнитов // 00200000 - 0x15 стэк убит? 41E617 чародей,firebird - может еще кастовать? // 00400000 - 0x16 421BDC,421FC4 (что-то с вызовом) // 00800000 - 0x17 копия стэку - умирает сразу // 01000000 - 0x18 гарпии-ведьмы // 02000000 - 0x19 остался(уже) ждать СБРОСИТЬ - МОЖЕТ ЖДАТЬ СНОВА // 04000000 - 0x1A уст. после атаки СБРОСИТЬ - ВНОВЬ МОЖЕТ ОТАКОВАТЬ // 08000000 - 0x1B - выбрал защиту // 10000000 - 0x1C - не может быть ресуректен ??? // 20000000 - 0x1D + 43DFAF // 40000000 - 0x1E + 43E06F // 80000000 - 0x1F дракон // int FullHP; // +B0 dd = ??? int HitPoints; // +C0 dd = здоровье монстра int Speed; // +С4 dd = скорость монстра int Attack; // +C8 dd = атака с бонусами int Defence; // +CC dd = защита с бонусами // +D0 dd = мин. дамэдж // +D4 dd = макс. дамэдж // +D8 dd = количество выстрелов // +DC dd = количество заклинаний 0=нет ДЛЯ ВОСКРЕШЕНИЯ УВЕЛИЧИТЬ // +E8 db = // +E9 db = 1, если умирал хоть один // +EA db = 1, если был убит весь стэк // +EC dd = номер заклинания существа в тек раунде 0x50 Acid breath // +F0 db=1 перед атакой на него 441434 // +F4 dd (0,1) индекс игрока 0 или 1 4414AF 443D69 // +F8 dd = номер стэка у стороны на поле боя // +FC dd = ? что-то с магией // +100 dd 43DEA4 // +104 dd 43DEAD // +108 dd // +158 dd =? // +164 dd -> ctroll.def (троль) Byte *ShootDef; // +168 - загруж.деф. для стреляющих (иниц в 43DA8E) // +16C // +194 dd = количество уже наложенных заклинаний // +198 dd*? (есть заклинание (длительность) или нет по номерам) // +198 dd = Summon Boat // +19C dd = Scuttle Boat // +1A0 dd = Visions // +1A4 dd = View Earth // +1A8 dd = Disguise // +1AC dd = View Air // +1B0 dd = Fly // +1B4 dd = Water Walk // +1B8 dd = Dimension Door // +1BC dd = Town Portal
// +1C0 dd = Quicksand // +1C4 dd = Land Mine // +1C8 dd = Force Field // +1CC dd = Fire Wall // +1D0 dd = Earthquake // +1D4 dd = Magic Arrow // +1D8 dd = Ice Bolt // +1DC dd = Lightning Bolt // +1E0 dd = Implosion // +1E4 dd = Chain Lightning // +1E8 dd = Frost Ring // +1EC dd = Fireball // +1F0 dd = Inferno // +1F4 dd = Meteor Shower // +1F8 dd = Death Ripple // +1FC dd = Destroy Undead // +200 dd = Armageddon // +204 dd = Shield // +208 dd = Air Shield // +20C dd = fire Shield // +210 dd = Protection from Air // +214 dd = Protection from Fire // +218 dd = Protection from Water // +21C dd = Protection from Earth // +220 dd = Anti-Magic // +224 dd = Dispel // +228 dd = Magic Mirror // +22C dd = Cure // +230 dd = Resurrection // +234 dd = Animate Dead // +238 dd = Sacrifice // +23C dd = Bless // +240 dd = Curse // +244 dd = Bloodlust // +248 dd = Precision // +24C dd = Weakness // +250 dd = Stone Skin // +254 dd = Disrupting Ray // +258 dd = Prayer // +25C dd = Mirth // +260 dd = Sorrow // +264 dd = Fortune // +268 dd = Misfortune // +26C dd = Haste // +270 dd = Slow // +274 dd = Slayer // +278 dd = Frenzy // +27C dd = Titan's Lightning Bolt // +280 dd = Counterstrike // +284 dd = Berserk // +288 dd = Hypnotize // +28C dd = Forgetfulness // +290 dd = Blind // +294 dd = Teleport // +298 dd = Remove Obstacle // +29C dd = Clone // +2A0 dd = Fire Elemental // +2A4 dd = Earth Elemental // +2A8 dd = Water Elemental // +2AC dd = Air Elemental
// +2B0 dd = Stone 443D3A 43E0EB 441B0D (!= не отв. на атаку) // +2B4 dd = Poison // +2B8 dd = Bind // +2BC dd = Desease // +2C0 dd = Paralyze // +2C4 dd = Aging // +2C8 dd = Death Cloud // +2CC dd = Thunderbolt // +2D0 dd = Dispel // +2D4 dd = Death Stare // +2D8 dd = Acid Breath // +2DC dd*? (сила действия заклинания) // +2DC dd = Summon Boat // +2E0 dd = Scuttle Boat // +2E4 dd = Visions // +2E8 dd = View Earth // +2EC dd = Disguise // +2F0 dd = View Air // +2F4 dd = Fly // +2F8 dd = Water Walk // +2FC dd = Dimension Door // +300 dd = Town Portal
// +304 dd = Quicksand // +308 dd = Land Mine // +30C dd = Force Field // +310 dd = Fire Wall // +314 dd = Earthquake // +318 dd = Magic Arrow // +31C dd = Ice Bolt // +320 dd = Lightning Bolt // +324 dd = Implosion // +328 dd = Chain Lightning // +32C dd = Frost Ring // +330 dd = Fireball // +334 dd = Inferno // +338 dd = Meteor Shower // +33C dd = Death Ripple // +340 dd = Destroy Undead // +344 dd = Armageddon // +348 dd = Shield // +34C dd = Air Shield // +350 dd = fire Shield // +354 dd = Protection from Air // +358 dd = Protection from Fire // +35C dd = Protection from Water // +360 dd = Protection from Earth // +364 dd = Anti-Magic // +368 dd = Dispel // +36C dd = Magic Mirror // +370 dd = Cure // +374 dd = Resurrection // +378 dd = Animate Dead // +37C dd = Sacrifice // +380 dd = Bless // +384 dd = Curse // +388 dd = Bloodlust // +38C dd = Precision // +390 dd = Weakness // +394 dd = Stone Skin // +398 dd = Disrupting Ray // +39C dd = Prayer // +3A0 dd = Mirth // +3A4 dd = Sorrow // +3A8 dd = Fortune // +3AC dd = Misfortune // +3B0 dd = Haste // +3B4 dd = Slow // +3B8 dd = Slayer // +3BC dd = Frenzy // +3C0 dd = Titan's Lightning Bolt // +3C4 dd = Counterstrike // +3C8 dd = Berserk // +3CC dd = Hypnotize // +3D0 dd = Forgetfulness // +3D4 dd = Blind // +3D8 dd = Teleport // +3DC dd = Remove Obstacle // +3E0 dd = Clone // +3E4 dd = Fire Elemental // +3E8 dd = Earth Elemental // +3EC dd = Water Elemental // +3F0 dd = Air Elemental
// +3F4 dd = Stone 443D3A 43E0EB 441B0D (!= не отв. на атаку) // +3F8 dd = Poison // +3FC dd = Bind // +400 dd = Desease // +404 dd = Paralyze // +408 dd = Aging // +40C dd = Death Cloud // +410 dd = Thunderbolt // +414 dd = Dispel // +418 dd = Death Stare // +41C dd = Acid Breath // +444 dd -> // +448 dd (2) // +44C dd // +454 dd 441B17 (кол-во ответов на атаку 0= не отв. на атаку) // настройка для грифонов 46D6A0 // КОЛИЧЕСТВО ОТВЕТОВ НВ АТАКУ // +458 dd Bless добавка к Max. Damage // +45C dd Curse убавка к Min. Damage // +464 dd Bloodlast добавка к Атаке с бонусами // +468 dd Precision добавка к Атаке с бонусами // +48C dd KING_123 тип (1=KING_1,2=KING_2,3=KING_3) // исп для расчета Slayer. Бонус 8 к Атаке: 0x4421D2 // +490 dd номер атакера по порядку??? уже атаковал??? (сбрасывается после первого удара) // +494 dd кол. доп. ответов на атаку, добавленных Counerstrike заклом // +4A4 dd // +4C0 db Blinded - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом) // +4C1 db Paralized - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом) // +4C2 dd Forgetfulness - уровень (>2 - не может стрелять) // +4DC dd = величина бонуса при выборе защиты // +4E0 dd заклинание для сказ дракона // +4EC dd 44152A // +4F1 db 43DF88
// +514 dd // +518 dd -> dd first \ adjusted stacks pointers // +51C dd -> dd last /
// +524 dd // +528 dd -> dd first \ adjusted to wich stacks pointers // +52C dd -> dd last / };
ФУНКЦИИ:
Битва: герои:
RE: UN:C - igrik - 26.01.2017 13:12
Артефакты:
Создание артефакта автонакладывающего заклинание см.тут
Расширить список артефактов для появления на карте см.тут
RE: UN:C - igrik - 27.10.2017 11:12
Хуки на исполняемый код ERA:
Несколько хуков на форуме df2
.
.
Скачать: ERM_Hooker
Добавление артефакту автокаст закла в начале боя (на примере Альянса ангелов)
Quote:Можно ли как-то сделать абилку после атаки?
(17.06.2019 16:52)wessonsm Wrote: Можно "отследить" момент, когда AI выкупает героя в таверне?
Получить момент покупки героя:
(04.10.2019 14:58)Igor Wrote: А напрямую влиять на количество отрядов через erm можно?
Скажем чтобы при нападении вампиров монстр делал 1 отряд?
Напрямую кол-во отрядов в армии нейтралов можно менять вот так:
Quote:А можно, чтобы магоги не наносили урон войскам Инферно
(14.11.2017 12:58)Heromant Wrote: ... расстояние до точки герою в баллах перемещения пересчитать с нуля в ERM я считаю, достаточно сложно. Слишком много факторов надо учитывать. Поэтому у меня и появилась мысль, что возможно, легче бы было "выдрать" циферку под миниатюрой лошадки в днях (без графического построения стрелочки пути).
Получение дальности до клетки под курсором
RE: ERA II - igrik - 07.12.2017 21:52
Командиры:
Code:
#define o_Npc ((_Npc_*)0x28620C0) // получение структуры командира
// Структура командира 0x128h (296)
NOALIGN struct _Npc_
{
_dword_ on; // 0x00 +0 Доступность
_dword_ alive; // 0x04 +4 Жив_или_мёртв
_dword_ id; // 0x08 +8 Номер_героя_хозяина (ну и номер командира)
_dword_ type; // 0x0C +12 Тип_командира
_dword_ type_Hero; // 0x10 +16 Тип_героя
_dword_ LastExpaInBattle; // 0x14 +20 Опыт в прошлых битвах
_dword_ CustomPrimary; // 0x18 +24 Если вы установить 1 (вкл), первичные навыки не будут изменяться с продвижением командира по уровням
// Если установить 0, то здоровье и урон будут автоматически прибавляться вместе с уровнем командира (из ERM Help = CO:P)
_dword_ attack; // 0x1C +28 Атака
_dword_ defence; // 0x20 +32 Защита
_dword_ hit_points; // 0x24 +36 Здоровье
_dword_ damage; // 0x28 +40 Урон
_dword_ spell_power; // 0x2C +44 Сила_магии
_dword_ speed; // 0x30 +48 Скорость
_dword_ resistance; // 0x34 +52 Сопротивление
_dword_ lvl_attack; // 0x38 +56 Уровень_Атаки
_dword_ lvl_defence; // 0x3C +60 Уровень_Защиты
_dword_ lvl_hit_points; // 0x40 +64 Уровень_Здоровья
_dword_ lvl_damage; // 0x44 +68 Уровень_Урона
_dword_ lvl_spell_power; // 0x48 +72 Уровень_Сила_магии
_dword_ lvl_speed; // 0x4C +76 Уровень_Скорости
_dword_ lvl_resistance; // 0x50 +80 Уровень_Сопротивления
_word_ arts[10][8]; // 0x54 +84 Номер_артефакта; Кол-во проведённых с ним битв
_char_ name[32]; // 0xF4 +244 Имя
_dword_ old_expa; // 0x114 +276 Старый_опыт_героя
_dword_ now_expa; // 0x118 +280 Текущий_опыт
_dword_ now_level; // 0x11C +284 Текущий_уровень (при отображении добавляем +1)
_dword_ specBon[2]; // 0x120 +288 Особые_бонусы(сумма_битов); Запрещенные_бонусы(сумма_битов)
};
// функция получения адреса структуры командира
inline _Npc_* GetNpc(_int_ hero_id) {return ((_Npc_ *)(0x28620C0 + 296 * hero_id));}
// функция получения строк из командирского текстовика "znpc00.txt"
inline char* Get_ITxt(int StrNum, int ItemNum) {return CALL_3 (char*, __cdecl, 0x77710B, StrNum, ItemNum, 0x2860724);}
// функция получения строк из командирского текстовика "znpc01.txt" Имена и биографии
inline char* Get_ITxtBio(int StrNum, int ItemNum) {return CALL_3 (char*, __cdecl, 0x77710B, StrNum, ItemNum, 0x286072C);}
// функция получения силы первичного командирского навыка
inline int Get_NpcSkillPower(_Npc_* npc, int skill_id) {return CALL_2 (int, __thiscall, 0x769460, npc, skill_id);}
RE: UN:C - igrik - 08.07.2018 21:50
Спец.абилки монстров:
Колдовство монстром:
RE: UN:C - Algor - 19.02.2019 17:16
Управление вторичными навыками:
© разные хорошие люди
RE: UN:C - Chaomen - 18.08.2019 03:53
Одновременная анимация на стеках:
Позволяет сразу обращаться к номерам стеков.
Присваиваете нужным SimulAnim# 1 и вызываете функцию (SimultaneousAnimations).
RE: UN:C - Igor - 06.09.2019 22:54
Боевые константы:
RE: UN:C - Igor - 25.09.2019 23:34
UN:C для чайников FAQ:
1. Что делает команда?
Большое количество информации хранится в оперативной памяти. У каждого байта памяти есть линейный адрес. UN:C позволяет читать или писать данные размером 1/2/4 байта.
Формат команды: !!UN:C[адрес]/[кол-во байт=1,2 или 4]/$[новое значение или куда записать прочитанное].
Пример:
!!UN:C5901022/4/5; Записать целое четырёхбайтовое число со значением 5 в память по адресу 5901022
2. Как менять процентные параметры %.
Если игра использует проценты, то нельзя просто написать 30%, надо перевести на понятный программе язык. Это можно сделать 3 путями (работает с навыками волшебство и т.д.)
1. Самому посчитать проценты используя калькуляторы:
Сначала переводим проценты например 0.5 (50%) в Binary32
https://babbage.cs.qc.cuny.edu/IEEE-754/index.xhtml
затем полученное значение 3F000000 в 10-ую систему
https://calculatori.ru/perevod-chisel.html
и результат 1056964608 используем в ERM вместо y1.
2. ERM сам считает проценты:
3.Для навыков есть специальная удобная функция: !!FU7703
3. Не работают способы, указанные выше?
Не все процентные показатели можно поменять способом выше. Такие параметры как бонусы атаки и защиты используют значения из массива, соответственно надо знать определенный массив чтобы им подменить существующий.
6535680 - 25%
6554608 – 75%
RE: UN:C - PerryR - 01.11.2019 15:29
!?MF1 Trigger damage type:
I found this information on a Chinese Heroes forum and it is very helpful so I want to share it here.
When using the MF1 trigger it triggers for several other damage types which were probably not intended by the modder, most likely causing side effects or bugs. This can be prevented by specifying which damage type should be considered. Doing this is also helpful if only certain damage types should be modified, allowing for interesting scripts.
The following is directly copied from the forum and not my work, but it is enough to make you understand:
Then, we can detect the value of [028326c0] in the MF1 trigger, and basically determine the type of damage.
After a round of testing, the data obtained is as follows:
Damage Type Return Address:
Fireball damage 0043F960
Normal shooting 0043FA63 (4455011)
Range cloud damage 0043FD42
Ring damage 004400E4 (Strikes all Enemies around)
Fire Shield Damage 0044085D
Death gaze damage 00440E75
Lightning strike 0044104D
Acid attack damage 00441251
Normal melee damage 0044173E (4462398)
Dragon damage 0044178F
Arrow Tower Damage 00465964
Moat damage 00469A98
Death ripple damage? 005A106A
Calc with Hex in Deca
Example how to use it:
Full credits for this work should go to You know that you have (Google translated name) wakeofgods.com source
RE: UN:C - Berserker - 19.12.2019 14:53
Бесследно убрать стек с поля боя:
RE: UN:C - Igor - 11.01.2020 21:45
Способности монстров:
Бонусы к приросту монстров от городских построек
Поправка от Raistlin
Шансы срабатывания способностей
RE: UN:C - Igor - 12.01.2020 18:50
Артефакты:
** Редактирование стандартных бонусов к атаке\защите\силе магии\знаниям от артефактов
** максимальное значение + 127/-128
RE: UN:C - Igor - 14.01.2020 20:31
Изменение типа охраны сокровищниц:
RE: UN:C - Igor - 19.01.2020 22:39
Параметры героев:
RE: UN:C - Igor - 20.01.2020 05:04
RE: UN:C - Igor - 22.01.2020 21:38
Расстановка Войск, запускается триггером !?BF;
RE: UN:C - Igor - 25.01.2020 20:20
Ресурсы:
Стартовые ресурсы игрока человека
Стартовые ресурсы игрока комп
Мифрил:
RE: UN:C - Igor - 25.01.2020 21:45
Заклинания:
RE: UN:C - Berserker - 28.01.2020 04:25
Функции:
RE: UN:C - Berserker - 07.03.2020 00:33
Все опции игры:
Code:
SHOW_INTRO_OPT: !!UN:C6919184/4/$;
MUSIC_VOLUME_OPT: !!UN:C6916016/4/$;
SOUND_VOLUME_OPT: !!UN:C6916020/4/$;
LAST_MUSIC_VOLUME_OPT: !!UN:C6916024/4/$;
LAST_SOUND_VOLUME_OPT: !!UN:C6916028/4/$;
WALK_SPEED_OPT: !!UN:C6916012/4/$;
COMP_WALK_SPEED_OPT: !!UN:C6916008/4/$;
SHOW_ROUTE_OPT: !!UN:C6916036/4/$;
MOVE_REMINDER_OPT: !!UN:C6916040/4/$;
QUICK_COMBAT_OPT: !!UN:C6916044/4/$;
VIDEO_SUBTITLES_OPT: !!UN:C6916048/4/$;
TOWN_OUTLINES_OPT: !!UN:C6916052/4/$;
ANIMATE_SPELLBOOK_OPT: !!UN:C6916056/4/$;
WINDOW_SCROLL_SPEED_OPT: !!UN:C6916060/4/$;
BLACKOUT_COMPUTER_OPT: !!UN:C6916064/4/$;
FIRST_TIME_OPT: !!UN:C6919540/4/$;
TEST_DECOMP_OPT: !!UN:C6919544/4/$;
TEST_READ_OPT: !!UN:C6919548/4/$;
TEST_BLIT_OPT: !!UN:C6919552/4/$;
BINK_VIDEO_OPT: !!UN:C6916088/4/$;
UNIQUE_SYSTEM_ID_OPT: !!UN:C6916152/это строка/$;
NETWORK_DEF_NAME_OPT: !!UN:C6916199/это строка/$;
AUTOSAVE_OPT: !!UN:C6916032/4/$;
SHOW_COMBAT_GRID_OPT: !!UN:C6916108/4/$;
SHOW_COMBAT_MOUSE_HEX_OPT: !!UN:C6916112/4/$;
COMBAT_SHADE_LEVEL_OPT: !!UN:C6916116/4/$;
COMBAT_ARMY_INFO_LEVEL_OPT: !!UN:C6916120/4/$; информация об отряде (0 - нет, 1 - вся статистика, 2 - только заклинания)
COMBAT_AUTO_CREATURES_OPT: !!UN:C6916068/4/$;
COMBAT_AUTO_SPELLS_OPT: !!UN:C6916072/4/$;
COMBAT_CATAPULT_OPT: !!UN:C6916076/4/$;
COMBAT_BALLISTA_OPT: !!UN:C6916080/4/$;
COMBAT_FIRST_AID_TENT_OPT: !!UN:C6916084/4/$;
COMBAT_SPEED_OPT: !!UN:C6916156/4/$;
MAIN_GAME_SHOW_MENU_OPT: !!UN:C6916092/4/$;
MAIN_GAME_X_OPT: !!UN:C6916096/4/$;
MAIN_GAME_Y_OPT: !!UN:C6916100/4/$;
MAIN_GAME_FULL_SCREEN_OPT: !!UN:C6916104/4/$;
APP_PATH_OPT: !!UN:C6915604/4/$;
CD_DRIVE_OPT: !!UN:C6916232/4/$;
RE: UN:C - Raistlin - 16.04.2020 18:47
Замена озвучки и/или боевой анимации существ:
RE: UN:C - Raistlin - 23.04.2020 23:45
Работа с экраном города:
При замене анимации нужно также записать в память новое количество кадров:
Перемещение зданий:
Приоритет отображения:
P.S. Спасибо Феанору за адреса и объяснение!
RE: UN:C - Raistlin - 03.05.2020 03:10
Замена ресурса, даваемого хранилищем:
Структура:
PHP Code:
struct Silo { int woodBonus; int mercuryBonus; int oreBonus; int sulfurBonus; int crystalBonus; int gemsBonus; int goldBonus; };
Значения в памяти:
RE: UN:C - SergOz - 13.05.2020 15:50
Получение координат закопанного Грааля, при посещении обелиска:
RE: UN:C - igrik - 15.05.2020 23:25
Города: постройки и их цены:
Данные скрипты походу нужно и в Fun Lib добавить.
RE: UN:C - SergOz - 20.07.2020 01:56
УЗНАТЬ РАНДОМНОСТЬ КАРТЫ:
RE: UN:C - Bes - 19.09.2020 22:25
Преобразователь скелетов
RE: UN:C - igrik - 05.11.2020 21:45
(12.11.2017 12:49)igrik Wrote:
P.S. это секция SOD (а значит данная проблема есть на всех версиях героев 3)
RE: UN:C - Berserker - 11.12.2020 17:52
Установка прозрачности анимациям заклинаний:
RE: UN:C - Raistlin - 17.12.2020 02:45
Спец.абилки монстров:
Большая часть адресов взята из темы инженерного анализа на df2, и результат моей работы заключается в том, что значения теперь можно выставлять напрямую через ERM. Однако кое-что (например, регенерацию или возрождение фениксов) я действительно раскопал сам.
*Атака с возвратом в оригинальном коде
Code:
47832B cmp eax, 48h ; Compare Two Operands
47832E jz short loc_00478335 ; Jump if Zero (ZF=1)
478330 cmp eax, 49h ; Compare Two Operands
478333 jnz short loc_00478365 ; Jump if Not Zero (ZF=0)
RE: UN:C - Raistlin - 04.01.2021 03:50
Спец.строения в городах:
Code:
if ( v53->type == 2 || v53->type == 5 || v53->type == 8 )
005D40EE 83E8 02 SUB EAX,2 ; Switch (cases 2..8, 2 exits)
005D40F1 74 6F JZ SHORT 005D4162
005D40F3 83E8 03 SUB EAX,3
005D40F6 74 6A JZ SHORT 005D4162
005D40F8 83E8 03 SUB EAX,3
005D40FB 74 65 JZ SHORT 005D4162
Вместо проверки на Темницу feanor сразу проверяет Сопряжение, вычитая не 3, а 6, ну а второй "SUB EAX,3" становится попросту не нужен. Последующий переход происходит только в том случае, если результат равен нулю (JZ), а он, как ни крути, будет меньше
P.S. ©Я - это конечно же шутка, и каждая буква этого сообщения является общественным достоянием
RE: UN:C - Raistlin - 10.01.2021 22:18
Золотишко:
Code:
v20 = o_GameMgr->Player.PlayerHandicap[player_id];
if ( v20 == 1 )
{
v21 = (golda * 0.85);
}
else if ( v20 == 2 )
{
v21 = (golda * 0.7);
}
else
{
LODWORD(v21) = golda;
}
Igor Wrote:
igrik Wrote:
RE: UN:C - Raistlin - 12.01.2021 18:44
Арена:
Сидели мы как-то с одним разработчиком, ковыряли его проект и потихоньку воровали контент из хоты. В какой-то момент решили добавить Колизей магов, я полез изучать код и нашел целую кучу интересных адресов, которые решил опубликовать здесь. Потом еще что-нибудь расковыряю и назову сообщение "Объекты карты", ну а пока пусть будет "Арена". Мы, кстати, еще пушку сперли, так что далеко не уходите - скоро где-нибудь тут на форуме я опубликую код на добавление боевых машин
Основная функция (огромное спасибо igrik за создание работающего варианта, а то у меня все-же что-то не склеилось ):
Code:
char _bool8_ __stdcall AdvMng_4_Arena(HiHook* hook, _AdvMgr_* AvdMgr, _Hero_* hero, _MapItem_* object, _bool8_ isHuman)
{
// Hero_GetVisited7_Object
if( !CALL_2(_bool8_, __thiscall, 0x4E5630, hero, object) )
{
//
int skillId = 0;
// получаем подтип объекта (0 - атака/защита, 1 - сила/знания)
int subtype = object->os_type *2;
// код игрока человека
if (isHuman)
{
// AdvMgr_SetTimer
CALL_3(int, __thiscall, 0x415CC0, AvdMgr, 0, -1);
// AdvMgr_UpdateInfoPanel
CALL_4(void, __thiscall, 0x415D40, AvdMgr, 0, 1, 1);
// показ сообщения с выбором первичного навыка +2
skillId = o_MsgBox(o_ADVEVENT_TXT->GetString(1), 10, -1, -1, 31 + subtype, 2, 32 + subtype, 2, -1, 0, -1, 0);
// если нажата отмена: выход
if( skillId == 30721 )
return 1;
// получаем номер выбранного скилла
skillId -= 30729;
} else { // код ИИ
skillId = Randint(0, 1);
}
// первоначальная величина бонуса
int bonus = 2;
// собираем правильный номер выбранного скилла
skillId += subtype;
// величина первичного навыка героя
int valueSkillPower = *(_byte_*)(&hero->attack + skillId);
// работаем с границами величин (0..99)
if (valueSkillPower >= 99)
bonus = 0;
else if(valueSkillPower == 98)
bonus = 1;
// выдаём бонус герою
*(_byte_*)(&hero->attack + skillId) += bonus;
// Hero_SetVisited7_Object
CALL_2(_bool8_, __thiscall, 0x4E5650, hero, object);
}
else if (isHuman)
{
// сообщение игроку человеку, что объект уже был посещён этим героем
o_MsgBox(o_ADVEVENT_TXT->GetString(2), 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
}
return isHuman;
}
В DllMain также должно стоять вот это:
Code:
Magic->WriteHiHook(0x49E440, SPLICE_, EXTENDED_, THISCALL_, AdvMng_4_Arena);
Если что, Magic - это моя PatсherInstance
P.S. Мы - значит я
RE: UN:C - Raistlin - 15.02.2021 15:46
Работа с препятствиями:
RE: UN:C - Raistlin - 21.02.2021 20:32
Получение случайного урона от стека (как при атаке):
Получение минимального и максимального урона от стека:
RE: UN:C - Archer30 - 12.04.2021 10:53
Note: This post is being updated constantly.
Commanders:
Commander's spells on the Battlefield = Commander's Magic Power Skill Level:
(instead of Magic Power Skill + 1 / only visual)
Allow commanders to learn 6 primary skills:
Allow commanders to learn Master basic skills before getting 4 Expert basic skills:
Spells:
Resurection spell keeps revived creatures at the end of battle without Advanced Earth Magic.
Town Portal spell allows to teleport to any town without Advanced Earth Magic.
Dwellings:
Enable guards for lower level dwellings (type 17)
(0 - minmimun level of creature's dwellings that are guarded)
Level 1 creature no longer free in dwellings
Miscs:
All heroes recruited from the tavern have full toops:
(instead of having only 1 level 1 creature for the third hero and after in a week)
Disable AI using Castle Gate (Inferno Building):
RE: UN:C - Berserker - 18.08.2021 14:25
Изменение колдовской силы героев в бою:
RE: UN:C - Berserker - 10.01.2022 15:21
Патч на восстановление работы команд FU:D/IP на карте приключений с HD модом для Эры 3.9.2 и ранее
RE: UN:C - daemon_n - 18.04.2022 14:02
Дать/Забрать любое заклинание герою от любого артефакта
RE: UN:C - daemon_n - 30.05.2022 07:05
Чтение текста из txt таблиц
Reading text from txt tables
;как оказалось, я лишь сделал аналог вот этого
RE: ERA II - daemon_n - 29.07.2022 01:56
(07.12.2017 21:52)igrik Wrote: Командиры / Commanders:
Code:
int NPC::Bonus[7][5]={
{2,5,9,15,25}, // +AT
{4,10,18,30,50}, // +DF
{10,25,45,70,100}, // +HP%
{10,25,45,70,100}, // +DM%
{1,3,6,14,29}, // +MP
{1,2,3,4,6}, // +SP
{5,15,35,60,90} // +MR%
};
Изменяем/получаем базовые параметры Командиров
Это не массив, но внимательные уже заметили, что со смещением в 10 байт мы можем работать со значениями с помощью цикла
RE: UN:C - daemon_n - 23.08.2022 22:11
(15.05.2020 23:25)igrik Wrote: Города: постройки и их цены:
Возможность получить и Установить стоимость зданий
RE: UN:C - daemon_n - 04.11.2022 18:33
Текст: Работаем с геройскими txt:
Имеем геройскую строку в стандарте языка "C", которую можно извлечь из игры:
Code:
"%s currently has %d spell points out of a maximum of %d"
Но нам надо подставить свои значения, не используя посимвольный парсинг строки))
вместо буфера можно использовать адрес любой статической текстовой переменной или же геройский буфер по адресу 6911016
например:
Выдаст:
"Berserker currently has 0 spell points out of a maximum of 0"
Необязательно подставлять все значения, но их тип обязательно должен совпадать -- %s - текст, %d - число (если поставить текст, то выдаст его адрес)
также необязательно использовать геройский буфер -- способ с переменной со статическим адресом:
Выдаст:
"daemon_n currently has 666 spell points out of a maximum of 666"
RE: UN:C - daemon_n - 02.01.2023 23:25
(18.08.2021 14:25)Berserker Wrote: Изменение колдовской силы героев в бою:
RE: UN:C - SergOz - 02.05.2023 11:46
ОТКРЫТИЕ ОКНА ГЕРОЯ:
RE: UN:C - daemon_n - 25.06.2023 08:59
Текст: Считаем количество строк нашего текста в определённой ширине:
Text: Count the number of lines of our text in a certain width:
Вызываем внутриигровую ф-цию, которая определяет, сколько строк займёт указанный текст в указанной ширине и с указанным шрифтом.
Последним аргументом передаётся указатель на вектор, в который ф-ция и сохраняет массив строк.
Очень важно отправить чистые 16 байтов (определяется как чистый вектор строк), поэтому чистим первые 16 байтов z-2 переменной, адрес которой и передаём в главную ф-цию. Хотя ранее я чистил все 512, по привычке.
После выполнения ф-ции получаем вектор из строк - не думаю, что много кому нужен, но для получения кол-ва строк вычитаем адрес первого элемента из адреса конца и делим на 16 (размер объекта класса строки).
We call an in-game function that determines how many lines the specified text will take up in the specified width and font.
The last argument is a pointer to a vector, where this function saves an array of strings.
It's very important to send clean 16 bytes (defined as a clean vector of strings), so we clean the first 16 bytes of the z-2 variable, the address of which is passed to the main f-function. Although I used to clear all 512, out of habit.
After f-function execution we get a vector of strings - I don't think anyone needs it much, but to get the number of strings we subtract the first address from the end address and divide by 16 (the size of the string class object).
RE: UN:C - daemon_n - 23.08.2023 08:51
Карта Приключений: Меняем внешний вид монстров:
Adventure Map: Changing Monster Map View
RE: UN:C - SergOz - 06.03.2024 11:07
Установить конкретному герою персональный обзор:
@by daemon_n
Нужно учесть, что при нулевом обзоре герой не сможет исследовать новые территории, но игрок клавишами со стрелками всё же может двигать этого героя "во тьму" )))
RE: UN:C - FallenAngel - 26.03.2024 22:59
Изменение кол-ва информации в окне гильдии воров
Из недр df2 (не в темах из шапки), feanor постил давным-давно.
Братство меча вместо старого бонуса теперь дает информацию как внешние гильдии воров.
RE: UN:C - daemon_n - 31.03.2024 07:57
Карта Приключений: Актуализируем данные для подсказок для квестов/заданий:
Adventure Map: Update tips/hints/pictures for quests/seer huts/guards
RE: UN:C - Raistlin - 23.06.2024 14:39
ОБНОВЛЕНИЕ КУРСОРА В БИТВЕ:
Пример скрипта - альтернативное действие в бою (переключение на атаку у стрелков):
Учтите, в сетевой игре можно переключать режим атаки у отряда оппонента!
|