ディスペルを唱えたか調べる(OBSE)

他者のディスペルなら OnMagicHitWith DSPL で調べられそうですが、術者自信に効果があるディスペルの場合はどうしたらいいんでしょうか?


ScriptName DispelCheck
ref caster
ref spell
short is_dspl
begin Function { caster spell }
  ;プレイヤーがディスペルを唱えたか調べたい場合、casterがplayer以外だったら処理をやめる
  ;特定のコンパニオンに対して調べたい場合は、そのコンパニオンのrefをチェックする
  if caster != player
    return
  endif
  let is_dspl := MagicItemHasEffect "DSPL" spell
  if is_dspl
    ;ディスペルを使った
  endif
end

ScriptName なんかてきとうなクエストスクリプト
begin GameMode
  if GetGameLoaded
    SetEventHandler "OnSpellCast" DispelCheck
  endif
end

spellに格納されるリファレンスは、MagicItemです。
なので、MagicItemHasEffectで magic effect の DSPL が含まれているかを調べれば、caster がディスペルを使ったのかが分かります。
ただ、これだけだと、プレイヤーが誰かに対して他者のディスペルを撃った時にも反応してしまいます。
プレイヤー自身に対して使ったディスペルに限定したい場合は、少し処理の仕方を変えないといけません。


ScriptName DispelCheck
ref caster
ref spell
short count
short range
int code
int dspl_code
begin Function { caster spell }
  if caster != player
    return
  endif
  let dspl_code := GetMagicEffectCode "DSPL"
  let count := GetMagicItemEffectCount spell
  while count > 0
    let count -= 1
    let code := GetNthEffectItemCode spell count
    if code == dspl_code
      let range := GetNthEffectItemRange spell count
      if range == 0
        ;Selfディスペルを使った
        break
      endif
    endif
  loop
end


結構、処理が増えました。

MagicItem は、複数の magic effect を持つことがあるので、ひとつひとつの magic effect に対して、それがディスペルなのか、そうでないのかをチェックしないといけません。
ディスペルだったら、その魔法の対象(range)が自分自身かどうかを調べます。

whileループを使っていますが、1回しかループしない場合がほとんどだと思うので、それほどの負荷にはならないはずです。
多くてもせいぜい数回のループで、MODで追加されたチート魔法なら10回以上になることがあるかも…くらいでしょう。
 
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。