スクリプトからswfにアクセスして情報を取得することでできることが広がります。
必要な情報元
- JPEXS Free Flash Decompiler
- Adobe® Flash® Platform 用 ActionScript® 3.0 リファレンスガイド
- HUDMenu Display List.txt
現在の装填数を取得する
PapyrusのUIクラスを使うと、swfからデータを取得できます。
装填数はHUDにあるので、HUDMenu.swfから読み取ります。
int iClipCount = UI.Get("HUDMenu", "root1.RightMeters_mc.AmmoCount_mc.ClipCount_tf.text") as int
第2引数のパスの探し方です。
まずはHUDMenu.swfを取り出します。まずはバニラのba2から取ったほうがよいでしょう。FallUIやDEF_UIのものは改変されているので、つまづく可能性があります。
HUDMenu.swfをJPEXS Free Flash Decompilerで開きます。
scriptsのところに色々なクラスが並んでいます。おそらくはファイル名と同じ名前のクラスがrootになるのだと思われます。そこから辿っていきます。
HUDMenu Display List.txtには、このパスの一覧が網羅されているので便利です。こちらから探す方が早いでしょう。
プロパティですが、ソースコードを読んだり、Adobeのリファレンスを読んだり、他のModの実例から探り当てます。今回はAmmoUIのソースコードを読んで判明しました。
他にもenabled(常にtrueを返す?)やvisible(表示されているときにtrueになる模様)も取得できました。
Pip-boyのライトを点けているかどうかを取得する
root1.RightMeters_mc.FlashLightWidget_mcのvisibleで取れるようです。
bool bVisible = UI.Get("HUDMenu", "root1.RightMeters_mc.FlashLightWidget_mc.visible") as bool
どうもライトに関する処理はゲームエンジンにハードコーディングされているようで、Papyrusの関数をひと通り眺めてもそれらしいものはなく、Pip-boyのArmorレコードを見てもライトに関するものはないようでした。
唯一判明したのがHUDのアイコンの表示、非表示から判断する方法になります。
Baka Framework
Baka Frameworkにライトのオン、オフをイベントとして受け取れる仕組みがあるようです。
会話のダイアログが出ているかどうか
会話のダイアログを担当しているswfはDialogueMenuになります。ですからRegisterForMenuOpenCloseEventでこのDialogueMenuの開閉状態を見ればいいです。
ところが、DialogueMenuが開く前から会話のダイアログが表示される場面があります。コンパニオンに話しかけた直後やコンパニオンに指示を出している最中、NPCから強制的に会話を持ちかけられた直後です。DialogueMenuが開いたあとはプレイヤーが移動不可になり、開く前なら移動可能なので、それでも判断できます。
DialogueMenuが開く前の会話のダイアログはDialogueMenuの開閉では検知できませんが、どうやら会話のダイアログが表示されている最中はHUDMenuのクロスヘアが消えるようです。
bool bVisible = UI.Get("HUDMenu", "root1.CenterGroup_mc.HUDCrosshair_mc.visible") as bool
他にもクロスヘアが消える場面があるかもしれません。