'static + Life

運良く生きています

PAYDAY2 Moddingから学ぶゲーム解析 #1

この記事はLava Bucket Advent Calendar 2017 9日目の記事です。

まず最初に

PAYDAY 2とは?Moddingとは?

他のプレイヤーやNPCと最大4人のチームを組み、銀行強盗などのお仕事をこなすFPSです。
以下のキーワードに反応した方は是非チェックを。
 強盗
 CO-OP
 オブジェクティブベース
 エレクトロニック・ダンス・ミュージック
Payday2 日本語 WikiFAQ - どんなゲームより

そういうことですので、気になった方は購入を。

・・・

冗談は置いといて、少し真面目な解説をしましょう。

PAYDAY 2とは、 OVERKILL Softwareが制作、Starbreeze Studioがパブリッシャーの最大4人で遊ぶことができるCO-OP*1ゲームです。引用に書いてあるように内容は銀行強盗などのお仕事を受けてオブジェクティブ(目標)を達成しながらクリアを目指すゲームです。特に音楽に関しては評価がかなり高く、有名アーティストがPAYDAY 2用の曲を作成するほどの人気があります。ゲーム自体はC/C++*2で書かれており内部スクリプトLua*3で書かれています。そのため、内部スクリプトLuaをいじることでゲームの挙動を変えることができます。これがModdingです。これからこのModdingという行為からゲームの挙動の予測、つまり、解析を学ぼうと思います。

ゲームデータを展開する

まずゲーム解析を行うためにはゲームデータを展開させないと意味ありません。
PAYDAY 2はC:\Program Files (x86)\Steam\steamapps\common\PAYDAY 2\assetsにゲームデータを.bundle拡張子に変換して配置し、本体に読み込ませられるようにしています。
f:id:KashEight:20171124214722p:plain
(assetsの中身、およそ40GB以上ある。)

通常、.bundle拡張子の中身は見ることや展開することは不可能ですが、有志の方が作成したツールを使用することでそれらをすることができます。それで使うツールはこれです。

f:id:KashEight:20171124220015p:plain

使い方

前述してあるURLをクリックし、ダウンロードページへ移動、下画像の赤丸で囲んである"Download"をクリックしダウンロード、そして好きな場所へ解凍します。フォルダ作ってそこに格納したほうがいいかもしれません。

f:id:KashEight:20171124220550p:plain

解凍したファイルの中からPDBundleModPatcher.exeを実行、ダイアログが出ると思いますが迷わず[OK]と押しましょう。
そうすると紹介時の画像ような画面が映るかと思います。
そこからGame File Extractionタブをクリックしましょう。するとこういう画面に移ると思います。

f:id:KashEight:20171124221302p:plain

ここでのCustom Extract Folderは、展開先をどこにするかの指定です。中央左のBrowseをクリックして指定できます。ゲームデータは40GBを余裕で超えるので別ドライブに展開したら良いでしょう。
また、Extention Replacementは特定のワードを置換する機能です。PAYDAY 2はデータを読み込ませるために独特の拡張子を使用しています。一部のデータは拡張子を変えるだけで見れるのでこの機能を使い拡張子を一気に変更します。今回は.unitファイルを.xmlに、.textureファイルを.ddsにします。追加方法はExtentionに置換元のワード、Replacementに置換後のワードを入力してAdd/Updateをクリックするだけで追加できます。削除は削除したいものをクリックし、Removeを押せば削除できます。

これで、展開する準備が完了しました。

…と思いきや、まだやることがあります。

理由

まず、先程の状態から展開をスタートすると、「ちゃんと展開されるし問題ないのでは?」と思うかもしれませんが、実は一部のものしか展開できていません。
では一体どのファイルができていないのでしょうか?

ここで、この記事を見てみましょう。
この記事はall_<number>_h.bundleを作成するPython*4スクリプトといういうことがわかります。
ここからはBundle Modderの内部の話になりますが、Bundle Modderは.bundleをhashlist*5を元にhashを作成、それを参照し展開するような形をとっています。
そのため、もしhashが上手く作成されていない場合、.bundleを正常に展開することはできません。
ということは、このスクリプトはall_<number>_h.bundleを正常に読み込ませるためのスクリプトっていうことがわかります。
このため、展開する前にファイルを修正する必要があります。

.bundleファイルの修正, 及び更新

Python 2.7またはPython 3.x環境が必要です。

はじめに、hashlistのリポジトリダウンロードします。

Python 2.7を使用している場合

  1. hashlist, bundle fixer.pyを解凍する。
  2. hashlistをBundle Modderにあるフォルダに移動する。
  3. bundle fixer.pyを実行、all_h.bundleが作成されていることを確認する。
  4. Bundle Modderを起動、ファイルを展開する。

Python 3.xを使用している場合

  1. hashlistを解凍する。
  2. hashlistをBundle Modderにあるフォルダに移動する。
  3. ここからコードをペーストし、.py拡張子にして実行、all_h.bundleが作成されていることを確認する。
  4. Bundle Modderを起動、ファイルを展開する。

以上でファイルの展開が完了します、正常に展開されれば下画像のように展開されているはずです。

f:id:KashEight:20171125203535p:plain

アップデートで追加されたファイルを展開したい場合、先程のリポジトリを再度ダウンロード、hashlistをBundle Modderが存在するフォルダに移動させ、bundle fixer.pyを実行すればall_h.bundleが更新されます。
そして、Bundle Modderを起動して展開を実行すれば新しいファイルが追加されます。(この場合Ignore existing filesにチェックを入れることをオススメします。展開するファイルが既に存在している場合、展開しない処理をするので早く終わらせることができます。)

#1はここまでです。payday2の内部データの説明、解析は明日の#2で紹介いたします。
ここまで見てくださりありがとうございました。

注釈