Starlight
スプラトゥーン2で任意のC++コードが実行できるStarlightですが、インスタンスの呼び出しにcodehook.slpatchとかexported.txtとかの編集があったり、main.cppやmain.hppのrenderEntrypointを編集したりとめちゃくちゃめんどくさかったんですよね。
めちゃくちゃめんどくさい理由としてはサーモンランの解析に使っていたインスタンスがSingletonという形式でこれが固定されたアドレスを持たないためにレジスタから読み込まなければいけなかったためです。
が、それをShadowninja108氏が上手く解決してくれたのでその機能をぼくのレポジトリにマージしてみました。
Singleton.h
まず、以下のヘッダーファイルを新規作成します。これが何かというとCmn::SingletonをHookするためのファイルなんですよね。
#pragma once #include "types.h" namespace Cmn { template<typename T> class Singleton{ public: static T* GetInstance_() { static T* sInstance; return sInstance; }; }; };
この試みは自分もやろうとしていたのですが、C++よくわからんマンだったので放置していました。まさかこんな短いコードで実装できたとは……
#pragma once #include <string.h> #include <vector> #include <math.h> #include "svc.h" #include "types.h" #include "operator.h" #include "agl/lyr/renderinfo.h" #include "agl/lyr/renderer.h" #include "agl/utl/devtools.h" #include "sead/textwriter.h" #include "sead/string.h" #include "sead/drawer.h" #include "sead/heap.h" #include "sead/matrix.h" #include "sead/arena.h" #include "sead/system.h" #include "Cmn/Singleton.h
あとは作成したヘッダーファイルをmain.hppに読み込ませてあげるだけです。これで終わり。
Singletonの使い方
これを使えばたった一行で任意のインスタンスを呼び出すことができます。codehook.slpatchやexported.txtをいじるような面倒な作業はもう不要。
たとえばサーモンランの設定を読み込ませたければ次のように書けば良い。
Game::Coop::Setting *mCoopSetting = Cmn::Singleton<Game::Coop::Setting>::GetInstance_();
これでmCoopSetting
にGame::Coop::Setting
のインスタンスのポインタが入ります。
このとき、ちゃんとincludeでGame::Coop::Setting
を定義していないと意味がないので注意。ちなみにGame::Coop::Setting
の中身はこんな感じ。
#pragma once #include "types.h" namespace Game { namespace Coop { class Wave { public: _DWORD weather; _DWORD tide; _DWORD seed; _DWORD gap0xC; _DWORD event; }; class Setting : public Lp::Sys::Params, public sead::IDisposer { public: Game::Coop::LevelConfig mLevelConfig; _BYTE field_14B0[48]; Game::Coop::Wave present; Game::Coop::Wave preview; Game::Coop::Wave mWave[3]; }; }; // namespace Coop }; // namespace Game
Wave情報は五つのパラメータしかないのだけれど、あと一つが何を意味しているのか全然わからない。誰か教えて。
記事は以上。
自身を天才と信じて疑わないマッドサイエンティスト。二つ上の姉は大英図書館特殊工作部勤務、額の十字架の疵は彼女につけられた。
コメント