Quote:требуется: реализация быстрых клавиш заклинаний в бою... Конкретно код, активирующий ЛЮБОЕ заклинание (баз/продв/эксп) с действием как при нажатии из книги
Code:
; 23. Колдовство боевых заклинаний без использования Книги
; Меняем вызовы исходной функции:
73E32 E872080000; CALL mop.004746A9
73F55 E84F070000; CALL mop.004746A9
; При вызове исходной функции заносим в ини-байт значение -1
746A9 C605A8464700FF; MOV BYTE PTR DS:[4746A8],0FF
; Под-функция
239C2D 55; PUSH EBP
239C2E 8BEC; MOV EBP,ESP
239C30 53; PUSH EBX
239C31 56; PUSH ESI
239C32 57; PUSH EDI
239C33 8B5D08; MOV EBX,DWORD PTR SS:[EBP+8] - положить указатель на BattleManager в ebx для корректной работы функции
239C36 E958ACE3FF; JMP mop.00474893
; Замена номера выбранного заклинания в Книге на требуемый:
19ED44 E9F2AE0900; JMP mop.00639C3B
239C3B A1D0926900; MOV EAX,DWORD PTR DS:[6992D0]
239C40 803DA8464700FF; CMP BYTE PTR DS:[4746A8],0FF
239C47 7505; JNZ SHORT mop.00639C4E
239C49 E9FB50F6FF; JMP mop.0059ED49
239C4E 0FB615A8464700; MOVZX EDX,BYTE PTR DS:[4746A8]
239C55 895038; MOV DWORD PTR DS:[EAX+38],EDX
239C58 EBEF; JMP SHORT mop.00639C49
; Не показывать диалог Книги Заклинаний:
19ED2D E928AF0900; JMP mop.00639C5A
239C5A 803DA8464700FF; CMP BYTE PTR DS:[4746A8],0FF
239C61 7408; JE SHORT mop.00639C6B
239C63 83C404; ADD ESP,4
239C66 E9C750F6FF; JMP mop.0059ED32
239C6B E8B05DFCFF; CALL mop.005FFA20
239C70 EBF4; JMP SHORT mop.00639C66
; Сама функция:
239C72 803DA8464700FF; CMP BYTE PTR DS:[4746A8],0FF
239C79 7518; JNZ SHORT mop.00639C93
239C7B 880DA8464700; MOV BYTE PTR DS:[4746A8],CL - занести номер заклинания в неиспользуемый байт
239C81 FF3520946900; PUSH DWORD PTR DS:[699420] - указатель на BattleManager
239C87 E8A1FFFFFF; CALL mop.00639C2D - вызов подфункции
239C8C C605A8464700FF; MOV BYTE PTR DS:[4746A8],0FF
239C93 C3;
сможем из этого сделать универсальную ф-цию, вызывающую в ЕРМ при нажатии на любую из 0..9 клавиш в бою назначенное заклинание?
Эм, я не активен, Бес, а сделать можно и проще.
Berserker, я не говорю "Давай!".. я спрашиваю, чего с ходу не вижу. А там буду смотреть уже

Code:
TCaster = (CASTER_HERO, CASTER_MON, CASTER_ART);
PROCEDURE CastSpell (Caster: TCaster; Spell, Power, Pos1, Pos2: INTEGER);
VAR
HeroPower: INTEGER;
MonPower: INTEGER;
CasterId: INTEGER;
BEGIN
IF Caster <> CASTER_MON THEN BEGIN
HeroPower := Power;
MonPower := -1;
END // .IF
ELSE BEGIN
HeroPower := -1;
MonPower := Power;
END; // .ELSE
CasterId := ORD(Caster);
ASM
MOV ECX, [COMBAT_MAN]
PUSH HeroPower
PUSH MonPower
PUSH Pos2
PUSH CasterId
PUSH Pos1
PUSH Spell
MOV EAX, $5A0140
CALL EAX
END; // .ASM
END; // .PROCEDURE CastSpell
Оставлю на будущее. Процедура позволяет колдовать любое заклинание. Ну а обработка клавиш в Эре есть.
есть желающие таки сделать такой ERM-код/плагин для добавления в некую популярную сборку ERA?
К Berserker'у уже не буду приставать, хоть он и делал задел для реализации...
V_Maiko Wrote: [ -> ]Bes, A Chinese modder named Xericsin helped me with this issue when I had creatures that were range and spellcaster at the same time, the code is this, it works like this
V_Maiko, я не совсем про это...
да, на ЕРМ можно повторить (эмулировать) действие того или иного заклинания, что есть у героя.
Но, не всегда это полностью удаётся, не исключает ошибки из-за несовместимости с другими скриптами/модами и пр. пр.
Я говорил сделать именно средствами оригинальных игровых функций, благо ранее и
Master of Puppets, и потом
Berserker дали для этого материал. Но тогда, да и сейчас, я не располагаю нужными знаниями и умениями для использования тех наработок.
Когда-то в Феникс-моде были реализованы быстрые клавиши заклинаний, но то была не идеальная имитация срабатывания заклинаний.
Вот, кстати, шапка той реализации (с хранением в ini настроек по клавишам)
Code:
[btn]
0=-1
1=-1
2=-1
3=-1
4=-1
5=-1
6=-1
7=-1
8=-1
9=-1
Bes, а ещё есть такое в SoD_SP плагине, так что намекаю на его автора, чтобы он продолжил портировать экран боя

(21.03.2014 05:05)Berserker Wrote: [ -> ]
Code:
TCaster = (CASTER_HERO, CASTER_MON, CASTER_ART);
PROCEDURE CastSpell (Caster: TCaster; Spell, Power, Pos1, Pos2: INTEGER);
VAR
HeroPower: INTEGER;
MonPower: INTEGER;
CasterId: INTEGER;
BEGIN
IF Caster <> CASTER_MON THEN BEGIN
HeroPower := Power;
MonPower := -1;
END // .IF
ELSE BEGIN
HeroPower := -1;
MonPower := Power;
END; // .ELSE
CasterId := ORD(Caster);
ASM
MOV ECX, [COMBAT_MAN]
PUSH HeroPower
PUSH MonPower
PUSH Pos2
PUSH CasterId
PUSH Pos1
PUSH Spell
MOV EAX, $5A0140
CALL EAX
END; // .ASM
END; // .PROCEDURE CastSpell
Оставлю на будущее. Процедура позволяет колдовать любое заклинание. Ну а обработка клавиш в Эре есть.
Было бы прекрасно, если бы это было всё, что требуется... Но это просто оригинал !!BM:C и !!BH:C.
Код, приведённый Бесом из моих исходников, такой странный потому, что не все условия колдовства учитываются данной функцией.
Это так, по памяти. Конкретные проблемы забыл, но мучительные поиски решения - всё ещё помню.
MOP, имеешь в виду, что проверки на артефакты/почву к моменту вызова Cast уже сработали?
Вроде того. Могут быть ещё проверки на иммунитеты.
Вообще, во многих местах кода, где вроде бы можно было сделать универсальную функцию, её вызов сопровождается одними и теми же проверками (проверки на диапазоны существ/артефактов/заклинаний ещё самые очевидные). Ещё есть действия, половина которых осуществляется вызовом процедуры, а другая половина - вставкой тела этой же процедуры.
Berserker, некоторые проверки (которые по идее никак не вызовут некие коллизии с другими модами) можно сделать через ЕРМ, типа проверки уровня навыка героя, наличие закла в книге и пр.
дабы не отвлекаться на них
MOP, код, явно нуждающийся в рефакторинге, в общем.
moderator Wrote:На данный момент существует отдельный плагин для быстрых клавиш в бою.
Все подробности вы можете увидеть ЗДЕСЬ 