Skyrim箱庭DIY

MODによる固有の環境不具合は自分で直して快適ゲーム。CTDにさようなら。Do It Yourself!!

【SkyrimSE】確定CTDを引き起こすNPC構造の再現実験



スポンサーリンク

お食事中

Leveled Listを併用したNPCのTemplate参照のやり方次第で、確定CTDを引き起こすNPCがスポーンするようなので、ちょっとメモっておきます。

復帰してまだひと月程度なので、既出の話だったら生暖かくスルーしてください('_')

ほぼバニラに近いプロファイルでも発生してるので、共通問題の可能性が高いと思いますが、もし再現しなかったらすいません。

SE1.5.97環境です。

NPCの生成構造について

リスポンするような、非ユニーク系NPCがメインになります。

この辺は過去記事ありますので、よかったらどうぞ。

skmod.hatenablog.com

Whiterun衛兵をコンソール生成しました。正常に見えます。

”placeatme D2ACC”でスポーンさせたのですが、More Informative Consoleで確認すると、違うBase IDが見えてますね(後述)。

通常スポーンの衛兵

さて、この衛兵がスポーンするまでには、いくつかの道のりがあります。ちょっと簡単に説明しておきます。

以下のような流れで、直下のNPCをTemplate参照しながら生成されていきます。

 

000D2ACC:NPC(コンソール入力)
    000EA0A2:NPC
        0001FC62:NPC(Leveled List参照)
            000E7B2C:Leveled List
                000AA8D7:NPC(Leveled Listから選択)
                    000F6F37:NPC
                        0001FC5D:NPC

 

000D2ACCの衛兵は、000EA0A2の衛兵から、AI PackageとKeyword以外の全てを、Templateとして引き継ぎます。要するに使いまわしですね。下のNPCを雛形に、ちょっとずつ改変されていきます。

000EA0A2はWhiterun衛兵の雛形なので、所属や容姿、インベントリ等以外のパラメータを、0001FC62から引き継ぎます。下に行くほどだんだん各衛兵の個性が無くなり、最後はみんな帝国兵になります。極力共通化することで、生産性を高めてるのかと(多分)。

こんな感じでTemplate参照を繰り返しながら、最終形態の衛兵が生まれる訳です。

Templateの参照方法は、雛形NPCを直接指定する以外に、Leveled List経由で参照することもあります。まあこれが今回のお話のキモだったり。

 

ちなみにこの000D2ACCの衛兵は、Ref ID:0003706AとしてWhiterun内で使われている、動作実績のある衛兵です。

 

そんな訳で改めて、Tmplateの参照フローを確認。

衛兵return

000D2ACC:NPC(コンソール入力)
    000EA0A2:NPC
        0001FC62:NPC(Leveled List参照)
            000E7B2C:Leveled List
                000AA8D7:NPC(Leveled Listから選択)
                    000F6F37:NPC
                        0001FC5D:NPC

この衛兵は、1度だけLeveled List経由でTemplateを参照します。他は直接指定ですね。このLeveled Listから選択された000AA8D7が、Base IDとして見えてるようです。LEでMfg Consoleの時もこういう見え方したのかな?とも思いますが、どうだろう。

ちなみに000AA8D7を直接スポーンさせると、帝国兵になります。

 

確定CTDを起こす異常生成NPC

さて、このTmplate参照フローに、ちょっとしたイタズラもとい追加を試します。

最初の000D2ACCから000EA0A2の参照を、直接指定からLeveled List経由に変更。

LeveledListを追加

 

追加したLeveled Listの中身は、000EA0A2のみ。これで実質的には同じ筈。

追加したLeveledListのレコード

 

以下のような構造になります。以下、同様にコンソールから000D2ACCをスポーンさせます。

 

000D2ACC:NPC(Leveled List参照)
    FExxx801:Leveled List
        000EA0A2:NPC(Leveled Listから選択)
            0001FC62:NPC(Leveled List参照)
                000E7B2C:Leveled List
                    xxxxxxxx:NPC(Leveled Listから選択)
                        000F6F37:NPC
                            0001FC5D:NPC

 

000E7B2CのLeveled Listから、何が選ばれるかは神のみぞ知る(000AA8D7だけに書き換えてもいいけど、一応他に手加えたくなかった)。

 

これで000D2ACCをスポーンさせると・・・

怪しい気配

おや、何も湧かないですね・・・。しかし周囲に妙な気配が。謎のコリジョンがうごめいてます。ここで一旦セーブして、ゲームを落とします

LEのときも、こんなことがありましたぬ。あれは多分CKバグだと思いますが(Use Trait未設定でFoxRaceになってる為、変なNPCがスポーンする)。

skmod.hatenablog.com

今回はFlags設定は正常なので、別件ですね。

 

唐突ですが、FoxRaceの修正をします。FoxってNPC個別ではちゃんと”SkinFox”がWornArmor指定されてるんですが、Raceでは何故か”SkinWolf”が指定されてます。これをSkinFoxに修正。

狐の修復

 

・・・で、それが今何の関係あんのよ!?

 

ごもっともな意見ですが、この状態でさっきのセーブデータをロードすると・・・あら不思議。

狐祭り

 

きつねです、キツネ。まぎれもないFox。

動作確認済のNPCの間にLeveled List挟んだだけなので、TemplateでUse Traitが未チェックでFoxRaceになってる、なんてことはありませぬ。”Whiterun Guard”だけど狐。

異常スポーンした衛兵

 

さて、このキツネですが・・・

異常データの為か、True Directional Movementのロックオンが機能しません。

確定CTDを引き起こすEvent

それどころか・・・

 

叩いた瞬間に確定CTDします(w)

 

いや笑いごとじゃないですぬ。すいません。

戦闘AIを停止(tai)しておくとCTDしないのですが、再び有効化した途端にCTDします。恐ろしや狐の祟り。FoxRaceの変更をせず、透明状態のまま叩いてもCTDします

 

異常生成が起こる原因を調査

さて、何が原因で狐の祟りが起きるのか?

色々試しましたが、あまり羅列しても見づらいので簡単に。既に答え書いてるようなものですし('_')

 

検証0.バニラのTemplate参照フロー

最初のおさらいです。NPCを直接指定した参照が多いです。0001FC62のNPCだけ、次に参照するTemplateにLeveled Listを使っています。

 

000D2ACC:NPC
    000EA0A2:NPC
        0001FC62:NPC(Leveled List参照)
            000E7B2C:Leveled List
                000AA8D7:NPC(Leveled Listから選択)
                    000F6F37:NPC
                        0001FC5D:NPC

 

勿論これは、動作OK。

 

検証1.Leveled Listの層数を増やす

0001FC62のNPCから、Leveled Listを3連続で通して(Leveled ListからLeveled Listを指定する)Template対象を選択します。最後にNPCを指定。

 

000D2ACC:NPC
    000EA0A2:NPC
        0001FC62:NPC(Leveled List参照)
            000E7B2C:Leveled List
                FExxx801:Leveled List
                    FExxx802:Leveled List
                        000AA8D7:NPC(Leveled Listから選択)
                            000F6F37:NPC
                                0001FC5D:NPC

 

これも問題無し。このスタイルのLeveled Listは多いでしょうし、妥当な結果。

 

検証2.Leveled ListでのTemplate参照を2回実行する

狐衛兵のやつまんまです(汗)

これが他と違うところは表題の通り、一連のフローでLeveled List経由のTemplate参照を2回実行していること

 

000D2ACC:NPC(Leveled List参照)
    FExxx801:Leveled List
        000EA0A2:NPC(Leveled Listから選択)
            0001FC62:NPC(Leveled List参照)
                000E7B2C:Leveled List
                    xxxxxxxx:NPC(Leveled Listから選択)
                        000F6F37:NPC
                            0001FC5D:NPC

 

この構造がアウトみたいですね。Leveled List自体が多層なのは問題無くても、Leveled List経由のTemplate用NPC参照が多層化するのはダメぽいと見えます。

こういうスタイルのLeveled Listは、あまり見ないと思いますが、大規模な敵追加系MODだと有るかもしれません。実際、Enemy Plusに合致するLeveled Listを発見しまして、狐が発生しておりました。

というか、Enemy Plusで見つけたので検証を始めましたw

 

Enemy Plusにおける確定CTD要因

まずEnemy Plusのお話を少々。バニラのLeveled Listに手を加えない敵追加系MODです。特筆すべきはMODのデザインの完成度で、単に敵を増やすだけでなく、エリアごとにストーリー性のある配置になっています。敵追加だけでここまでストーリーを感じさせる作りなのは、もうお見事としか言う他無い(〃▽〃)

中ボス格の強め(序盤のガシャドクロとか必死に逃げたw)の敵がちょいちょい配置されているのですが、広域かつ低確率なので、たまに遭遇しては激戦が楽しめますw。

その為だと思いますが、強ボスと雑魚敵、さらには野生動物までもが一緒になったLeveled Listがありまして、そこで上記のFox化現象が起こる構造があるようです。

 

Enemy Plusでの異常生成NPC

Frostmere Crypt付近で発見。名前からおかしくなってますね。やはり叩くと確定CTDします

EnemyPlusのFox化

Frostmere Cryptから逃走するEisa Blackthornが殴ってCTDしたり、付近に何かMarkerがあるのか、ちょっと移動しただけでCTDしたりと、放置しておくと結構大変な狐様です。

 

地図で見ると、この辺り。

CTD狐発生個所

Fox化する可能性のあるNPCは、

Base ID : xx924550 aaaEPRandomBOSSOutsideSnow

Frostmere Crypt付近を含めて22か所に配置されてます。

プレイヤのレベルにもよりますが、発生確率は低めと思われます。正常スポーンする候補の方が圧倒的に多い為。

 

1つ注意。このLeveled Listには”Snow Fox”が入っており、正常な手順でこれがスポーンすることもあります。CTDリスクになるのは見た目がただのFoxの方です

※FoxRaceの修正をしないと、CTDする方は透明のままです。

正常Foxと異常Fox

 

該当NPCの参照構造を確認

Frostmere Crypt付近に配置されたキャラから、たどっていきます。

xxAE78F5:NPC(Ref ID、Frostmete Crypt付近)
    xx924550:NPC(Base ID、Leveled List参照)
        xx92454E:Leveled List
            xx91002A:Leveled List
                xxC9108D:NPC(Leveled Listから選択、Leveled List参照)
                    xxC91088:Leveled List
                        xxxxxxxx:NPC(Leveled Listから選択)

 

前述の衛兵実験と同じですね。

xx91002AのLeveled Listから、xxC9108DのNPCを引き当ててしまうとFoxコース。

Leveled List経由のTemplate参照が2回実行される為、同様にFox化したと思われます。

ボスに混ざるバグ狐

xx924550を20体スポーンさせた所、問題の狐が1体発生。

 

Enemy PlusのCTDを回避する暫定対策案

とりあえず見つけた範囲の暫定対策ということで。

対策1.Leveled Listの修正

2回目のLeveled List経由のTemplate参照は山賊のみ(人、犬、Riekling)なので、これをxx91002AのLeveled Listから外します。他の3つのボスキャラはそのままで大丈夫。

異常スポーン要因になるLLの削除

 

山賊さんが居なくなりましたが、みんな元気にやってます(〃▽〃)

ボス祭り

 

xxC9108Dの山賊も直接セル配置されてますが、こちらは問題無いです。Leveled List経由のTemplate参照を2回実行することが問題な為(xx91002AのLeveled Listに組み込まれてることがマズい)。

元気に盗賊

こっちもこっちで元気に山賊(ノ´∀`*)

 

対策2.スポーン済の該当NPCの対処

参照元Tmplateを変更すると、通常は配置済のNPCにも反映されますが、今回は参照元を削除している為、そのまま放置という訳にはいかないです。

既にスポーン済の場合は、Ref IDをpridでタゲって(例えばprid xxAE78F5)kill、またはrecycleactorで大丈夫じゃないかと思います。コンソールからのkillではCTDしないのを確認済。

もしそれでもダメならInitially Disabledで隔離等でも。

異常スポーン要因となるNPCをセルから削除

画像用意してから気づきましたが、Initially Disabledだと存在自体は残るので、これする位ならDeleted付けた方が良いかもです。

 

あくまで見つけた範囲ということなので、CTD要因になるにはまだ他の条件もあるかもしれません。例えば種族によっては多重参照してもOK、とか。

長くなりましたが、このあたりでおしまいです!