summaryrefslogtreecommitdiff
path: root/src/d/d_cs_base.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-07-26 19:27:34 +0200
committerrobojumper <robojumper@gmail.com>2025-07-26 20:19:12 +0200
commitd8bd55a8723468033e2a947f48a834f3433e175a (patch)
tree1a798c9e96dc7f89b705d191629b45dc867a9e7a /src/d/d_cs_base.cpp
parent58866f517f5cb0c2eb138d334a43b8e3da4f9b76 (diff)
d_cs_base OK
Diffstat (limited to 'src/d/d_cs_base.cpp')
-rw-r--r--src/d/d_cs_base.cpp73
1 files changed, 56 insertions, 17 deletions
diff --git a/src/d/d_cs_base.cpp b/src/d/d_cs_base.cpp
index e95a73c5..30fc60f1 100644
--- a/src/d/d_cs_base.cpp
+++ b/src/d/d_cs_base.cpp
@@ -1,23 +1,29 @@
#include "d/d_cs_base.h"
#include "common.h"
+#include "d/d_gfx.h"
+#include "d/d_pad.h"
#include "d/d_pad_nav.h"
#include "d/lyt/d_lyt_cursor_stick.h"
+#include "egg/math/eggMath.h"
#include "f/f_base.h"
#include "f/f_profile_name.h"
+#include "m/m_pad.h"
+#include "m/m_vec.h"
#include "nw4r/math/math_types.h"
+#include "s/s_Math.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
SPECIAL_BASE_PROFILE(C_BASE, dCsBase_c, fProfile::C_BASE, 0x2C0, 0x06F9);
+dCsBase_c *dCsBase_c::sInstance;
+
dCsBase_c::dCsBase_c()
: mpCurrLyt(nullptr),
- field_0x6F0(0.0f),
- field_0x6F4(0.0f),
- field_0x6F8(0.0f),
- field_0x6FC(0.0f),
+ mCsPosition(0.0f, 0.0f),
+ mCsVelocity(0.0f, 0.0f),
field_0x700(0),
- field_0x702(0),
+ mAlpha(0),
field_0x703(0),
field_0x704(0),
field_0x705(0) {
@@ -47,13 +53,11 @@ int dCsBase_c::create() {
mCursorIf.setCursorMask(1);
dCsMgr_c::GetInstance()->registCursor(&mCursorIf);
dLytCursorStick_c::build();
- field_0x6F0 = 0.0f;
- field_0x6F4 = 0.0f;
- field_0x6F8 = 0.0f;
- field_0x6FC = 0.0f;
+ mCsPosition.set(0.0f, 0.0f);
+ mCsVelocity.set(0.0f, 0.0f);
field_0x700 = 0;
- field_0x702 = 0;
+ mAlpha = 0;
field_0x703 = 0;
return SUCCEEDED;
@@ -67,8 +71,43 @@ int dCsBase_c::doDelete() {
}
int dCsBase_c::execute() {
- // TODO this needs player / controller / d_pad stuff?
+ mVec2_c dpdPosScreen = dPad::ex_c::getInstance()->getDpdPosScreen();
+ u8 oldAlpha = mAlpha;
+ bool bIsInBounds = false;
+ if (field_0x705 == 1) {
+ mVec2_c dpdPos = mPad::getDpdRawPos();
+ dpdPosScreen.x = dGfx_c::getWidth4x3F() * 0.5f * (1.f + dpdPos.x) + dGfx_c::getWidth4x3LeftF();
+ dpdPosScreen.y = dGfx_c::getCurrentScreenHeightF() * -0.5f * (1.f + dpdPos.y) + dGfx_c::getCurrentScreenTopF();
+
+ if (dPad::ex_c::getInstance()->field_0x22D8 == 0) {
+ dpdPosScreen.x = EGG::Math<f32>::maxNumber();
+ dpdPosScreen.y = EGG::Math<f32>::maxNumber();
+ }
+ }
+
+ if (dGfx_c::getWidth4x3LeftF() <= dpdPosScreen.x && dpdPosScreen.x <= dGfx_c::getWidth4x3RightF()) {
+ if (dGfx_c::getCurrentScreenBottomF() <= dpdPosScreen.y && dpdPosScreen.y <= dGfx_c::getCurrentScreenTopF()) {
+ bIsInBounds = true;
+ }
+ }
+
+ mCsVelocity = dpdPosScreen - mCsPosition;
+ mCsPosition = dpdPosScreen;
+
+ sLib::addCalcAngle(&field_0x700.mVal, mCsVelocity.ang(), 0x10, 2000);
+ sLib::chaseUC(&mAlpha, bIsInBounds ? 255 : 0, 10);
+ if (oldAlpha != mAlpha) {
+ mLyts[0].getLayout()->GetRootPane()->SetAlpha(mAlpha);
+ mLyts[1].getLayout()->GetRootPane()->SetAlpha(mAlpha);
+ }
+
+ if (dPadNav::isPointerVisible()) {
+ mCursorStick.setShouldBeOn(false);
+ } else if (dPadNav::isCursorStickVisible()) {
+ mCursorStick.setShouldBeOn(true);
+ }
+ mCursorStick.execute();
return SUCCEEDED;
}
@@ -77,11 +116,11 @@ int dCsBase_c::draw() {
return SUCCEEDED;
}
- if (field_0x703 && dPadNav::isPointerVisible() && field_0x702) {
+ if (field_0x703 && dPadNav::isPointerVisible() && mAlpha) {
nw4r::lyt::Pane *p = mpCurrLyt->getLayout()->GetRootPane();
nw4r::math::VEC3 pos;
- pos.x = field_0x6F0;
- pos.y = field_0x6F4;
+ pos.x = mCsPosition.x;
+ pos.y = mCsPosition.y;
pos.z = 0.0f;
p->SetTranslate(pos);
mpCurrLyt->calc();
@@ -105,11 +144,11 @@ bool dCsBase_c::drawDirectly() {
return true;
}
- if (field_0x703 && dPadNav::isPointerVisible() && field_0x702) {
+ if (field_0x703 && dPadNav::isPointerVisible() && mAlpha) {
nw4r::lyt::Pane *p = mpCurrLyt->getLayout()->GetRootPane();
nw4r::math::VEC3 pos;
- pos.x = field_0x6F0;
- pos.y = field_0x6F4;
+ pos.x = mCsPosition.x;
+ pos.y = mCsPosition.y;
pos.z = 0.0f;
p->SetTranslate(pos);
mpCurrLyt->calc();