Вы спросите, зачем нужна эта статья? Разве нельзя использовать скриптовые заклинания?Конечно можно, но у них есть некоторые ограничения. Например, вы хотите сделать комбинацию из нижеследующего:
- «Тихо» нанести повреждения NPC, то есть не видя никаких магических эффектов.
- Сделать игрока невидимым так, чтобы не было видно руку, колдующую заклинание.
- Какое-то заклинание считается враждебным, только стражник видит, как я его колдую.
- Колдовать заклинание аля Morrowind, которое может не сработать, или нанести случайное кол-во повреждений оружием.
- Колдовать заклинание, которое наносит огненное повреждение инеевым атронахам, а огненным атронахам наносит повреждение холодом.
- Узнать, кто колдовал заклинание на меня или на другого актера.
Теперь все это можно сделать! Нижеследующее основано на том, что заклинания-способности колдуются сразу же, как только добавляются в список заклинаний, а также они не вызывают никаких визуальных изменений на колдующем или его цели. А необходимые визуальные эффекты вы можете добавить через PlayMagicShaderEffect или PlayMagicVisualEffects и т.д.
Вот простейший пример, как создать простейшее «тихое» заклинание, наносящее 10 ед. повреждений мгновенно на избранную цель.
- Шаг 1 – создайте заклинание типа Способность, скажем "SilentDm10" с эффектом: "Понижение здоровья 10" и скриптовым эффектом: "StopSilentDm10" .
- Шаг 2 – создайте следующей скрипт для магических эффектов "StopSilentDm10" :
scn StopSilectDm10 short doOnce Begin ScriptEffectUpdate if doOnce Dispel SilentDm10 endif set doOnce to 1 End Begin ScriptEffectFinish RemoveSpell SilentDm10 End
- Шаг 3 – используйте это заклинание в каком либо другом скрипте:
; target – ссылка на актера (или игрока) target.AddSpell SilentDm10
Примечание: добавление способности игроку вызовет появление сообщения, и заклинание не будет «тихим». Поэтому я бы изменил имя заклинания на что-нибудь более подходящее, например, "Отравление" . Вы не увидите больше одного сообщения "Добавлено Отравление" , если у всех ваших заклинаний-способностей будет одно имя.
Настоящие программируемые заклинания более полезны. По сути, они являются комбинацией внутриигровых функций и нескольких обычных заклинаний.
Вот простой пример. Он позволяет вам нанести цели случайные повреждения от X до X+Y:
scn WildDamageSpell ; это внутриигровая функция на объекте 'FIGWildDamageSpell' ref target short baseDamage short wildDamage short isPlayerHostile short dam Begin OnActivate ; обнаруживаем цель set target to GetActionRef if target.IsActor == 0 || target.GetDead == 1 Return endif ; считаем кол-во повреждений set dam to baseDamage+wildDamage*0.01*GetRandomPercent ; если заклинание враждебное – простая проверка, только для игрока if dam > 0 && isPlayerHostile > 0 if target.IsGuard == 0 target.Startcombat player endif SendTrespassAlarm player player.ModCrimeGold 35 endif ; добавляем какой-нибудь нетипичный графический эффект (не обязательно!) if dam > 0 target.PME DTCT 1 endif ; наносит повреждения – здесь они ограничены от 0 до 31 ; dam <= 0 ничего не делает, dam > 31 дает 31 if dam >= 16 target.AddSpell SilentDm16 ; тот же SilentDm10, что и в предыдущем пример, но дает 16 повреждений set dam to (dam)-16 endif if dam >= 8 target.AddSpell SilentDm08 ; дает 8 повреждений, и так далее... set dam to (dam)-8 endif if dam >= 4 target.AddSpell SilentDm04 set dam to (dam)-4 endif if dam >= 2 target.AddSpell SilentDm02 set dam to (dam)-2 endif if dam >= 1 target.AddSpell SilentDm01 endif End
Чтобы колдовать это заклинание:
; target – ссылка на актера, предполагается, что заклинание колдует игрок set FIGWildDamageSpell.baseDamage to 10 set FIGWildDamageSpell.wildDamage to 20 set FIGWildDamageSpell.isPlayerHostile to 1 FIGWildDamageSpell.Activate target 1
Продвинутые эффекты:
Здесь все ограничено вашей смекалкой и воображением. Вот несколько вещей, которое можно сделать:
1) Заклинания-таймеры: Поскольку внутриигровые функции могут использовать блок GameMode, небольшая модификация скрипта позволит запускать его каждую секунду (или каждый кадр) в течение любого времени.
2) Эффекты для касания/цели/области: Поскольку внутри игровые функции могут вызываться где угодно, можно создать обычное заклинание с нужным набором целей, а потом в скриптовом эффекте вызывать нужную функцию на целях.
3) Заклинания с центром на игроке: Можно использовать заклинания, кастующиеся с активатора на игрока, а использование внутриигровых функцию дает вам полный контроль над ними.
4) Отслеживание колдующего: Добавьте ref-переменную в скрипт функции под названием 'caster' и устанавливайте ее перед вызовом функции. (можно также задать переменные для целей.)
5) Симулирование сопротивления, цены заклинания: Все это можно запрограммировать с помощью условий!
6) NPC колдуют заклинания: Заставить актера X немедленно колдовать заклинание на цель Y просто. Заставить его колдовать, когда это бы сделал RAI, может быть потруднее. Можно попробовать самому симулировать AI (AAI), с помощью постоянного заклинания.
Постоянные заклинания:
Самое смешное, что заклинания-способности не годятся для наложения постоянных эффектов – даже для игрока! Дело в том, что при смене ячейки заклинание удаляется и накладывается снова, то есть все переменные в скриптовом эффекте сбрасываются.
Конечно, для игрока не все так страшно, поскольку для него можно использовать глобальные переменные в блоке ScriptEffectUpdate. Еще хуже то, что добавление способности добавляет ее всем актерам этого типа в игре. (Вот почему в примере заклинание удаляется после 1 фрейма.)
Конечно, это хорошо, если вам надо, чтобы заклинание наложилось на всех актеров и исполнялось, только когда рядом игрок.
Данная статья взята с неработающего ныне сайта tiarum wiki. Статья является переводом данной статьи http://cs.elderscrolls.com/index.php?title=Programmable_Spell_Effects за авторством GuidoBot. Переводчик Gwathlobal (OSFM team).
Recommended Comments
There are no comments to display.
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now