diff options
| author | robojumper <robojumper@gmail.com> | 2025-07-26 19:27:34 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-07-26 20:19:12 +0200 |
| commit | d8bd55a8723468033e2a947f48a834f3433e175a (patch) | |
| tree | 1a798c9e96dc7f89b705d191629b45dc867a9e7a /src/d/d_cs_base.cpp | |
| parent | 58866f517f5cb0c2eb138d334a43b8e3da4f9b76 (diff) | |
d_cs_base OK
Diffstat (limited to 'src/d/d_cs_base.cpp')
| -rw-r--r-- | src/d/d_cs_base.cpp | 73 |
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(); |
