[IPSwitch]書きたいコード

3.1.0

関数名が参照できるのが3.1.0までなので、以後のバージョンには3.1.0から移植するという手がとられている。

ほとんどメモ代わりみたいな感じですが、なんかうまく弄れたら教えてください。

UpdateLocalDifficulty

; __int64 __fastcall Cmn::Def::Coop::UpdateLocalDifficulty(Cmn::Def::Coop *__hidden this, int, bool)
EXPORT _ZN3Cmn3Def4Coop21UpdateLocalDifficultyEib
_ZN3Cmn3Def4Coop21UpdateLocalDifficultyEib
; __unwind {
CMP             W0, #0x63
; 5:   if ( (signed int)result <= 99 )
MOV             W8, #5
MOV             W9, #0xA
; 6:     v2 = 5;
; 8:     v2 = 10;
CSEL            W8, W9, W8, GT
; 9:   v3 = v2 + result;
MOV             W9, #0xC8
ADD             W8, W8, W0
; 10:   if ( v3 > 200 )
CMP             W8, #0xC8
; 11:     v3 = 200;
CSEL            W8, W9, W8, GT
; 12:   if ( a2 &amp; 1 )
TST             W1, #1
; 13:     result = (unsigned int)v3;
; 15:     result = (unsigned int)result;
CSEL            W0, W0, W8, EQ
RET
; } // starts at 9FF00
; End of function Cmn::Def::Coop::UpdateLocalDifficulty(int,bool)

キケン度を更新するコード。

200%以上にも設定できるはずだが、xmlで定義されていないのでクラッシュするか単にキケン度MAXと同じ仕様になる可能性が高い。

setCoopLocalDifficultAndStage

; __int64 __fastcall Cnet::SystemGameAtomicCloneObj::setCoopLocalDifficultAndStage(Cnet::SystemGameAtomicCloneObj *__hidden this, int, int, bool)
EXPORT _ZN4Cnet24SystemGameAtomicCloneObj29setCoopLocalDifficultAndStageEiib
_ZN4Cnet24SystemGameAtomicCloneObj29setCoopLocalDifficultAndStageEiib
var_28= -0x28
var_20= -0x20
var_10= -0x10
var_s0=  0
; __unwind {
SUB             SP, SP, #0x40
STP             X22, X21, [SP,#0x30+var_20]
STP             X20, X19, [SP,#0x30+var_10]
STP             X29, X30, [SP,#0x30+var_s0]
ADD             X29, SP, #0x30
; 8:   v4 = this;
MOV             X22, X0
; 12:   v9 = *(_QWORD *)(*(__int64 (**)(void))(**((_QWORD **)this + 14) + 104LL))();
LDR             X0, [X22,#0x70]
LDR             X8, [X0]
LDR             X8, [X8,#0x68]
; 9:   v5 = a4;
MOV             W19, W3
; 10:   v6 = a3;
MOV             W20, W2
; 11:   v7 = a2;
MOV             W21, W1
BLR             X8
LDR             X8, [X0]
STR             X8, [SP,#0x30+var_28]
; 13:   LOWORD(v9) = v7;
AND             W8, W19, #1
STRH            W21, [SP,#0x30+var_28]
; 14:   WORD1(v9) = v6;
STRH            W20, [SP,#0x30+var_28+2]
; 15:   BYTE6(v9) = v5 &amp; 1;
STRB            W8, [SP,#0x30+var_28+6]
; 16:   return (*(__int64 (**)(void))(**((_QWORD **)v4 + 14) + 112LL))();
LDR             X0, [X22,#0x70]
LDR             X8, [X0]
LDR             X8, [X8,#0x70]
ADD             X1, SP, #0x30+var_28
BLR             X8
LDP             X29, X30, [SP,#0x30+var_s0]
LDP             X20, X19, [SP,#0x30+var_10]
LDP             X22, X21, [SP,#0x30+var_20]
ADD             SP, SP, #0x40
RET
; } // starts at 1EC14C
; End of function Cnet::SystemGameAtomicCloneObj::setCoopLocalDifficultAndStage(int,int,bool)

おそらくホストがパケットを送信して他のメンバーにキケン度とステージを指定する関数。

ここを弄れば選択したステージと違うステージを遊ぶことができるかもしれない。

PacketSeqEventCoopSetting

; __int64 __fastcall Cnet::PacketSeqEventCoopSetting::PacketSeqEventCoopSetting(Cnet::PacketSeqEventCoopSetting *__hidden this)
EXPORT _ZN4Cnet25PacketSeqEventCoopSettingC2Ev
_ZN4Cnet25PacketSeqEventCoopSettingC2Ev
var_10= -0x10
var_s0=  0
; __unwind {
STR             X19, [SP,#-0x10+var_10]!
STP             X29, X30, [SP,#0x10+var_s0]
ADD             X29, SP, #0x10
; 5:   v1 = this;
MOV             X19, X0
; 10:   memset((char *)this + 20, 0LL, 84LL);
MOV             W8, #1
MOV             W2, #0x54
ADD             X0, X19, #0x14
; 6:   *(_BYTE *)this = 1;
MOV             W1, WZR
STRB            W8, [X19]
; 7:   *((_BYTE *)this + 17) = 0;
STRB            WZR, [X19,#0x11]
; 8:   *(_QWORD *)((char *)this + 9) = 0LL;
STUR            XZR, [X19,#9]
; 9:   *(_QWORD *)((char *)this + 1) = 0LL;
STUR            XZR, [X19,#1]
BL              .memset
; 11:   result = sead::Random::getU32((sead::Random *)sead::GlobalRandom::sInstance);
ADRP            X8, #off_41565B0@PAGE
LDR             X8, [X8,#off_41565B0@PAGEOFF]
LDR             X0, [X8] ; this
BL              _ZN4sead6Random6getU32Ev ; sead::Random::getU32(void)
; 12:   *((_DWORD *)v1 + 11) = result;
STR             W0, [X19,#0x2C]
LDP             X29, X30, [SP,#0x10+var_s0]
LDR             X19, [SP+0x10+var_10],#0x20
RET
; } // starts at 208C34
; End of function Cnet::PacketSeqEventCoopSetting::PacketSeqEventCoopSetting(void)

イベント情報をパケットで送信している関数。

setBGM

; __int64 __fastcall Cnet::PacketSeqEventCoopSetting::setBGM(Cnet::PacketSeqEventCoopSetting *__hidden this, int)
EXPORT _ZN4Cnet25PacketSeqEventCoopSetting6setBGMEi
_ZN4Cnet25PacketSeqEventCoopSetting6setBGMEi
; __unwind {
STRH            W1, [X0,#4]
RET
; } // starts at 208C98
; End of function Cnet::PacketSeqEventCoopSetting::setBGM(int)

おそらくBGMを変更できる関数。ver3.0.0の段階では一種類しかないので弄れない。

setStage

; __int64 __fastcall Cnet::PacketSeqEventCoopSetting::setStage(Cnet::PacketSeqEventCoopSetting *__hidden this, __int16)
EXPORT _ZN4Cnet25PacketSeqEventCoopSetting8setStageEs
_ZN4Cnet25PacketSeqEventCoopSetting8setStageEs
; __unwind {
STRH            W1, [X0,#2]
RET
; } // starts at 208C88
; End of function Cnet::PacketSeqEventCoopSetting::setStage(short)

ステージを設定している場所。

パケットを受け取ってからの動作の気もするので、ここを弄ると一人だけ違うステージに飛ばされるかもしれない。