Starlightを更に便利にするアップデートをした

Hack

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_();

これでmCoopSettingGame::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情報は五つのパラメータしかないのだけれど、あと一つが何を意味しているのか全然わからない。誰か教えて。

記事は以上。

コメント

タイトルとURLをコピーしました