Fallout箱庭DIY

「箱庭DIY」Fallout分室

【Fallout4】スクリプト式Leveled Listの構造とプラグイン式への改造手順

スポンサーリンク


Leveled List
Fallout4において、武器や防具MOD等によるLeveled List追加は、スクリプト形式が多いです。User的にはプラグイン形式に比べて使い勝手が良いんですが、環境整備の観点からはデメリットも少なくないです。
まずはスクリプト形式の利点と欠点を確認し、その後にプラグイン形式への書換えを試します。

Desert Eagle - Standalone Handgunを例に。強力なハンドガンとして有名な、デザートイーグルを追加するMODです。レイダーやガンナーが所持するようになり、レジェンダリ装備が落ちることもあります。店売りにも追加されます。
※以下、銃単体は片仮名で『デザートイーグル』、MOD自体を表す時は英字で『Desert Eagle』と表記しています。

デザートイーグル

スクリプト形式によるLeveled Listのメリット

一番かつ唯一の利点は、Leveled Listの競合が起こらないことです。プラグイン形式のようにLeveled Listをまるごと上書きせず、必要なアイテムのみを既存のLeveled Listに追加できます
だから競合しようが無いんです、なかなかに便利。

Desert Eagleのプラグイン。赤枠内のQuestで、Leveled Listにデザートイーグルを追加するスクリプトを走らせます。もう1は、フラッシュライトモジュールのコントロール用ですね。
LeveledListのInjection


Raider Overhaul WIP環境に入れました。双方ともLLI_Raider_Weapons_BossのLeveled Listを変更します。Raider Overhaulはプラグイン方式ですが、Desert Eagleはスクリプト方式な為、Raider Overhaulの変更を阻害しません。
スクリプトによるLLインジェクション
Raider Overhaulにより、LV90超えのRaider Veteranは時々ミニガンを持ちます。これを壊すことなく、時々デザートイーグルを持つ固体(LV30以上)も出現します。


スクリプト形式によるLeveled Listのデメリット

いいことずくめに見えるスクリプト形式ですが、問題点も多いです。
※Desert Eagleのスクリプトに問題があるのでなく、スクリプト形式の共通問題です。

Leveled Listにデザートイーグルを追加するスクリプト、MyWeaponLLInjector.pscからの抜粋。

Event OnQuestInit()
	LLI_Gunner_SemiAuto.AddForm(MyWeapon as Form, 15, 1)
	LLI_Gunner_SemiAuto_Boss.AddForm(MyWeapon as Form, 15, 1)
	LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1)
	LGND_PossibleLegendaryItemBaseLists_GunGroupLow.AddForm(MyWeapon as Form, 10, 1)
	LGND_PossibleLegendaryItemBaseLists_GunGroupHigh.AddForm(MyWeapon as Form, 10, 1)
	LGND_PossibleLegendaryItemBaseLists_SpecialGuns.AddForm(MyWeapon as Form, 10, 1)
	LL_Vendor_Weapon_GunSpecialty.AddForm(MyWeapon as Form, 1, 1)
	LL_Vendor_Weapon_GunGeneralStore.AddForm(MyWeapon as Form, 10, 1)
EndEvent

※pexファイルがDEagleLLInjector.pexなので、厳密には正しいソースファイルでは無いようです。後述しますが、差分はデザートイーグルのプロパティ名だけなので、構造的には同一とみなして問題無いです。


さて、もし導入した後になってから、


やっぱレイダーにはデザートイーグルを持たせたくない!


と思ったら、どうしましょう?

ソースから、以下の一行を削除すればOKに見えるかもですが・・・

LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1)

これ、うまくいきません


このスクリプトを動かすQuestですが、インストール後のゲーム開始時に1度動くだけです。初回起動時だけ走って、デザートイーグルを既存のLeveled Listにinjection(追加)します。この追加はセーブデータ依存となり、以降は何も機能しないです。
つまり、スクリプトを後から書換えても手遅れなんですね。
1度だけ稼動するスクリプト
まあ、そうでないとLeveled Listがデザートイーグルだらけになってしまいますし!

要するに、

  • Leveled Listの削除
  • 対象NPC、レベル、所持数の変更

導入後に、こうしたLeveled Listの改変作業ができません。セーブデータ依存な為、プラグインからはどうにもならないです。Questを削除しても、30日待機しても、レイダーからデザートイーグルは無くなりません。

管理面も面倒で、Leveled Listにスクリプト追加があまりに増えすぎると・・・何がどのNPCにどう持たされるやら、訳わからなくなっちゃいますね。

『競合無く手軽に導入できる』という利点の代償として、とにかくメンテナンス性が悪いです。恐らくプラグイン方式だと、競合対策せずに大騒ぎするUserが出てくるので、Modderがこっちの手段を取ってるんでしょうね・・・。ぶっちゃけUserの連帯責任。

最近離れてるので今のトレンドは知らないですが、Skyrimではスクリプト方式のLeveled Listが嫌われる傾向でした(”スクリプト”と聞いただけで拒絶反応起こす人も多かったと思いますがw)。

Wrye BashでLeveled List用互換パッチの自動作成(Bashed Patch)が一般的だったかと。Fallout4もWrye Bashあると思いますが、どうなんでしょう。僕はマニュアルでLeveled List統合してるので・・・。


Leveled Listをプラグイン方式に変更

一方のプラグイン方式。競合対策が必須なので、パッチ作れない人が運用するのは厳しいです(ロードオーダー下位の追加が潰れる)。反面シンプルな構造をしており、Leveled Listの事後改変や削除はいつでも可能です(勿論リスポン後の反映になります)。

更に、元からLeveled Listにパッチを当てて使ってる人から見れば、スクリプト形式を混ぜて使うことに何のメリットもありません。面倒が増えるだけなので、むしろプラグイン形式で統一した方が楽になります。

そこでソースを元にして、スクリプト形式のLeveled Listをプラグイン形式に作り変えることにします。

※スクリプトが走る前のセーブデータで実施しないと意味無いです

必要なLeveled Listの確認

再度MyWeaponLLInjector.pscからの抜粋。8個のLeveled Listにデザートイーグルを追加してます。大きく分けて4タイプ。

ガンナー用。

	LLI_Gunner_SemiAuto.AddForm(MyWeapon as Form, 15, 1)
	LLI_Gunner_SemiAuto_Boss.AddForm(MyWeapon as Form, 15, 1)


レイダー(上位)用。

	LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1)


レジェンダリ仕様。

	LGND_PossibleLegendaryItemBaseLists_GunGroupLow.AddForm(MyWeapon as Form, 10, 1)
	LGND_PossibleLegendaryItemBaseLists_GunGroupHigh.AddForm(MyWeapon as Form, 10, 1)
	LGND_PossibleLegendaryItemBaseLists_SpecialGuns.AddForm(MyWeapon as Form, 10, 1)


店売り。

	LL_Vendor_Weapon_GunSpecialty.AddForm(MyWeapon as Form, 1, 1)
	LL_Vendor_Weapon_GunGeneralStore.AddForm(MyWeapon as Form, 10, 1)

これら8個をプラグインに落とします。

スクリプトとプラグインとの接続確認

スクリプト上のプロパティと、プラグイン上のオブジェクトとの対応を調べます。QuestのVMAD-Virtual Machine Adapterから判ります。
SSはレイダー用Leveled List。
プロパティとオブジェクトの対応
スクリプトの『LLI_Raider_Weapons_Boss』が、プラグインの『LLI_Raider_Weapons_Boss』に対応してます。このMODではプロパティ名がEditor IDと同じ名前なので、判り易いですね。他のMODもそうとは限らないです。

※前述のソースとバイナリの差分について。
Leveled Listのプロパティ同様に、武器(デザートイーグル)のプロパティも確認すると・・・
propertyとオブジェクトのリンク
ソースでは『MyWeapon』ですが、バイナリでは『DEagle』になっており、VMADのPropertyNameも同様です。
pexから開いた方は、このあとのおまけで載せてます(Leveled Listの中身は同じ)。


プラグインにLeveled Listを追加

プラグイン上のEditor IDが判ったので、8個のLeveled Listをプラグインに落とします。
LeveledListの変換
Fallout4.esmからCopy as override intoしてから作ればOKです。スクリプトInjection用のQuest(xx0017E8)の削除も忘れずに。SSは削除済の状態です。

あとは、各Leveled List内にデザートイーグルを追加していきます。レイダー用のを例に。

LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1)

書式は、

AddForm(追加アイテム, レベル, 員数)

なので、それをプラグインに記述。
LeveledListの追加
他の7個にも、同様に追加。

競合対策

ここではRaider OverhaulのLeveled Listと競合するので、共存できるように統合します。直接書いちゃってますが、互換パッチ作った方が良いと思います。
LeveledListの競合対策
同じく、他の7個も統合したら、作業完了。


あとはスクリプト版と同じ動作をします。レジェンダリ仕様のも時々落っこちます!
レジェンダリ仕様のデザートイーグル

所持対象やレベル等を変更したくなったら、プラグインからいつでも変更OKです。変更後のスポーンorリスポンから適用されます。


(おまけ)ソースファイルが無かったら?

PexInspectorで直接pexファイルを覗いて、injection状況を調べるという手も。Leveled List追加のスクリプトは構造が単純なので、ほぼソース通りに見られると思います。
pexファイルからの構造確認
pexから見ると、プロパティ名が『DEagle』なのがわかります(右窓2行目)。



以上、おしまいです!

 

Copyright © 2015 Fallout Hakoniwa DIY All rights reserved .

S.kutsumiya@gmail.com