diff --git a/config/eur/arm9/delinks.txt b/config/eur/arm9/delinks.txt index 26659d40..6db78823 100644 --- a/config/eur/arm9/delinks.txt +++ b/config/eur/arm9/delinks.txt @@ -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 diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index 85e4ca58..02c53b2b 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -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 diff --git a/config/jp/arm9/delinks.txt b/config/jp/arm9/delinks.txt index 22524e8f..804cd7ec 100644 --- a/config/jp/arm9/delinks.txt +++ b/config/jp/arm9/delinks.txt @@ -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 diff --git a/config/jp/arm9/symbols.txt b/config/jp/arm9/symbols.txt index f6c253ad..7890204c 100644 --- a/config/jp/arm9/symbols.txt +++ b/config/jp/arm9/symbols.txt @@ -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 diff --git a/include/Game/GameModeManager.hpp b/include/Game/GameModeManager.hpp index 5faf09a1..7e70fca4 100644 --- a/include/Game/GameModeManager.hpp +++ b/include/Game/GameModeManager.hpp @@ -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); diff --git a/include/Player/TouchControl.hpp b/include/Player/TouchControl.hpp index e403d130..d31c0f28 100644 --- a/include/Player/TouchControl.hpp +++ b/include/Player/TouchControl.hpp @@ -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); }; diff --git a/include/Unknown/UnkStruct_02049b4c.hpp b/include/Unknown/UnkStruct_02049b4c.hpp deleted file mode 100644 index 6841bd35..00000000 --- a/include/Unknown/UnkStruct_02049b4c.hpp +++ /dev/null @@ -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; diff --git a/include/nitro/touch.h b/include/nitro/touch.h new file mode 100644 index 00000000..20afc331 --- /dev/null +++ b/include/nitro/touch.h @@ -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 diff --git a/src/019_MainSelect/FileSelectManager.cpp b/src/019_MainSelect/FileSelectManager.cpp index c72ee6ae..80947bd0 100644 --- a/src/019_MainSelect/FileSelectManager.cpp +++ b/src/019_MainSelect/FileSelectManager.cpp @@ -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; } diff --git a/src/Main/Game/GameModeManagerBase.cpp b/src/Main/Game/GameModeManagerBase.cpp index b91f4910..f9e13801 100644 --- a/src/Main/Game/GameModeManagerBase.cpp +++ b/src/Main/Game/GameModeManagerBase.cpp @@ -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() { diff --git a/src/Main/Player/TouchControl.cpp b/src/Main/Player/TouchControl.cpp new file mode 100644 index 00000000..369192c6 --- /dev/null +++ b/src/Main/Player/TouchControl.cpp @@ -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); +} diff --git a/tools/configure.py b/tools/configure.py index 0588603e..bdf1bacb 100755 --- a/tools/configure.py +++ b/tools/configure.py @@ -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"),