27.11.2010, 23:12
Dll модифицирует код определения целей при ближнем ударе существ.
Для Era 1.9 и выше.
Damage.era (v1.02).
Исходник (MSVC++).
Для Era 1.9 и выше.
Damage.era (v1.02).
Исходник (MSVC++).
Возможности: (Click to View)
1. Новый триггер "перед ударом" (вызывается перед нанесением урона, один раз для каждого ближнего удара, визуально - во время срабатывания удачи).
2. Возможность в этом триггере получить информацию о том:
1) Какие стеки являются целями атаки;
2) Какой стек является основной целью атаки (тот, на который игрок нажал при направлении на атаку, на который будет наложено заклинание при атаке и который будет наносить ответный удар);
3) Какой стек является атакующим в данный момент.
3. Возможность в этом триггере изменить цели атаки (целей может быть любое количество, ими могут быть дружественные существа; вся анимация, вычисления, лог и прочее правильно работают для всех целей, триггер !?MF вызывается для каждой цели).
2. Возможность в этом триггере получить информацию о том:
1) Какие стеки являются целями атаки;
2) Какой стек является основной целью атаки (тот, на который игрок нажал при направлении на атаку, на который будет наложено заклинание при атаке и который будет наносить ответный удар);
3) Какой стек является атакующим в данный момент.
3. Возможность в этом триггере изменить цели атаки (целей может быть любое количество, ими могут быть дружественные существа; вся анимация, вычисления, лог и прочее правильно работают для всех целей, триггер !?MF вызывается для каждой цели).
Использование dll (Click to View)
Файл dll (с расширением "era") должен лежать в папке "EraPlugins".
Триггер "Перед ударом" - !?FU78001;.
Вы можете получить информацию об атаке в триггере "перед ударом" при помощи !!SN:X.
Передать изменённые цели можно тоже через !!SN:X.
Вы можете также передать основную цель и атакующего, но это ни на что не повлияет.
Основая цель и атакующий стек передаются в виде номера стека (0-41).
Цели атаки разделены на две переменные - в первой хранится информация о том, какие стеки среди атакующих являются целями, а во второй - какие из защищающихся.
Информация в этих переменных хранится побитно: в каждой из них 1-21 бит хранит информацию о том, будет ли атаковано соответствующий стек соответствующей стороны (1 - будет атакован, 0 - нет).
При получении информации о целях используется та же система.
Триггер "Перед ударом" - !?FU78001;.
Вы можете получить информацию об атаке в триггере "перед ударом" при помощи !!SN:X.
Code:
!!SN:X?v2/?v3/?v4/?v5;Теперь в v2 хранятся цели среди атакующих существ, в v3 - цели среди защищающихся, в v4 - номер основной цели, в v5 - номер атакующего стека.
Передать изменённые цели можно тоже через !!SN:X.
Code:
!!SN:Xv2/v3;Передача новых целей.
Основая цель и атакующий стек передаются в виде номера стека (0-41).
Цели атаки разделены на две переменные - в первой хранится информация о том, какие стеки среди атакующих являются целями, а во второй - какие из защищающихся.
Информация в этих переменных хранится побитно: в каждой из них 1-21 бит хранит информацию о том, будет ли атаковано соответствующий стек соответствующей стороны (1 - будет атакован, 0 - нет).
Code:
!!VRv1:S0;Для атакующего: нет атакованных.
!!VRv2:S6;Для защищающегося: 6 = 2 + 4 = 2^1 + 2^2 - 1-ый и 2-ой (считая с нуля) по номерам стеки.
!!SN:Xv1/v2;В результате будут атакованы стеки с номерами 22 и 23 (номера 1 и 2 у защищающегося).
При получении информации о целях используется та же система.
Что на самом деле происходит (в порядке выполнения): (Click to View)
1. Выполняется код нанесения удара, но модифицированный - вместо нанесения урона в эти моменты записываются цели которые должны получить урон.
2. Вызывается триггер "перед ударом", туда передаётся вся информация.
3. Если пользователь не изменил цели атаки, модификация отключается и повторно выполняется код удара (уже наносящий урон).
Иначе - включается модификация и выполняется модифицированный код удара:
1) Все проверки на флаг "бить всех вокруг" модифицируются так, что для любого удара выполняется код удара с флагом "бить всех вокруг".
2) Совершается цикл: для каждого номера стека проверяется по переменным целей, должен ли он быть атакован, если должен, ему наносится урон (без анимации), иначе - нет.
4. Дальше идёт неизменённый код - анимация, запись в лог и т. д.
2. Вызывается триггер "перед ударом", туда передаётся вся информация.
3. Если пользователь не изменил цели атаки, модификация отключается и повторно выполняется код удара (уже наносящий урон).
Иначе - включается модификация и выполняется модифицированный код удара:
1) Все проверки на флаг "бить всех вокруг" модифицируются так, что для любого удара выполняется код удара с флагом "бить всех вокруг".
2) Совершается цикл: для каждого номера стека проверяется по переменным целей, должен ли он быть атакован, если должен, ему наносится урон (без анимации), иначе - нет.
4. Дальше идёт неизменённый код - анимация, запись в лог и т. д.
Что происходит в некоторых в специфических случаях: (Click to View)
Можно атаковать самого себя, при этом не будет анимации получения урона и гибели. Может даже закончиться бой, а существо останется стоять.
Можно атаковать мёртвые и несуществующие стеки. Скорее всего, не случится ничего, но могут быть и неприятные последствия.
Если не выбрана ни одна цель (или все они мёртвые или несуществующие) удар будет нанесён "в воздух", а в логе будет написано "X нанасли 0 урона."
Можно атаковать мёртвые и несуществующие стеки. Скорее всего, не случится ничего, но могут быть и неприятные последствия.
Если не выбрана ни одна цель (или все они мёртвые или несуществующие) удар будет нанесён "в воздух", а в логе будет написано "X нанасли 0 урона."
Пример скрипта на основе dll (даёт пожарам свойство - при ударе атаковать сразу все стеки противника): (Click to View)
ZVSE
!?FU78001;Перед ударом существа (триггер Damage.dll)...
!!VRy-1:Sv2;Сохраняем значение глобальной переменной.
!!VRy-2:Sv3;Сохраняем значение глобальной переменной.
!!VRy-3:Sv4;Сохраняем значение глобальной переменной.
!!VRy-4:Sv5;Сохраняем значение глобальной переменной.
!!SN:X?v2/?v3/?v4/?v5;Считываем переданные параметры.
!!BMv5:T?y-5;Считываем тип существ действующего стека.
!!FU&y-5<>195:E;Если удар производят не пожары, выходим из триггера.
!!BMv5:I?y-6;Считываем номер стороны - хозяина пожаров.
!!VRy-7:S1-y-6;Вычисляем номер не ходящей стороны.
!!VRy-8:Sy-7*21;Вычисляем номер первого стека не ходящей стороны.
!!VRy-9:Sy-8+20;Вычисляем номер последнего стека не ходящей стороны.
!!VRy-10:S1;Устанавливаем переменную бита в 1 (первый бит).
!!VRy-7:+2;Вычисляем номер переменной целей для не ходящей стороны.
!!DO9499/y-8/y-9/1:P=y-10/?y-10/y-7;Запускаем цикл, проходящийся по всем стекам стороны и устанавливающий биты существующих из них в переменной целей в 1 (то есть делающий их целями атаки).
!!SN:Xv2/v3/v4/v5;Передаём переменные-параметры.
!!VRv5:Sy-4;Возвращаем значение глобальной переменной.
!!VRv4:Sy-3;Возвращаем значение глобальной переменной.
!!VRv3:Sy-2;Возвращаем значение глобальной переменной.
!!VRv2:Sy-1;Возвращаем значение глобальной переменной.
;Функции определения существующих целей.
!?FU9499;Функция проверки существования стека и установки его бита в переменной целей.
!!BMx16:N?y2;Считываем количество существ в текущем проверяемом стеке.
!!VRvx3&y2>0:|x1;Если в текущем проверяемом стеке есть существа, устанавливаем его бит в соответствующей переменной целей в 1.
!!VRx2:Sx1*2;Переходим к следующему биту (умножаем переменную бита на 2).
!?FU78001;Перед ударом существа (триггер Damage.dll)...
!!VRy-1:Sv2;Сохраняем значение глобальной переменной.
!!VRy-2:Sv3;Сохраняем значение глобальной переменной.
!!VRy-3:Sv4;Сохраняем значение глобальной переменной.
!!VRy-4:Sv5;Сохраняем значение глобальной переменной.
!!SN:X?v2/?v3/?v4/?v5;Считываем переданные параметры.
!!BMv5:T?y-5;Считываем тип существ действующего стека.
!!FU&y-5<>195:E;Если удар производят не пожары, выходим из триггера.
!!BMv5:I?y-6;Считываем номер стороны - хозяина пожаров.
!!VRy-7:S1-y-6;Вычисляем номер не ходящей стороны.
!!VRy-8:Sy-7*21;Вычисляем номер первого стека не ходящей стороны.
!!VRy-9:Sy-8+20;Вычисляем номер последнего стека не ходящей стороны.
!!VRy-10:S1;Устанавливаем переменную бита в 1 (первый бит).
!!VRy-7:+2;Вычисляем номер переменной целей для не ходящей стороны.
!!DO9499/y-8/y-9/1:P=y-10/?y-10/y-7;Запускаем цикл, проходящийся по всем стекам стороны и устанавливающий биты существующих из них в переменной целей в 1 (то есть делающий их целями атаки).
!!SN:Xv2/v3/v4/v5;Передаём переменные-параметры.
!!VRv5:Sy-4;Возвращаем значение глобальной переменной.
!!VRv4:Sy-3;Возвращаем значение глобальной переменной.
!!VRv3:Sy-2;Возвращаем значение глобальной переменной.
!!VRv2:Sy-1;Возвращаем значение глобальной переменной.
;Функции определения существующих целей.
!?FU9499;Функция проверки существования стека и установки его бита в переменной целей.
!!BMx16:N?y2;Считываем количество существ в текущем проверяемом стеке.
!!VRvx3&y2>0:|x1;Если в текущем проверяемом стеке есть существа, устанавливаем его бит в соответствующей переменной целей в 1.
!!VRx2:Sx1*2;Переходим к следующему биту (умножаем переменную бита на 2).