summaryrefslogtreecommitdiff
path: root/src/00_Core/Player/TouchControl_00.cpp
diff options
context:
space:
mode:
authorYanis <35189056+Yanis002@users.noreply.github.com>2026-01-30 18:36:20 +0100
committerGitHub <noreply@github.com>2026-01-30 18:36:20 +0100
commit98cc0af690719f10bd7b67c1c11d207bfcdbbfe7 (patch)
tree106937a3d0b6476d44872d8ccf2cfc6b0a6a03df /src/00_Core/Player/TouchControl_00.cpp
parente5701a754e910812061cdd7aa2012feca050a6c4 (diff)
Started `TouchControl.cpp` (#111)
* start both `TouchControl.cpp` * fix build issues * complete touchcontrol * remove useless comment --------- Co-authored-by: Yanis002 <Yanis002@users.noreply.github.com>
Diffstat (limited to 'src/00_Core/Player/TouchControl_00.cpp')
-rw-r--r--src/00_Core/Player/TouchControl_00.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/00_Core/Player/TouchControl_00.cpp b/src/00_Core/Player/TouchControl_00.cpp
new file mode 100644
index 00000000..b2ef607c
--- /dev/null
+++ b/src/00_Core/Player/TouchControl_00.cpp
@@ -0,0 +1,159 @@
+#include "Player/TouchControl.hpp"
+#include "global.h"
+
+TouchControl gTouchControl;
+
+THUMB void TouchControl::Init() {
+ 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(u16 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 > 0) {
+ 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) {
+ this->IncreaseSpeed(speedIncrease);
+ return;
+ }
+
+ if (TouchControl::func_ov00_0207aeac()) {
+ Fill16(0, &touchState.touchX, 8);
+ } else {
+ GetTouchStateFlags(&touchState);
+ }
+
+ this->UpdateWithStateFlags(&touchState, speedIncrease);
+}
+
+ARM TouchControl::~TouchControl() {}