'static + Life

運良く生きています

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

この記事はLava Bucket Advent Calendar 2017 10日目の記事です。
9日目の記事を先に見たことを前提として書いていきます。

Luaスクリプトを覗いてみる

Luaスクリプト群はcore/liblib/に存在しています。前者はこのゲームの基礎の基礎となる部分、つまりDiesel Engine*1の中心スクリプトとなる部分です。後者はこのゲーム自体のスクリプトとなる部分です。
さて、この中にLuaスクリプトが入ってるわけなのでそれを見ようと思いますが…。

f:id:KashEight:20171203192208p:plain (core/lib/utils/coreapp.luaの例)

あれ?
運の悪いことに.luaテキストエディタで開けません、どういうことでしょうか?
実はこのluaファイルはコンパイル済みであり、通常のテキストエディタで開くことはできません。なので、これらのLuaファイルをデコンパイルして読まなければなりません。
これを全てデコンパイルするのはかなり時間かかるのと手間がかかりますので有志の方が公開しているリポジトリをダウンロードかクローンして覗いてみましょう。
これらからお好きな方を選んでください。

  • bitbucket (アップデートの反映は早い、ただしgitでのクローンは不可)

  • github (gitでのクローンは可能、ただしアップデートの反映は遅い)

これでもう一回同じファイルを見てみましょう。

f:id:KashEight:20171203194248p:plain

これにて正常に開けました。

Luaスクリプトから推察する

さて、先程見れるようになったLuaスクリプトですが、これからpayday2のシステムを(一部ですが)推察してみましょう。

とりあえずデータを見てみる

今回はpayday2自体を見るのでlib/内のフォルダを見ることにしましょう。

f:id:KashEight:20171203195400p:plain
(lib/の内部)
この中には膨大というわけでもありませんが多くの量のスクリプトがあるので今回は"ゲームデータ"関連のスクリプトに焦点を当てて見てみましょう。
lib/内部をすべて解説するほどの労力がない(ごめんなさい)ので目的のフォルダだけを挙げます。今回の目的のフォルダはtweak_dataフォルダです。
f:id:KashEight:20171208231735p:plain
(lib/tweak_dataの内部)
内部だけでも大量のluaファイルが存在するのでさらに焦点を当ててみましょう。"キャラクター関連のゲームデータ"を探そうと思います。

f:id:KashEight:20171208232328p:plain
(lib/tweak_data/charactertweakdata.lua)の内部
まず、1行目から見てましょう。

CharacterTweakData = CharacterTweakData or class()

ここの定義からCharacterTweakDataはクラスとして定義されていることがわかります。*2
次に4行目を見てみましょう。

function CharacterTweakData:init(tweak_data)
…

initの詳しい説明は省きますがこの関数(メソッド)はオブジェクト指向型プログラミングでいうコンストラクタみたいなものです。ここでは、CharacterTweakDataクラスが呼び出されたときの初期化処理を行っています。
余談ですが、今回initの詳しい説明を省いたのはinit自体は別のファイル(クラス)で定義はされており、それを解説するとキリがないことや今回の目的とは少し遠くなるので説明を省きました。また今度違う記事で説明するかもしれません。

さて、このクラスについて基本部分はある程度の説明できました。あとは、各種のメソッドの処理がどうなっているか調べるだけです。
この部分が理解できればあなたも立派なHeisterです。いえい!(あいにく私は理解できていませんですが。)
もうほとんど書ききってしまったのとこれ以上書くと記事が長くなるのでここでお終いとします。
ここまで見てくださりありがとうございました。
明日はNagisberryさんの"ラズライト ~天藍石と青金石の関係性~"です。一体どういう記事なんでしょうか、楽しみです。

注釈

*1:OVERKILL Softwareの前身となるGRIN(現在は閉鎖済み)が開発したゲームエンジン

*2:補足: 今回は省略していますが、Luaは最初からクラスが提供されているわけではないため、クラスとして扱うには連想配列を使って定義する必要があります。1行目のclass()関数はPAYDAY 2のLuaスクリプト側で定義されたグローバル関数であり、Luaが直接持っている関数ではないので注意が必要です。class()関数の詳細は都合により省きます。