Fallout 2287 – Gas Masks of the Wasteland

Mod紹介

ガスマスクをつけていないと放射能ダメージを受けるようになります。D1v1ne122さんの作品です。

Nexusで見る

FROSTとの相性について

FROST – Gas Masks of the Wasteland Patchを使います。

本Modに付属のパッチは一切使ってはいけません。

ガスマスクの配布をSPID化

FROSTパッチを導入している場合は不要です。

NPCにガスマスクを持たせているGas Mask NPC.espはNPCレコードを書き換えているため競合しやすくなっています。

この手の変更はSPIDに置き換えることで、競合の心配がなくなり、Modで追加されたNPCにも適用されるので、非常に効果的です。

結構細かく分かれているのですが面倒なので、レイダー、ガンナー、その他の人間としました。

; GasMask_NPC_Raider_RandomGeneral
; RaiderFaction
Item = 0x26A7~Gas Masks of the Wasteland.esp|NONE|0x1CBED

; GasMask_NPC_Military_RandomGeneral
; GunnerFaction
Item = 0x26A8~Gas Masks of the Wasteland.esp|NONE|0x58303

; GasMask_NPC_Settler_RandomGeneral
; ActorTypeNPC
Item = 0x26A6~Gas Masks of the Wasteland.esp|ActorTypeNPC

後述するスペルにて、ガスマスクを持っていないことが検知されると、その場でガスマスクを配布しているようです。ですので無理にSPIDでガスマスクを配布しなくてもよさそうです。

スペルの配布をSPID化

GasMask_NPCというクエストで配布しているため、クエストごと削除するのが楽です。

あるいはこのクエストからスクリプトを取り除きます。Start Game Enabledのフラグを外してもスクリプトは実行されるのでダメです。とはいえ動いても無駄なだけなので、いずれにせよStart Game Enabledのフラグは外します。

NPCに持たせるスペルはGasMask_NPC_CloakEquipになります。

; GasMask_NPC_CloakEquip
; ActorTypeNPC
Spell = 0x6389~Gas Masks of the Wasteland.esp|ActorTypeNPC

すでに動かしてしまっている場合はプレイヤーにCloakスペルが付与されていますので、取り除く必要があります。コンソールだと以下になります。

player.removespell GasMask_NPC_Cloak

Nanakochanに対応させる

スペルの条件に種族で対象を決めている部分がいくつかあります。そのため、HumanでもGhoulでもないNanakochanは処理の対象外になってしまいます。

HumanRaceのところにNanaRaceとNana2Raceを追加すればよいでしょう。

屋外の放射能ダメージについて

とても複雑になっています。

まずバニラですが、天気にスペルを付けることが可能になっています。この天気の間はこのスペルの効果を受け続ける、という感じです。輝きの海は専用の天気が用意されており、放射能ダメージを受けるスペルが設定されています。ですので輝きの海に行くと放射能ダメージを受けるわけです。

次にFROSTですが、すべての天気にスペルを設定することで、どこにいても放射能ダメージを受けるようになっています。スペルの発動条件に「ガスマスクをつけていない」があるため、ガスマスクをつければ放射能ダメージを防ぐことができるわけです。

このFROSTの実装は、Modで天気が追加された場合、それらにもスペルを設定しないと放射能ダメージが消えてしまいます。これがデメリットです。

そしてFROST Official Updateです。天気からスペルを削除しています。そのかわりに放射能ダメージを与えるスペルをプレイヤーに付与しています。天気に関係なく放射能ダメージが発生するようになります。

GMOWは独自の放射能ダメージの仕組みを実装しています。FROST GMOWパッチはFROST Official Updateの放射能ダメージスペルを無効にします。

まとめると、屋外の放射能ダメージはGMOWによってのみ管理されるようになる、ということです。

ダメージ量の調整

Metro:World:Radiationで管理されています。

CalcRadiation関数で目標のRAD値を決めて、段階的に近づけていくようになっています。

天気で目標値を決めています。

int Property InMultiplierA = 7 Auto
int Property InMultiplierB = 17 Auto
int Property InMultiplierC = 29 Auto
int Property InMultiplierD = 61 Auto

上から晴れ、曇り、雨、雪なのですが、雪が非常に高く設定されています。私の環境では17 RADでした。FROSTに雪Modをいれて、いつも雪が降っているようにすると、バランス的におかしいので、下げたほうがいいでしょう。

このプロパティはConstでないので、初回起動時にセーブデータに保存されてしまうため、後からの変更はスクリプトからでないとできません。Constをつければ再コンパイルで適用されるようになります。

int Property InMultiplierA = 1 Auto Const	; WeatherClassPleasant
int Property InMultiplierB = 2 Auto Const	; WeatherClassCloudy
int Property InMultiplierC = 5 Auto Const	; WeatherClassRainy
int Property InMultiplierD = 5 Auto Const	; WeatherClassSnow

競合について

まず確認の方法について、FO4Editで全プラグインを読み込み、Gas Masks of the Wasteland.espを右クリックしてApply Filter to show Conflicts (selected files only)を選びます。

CellがDLCと競合しているのがわかります。とはいえPreVIS Files Timestampだけなのですが、気持ち悪いのでDLCCoast.esmと合わせました。

HUDがおかしい

HUDの表示が、本来はパーセントや文字が表示されるべき部分がすべてVALUEになります。

どうやらFrost Sanity HUD Indicator HudFramework VersionのWidgetが読み込まれていると問題が発生するようです。

このMod、HudFramework、Frost Sanity HUD Indicatorのソースコードをそれぞれ確認しましたが、問題は見当たらず、よくわかりませんでした。

Frost Sanity HUD Indicatorをアンイストールすると問題なく動作しました。ゲーム起動時にFrost Sanity HUD IndicatorのWidgetを読み込むタイミングを遅らせてみたところ、どちらも正常に動くようです。

しかし、ガスマスクを外すとGas MaskのHUDが消えますが、Widgetそのものをアンロードしているようで、ガスマスクを再び装着しても、その後はFrost Sanity HUD Indicatorの状態に関係なく問題が発生するようになります。

swfで何かが競合しているように思えるのですが、詳しいことはわかりませんでした。

対処療法として、Gas MaskのHUDはゲーム起動時にWidgetを読み込ませたらそのままとし、透明度(Opacity)を0%にすることで擬似的に非表示にしました。これで常に正常動作するようになりました。

このModはWidgetをHudFrameworkにRegisterする際に、LoadNowとAutoLoadを無効にしてRegisterしているため、次回のゲームロード時はWidgetが表示されません。ガスマスクを脱着して初めてWidgetをロードするようなので、これだとVALUEが発生してしまいます。

処理が重い

同じ作者のFallout 2287 - Nuclear Winterにも言えることですが、ガチガチのオブジェクト指向プログラミングで書かれており、最適化が不足しているので、スクリプトの実行時間が長いです。

以下にいくつか例をあげます。

ガスマスクを装着しているかどうかの判定

OnItemEquipped/OnItemUnequippedイベントを使っています。このイベントからかなり重めの処理を愚直に開始しています。スクリプトによる一斉脱衣系処理であったり、単にPipboyを開いてガスマスクを付けて外す、ということをしただけでも、この重たい処理が複数平行して動きます。OnItemEquipped/OnItemUnequippedイベントを受け取ったらすぐに処理を開始するのではなく、StartTimerを使ってクッションを挟むようにすると、処理を並行稼働させずに済みます。

ガスマスクであるかどうかを判定するために、このModは内部でガスマスクデータベースを構築して照会するということをしています。それよりも、ガスマスクにキーワードを設定しておき、WornHasKeyword関数で検査するほうが遥かに軽くなります。

屋内で放射能ダメージを受けるかどうかの判定

屋内だが天井が抜けているため屋外扱いしている場所があります。

実装は、放射能汚染されたバレルに近づいたり、ファー・ハーバーで霧に入ると放射能ダメージを受けますが、それらと同じです。

Hazardというレコードがあり、これがCellに配置されています。HazardにはSpellを設定できて、Hazard内にいるActorにSpellの効果が発動するという仕組みです。このSpellはConcentrateタイプなので、秒間5~6回のヒット判定があります。放射能ダメージが発生するだけならゲームエンジン内で処理が完結するため、特に問題ありません。

本Modはこれにスクリプトを付与して放射能ダメージチェックを行っています。このチェックがかなり重く、Concentrateタイプの仕様として秒間5~6回のヒット判定、つまりスクリプトが毎秒5~6回という高頻度でOnEffectStart/OnEffectFinishイベントを繰り返しているため、FPSに大きな影響がでます。

まず、HazardのSpellにスクリプト付与するのを止めます。プレイヤーがHazardの影響下にあるかどうかを判定するアビリティのSpellを別途用意して持たせておきます。Hazard内に侵入すると効果が発動するという仕組みです。アビリティなので詠唱タイプはConstant Effectになります。こちらにスクリプトを付与します。これですとHazard内に侵入した際にOnEffectStartイベント、離脱した際にOnEffectFinishイベントが発火するため、無駄にイベントが繰り返されることはありません。

Hazardの影響下にあるかどうかをSpellのConditionを用いて検査することになりますので、判定処理はゲームエンジンでのみ行われます。

不具合が多い

風呂敷を広げすぎたままほったらかしにしたかのようなコードなので、とにかく不具合が多いという印象です。

ゲーム内でMCMからModを無効にして再度有効にすると、初期設定がModの初期値に戻されてしまいます。自分でMCMで設定した内容は無視されるようです。MCM自体が後付けなので作者が異なるのですが、知らないと困ることになります。

Visual Effectを無効にしていても、無効・有効をすると、MCMでは無効の表示なのに、実際には有効になっているようで、攻撃を受けると画面に血が張り付いてしまいます。これがどうやっても消せず、結局Modをアンインストールしてセーブデータのクリーニングを行い、再度インストールしてようやく消せました。自分用にModを書き換えて、Visual Effectに関連した部分はすべて削除して動かないようにしました。

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