Leveled Listを併用したNPCのTemplate参照のやり方次第で、確定CTDを引き起こすNPCがスポーンするようなので、ちょっとメモっておきます。
復帰してまだひと月程度なので、既出の話だったら生暖かくスルーしてください('_')
ほぼバニラに近いプロファイルでも発生してるので、共通問題の可能性が高いと思いますが、もし再現しなかったらすいません。
SE1.5.97環境です。
NPCの生成構造について
リスポンするような、非ユニーク系NPCがメインになります。
この辺は過去記事ありますので、よかったらどうぞ。
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の参照フローを確認。
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経由に変更。
追加したLeveled Listの中身は、000EA0A2
のみ。これで実質的には同じ筈。
以下のような構造になります。以下、同様にコンソールから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がスポーンする)。
今回はFlags設定は正常なので、別件ですね。
唐突ですが、FoxRaceの修正をします。FoxってNPC個別ではちゃんと”SkinFox”がWornArmor指定されてるんですが、Raceでは何故か”SkinWolf”が指定されてます。これをSkinFoxに修正。
・・・で、それが今何の関係あんのよ!?
ごもっともな意見ですが、この状態でさっきのセーブデータをロードすると・・・あら不思議。
きつねです、キツネ。まぎれもないFox。
動作確認済のNPCの間にLeveled List挟んだだけなので、TemplateでUse Traitが未チェックでFoxRaceになってる、なんてことはありませぬ。”Whiterun Guard”だけど狐。
さて、このキツネですが・・・
異常データの為か、True Directional Movementのロックオンが機能しません。
それどころか・・・
叩いた瞬間に確定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します。
Frostmere Cryptから逃走するEisa Blackthornが殴ってCTDしたり、付近に何かMarkerがあるのか、ちょっと移動しただけでCTDしたりと、放置しておくと結構大変な狐様です。
地図で見ると、この辺り。
Fox化する可能性のあるNPCは、
Base ID : xx924550 aaaEPRandomBOSSOutsideSnow
Frostmere Crypt付近を含めて22か所に配置されてます。
プレイヤのレベルにもよりますが、発生確率は低めと思われます。正常スポーンする候補の方が圧倒的に多い為。
1つ注意。このLeveled Listには”Snow Fox”が入っており、正常な手順でこれがスポーンすることもあります。CTDリスクになるのは見た目がただのFoxの方です。
※FoxRaceの修正をしないと、CTDする方は透明のままです。
該当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つのボスキャラはそのままで大丈夫。
山賊さんが居なくなりましたが、みんな元気にやってます(〃▽〃)
xxC9108Dの山賊も直接セル配置されてますが、こちらは問題無いです。Leveled List経由のTemplate参照を2回実行することが問題な為(xx91002A
のLeveled Listに組み込まれてることがマズい)。
こっちもこっちで元気に山賊(ノ´∀`*)
対策2.スポーン済の該当NPCの対処
参照元Tmplateを変更すると、通常は配置済のNPCにも反映されますが、今回は参照元を削除している為、そのまま放置という訳にはいかないです。
既にスポーン済の場合は、Ref IDをpridでタゲって(例えばprid xxAE78F5)kill、またはrecycleactorで大丈夫じゃないかと思います。コンソールからのkillではCTDしないのを確認済。
もしそれでもダメならInitially Disabledで隔離等でも。
画像用意してから気づきましたが、Initially Disabledだと存在自体は残るので、これする位ならDeleted付けた方が良いかもです。
あくまで見つけた範囲ということなので、CTD要因になるにはまだ他の条件もあるかもしれません。例えば種族によっては多重参照してもOK、とか。
長くなりましたが、このあたりでおしまいです!