Decompile TouchControl (98%) (#24)

* decompile touchcontrol (98%)

* fix broken match
This commit is contained in:
Yanis
2026-01-19 18:54:06 +01:00
committed by GitHub
parent e9789bf360
commit 3e57b7c175
12 changed files with 266 additions and 48 deletions
+3
View File
@@ -13,6 +13,9 @@ src/Main/Main.cpp:
src/Main/System/SysNew.cpp:
.text start:0x02011e10 end:0x0201200c
src/Main/Player/TouchControl.cpp:
.text start:0x02014124 end:0x020144a0
src/Main/System/OverlayManager.cpp:
.text start:0x020147fc end:0x02014944
+10 -10
View File
@@ -685,15 +685,15 @@ _ZN18UnkStruct_02049b8013func_02013ee8Eii kind:function(arm,size=0x98) addr:0x02
func_02013f80 kind:function(arm,size=0x6c) addr:0x02013f80
func_02013fec kind:function(arm,size=0xc) addr:0x02013fec
func_02013ff8 kind:function(arm,size=0x12c) addr:0x02013ff8
func_02014124 kind:function(arm,size=0xb8) addr:0x02014124
_ZN12TouchControl11UpdateStateEP10TouchStateP15TouchStateFlags kind:function(arm,size=0xb8) addr:0x02014124
_ZN12TouchControlC1Ev kind:function(thumb,size=0x3c) addr:0x020141dc
func_02014218 kind:function(arm,size=0x18) addr:0x02014218
func_02014230 kind:function(arm,size=0x12c) addr:0x02014230
func_0201435c kind:function(arm,size=0x44) addr:0x0201435c
func_020143a0 kind:function(arm,size=0x50) addr:0x020143a0
func_020143f0 kind:function(arm,size=0x24) addr:0x020143f0
func_02014414 kind:function(arm,size=0x64) addr:0x02014414
_ZN12TouchControl13func_02014478EP18UnkStruct_02049b4ci kind:function(arm,size=0x28) addr:0x02014478
_ZN12TouchControl13IncreaseSpeedEt kind:function(arm,size=0x18) addr:0x02014218
_ZN12TouchControl11UpdateFlagsEt kind:function(arm,size=0x12c) addr:0x02014230
_ZN12TouchControl20UpdateWithStateFlagsEP15TouchStateFlagst kind:function(arm,size=0x44) addr:0x0201435c
_ZN12TouchControl6UpdateEP10TouchStatet kind:function(arm,size=0x50) addr:0x020143a0
_ZN12TouchControl13func_020143f0Ev kind:function(arm,size=0x24) addr:0x020143f0
_ZN12TouchControl13func_02014414Etb kind:function(arm,size=0x64) addr:0x02014414
_ZN12TouchControl13func_02014478EP10TouchStatet kind:function(arm,size=0x28) addr:0x02014478
func_020144a0 kind:function(thumb,size=0x10) addr:0x020144a0
func_020144b0 kind:function(thumb,size=0x1c) addr:0x020144b0
func_020144cc kind:function(thumb,size=0x6c) addr:0x020144cc
@@ -934,7 +934,7 @@ _ZN19GameModeManagerBase8vfunc_1CEv kind:function(thumb,size=0x2) addr:0x020185d
_ZN19GameModeManagerBase8vfunc_20Ev kind:function(thumb,size=0x2) addr:0x020185dc
_ZN19GameModeManagerBase8vfunc_00Ev kind:function(arm,size=0x2c) addr:0x020185e0
_ZN19GameModeManagerBase8vfunc_04Ev kind:function(arm,size=0x28) addr:0x0201860c
_ZN19GameModeManagerBase13func_02018634Ei kind:function(arm,size=0x48) addr:0x02018634
_ZN19GameModeManagerBase13func_02018634Et kind:function(arm,size=0x48) addr:0x02018634
_ZN19GameModeManagerBase8vfunc_24Ev kind:function(arm,size=0x18) addr:0x0201867c
_ZN19GameModeManagerBase8vfunc_28EPc kind:function(arm,size=0x10) addr:0x02018694
_ZN19GameModeManagerBase8vfunc_2CEPc kind:function(arm,size=0x4) addr:0x020186a4
@@ -1801,7 +1801,7 @@ func_0202e864 kind:function(arm,size=0x94) addr:0x0202e864
func_0202e8f8 kind:function(arm,size=0xf0) addr:0x0202e8f8
func_0202e9e8 kind:function(arm,size=0x9c) addr:0x0202e9e8
func_0202ea84 kind:function(arm,size=0x4c) addr:0x0202ea84
func_0202ead0 kind:function(arm,size=0x1c) addr:0x0202ead0
TP_GetTouchStateFlags kind:function(arm,size=0x1c) addr:0x0202ead0
func_0202eaec kind:function(arm,size=0x1ec) addr:0x0202eaec
func_0202ecd8 kind:function(arm,size=0x11c) addr:0x0202ecd8
func_0202edf4 kind:function(arm,size=0x18) addr:0x0202edf4
+3
View File
@@ -13,6 +13,9 @@ src/Main/Main.cpp:
src/Main/System/SysNew.cpp:
.text start:0x02011e10 end:0x0201200c
src/Main/Player/TouchControl.cpp:
.text start:0x02014128 end:0x020144a4
src/Main/System/OverlayManager.cpp:
.text start:0x02014800 end:0x02014948
+10 -10
View File
@@ -685,15 +685,15 @@ _ZN18UnkStruct_02049b8013func_02013ee8Eii kind:function(arm,size=0x98) addr:0x02
func_02013f84 kind:function(arm,size=0x6c) addr:0x02013f84
func_02013ff0 kind:function(arm,size=0xc) addr:0x02013ff0
func_02013ffc kind:function(arm,size=0x12c) addr:0x02013ffc
func_02014128 kind:function(arm,size=0xb8) addr:0x02014128
_ZN12TouchControl11UpdateStateEP10TouchStateP15TouchStateFlags kind:function(arm,size=0xb8) addr:0x02014128
_ZN12TouchControlC1Ev kind:function(thumb,size=0x3c) addr:0x020141e0
func_0201421c kind:function(arm,size=0x18) addr:0x0201421c
func_02014234 kind:function(arm,size=0x12c) addr:0x02014234
func_02014360 kind:function(arm,size=0x44) addr:0x02014360
func_020143a4 kind:function(arm,size=0x50) addr:0x020143a4
func_020143f4 kind:function(arm,size=0x24) addr:0x020143f4
func_02014418 kind:function(arm,size=0x64) addr:0x02014418
_ZN12TouchControl13func_02014478EP18UnkStruct_02049b4ci kind:function(arm,size=0x28) addr:0x0201447c
_ZN12TouchControl13IncreaseSpeedEt kind:function(arm,size=0x18) addr:0x0201421c
_ZN12TouchControl11UpdateFlagsEt kind:function(arm,size=0x12c) addr:0x02014234
_ZN12TouchControl20UpdateWithStateFlagsEP15TouchStateFlagst kind:function(arm,size=0x44) addr:0x02014360
_ZN12TouchControl6UpdateEP10TouchStatet kind:function(arm,size=0x50) addr:0x020143a4
_ZN12TouchControl13func_020143f0Ev kind:function(arm,size=0x24) addr:0x020143f4
_ZN12TouchControl13func_02014414Etb kind:function(arm,size=0x64) addr:0x02014418
_ZN12TouchControl13func_02014478EP10TouchStatet kind:function(arm,size=0x28) addr:0x0201447c
func_020144a0 kind:function(thumb,size=0x10) addr:0x020144a4
func_020144b4 kind:function(thumb,size=0x1c) addr:0x020144b4
func_020144d0 kind:function(thumb,size=0x6c) addr:0x020144d0
@@ -934,7 +934,7 @@ _ZN19GameModeManagerBase8vfunc_1CEv kind:function(thumb,size=0x2) addr:0x0201857
_ZN19GameModeManagerBase8vfunc_20Ev kind:function(thumb,size=0x2) addr:0x02018574
_ZN19GameModeManagerBase8vfunc_00Ev kind:function(arm,size=0x2c) addr:0x02018578
_ZN19GameModeManagerBase8vfunc_04Ev kind:function(arm,size=0x28) addr:0x020185a4
_ZN19GameModeManagerBase13func_02018634Ei kind:function(arm,size=0x48) addr:0x020185cc
_ZN19GameModeManagerBase13func_02018634Et kind:function(arm,size=0x48) addr:0x020185cc
_ZN19GameModeManagerBase8vfunc_24Ev kind:function(arm,size=0x18) addr:0x02018614
_ZN19GameModeManagerBase8vfunc_28EPc kind:function(arm,size=0x10) addr:0x0201862c
_ZN19GameModeManagerBase8vfunc_2CEPc kind:function(arm,size=0x4) addr:0x0201863c
@@ -1822,7 +1822,7 @@ func_0202e864 kind:function(arm,size=0x94) addr:0x0202fd94
func_0202e8f8 kind:function(arm,size=0xf0) addr:0x0202fe28
func_0202ff18 kind:function(arm,size=0x9c) addr:0x0202ff18
func_0202ffb4 kind:function(arm,size=0x4c) addr:0x0202ffb4
func_02030000 kind:function(arm,size=0x1c) addr:0x02030000
TP_GetTouchStateFlags kind:function(arm,size=0x1c) addr:0x02030000
func_0203001c kind:function(arm,size=0x1ec) addr:0x0203001c
func_02030208 kind:function(arm,size=0x11c) addr:0x02030208
func_02030324 kind:function(arm,size=0x18) addr:0x02030324
+2 -2
View File
@@ -3,9 +3,9 @@
#include "Player/TouchControl.hpp"
#include "System/SysNew.hpp"
#include "Unknown/UnkStruct_02049b18.hpp"
#include "Unknown/UnkStruct_02049b4c.hpp"
#include "nitro/button.h"
#include "nitro/math.h"
#include "nitro/touch.h"
#include "types.h"
class GameModeManagerBase;
@@ -160,7 +160,7 @@ public:
GameModeManagerBase(unk32 param1);
void func_02018550(void);
void func_02018554(void);
void func_02018634(unk32 param1);
void func_02018634(u16 speed);
void *func_020186f8(unk32 param1);
void func_02018704(void);
void func_02018714(unk32 param1, unk32 param2, unk32 param3, unk32 param4, unk32 param5);
+16 -9
View File
@@ -1,11 +1,12 @@
#pragma once
#include "Unknown/UnkStruct_02049b4c.hpp"
#include "nitro/math.h"
#include "nitro/touch.h"
#include "types.h"
typedef u16 TouchFlags;
enum TouchFlag_ {
TouchFlag_None = 0x0000,
TouchFlag_TouchedNow = 0x0001,
TouchFlag_UntouchedNow = 0x0002,
TouchFlag_Repeat = 0x0004,
@@ -18,20 +19,26 @@ public:
/* 00 */ u16 mSpeed;
/* 02 */ u16 mTimeBetweenTouches; // gets set to mTimeSinceTouch when touching the screen
/* 04 */ u16 mTimeSinceTouch; // increases by mSpeed every frame
/* 06 */ unk16 mRepeatStart;
/* 08 */ unk16 mRepeatLoop;
/* 06 */ u16 mRepeatStart;
/* 08 */ u16 mRepeatLoop;
// mRepeatTimer starts at mRepeatStart, decreases by mSpeed while touching the screen.
// if equal to 0, mRepeatTimer gets set to mRepeatLoop and the Repeat flag is set
/* 0A */ unk16 mRepeatTimer;
/* 0C */ bool mTouch;
/* 10 */ Vec2s mTouchPos;
/* 14 */ bool mTouchPrev;
/* 16 */ Vec2s mTouchPosPrev;
/* 0A */ u16 mRepeatTimer;
/* 0C */ TouchState mState;
/* 12 */ TouchState mPrevState;
/* 18 */ Vec2s mTouchPosLast;
/* 1C */ Vec2s mTouchPosStart;
/* 20 */ TouchFlags mFlags;
/* 22 */
TouchControl();
void func_02014478(UnkStruct_02049b4c *param1, unk32 param2);
void IncreaseSpeed(u16 increase);
void UpdateFlags(u16 speed);
void UpdateWithStateFlags(TouchStateFlags *state, u16 speed);
void Update(TouchState *state, u16 speed);
void func_02014414(u16 speedIncrease, bool shouldIncrease);
void func_02014478(TouchState *state, u16 speed);
static bool func_020143f0();
static void UpdateState(TouchState *state, TouchStateFlags *stateFlags);
};
-14
View File
@@ -1,14 +0,0 @@
#pragma once
#include "global.h"
#include "types.h"
class UnkStruct_02049b4c {
public:
/* 00 */ unk32 mUnk_00;
UnkStruct_02049b4c();
~UnkStruct_02049b4c();
};
extern UnkStruct_02049b4c data_02049b4c;
+42
View File
@@ -0,0 +1,42 @@
#pragma once
#include "global.h"
#include "nitro/math.h"
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct TouchStateFlags {
/* 00 */ Vec2us touchPos;
/* 04 */ u16 touch;
/* 06 */ u16 flags;
} TouchStateFlags; // size = 0x08
typedef struct TouchState {
/* 00 */ bool touch;
/* 01 */ bool unk_01;
/* 02 */ Vec2s touchPos;
} TouchState; // size = 0x06
typedef struct TouchStateU {
/* 00 */ bool touch;
/* 01 */ bool unk_01;
/* 02 */ Vec2us touchPos;
} TouchStateU; // size = 0x06
void WaitForTouchUpdate(u16 param1);
bool TP_GetTouchStateFlags(TouchStateFlags *pState);
static inline void TP_CopyState(TouchState *from, TouchState *to) {
to->touch = from->touch;
to->unk_01 = from->unk_01;
to->touchPos = from->touchPos;
}
extern TouchState data_02049b4c;
#ifdef __cplusplus
}
#endif
+1 -1
View File
@@ -55,7 +55,7 @@ ARM void FileSelectManager::vfunc_24() {
this->func_0201875c();
this->func_02018908();
if (!this->mTouchControl.mTouch) {
if (!this->mTouchControl.mState.touch) {
this->mUnk_148 = -1;
}
+2 -2
View File
@@ -52,9 +52,9 @@ ARM void GameModeManagerBase::vfunc_04() {
}
}
ARM void GameModeManagerBase::func_02018634(unk32 param1) {
ARM void GameModeManagerBase::func_02018634(u16 speed) {
this->mButtons.func_02013b24(this->mButtons.func_02013c08(data_02049b18.mUnk_28));
this->mTouchControl.func_02014478(&data_02049b4c, param1);
this->mTouchControl.func_02014478(&data_02049b4c, speed);
}
ARM void GameModeManagerBase::vfunc_24() {
+176
View File
@@ -0,0 +1,176 @@
#include "Player/TouchControl.hpp"
#include "Unknown/UnkMemFuncs.h"
// non-matching
ARM void TouchControl::UpdateState(TouchState *state, TouchStateFlags *stateFlags) {
if (stateFlags->touch == 1) {
if (stateFlags->flags == 0) {
Vec2us pos;
pos.y = stateFlags->touchPos.y;
pos.x = stateFlags->touchPos.x;
state->touch = true;
state->touchPos.x = pos.x;
state->touchPos.y = pos.y;
} else {
if ((stateFlags->flags & 1) == 0) {
state->touchPos.x = stateFlags->touchPos.x;
}
if ((stateFlags->flags & 2) == 0) {
state->touchPos.y = stateFlags->touchPos.y;
}
if (state->touchPos.x >= 0 && state->touchPos.x < 0x100 && state->touchPos.y >= 0 && state->touchPos.y < 0xC0) {
state->touch = true;
} else {
state->touch = false;
state->unk_01 = false;
state->touchPos.x = -1;
state->touchPos.y = -1;
}
}
} else {
state->touch = false;
state->unk_01 = false;
state->touchPos.x = -1;
state->touchPos.y = -1;
}
}
THUMB TouchControl::TouchControl() {
this->mSpeed = 1;
this->mTimeBetweenTouches = -1;
this->mTimeSinceTouch = -1;
this->mRepeatStart = 20;
this->mRepeatLoop = 6;
this->mTouchPosLast.x = 128;
this->mRepeatTimer = 0;
this->mState.touch = false;
this->mState.unk_01 = false;
this->mState.touchPos.x = -1;
this->mState.touchPos.y = -1;
this->mPrevState.touch = false;
this->mPrevState.unk_01 = false;
this->mPrevState.touchPos.x = -1;
this->mPrevState.touchPos.y = -1;
this->mTouchPosLast.y = 96;
this->mTouchPosStart.x = -1;
this->mTouchPosStart.y = -1;
this->mFlags = TouchFlag_None;
}
ARM void TouchControl::IncreaseSpeed(u16 increase) {
this->mFlags = TouchFlag_None;
this->mSpeed += increase;
}
// non-matching
ARM void TouchControl::UpdateFlags(u16 speed) {
this->mFlags = TouchFlag_None;
if (this->mPrevState.unk_01 == false && this->mState.unk_01 == false) {
if (this->mPrevState.touch == false && this->mState.touch == true) {
this->mFlags |= TouchFlag_TouchedNow;
}
if (this->mPrevState.touch == true && this->mState.touch == false) {
this->mFlags |= TouchFlag_UntouchedNow;
}
}
if (this->mSpeed < speed) {
this->mSpeed = speed;
}
switch (!(this->mFlags & TouchFlag_TouchedNow)) {
default:
this->mFlags |= TouchFlag_Repeat;
this->mRepeatTimer = this->mRepeatStart;
break;
case 0:
if (this->mState.touch != false && this->mRepeatTimer != 0) {
if (this->mRepeatTimer - this->mSpeed > 0) {
this->mRepeatTimer -= this->mSpeed;
} else {
this->mFlags |= TouchFlag_Repeat;
this->mRepeatTimer = this->mRepeatLoop;
}
}
break;
}
if (this->mTimeSinceTouch + this->mSpeed < 0xFFFF) {
this->mTimeSinceTouch += this->mSpeed;
} else {
this->mTimeSinceTouch = -1;
}
if (this->mFlags & TouchFlag_TouchedNow) {
this->mTimeBetweenTouches = this->mTimeSinceTouch;
this->mTimeSinceTouch = 0;
this->mTouchPosStart.x = this->mState.touchPos.x;
this->mTouchPosStart.y = this->mState.touchPos.y;
}
this->mSpeed = speed;
if (this->mState.touch) {
this->mTouchPosLast.x = this->mState.touchPos.x;
this->mTouchPosLast.y = this->mState.touchPos.y;
}
}
ARM void TouchControl::UpdateWithStateFlags(TouchStateFlags *state, u16 speed) {
*(TouchStateU *) &this->mPrevState = *(TouchStateU *) &this->mState;
this->UpdateState(&this->mState, state);
this->UpdateFlags(speed);
}
ARM void TouchControl::Update(TouchState *state, u16 speed) {
TouchStateU curState = *(TouchStateU *) &this->mState;
TouchStateU newState = *(TouchStateU *) &*state;
this->mPrevState.touch = curState.touch;
this->mPrevState.touch = curState.touch;
this->mPrevState.unk_01 = curState.unk_01;
this->mPrevState.touchPos.x = curState.touchPos.x;
this->mPrevState.touchPos.y = curState.touchPos.y;
this->mState.touch = newState.touch;
this->mState.unk_01 = newState.unk_01;
this->mState.touchPos.x = newState.touchPos.x;
this->mState.touchPos.y = newState.touchPos.y;
this->UpdateFlags(speed);
}
ARM bool TouchControl::func_020143f0() {
return ((*((u16 *) 0x027FFFA8) & 0x8000) >> 15) == 1;
}
ARM void TouchControl::func_02014414(u16 speedIncrease, bool shouldIncrease) {
TouchStateFlags touchState;
if (shouldIncrease) {
this->IncreaseSpeed(speedIncrease);
return;
}
if (TouchControl::func_020143f0()) {
Fill16(0, (u16 *) &touchState, sizeof(TouchStateFlags));
} else {
TP_GetTouchStateFlags(&touchState);
}
this->UpdateWithStateFlags(&touchState, speedIncrease);
}
ARM void TouchControl::func_02014478(TouchState *state, u16 speed) {
TouchControl::func_020143f0();
this->Update(state, speed);
}
+1
View File
@@ -125,6 +125,7 @@ config.libs = [
[
Object("Main/Main.cpp"),
Object("Main/System/SysNew.cpp"),
Object("Main/Player/TouchControl.cpp"),
Object("Main/System/OverlayManager.cpp"),
Object("Main/Game/GameModeLinkListNode.cpp"),
Object("Main/func_02017ea4.cpp"),