07
2016  18:00:00

スクリプトを使う回復魔法 その2


前回に続いて、Avoid Deathについての記事になります。スクリプトに関してですが、Modを作ってみたいと言う考えから、プログラムのど素人が必死こいて調べた結果なので、暖かく見守ってください。

Creation Kit Logo 001


おさらい


"Avoid Perk - 死の回避"は、"Restoration - 回復魔法"のSkill 90 で習得することが出来るPerkです。


効果

  1. ゲーム内の1日に1回

  2. 体力が10%以下になった時

  3. 体力を250回復する

と言うものです。Creation Kit上では、3番の体力を250回復すると言うことは出来るのですが、1番と2番の設定が出来ません。そこでスクリプトで設定する必要があります。


PerkAvoidDeathScript


前回Creation Kit上の画像を上げましたが、分かりにくいのでブログ用に修正しました。こちらが、スクリプトの内容になります。

Scriptname PerkAvoidDeathScript extends ActiveMagicEffect

; ; Properties --------------------

Spell Property HealSpell Auto

GlobalVariable Property PerkAvoidDeathTimer Auto

GlobalVariable Property GameDaysPassed Auto

float Property PercentHealth = 100.0 Auto

SPELL Property HealCast Auto

; ; Event ----------------------------

; ready to heal you

Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked )

; ;  debug.trace(self + " Enter Bleedout");
  
  If PerkAvoidDeathTimer.GetValue() < GameDaysPassed.GetValue()
     
    ; cast heal spell
     
    PercentHealth = GetTargetActor().GetAVPercentage("Health")
     
    If PercentHealth < 0.1
         
         HealSpell.Cast(GetTargetActor())
         
         PerkAvoidDeathTimer.SetValue(GameDaysPassed.GetValue() + 1.0)

; ;  debug.trace(self + " Heal "+ PerkAvoidDeathTimer.GetValue() + " " + GameDaysPassed.GetValue())
     
    EndIf
  
  Else
; ;  debug.trace(self + " Timer not reset " + PerkAvoidDeathTimer.GetValue() + " " + GameDaysPassed.GetValue())
  
  EndIf

endEvent



自分で調べた時、こうやりましたと言う程度です。まずは、Propertyの説明からです。その後、Propertyを使って条件文( IF 文)を使用して、一日一回かどうかを検査し、次に体力が10%未満かどうか調べて、2つの条件に合致するなら体力を250回復するSpellを使用することになります。


Property



スクリプトで使用する各数値が何なのか設定する必要がありますので、事前に設定しておきます。

PerkAvoidDeath 001-1 MagicEffect PerkAvoidDeath Script Properties


Spell Property HealSpell Auto

これは、"HealSpell"は、"PerkAvoidDeathHealSpell"と言うSPELL(体力を250回復する)を指定しています。スクリプト上で指定するのではなく、Creation Kitで指定するんですね。スクリプトだけを見ても分からない種類になります。スクリプト上では、"PerkAvoidDeathHealSpell"を使用する時に使われます。最後のAutoはFlagですが、勝手に追加されると思います。

PerkAvoidDeath02 002-1 Property SPELL PerkAvoidDeathHealSpell


GlobalVariable Property PerkAvoidDeathTimer Auto

これは、"PerkAvoidDeathTimer"は、ゲーム内のGlobalValueの"PerkAvoidDeathTimer"を使用すると言う設定です。こちらもCreation Kit上で設定しています。スクリプト上では死の回避をどれだけ前に使ったかを記録するために使われます。画像を見ると、"PerkAvoidDeathTimer"の数値は"0.0000"と設定されています。

PerkAvoidDeath02 000-1 Property Global PerkAvoidDeathTimer


GlobalVariable Property GameDaysPassed Auto

これも、上と同種で、"GameDaysPassed"を、ゲーム内のGlobalValueの"GameDaysPassed"を使用すると言う設定です。同じようにCreation Kitで設定されています。スクリプト上では、上の"PerkAvoidDeathTimer"と比較することで、一日一回の設定に使用されます。"GameDaysPassed"は、ゲームの処理で時々刻々増えていきます。

PerkAvoidDeath02 001-1 Property Global GameDaysPassed


float Property PercentHealth = 100.0 Auto

"PercentHealth"はfloat - 小数で、最初は100.0に設定する、と言うことです。スクリプト上では、"PercentHealth"を、MagicEffect の "PerkAvoidDeath"の所有者の"Health - 体力"が何%あるか調べる時に使っています。ただ、Percentは、基本的に"100%"であれば"1.00"にしておけば良いのですが、なぜか100になっています。良くわかりませんが、問題ありません。


SPELL Property HealCast Auto

設定されていますが、使われていません。Creation KitでPropertyを削除すると言うことが出来ないので残ったのかなと思いますが、こちらも良くわかりません。


Event OnHit()

  • Creation Kit: Category:Events

  • Creation Kit: OnHit - ObjectReference


  • OnHit() は、Weapon - 武器、Spell - 魔法、Explosion - 爆発、Ingredient - 素材、Potion - ポーション、Enchantment - エンチャント、Projectile - 射出物が、対象者(今回は、MagicEffect の "PerkAvoidDeath"の所有者)に当たった時、スクリプトの以下の部分を実行しろ、と言うものです。

    また、実際に使う場合は、Creation Kit WikiにExample - 用例がありますので、そこからコピーアンドペーストすると間違いがないと思います。(ちなみに、ベセスダは間違えてた。何故だろか。おまけ参照のこと。)

    akAggressorは、対象者を攻撃してきたもの。akSourceは、対象者に当たったもの。akProjectileは、対象者に当たった射出物、と言うことになります。


    1回目のIF


    一回目の条件は、一日一回かどうかと言うことです。使うものは、IF文と言うものです。

    Wikipedia: if文

    ここでは、If PerkAvoidDeathTimer.GetValue() < GameDaysPassed.GetValue() と言う条件文で、数値の比較が行われています。それぞれの数値を取得する関数がGetValue()です。


    GetValue()

    Creation Kit: GetValue
    Global Objectの数値の情報を取得すると言うものです。"PerkAvoidDeathTimer.GetValue()"で、"PerkAvoidDeathTimer"の数値がいくつなのか調べます。同じように、"GameDaysPassed.GetValue()"で、"GameDaysPassed"の数値がいくつなのか調べます。

    それぞれの数値は具体的に設定されています。上で書いた通り、"PerkAvoidDeathTimer"の数値は"0.0000"です。また、”GameDaysPassed"はゲームで遊んでいれば増えていく数値です。そのため、一番最初であれば"GameDaysPassed"の方が必ず大きくなりますので、この条件文は成立します。2回目以降であれば、条件を満たさないので、先に進めなくなります。


    次の条件文のための準備


    次に、体力が10%未満かどうかを条件文に使いますが、その前に体力が何%あるか調べます。


    GetTargetActor


    MagicEffectの適用されたActorが誰であるかを調べます。今回は、"PerkAvoidDeath"の所有者です。次に、このActorのHealthが何%か調べます。


    GetAVPercentage


    対象としているActorの数値を、%(百分率)として調べるものです。今回は、GetAVPercentage("Health") となっていますから、調べたい数値は、"Health"の%だと言うことになります。

    上の関数と一緒に使うことで、PercentHealth (最初は100)と言うPropertyに、"GetTargetActor().GetAVPercentage("Health")" で、"Magic Effectを所有しているActorのHealthの%の数字"がわかりました。


    2回目のIF


    2回目の条件文で、体力が10%未満かどうか調べます。これは簡単に、"PercentHealth < 0.1"となっています。この条件が満たされている時に、次に体力を250回復し、更に、連続して起こらないように"PerkAvoidDeathTimer"の数値を変更します。


    Cast()


    この関数は、魔法のID.Cast(使用者, 使用の対象) と言うものです。魔法のIDは、"HealSpell"、つまりCreation Kitで指定した"PerkAvoidDeathHealSpell"です。使用者は、Perkの所有者です。使用される対象は、通常は"None"と設定されています。今回何も指示していないので"None"で、Perkの所有者です。

    つまり、ここで、体力を250回復する、"PerkAvoidDeathHealSpell"がPerkの所有者に使用されました。


    SetValue()


    SetValue()は、GlobalValueを変更する関数です。変更される対象は、"PerkAvoidDeathTaimer"です。変更後の数値は、"GameDaysPassed.GetValue() + 1.00"、つまり、"GameDaysPassed.GetValue()"に、1足した数値です。一日後と言う意味です。

    ここで、"PerkAvoidDeathTaimer"は明日の数値になりましたので、"GameDaysPassed"と数値を比較した場合、1回目の条件が満たせません。この結果、効果の発動が一日一回として設定されたことになります。


    リンク




    今回使った、Event OnHit() を使用しているので、非常に参考になりました。


    おまけ



    "Function" OnHit()

    BSAファイル(たぶん古い方)にあるスクリプトと、後から追加された"Scripts.rar"(新しい方)の両方を見ましたが、スカイリムが発売されてからしばらく、死の回避は機能していなかったと思います。古い方のBSAファイルのスクリプトを見ると、OnHitが、"Function OnHit()"になっていました。しかし、OnHit()は、"Event OnHit()"でなければなりません。下の画像は、ChampollionでDecodeした後SublimeText2で見たものです。

    PerkAvoidDeath02 003-1 Function OnHit


    RestoreAV

    HealSpell.Cast() を使わずに、GetTargetActor().RestoreAV("Health", 250) の方が良いんじゃないのと思ったんだけど、これでうまく行ったりしないですかね。これだと250って数字が見えにくくなりますが。

    Creation Kit: RestoreActorValue - Actor


    おわり



    感想)
    まあ、記事の質やら中身は別として、一回はスクリプトについて書いて見たかったのです。


    スポンサーサイト



     NPCの設定

0 Comments

Leave a comment