• Добро пожаловать, Гость. Войдите или зарегистрируйтесь.

Автор Тема: Programmable Spell Effects  (Прочитано 683 раз)

Описание:

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Programmable Spell Effects
« : 14 Декабрь, 2006, 15:38:46 »
0
Gwathlobal:  Programmable Spell Effects
http://cs.elderscrolls.com/constwiki/index...e_Spell_Effects

---------------------------

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

Вы спросите, зачем нужна эта статья? Разве нельзя использовать скриптовые заклинания?
Конечно, можно, но у них есть некоторые ограничения. Например, вы хотите сделать комбинацию из нижеследующего:
1) «Тихо» нанести повреждения NPC, то есть не видя никаких магических эффектов.
2) Сделать игрока невидимым так, чтобы не было видно руку, колдующую заклинание.
3) Какое-то заклинание считается враждебным, только стражник видит, как я его колдую.
4) Колдовать заклинание аля Morrowind, которое может не сработать, или нанести случайное кол-во повреждений оружием.
5) Колдовать заклинание, которое наносит огненное повреждение инеевым атронахам, а огненным атронахам наносит повреждение холодом.
6) Узнать, кто колдовал заклинание на меня или другого актера.
Теперь все это можно сделать! Нижеследующее основано на том, что заклинания-способности колдуются сразу же, как только добавляются в список заклинаний, а так же они не вызывают никаких визуальных изменений на колдующем или его цели. А необходимые визуальные эффекты вы можете добавить через PlayMagicShaderEffects или 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 Activate

; обнаруживаем цель
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 фрейма.)
Конечно, это хорошо, если вам надо, чтобы заклинание наложилось на всех актеров и исполнялось, только когда рядом игрок.
Награды За огромный вклад в развитие Румора

Теги:
 

Поиск

 
Top
SimplePortal 2.3.5 © 2008-2012, SimplePortal