diff options
Diffstat (limited to 'src/00_Core/Player/TouchControl_00.cpp')
| -rw-r--r-- | src/00_Core/Player/TouchControl_00.cpp | 159 |
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() {} |
