備忘録

何かあったとき用に

Payday2のunitデータを解析する

経緯

日本語化MODをBLT2.x系に対応する際に「pager応答の字幕表示」という機能があり、それを対応、更新するのにLuaコードだけでは不十分で、他のところから参照する必要があった。Luaコード内には探しても探しても見つからないメソッドやクラス等が何個もあり、更新する際にそこがネックとなった。 また、従来の方法だとゲームを起動して探すという方法しかないためそれをどうにかしたいと思ったのもある。

元のコード

f:id:KashEight:20170919180719p:plain
上の画像はnbmd氏が作成した日本語MODの元のjp_p.luaのコード、ここでは

self._unit:sound_source(source):post_event(sound_name, callback_function, self._unit, "marker", "duration", "end_of_event")

上のsound_souce(), post_event()の2つのメソッドがLuaコード内で見つからなかった。

unitデータを探す

hook元となるlib\units\beings\player\playersound.luaからself._unitを探したところ序盤に

function PlayerSound:init(unit)
    self._unit = unit

    unit:base():post_init()

    local ss = unit:sound_source()

    ss:set_switch("robber", "rb3")

    if unit:base().is_local_player then
        ss:set_switch("int_ext", "first")
    else
        ss:set_switch("int_ext", "third")
    end
end

とコンストラクタがあったのでそれから探し出せないかと考えた。
とりあえずunitを定義しているものを探そうと思いpayday2\unitsをcmd開いて
for /r /d %i in (*) do ren %i\*.unit *.xml
を実行し、.unitファイルを全て.xmlファイルに置換した。(Bundle Modderにも置換機能あるんでそれを利用しても良い。)
それで実際に置換したものを開いてみる。
f:id:KashEight:20171118235309p:plain
(units\payday2\characters\civ_male_worker_1\civ_male_worker_1_husk.xmlの例)
見ても普通にわからないのでmodworkshopのwikiページを参考にしながら色々探ってみる。(詳しいことはwikiページにて、英語なので苦労するかもしれない。)
流石に全部説明するのは酷(自分も完全に理解してるわけではないのもある)なので説明は省略するが、重要と思えるところだけ取り上げてみる。

<extensions>
        <extension name="unit_data" class="ScriptUnitData" />
        <extension name="base" class="HuskCivilianBase" >
...

<extentions>タグで囲まれてる部分がunitデータの部分と属するクラスである。
おそらく、呼び出されたunitデータがどのクラスで処理しているかを示していると思われる。
ここから、目的のものを探すことはできるのではないかと思ったが事はうまく進まない。まあ、当たり前だろう。
目的のsound_sourceがどう処理されているかがわからないのである。そのため、pager応答がどう行われているかわからない。

振り出しに戻ってしまった。けっこうだるい。まあ、少しは進んだか。
一応、この記事を書いてる現在(17/11/19)はある程度進んだもののまだ先は長そうだ。
これ以上書くと長くなるので、続きは次回にしよう、userdata型とかIdstring型とかめんどいのもあるし。

今回の話とあんまり関係ないけれども

f:id:KashEight:20171119004111p:plain
どうやら音は「ケツ」から出ているらしい。面白い。

参考にしたサイト

modworkshop - Wiki - unitデータの詳しい解説が載っています。