Menuとは
このゲームのHUDはAdobeのflashで実装されているのですが、基本的にHUDは出したら出っぱなしになるようです。そこに、状況に応じて出したり引っ込めたりする処理が実装されているようです。
UIはMenuという扱いになっています。HUDもMenuの中のひとつです。どのようなMenuがあるかはRegisterForMenuOpenCloseEventで確認できます。
Modが独自のメニューを追加することもできます。UIを追加するModのほとんどは独自のswfファイルを持っており、独自のメニューとしてゲームエンジンに登録するようです。
HUDMenuというMenuがあります。これが普段表示されているHUDになります。Pipboyを開くとPipboyMenuが表示されるのですが、HUDMenuを閉じてPipboyMenuを開き、PipboyMenuを閉じてHUDMenuを開くという動作になっているようです。
例えばHUD上にゲーム内時刻を表示するHoloTime – HUD Clock WidgetというModがあります。HUDMenuが消えるとこのWidgetも消えます。他のModが独自のメニューを追加している場合もきちんと消えてくれます。おそらくこのWidgetはHUDMenuの中に組み込まれているか、あるいはHUDMenuの表示、非表示に連動するように実装されているのだと思われます。
DEF_SSW Survival Stats widget redoneというサバイバルモードの要求値をHUD上に表示するModがあります。こちらはバニラのMenuの開閉時には消えてくれるのですが、Modで追加されたMenuの場合は残ってしまいます。HUDMenuとは連動しておらず、バニラの他のMenuだけを見ているのだと思われます。
あるModがMenuを表示している間にMenuを消す
Menuを消す方法は2つあります。
ひとつはMenuを追加しているModが自分自身で制御する方法です。こちらはModがPapyrusベースだと簡単ですが、DLLベースだと難しくなります。
もうひとつはMenuを追加しているModが他のMenuを制御する方法です。こちらの実装を解説します。
DEF_SSW Survival Stats widget redone
以下のコードでできました。
; 閉じる
if UI.IsMenuRegistered("SSW_Menu")
UI.CloseMenu(SSWMenuName)
endif
; 開く
if UI.IsMenuRegistered("SSW_Menu")
UI.OpenMenu(SSWMenuName)
endif
表示内容がリセットされてしまわないか心配でしたが、どうやら問題ないようです。
Condition Boy – Now with Condition Girl
DEF_SSWの方法ではダメでした。
; 閉じる
if UI.IsMenuRegistered("BingleBodyPartsUI")
Var[] args = new Var[1]
args[0] = false
UI.Invoke("BingleBodyPartsUI", "root1.CharacterManager.SetVisible", args)
endif
; 開く
if UI.IsMenuRegistered("BingleBodyPartsUI")
Var[] args = new Var[1]
args[0] = true
UI.Invoke("BingleBodyPartsUI", "root1.CharacterManager.SetVisible", args)
endif
ConditionBoyMCM.pscにヒントがあります。