子供が無敵の壁役を演じるのをどうにかする

Modを作ろう

スカイリムには子供がいますが、彼らは最強のInvulnerable属性持ちなので、一切の攻撃を受け付けません。Essentialよりも上位の属性で、攻撃エフェクトも発生しませんし、Actor Valueが一切変化しません […]

スカイリムには子供がいますが、彼らは最強のInvulnerable属性持ちなので、一切の攻撃を受け付けません。Essentialよりも上位の属性で、攻撃エフェクトも発生しませんし、Actor Valueが一切変化しません。子供に対する暴力は表現的に問題があるのでこのようになっているのだと思います。

さて、村に敵が攻めてきて、応戦した大人が全滅すると、敵は子供を追いかけまわすことになります。子供は無敵なので死なず、最強の壁役として働いてくれます。表現としてはともかく、ゲームバランスとしてはまずいと感じるので、これをなんとかしてみます。

まず、安易にInvulnerable属性を取り除くのはナンセンスです。要は壁役にならなければいいのです。敵が子供を無視してくれるのがベストなのですが、それにはFactionをいじることになります。この方法はModで追加された敵にも適用されるのか不安が残ります。そこで、攻撃を受けたら消えるようにしてみます。Invulnerable属性は攻撃を受け付けませんが、OnHitイベントは発火するので、これで攻撃されたことを認識できます。

以下のコードを持たせたアビリティを用意します。アビリティはスペルの一種です。

子供が攻撃されたらテレポート (papyrus)

Scriptname mychildrenEffectScript Extends ActiveMagicEffect

Bool OnHitBusy


Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akP, bool abPA, bool abSA, bool abBA, bool abHB)
    if OnHitBusy
        return
    endif

    OnHitBusy = true

    if akAggressor
        Actor kActor = akAggressor as Actor

        if kActor
            Actor kSelf = GetTargetActor()

            if kSelf
                if kActor.IsHostileToActor(kSelf)
                    kSelf.MoveToMyEditorLocation()
                endif
            endif
        endif
    endif

    Utility.Wait(0.5)
    OnHitBusy = false
EndEvent

子供にこのアビリティを持たせるには、Raceレコードがいいです。子供はNordRaceChildのような名前のRaceになっていますので、バニラの子供であればひと通り網羅できそうです。

CKを起動したらSkyrim.esmを読み込んで、まずMagic EffectとSpellを新規作成してアビリティを用意します。次にRaceレコードを絞り込んでバニラ4種の子供用Raceに持たせます。注意するのは、子供用RaceはPlayableフラグがオフなので編集が保存されません。ダイアログを開いたらPlayableフラグを一時的にオンにしてからアビリティを持たせて、一度ダイアログを閉じます。もう一度開いて、Playableフラグをオフにしてダイアログを閉じます。

テストプレイの結果は良好です。子供のEditor Locationは大抵彼らの自宅なので、自動的に自宅にテレポート退避するという形になります。

RS ChildrenはRaceレコードを編集していますので競合します。すぐにわかるのは顔がおかしくなります。SSEEditでパッチを作るか、今回作成したESPにRS Childrenの変更点をマージすればOKです。

タイトルとURLをコピーしました