飲食するためだけに、毎度Pip-boyを開くのが面倒です。そんなズボラさんに便利なのが、こちら『Fallout 4 Wheel Menu』。
www.nexusmods.com
ホットキー1発起動で使い勝手良好。なんですが、ゲームパッドだと『十字キー下』のみの割付になってます。僕の環境だと、セーブアイテムやベルチ呼び出しで頻繁に『十字キー下』を使う為、ちょっと勝手が悪いんですよね。
そこで、『Aボタン(箱コン)の長押し』に変更することにします。
※毎度のことですが自己責任で改造してください。それから元の作者に無断で公開するようなことの無いようお願いします。
Wheel Menuのスクリプト変更
スクリプトは1つだけ。Questカテゴリ内、”WheelMenu(0x000F99
)”に括られてます。ありがたいことにソースファイルが同梱されてますので、”WheelMenuWidget.psc”を改造します。
ゲームパッドにはF4SEの関数を使うので、F4SEのソースファイルの用意を忘れずに。
やることは、
- Key bindを”十字キー下”から”Aボタン”に変更
- キー入力判定トリガを、”押し込み”から”長押し後のリリース”に変更
の2点が必須。MCMからの長押し時間調整機能も付けますが、これは無くてもOK。
Key bindの変更
まずは、十字キーからAボタンに割付を変更します。WheelMenuWidget.pscの310行目あたりから見ます。青字”QuickkeyDown”で、”十字キー下”の登録と解除をしてます。
Function RegisterForCustomEvents(Actor player)
; RegisterForRemoteEvent(player, "onItemEquipped")
RegisterForRemoteEvent(player, "onItemAdded")
RegisterForRemoteEvent(player, "onItemRemoved")
RegisterForRemoteEvent(player, "onDeath")
; Todo: investigate possibility of applying only to specific keywords only
AddInventoryEventFilter(none)
; RegisterForKey(71); g
RegisterForExternalEvent("WheelMenuInit", "onMenuInit")
RegisterForExternalEvent("WheelMenuSelect", "onMenuSelect")
RegisterForExternalEvent("WheelMenuClose", "OnMenuClose")
if (GamepadControlEnabled)
RegisterForControl("QuickkeyDown")
Else
UnregisterForControl("QuickkeyDown")
EndIf
EndFunction
これを、”Aボタン”である”Active”に変更。
if (GamepadControlEnabled)
RegisterForControl("Activate")
Else
UnregisterForControl("Activate")
EndIf
EndFunction
ボタン入力を『長押し』に変更
このままだと、NPCや家具をアクティベートする度にWheel Menuが起動してしまいます。さすがに厳しいので、長押しして離した時のみの起動に変更します。
今度は367行目あたりをチェック。
”OnControlDown”で、ボタンの押し込み判定をしてますね。”QuickkeyDown(十字キー下)”とは、Downの意味が異なるので注意。
Event OnControlDown(string asControlName)
If (asControlName == "QuickkeyDown")
ToggleMenu()
Endif
EndEvent
これを、以下のように変更しました。
”OnControlUp”は、長押し中のボタンを離した時をトリガにします。2番目の引数である”fTime”には、長押し時間(float)が格納されます。
Event OnControlUp(string asControlName , float fTime)
If (asControlName == "Activate" && fTime >= fTimeThres)
ToggleMenu()
Endif
EndEvent
次の行のif文に書いた”fTimeThres”は、Wheel Menu起動に必要な『長押し時間設定(秒)』として使います。
つまり、
『押したボタンがAボタン』かつ『”fTimeThres”秒以上の長押し』
をした時のみ、Wheel Menuが起動します。
『長押し時間設定』のproperty宣言を追加
”fTimeThres”の宣言をまだしてないので、冒頭にProperty宣言を追加。初期値は0.5にしておきました。
以上でソースファイルの書換え完了。
int Property SlowTimeMode = 0 Auto
int Property SlowTimeMagnitude = 0 Auto
int Property MenuOffsetX = 0 Auto
int Property MenuOffsetY = 0 Auto
float Property MenuScaling = 1.0 Auto
bool Property GamepadControlEnabled = true Auto
float Property fTimeThres =0.5 Auto
String WheelMenuName = "F4WheelMenu" const
スクリプトをコンパイルしてProperty接続を確認
コンパイルが成功して、Property”fTimeThres”が正しく初期値で接続されてればOK。
これで終了にしても問題無いです。Aボタン長押しでWheel Menuが起動する筈です。
この後、MCMから”fTimeThres”を調整できるようにしますが、MCMを使わずにEdit Valueで直接書き換えても、好きな長押し時間に変更できます。再コンパイルは不要なので、後から書き換える時は、FO4Edit使った方が楽かも。
MCMに『長押し時間』の調整項目を追加
『長押し時間』を、ゲーム内で調整可能にします。その方がフィーリング的に合わせやすいかな、と。MCMの出番です。Wheel Menuは元からMCM対応MODなので、作業は簡単。
Data\MCM\Config\WheelMenu\config.jsonを変更します。”Gamepad”セクションの中に、長押し時間調整項目(橙の所)を追加しました。
”slider”で0から3まで、刻み幅0.1。”text”と”help”は、なんとなくそれっぽくw
{
"type": "section",
"text": "Gamepad"
},
{"type": "switcher",
"text": "Bind menu to D-Pad down",
"help": "Enables menu binding for gamepads (D-Pad down). Requires save or game reload to take the effect",
"valueOptions": {
"sourceType": "PropertyValueBool",
"sourceForm": "WheelMenu.esp|F99",
"propertyName": "GamepadControlEnabled"
}
},
{
"type": "slider",
"text": "A-button holding down",
"help": "The amount of time the button is held down in seconds.",
"valueOptions": {
"min": 0,
"max": 3,
"step": 0.1,
"sourceType": "PropertyValueFloat",
"sourceForm": "WheelMenu.esp|F99",
"propertyName": "fTimeThres"
}
}
]
}
書換え対象のPropertyは、ソースで記述した通りfloat型の”fTimeThres”。この閾値と実際に長押しされた時間の比較で、Wheel Menuの起動可否を判断します。
ゲーム上では、こんな感じ。ぶっちゃけ個人的には0.5のままでよかったかも(汗)
OFF/ON設定名称が”D-Pad down”のままなのが、微妙に気になりますぬ・・・あとでA-buttonに書き換えることにします。
物持ち上げる時に不便そうだったら、もう少し時間延ばすか、あるいは”QuickkeyDown” の長押しでもいけるかも?(試してないですけども)。
以上、おしまいです!