Jump to content
  • Новые материалы

  • Программируемые эффекты заклинаний


    Ed_MSL

    Вы спросите, зачем нужна эта статья? Разве нельзя использовать скриптовые заклинания?Конечно можно, но у них есть некоторые ограничения. Например, вы хотите сделать комбинацию из нижеследующего:

    • «Тихо» нанести повреждения 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).


    User Feedback

    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 account

    Sign in

    Already have an account? Sign in here.

    Sign In Now

×
×
  • Create New...