気温と体温の概念を追加します。吐く息が白くなったり、死体に霜がついたりします。D1v1ne122さんの作品です。
追加される機能
- 気温、風速、体温が追加され、HUD上にWidgetで表示される。
- 水に入ると濡れる。どのくらい濡れているかはHUD上に表示される。
- 火の近くにいると身体が温まり、体温が上昇する。水に濡れていたのが乾く。
- 天候、時間、場所などで気温が変化し、寒いと体温の低下が早まる。
- 防寒具を着ることで体温の低下を遅らせることができる。
- 体温が低下すると様々なデバフが発生する。
- 死体に霜のエフェクトがつく。
- 吐く息が白くなる。
- 寒いと飲み物が凍って飲めなくなる。温かい場所では解凍されて元にもどる。クラフトで即座に解凍も可能。
確認した不具合
MCMでMod全体のオン、オフと、食料凍結のオン、オフを設定できるようになっていますが、Mod全体をオンにしたあとから食料凍結をオンにしても反映されないようです。Mod全体がオフの状態で食料凍結をオンにしておき、Mod全体をオンにします。
修正した不具合
この手のModとしては唯一無二であり、堪能していたのですが、不具合がいくつか確認できたので、自分で改造してみました。
NPCにスクリプトをCloakスペルで配布している
SPID化することで負荷を減らせます。
ただし、SPIDの欠点として、死んでいるActorにはスペルを配布できないようです。すでに死んでいるActorがロードされると霜が付かないので、死体を検知するQuestを用意するなどの対応が必要になってきます。
NPCの処理が重い
NPCの処理として、周囲の熱源を検索して気温を確認し、エフェクトを再生させています。
この処理の稼働が最適化されておらず、状況によっては重複してFPSに影響してきます。
- NPCのエリア移動時(OnLocationChange)
- プレイヤーのエリア移動時(OnLocationChange)
- 天候が変化した時
- 5秒おき
特に致命的なのがOnLocationChangeで、ActorがLocationの境界線上を移動するとOnLocationChangeイベントが発火するのですが、NPCとプレイヤーの両方を見ています。プレイヤーはヒットアンドアウェイで前後左右に移動することがありますが、境界線上でこれをやってしまうとOnLocationChangeイベントが連続して発火しまくるため、あっというまに高負荷になります。
対策としては、他にもOnCombatStateChangeイベントなどにも言えることなのですが、イベントの発火で即座に処理を開始するのではなく、しばらく様子を見るようにします。OnLocationChangeイベントではCancelTimerで予約を解除した上で、あらためてStartTimerで5秒後に予約を行います。OnTimerイベントで本来やるべき処理を実行することで、処理の重複がなくなります。
それでなくとも、5秒間隔で処理を繰り返しているので、OnLocationChangeはみなくていいのではと思うのですが。
飲料の凍結、解凍の処理
ユニークで面白いと思うのですが、処理が愚直すぎてやりすぎな感じがしました。更新を追っていくと、作者は徹底した管理を求めているように感じました。
飲料を入手した時、フィールド上に捨てた時、コンテナ間を移動させた時、調理中の例外処理、などなど、とにかく凍結を徹底して発生させるように実装されています。
ここはバッサリと削って、OnTimerGameTimeを使い、ゲーム内時間で30分起きに、プレイヤーの所持品を精査して凍結、解凍する処理に書き換えました。クラフト中に凍結してしまう問題は、クラフト画面を開いたらCancelTimerGameTimeで予約を解除し、クラフト画面を抜けたら改めてStartTimerGameTimeで30分後に予約すればいいです。
こだわりすぎると処理が複雑化して重くなり不具合も起こりやすくなります。ゲームとして楽しいかは別なので、妥協することも大切だと思います。
あとModで追加される飲料品はサポートされていないので、飲料品一覧を管理しているFormListに追加する必要があります。凍結した飲料を解凍するレシピも合わせて追加します。
雪で気温が下がらない
Modで雪を追加しても気温がそれほど下がりません。天候Modにもよるのですが、内部的には雨の天気を雪に置き換えているので、本Modでは雨と見なされるようです。
本Modには天候を管理するためのFormListが用意されており、パッチを作ってここにWeatherを入れていく必要があるようです。パッチを作らない場合は自動認識となって大雑把にパラメータが決定されるようです。ですが、かなりザルなのと、雪はパッチが必須です。本ModにはVivid Weathers用のパッチが用意されていますので、パッチの作り方の参考になると思います。
まずはWinter_Weather_WeatherIDというFormListにWeatherを追加します。ここに足さないWeatherは認識されません。
次に気温を決めるWinter_Weather_TempClass_xxxというFormListがいくつかありますので、どれかに追加します。名前を見れば温度がわかります。
さらに風速を決めるWinter_Weather_Wind_xxxというFormListにも入れます。入れないと無風になるようです。
雪の場合はWinter_Weather_Shader_SnowFXSというFormListに入れると小雪という扱いとなり、Actorの身体の表面に霜のエフェクトが表示されるようになります。
Winter_Weather_Shader_HeavySnowFXSというFormListもあって、こちらは大雪なのでエフェクトが派手になるようです。ちなみにNanakochanでこれを使うと顔が壊れますので、小雪だけにしておくのがよさそうです。
Mod防具の防寒度がおかしい
本Modは防具のスペックを見て防寒性能をある程度は自動で決定してくれます。これで満足できればいいのですが、防寒のためにある防寒具の防寒性能が低すぎ、物理ダメージ耐性やRAD耐性の高い防具ほど防寒性能も高くなる傾向があるため、強い防具を着ていればそれでいいという状況になってしまいます。
本Modに用意されている防寒度を示すキーワードを防具に付与するといいです。耐性を見ている部分はコードを書き換えて廃止しました。
体温が下がらない
ある程度の防寒性能を得てしまうと、体温がまったく下がらなくなります。このあたりはバージョンアップで調整されているようですが、バランスを追いきれていないので、正しいのかどうか不明です。
とはいえ、防寒具さえ着ていれば体温を無視できてしまうというのは、遊んでいて楽しくありません。
というわけでThermodynamics.pscを読んで思いっきり書き換えてみました。本Modはソースコードがついておらず、Champollion FO4で逆コンパイルする必要があります。Champollion FO4が吐くコードは中途半端なのでいくつか補正しないとコンパイルできないのと、コードのファイル数も多いので大変です。
軒下判定が機能していない
処理はNuclearWinter:Gear:DetectInteriors.pscになります。
検知方法はSkyrimのWet and Coldと同じで、2つのObject Referenceを用意してSpellを放ち、ヒットするかどうかをみています。
まず、片方はバニラのマーカーなのでいいのですが、もう片方が存在しないメッシュのファイル名をしているため、これだとMoveTo関数が帰ってきません。よって判定ができていません。
幸い、Object ReferenceをDeleteするとMoveTo関数が失敗に終わって処理が戻ってくるため、スクリプトのインスタンスが永久に残り続けることはないです。
メッシュのファイル名はmeshes\NuclearWinter\LOSBox.nifと設定されているので、バニラの適当なstaticのmeshesをコピーしてalphaを0にして透明化するなどすればいいです。
常に判定していて無駄なので、屋外で雨が降っているときだけ検査するようにするとパフォーマンスを改善できます。
追加した機能
息をRunning Breathingと連動させる
Running Breathingにてスタミナの概念を追加したので、スタミナを参照するようにしました。
息の処理は以下になります。
source\scripts\NuclearWinter\World\BreathEffect.psc