Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/eur/arm9/delinks.txt
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ src/Main/Unknown/UnkStruct_02063220.cpp:
.rodata start:0x020562e0 end:0x02056300
.data start:0x0205772c end:0x02057808

src/Main/Player/TouchControl.cpp:
.text start:0x0202b864 end:0x0202b8e4

src/Main/Game/Game.cpp:
.text start:0x0202c6c8 end:0x0202d0cc
.rodata start:0x020561f4 end:0x020562d4
Expand Down
2 changes: 1 addition & 1 deletion config/eur/arm9/overlays/ov000/delinks.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ src/00_Core/Player/PlayerControl.cpp:
.data start:0x020e6104 end:0x020e6150
.sbss start:0x020ee198 end:0x020ee1a0

src/00_Core/Player/TouchControl.cpp:
src/00_Core/Player/TouchControl_00.cpp:
.text start:0x0207ac24 end:0x0207afa0
.init start:0x020df38c end:0x020df3b8
.ctor start:0x020e1e90 end:0x020e1e94
Expand Down
2 changes: 1 addition & 1 deletion config/eur/arm9/overlays/ov000/symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3928,7 +3928,7 @@ data_ov000_020df330 kind:data(any) addr:0x020df330
__sinit_ov000_020df338 kind:function(arm,size=0x14) addr:0x020df338
__sinit_ov000_020df34c kind:function(arm,size=0x2c) addr:0x020df34c
__sinit_ov000_020df378 kind:function(arm,size=0x14) addr:0x020df378
__sinit_ov000_020df38c kind:function(arm,size=0x2c) addr:0x020df38c
__sinit_TouchControl.cpp kind:function(arm,size=0x2c) addr:0x020df38c
__sinit_ov000_020df3b8 kind:function(arm,size=0x14) addr:0x020df3b8
__sinit_ov000_020df3cc kind:function(arm,size=0x14) addr:0x020df3cc
__sinit_ov000_020df3e0 kind:function(arm,size=0x14) addr:0x020df3e0
Expand Down
3 changes: 3 additions & 0 deletions config/usa/arm9/delinks.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ src/Main/Unknown/UnkStruct_02063220.cpp:
.rodata start:0x0205629c end:0x020562bc
.data start:0x020576e4 end:0x020577c0

src/Main/Player/TouchControl.cpp:
.text start:0x0202b84c end:0x0202b8cc

src/Main/Game/Game.cpp:
.text start:0x0202c6b0 end:0x0202d0b4
.rodata start:0x020561b0 end:0x02056290
Expand Down
2 changes: 1 addition & 1 deletion config/usa/arm9/overlays/ov000/delinks.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ src/00_Core/Player/PlayerControl.cpp:
.data start:0x020e60a4 end:0x020e60f0
.sbss start:0x020ee138 end:0x020ee140

src/00_Core/Player/TouchControl.cpp:
src/00_Core/Player/TouchControl_00.cpp:
.text start:0x0207abc4 end:0x0207af40
.init start:0x020df32c end:0x020df358
.ctor start:0x020e1e30 end:0x020e1e34
Expand Down
2 changes: 1 addition & 1 deletion config/usa/arm9/overlays/ov000/symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3928,7 +3928,7 @@ data_ov000_020df330 kind:data(any) addr:0x020df2d0
__sinit_ov000_020df338 kind:function(arm,size=0x14) addr:0x020df2d8
__sinit_ov000_020df34c kind:function(arm,size=0x2c) addr:0x020df2ec
__sinit_ov000_020df378 kind:function(arm,size=0x14) addr:0x020df318
__sinit_ov000_020df38c kind:function(arm,size=0x2c) addr:0x020df32c
__sinit_TouchControl.cpp kind:function(arm,size=0x2c) addr:0x020df32c
__sinit_ov000_020df3b8 kind:function(arm,size=0x14) addr:0x020df358
__sinit_ov000_020df3cc kind:function(arm,size=0x14) addr:0x020df36c
__sinit_ov000_020df3e0 kind:function(arm,size=0x14) addr:0x020df380
Expand Down
9 changes: 6 additions & 3 deletions include/Player/TouchControl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ extern u16 *data_0207aecc;

typedef u16 TouchFlags;
enum TouchFlag_ {
TouchFlag_None = 0x0000,
TouchFlag_TouchedNow = 0x0001,
TouchFlag_UntouchedNow = 0x0002,
TouchFlag_Repeat = 0x0004,
Expand All @@ -19,11 +20,11 @@ class TouchControl {
/* 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;
/* 0a */ u16 mRepeatTimer;
/* 0c */ bool mTouch;
/* 10 */ s32 mTouchX;
/* 14 */ s32 mTouchY;
Expand Down Expand Up @@ -55,4 +56,6 @@ class TouchControl {
};
extern TouchControl gTouchControl;

extern TouchControl gTouchControl;

extern "C" void Fill16(int value, unsigned short *dst, int size); // TODO: Replace with header file
39 changes: 0 additions & 39 deletions src/00_Core/Player/TouchControl.cpp

This file was deleted.

163 changes: 163 additions & 0 deletions src/00_Core/Player/TouchControl_00.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
#include "Player/TouchControl.hpp"
#include "global.h"

void TouchControl::Init() {}

TouchControl gTouchControl;

THUMB TouchControl::TouchControl() {
this->mSpeed = 1;
this->mTimeBetweenTouches = -1;
this->mTimeSinceTouch = -1;
this->mRepeatStart = 20;
this->mRepeatLoop = 6;
this->mRepeatTimer = this->mRepeatStart;
this->mTouch = false;
this->mTouchX = -1;
this->mTouchY = -1;
this->mTouchPrev = false;
this->mTouchPrevX = -1;
this->mTouchPrevY = -1;
this->mTouchLastX = 128;
this->mTouchLastY = 96;
this->mTouchStartX = -1;
this->mTouchStartY = -1;
this->mFlags = TouchFlag_None;
}

ARM void TouchControl::IncreaseSpeed(s16 increase) {
this->mFlags = TouchFlag_None;
this->mSpeed += increase;
}

ARM void TouchControl::UpdateFlags(u16 speed) {
this->mFlags = TouchFlag_None;

if (this->mTouchPrev == false && this->mTouch == true) {
this->mFlags |= TouchFlag_TouchedNow;
}

if (this->mTouchPrev == true && this->mTouch == false) {
this->mFlags |= TouchFlag_UntouchedNow;
}

if (this->mSpeed < speed) {
this->mSpeed = speed;
}

if (this->mFlags & TouchFlag_TouchedNow) {
this->mFlags |= TouchFlag_Repeat;
this->mRepeatTimer = this->mRepeatStart;
} else {
if (this->mTouch != false) {
if (this->mRepeatTimer - this->mSpeed > 1) {
this->mRepeatTimer -= this->mSpeed;
} else {
this->mFlags |= TouchFlag_Repeat;
this->mRepeatTimer = this->mRepeatLoop;
}
}
}

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->mTouchStartX = this->mTouchX;
this->mTouchStartY = this->mTouchY;
}

this->mSpeed = speed;

if (this->mTouch) {
this->mTouchLastX = this->mTouchX;
this->mTouchLastY = this->mTouchY;
}
}

ARM void TouchControl::UpdateWithStateFlags(TouchStateFlags *state, u16 speed) {
this->mTouchPrev = this->mTouch;
this->mTouchPrevX = this->mTouchX;
this->mTouchPrevY = this->mTouchY;

if (state->touch == 1) {
if (state->flags == 0) {
this->mTouch = true;
this->mTouchX = state->touchX;
this->mTouchY = state->touchY;
} else {
this->mTouchX = (state->flags & 1) ? this->mTouchPrevX : state->touchX;
this->mTouchY = (state->flags & 2) ? this->mTouchPrevY : state->touchY;

if (this->mTouchX >= 0 && this->mTouchX < 0x100 && this->mTouchY >= 0 && this->mTouchY < 0xC0) {
this->mTouch = true;
} else {
this->mTouch = false;
this->mTouchX = -1;
this->mTouchY = -1;
}
}
} else {
this->mTouch = false;
this->mTouchX = -1;
this->mTouchY = -1;
}

this->UpdateFlags(speed);
}

ARM void TouchControl::Update(TouchState *state, u16 speed) {
this->mTouchPrev = this->mTouch;
this->mTouchPrevX = this->mTouchX;
this->mTouchPrevY = this->mTouchY;
this->mTouch = state->touch;
this->mTouchX = state->touchX;
this->mTouchY = state->touchY;
this->UpdateFlags(speed);
}

ARM bool TouchControl::func_ov00_0207aeac() {
return ((*((u16 *) 0x027FFFA8) & 0x8000) >> 15) == 1;
}

ARM void TouchControl::UpdateConditionally(TouchState *state, u16 speed) {
TouchState newState;

if (TouchControl::func_ov00_0207aeac()) {
newState.touch = false;
newState.touchX = -1;
newState.touchY = -1;
} else {
newState.touch = state->touch;
newState.touchX = state->touchX;
newState.touchY = state->touchY;
}

this->Update(&newState, speed);
}

ARM void TouchControl::func_ov00_0207af38(u16 speedIncrease, bool shouldIncrease) {
TouchStateFlags touchState;

if (shouldIncrease) {
//! TODO: `IncreaseSpeed` expects an s16 variable, while `speedIncrease` is a u16.
//! As a result, the function performs a conversion that is not present in the binary.
this->IncreaseSpeed(speedIncrease);
return;
}

if (TouchControl::func_ov00_0207aeac()) {
Fill16(0, &touchState.touchX, 8);
} else {
GetTouchStateFlags(&touchState);
}

this->UpdateWithStateFlags(&touchState, speedIncrease);
}

ARM TouchControl::~TouchControl() {}
24 changes: 22 additions & 2 deletions src/Main/Player/TouchControl.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,24 @@
#include "Player/TouchControl.hpp"
#include "global.h"

bool TouchControl::func_0202b864(Vec3p *param1, s32 size, unk8 param3) {}
bool TouchControl::func_0202b894(Vec3p *param1, s32 size, unk8 param3) {}
extern "C" bool func_0202b8f8(Vec3p *, s32, s32, s32, unk8);

ARM bool TouchControl::func_0202b864(Vec3p *param1, s32 size, unk8 param3) {
if (gTouchControl.mFlags & TouchFlag_TouchedNow) {
return func_0202b8f8(param1, size, gTouchControl.mTouchX, gTouchControl.mTouchY, param3);
}

return false;
}

ARM bool TouchControl::func_0202b894(Vec3p *param1, s32 size, unk8 param3) {
if (gTouchControl.mTouch) {
return func_0202b8f8(param1, size, gTouchControl.mTouchX, gTouchControl.mTouchY, param3);
}

if (gTouchControl.mFlags & TouchFlag_UntouchedNow) {
return func_0202b8f8(param1, size, gTouchControl.mTouchPrevX, gTouchControl.mTouchPrevY, param3);
}

return false;
}