From b1d4c31dab0550e30d2b5fcecb5596d8b805cbab Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 5 Oct 2025 23:04:55 +0200 Subject: [PATCH 01/34] match Init__8KartGameFi --- include/Yamamoto/KartGame.h | 14 ++++++++++---- src/Yamamoto/kartCtrlStrat.cpp | 27 ++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index 2220031d..8bbc7667 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -11,7 +11,7 @@ class KartGame { public: // In kartCtrlStrat.cpp - void Init(int); + bool Init(int kartNo); void GetGorundTireNum(); void WatchEffectAcceleration(); void WatchAcceleration(); @@ -90,12 +90,18 @@ class KartGame // void DoTurboPower(); // void CheckBalloonPlayer(); KartBody *mBody; - u8 _4[0x12 - 004]; + u32 _4; + u8 _8; + u8 _9; + u8 _A[0x4]; + u16 _E; + u16 _10; u16 mCountDownDuration; - u8 _14[0x20 - 0x14]; + u8 _14[0x4]; + float _18[2]; JGeometry::TVec3f _20; JGeometry::TVec3f _2C; - JGeometry::TVec3f _34; + JGeometry::TVec3f _38; }; #endif KARTGAME_H diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 8cef9586..07562407 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -1,10 +1,35 @@ +#include "Kaneshige/RaceMgr.h" #include "Yamamoto/KartGame.h" +#include "Yamamoto/kartCtrl.h" #include "JSystem/JAudio/JASFakeMatch2.h" // comments inside functions are inline functions being called in that function -void KartGame::Init(int) {} +bool KartGame::Init(int kartNo) { + bool isRight; + + mBody = GetKartCtrl()->getKartBody(kartNo); + _8 = 0; + _9 = 0; + _38.zero(); + _4 = 0; + _18[0] = 0.f; + _18[1] = 0.f; + _E = 0; + _10 = 0; + mCountDownDuration = 0; + + _A[0] = 0; + _A[1] = 0; + _A[2] = 0; + + isRight = RaceMgr::getCurrentManager()->getStartPoint(&_20, &_2C, kartNo); + + _20.y += 300.f; + + return isRight; +} void KartGame::GetGorundTireNum() {} From 28c665465c934ec82d7a92568e421bb05e88279a Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 5 Oct 2025 23:53:15 +0200 Subject: [PATCH 02/34] match DoItmCancel__8KartGameFv --- include/Yamamoto/KartGame.h | 4 ++-- src/Yamamoto/kartCtrlStrat.cpp | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index 8bbc7667..872dcb64 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -89,14 +89,14 @@ class KartGame // void FrameWorkL(f32, f32, KartSus *); // void DoTurboPower(); // void CheckBalloonPlayer(); - KartBody *mBody; + KartBody *mBody; // 00 u32 _4; u8 _8; u8 _9; u8 _A[0x4]; u16 _E; u16 _10; - u16 mCountDownDuration; + u16 mCountDownDuration; // 12 u8 _14[0x4]; float _18[2]; JGeometry::TVec3f _20; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 07562407..9536079a 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -1,4 +1,5 @@ #include "Kaneshige/RaceMgr.h" +#include "Sato/ItemObjMgr.h" #include "Yamamoto/KartGame.h" #include "Yamamoto/kartCtrl.h" @@ -37,7 +38,14 @@ void KartGame::WatchEffectAcceleration() {} void KartGame::WatchAcceleration() {} -void KartGame::DoItmCancel() {} +void KartGame::DoItmCancel() { + KartBody *body; + + body = mBody; + + body->mCarStatus |= 0x80000000; + GetItemObjMgr()->abortItemShuffle(body->mMynum); +} void KartGame::DoStopItm() {} From 5ec6b294a2a58973faa4d214ceae2be6e925a6c5 Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 05:32:17 +0200 Subject: [PATCH 03/34] match GetGorundTireNum__8KartGameFv --- include/Kaneshige/Course/CrsGround.h | 1 + include/Sato/GeographyObj.h | 16 ++++----- include/Yamamoto/kartSus.h | 2 +- src/Yamamoto/kartCtrlStrat.cpp | 52 +++++++++++++++++++++++++++- 4 files changed, 61 insertions(+), 10 deletions(-) diff --git a/include/Kaneshige/Course/CrsGround.h b/include/Kaneshige/Course/CrsGround.h index 60478082..c1d254e3 100644 --- a/include/Kaneshige/Course/CrsGround.h +++ b/include/Kaneshige/Course/CrsGround.h @@ -80,6 +80,7 @@ class CrsGround bool isAttributeCollision(); // 0x801a38a8 f32 getWallNormal(JGeometry::TVec3f *, JGeometry::TVec3f *); // 0x801a38f4 void addPullerVelocity(); // 0x801a3e9c + GeographyObj *getObject() const; // 0x802e0154 // Inlines void getVelocity(JGeometry::TVec3f *dest) const { dest->set(mVelocity); } diff --git a/include/Sato/GeographyObj.h b/include/Sato/GeographyObj.h index d564d6ef..16717ba0 100644 --- a/include/Sato/GeographyObj.h +++ b/include/Sato/GeographyObj.h @@ -289,14 +289,14 @@ class ExGeographyObj : public GeographyObj { ~ExGeographyObj() {} // TODO: check return types - virtual bool Search_Bound(const JGeometry::TVec3f &) { return false; } - virtual bool Search_BoundRadius(const JGeometry::TVec3f &, f32) { return false; } - virtual void Search(const JGeometry::TVec3f &, const JGeometry::TVec3f &) {} - virtual void AddVel(const JGeometry::TVec3f &, const JGeometry::TVec3f &) {} - virtual void Search_Wall(const JGeometry::TVec3f &, f32) { } - virtual void draw(Mtx) {} - virtual f32 getMaxHeight() const { return 0.0f; } - virtual void lockDisplayList() {} + virtual bool Search_Bound(const JGeometry::TVec3f &) { return false; } // 80 + virtual bool Search_BoundRadius(const JGeometry::TVec3f &, f32) { return false; } // 84 + virtual void Search(const JGeometry::TVec3f &, const JGeometry::TVec3f &) {} // 88 + virtual void AddVel(const JGeometry::TVec3f &, const JGeometry::TVec3f &) {} // 8C + virtual void Search_Wall(const JGeometry::TVec3f &, f32) { } // 90 + virtual void draw(Mtx) {} // 94 + virtual f32 getMaxHeight() const { return 0.0f; } // 98 + virtual void lockDisplayList() {} // 9C template static T *ExNew(CrsData::SObject &object) { return new T(object); } diff --git a/include/Yamamoto/kartSus.h b/include/Yamamoto/kartSus.h index e20646b7..c99285f9 100644 --- a/include/Yamamoto/kartSus.h +++ b/include/Yamamoto/kartSus.h @@ -54,7 +54,7 @@ class KartSus f32 _10c; f32 _110; u8 _114[0x124 - 0x114]; - u32 _124; + u32 _124; // bitmask? 0: on ground? Mtx _128; Mtx _158; Mtx _188; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 9536079a..ca3f46d1 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -32,7 +32,57 @@ bool KartGame::Init(int kartNo) { return isRight; } -void KartGame::GetGorundTireNum() {} +void KartGame::GetGorundTireNum() { + u8 num; + int idx; + KartBody *body; + KartSus *sus[4]; + ExGeographyObj *exGeo; + + // lgtm + num = mBody->mMynum; + + body = mBody; + body->mTouchNum = 0; + + + // the compiler will optimize all of these redundant calls out, right?... right???? + idx = num; + sus[0] = GetKartCtrl()->getKartSus(idx * 4 + 0); + sus[1] = GetKartCtrl()->getKartSus(idx * 4 + 1); + sus[2] = GetKartCtrl()->getKartSus(idx * 4 + 2); + sus[3] = GetKartCtrl()->getKartSus(idx * 4 + 3); + + if (sus[0]->_124 & 1) + ++body->mTouchNum; + + if (sus[1]->_124 & 1) + ++body->mTouchNum; + + if (sus[2]->_124 & 1) + ++body->mTouchNum; + + if (sus[3]->_124 & 1) + ++body->mTouchNum; + + GetKartCtrl()->getKartSound(num)->DoSlipSound(num); + + JGeometry::TVec3f _geo0; + _geo0.set(body->mPlayerPosMtx[0][3], + body->mPlayerPosMtx[1][3], + body->mPlayerPosMtx[2][3]); + + body->mShadowArea.searchShadow(_geo0); + + if(body->mTouchNum != 0 && body->_58c == 7) { + exGeo = (ExGeographyObj*)body->mBodyGround.getObject(); + + JGeometry::TVec3f _geo2; + _geo2.set(0.f, -3.5f, 0.f); + + exGeo->AddVel(_geo0, _geo2); + } +} void KartGame::WatchEffectAcceleration() {} From cc646025f21ee92964bd08603bf3b8016ab93f2d Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 06:14:52 +0200 Subject: [PATCH 04/34] match WatchEffectAcceleration__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index ca3f46d1..71e5988e 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -84,7 +84,23 @@ void KartGame::GetGorundTireNum() { } } -void KartGame::WatchEffectAcceleration() {} +void KartGame::WatchEffectAcceleration() { + int num; + KartPad *pad; + KartBody *body; + KartGamePad *gamePad; + + num = mBody->mMynum; + body = mBody; + + gamePad = GetKartCtrl()->GetDriveCont(num); + pad = GetKartCtrl()->getKartPad(num); + if (gamePad->testButton(pad->mAccelBtn)) { + body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 1.f, 0.050000001f , 0.050000001f); + } else { + body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 0.f, 0.050000001f , 0.050000001f); + } +} void KartGame::WatchAcceleration() {} From a5a736d3c5cfdcea07a2b7ce36126aff238eb2ed Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 07:11:36 +0200 Subject: [PATCH 05/34] match WatchAcceleration__8KartGameFv --- include/Yamamoto/KartRescue.h | 1 - src/Yamamoto/kartCtrlStrat.cpp | 22 +++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/Yamamoto/KartRescue.h b/include/Yamamoto/KartRescue.h index e4f2eab2..edb38c9d 100644 --- a/include/Yamamoto/KartRescue.h +++ b/include/Yamamoto/KartRescue.h @@ -31,7 +31,6 @@ class KartRescue // Inline/Unused // void DoHang(); -// private: u8 _0[0xc]; // CrsGround mGround; // c u8 _6c[0x74 - 0x6c]; // padding up to offset 0x74 diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 71e5988e..292b0468 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -102,7 +102,27 @@ void KartGame::WatchEffectAcceleration() { } } -void KartGame::WatchAcceleration() {} +void KartGame::WatchAcceleration() { + int num; + KartPad *pad; + KartBody *body; + KartGamePad *gamePad; + + num = mBody->mMynum; + body = mBody; + + gamePad = GetKartCtrl()->GetDriveCont(num); + if ((body->mCarStatus & 0x400000) && (body->getRescue()->_6c[10] >= 3)) { + pad = GetKartCtrl()->getKartPad(num); + if (gamePad->testButton(pad->mAccelBtn)) { + body->_3c8 = GetKartCtrl()->fcnvge(body->_3c8, body->_3d0, 1.f , 1.f); + _8 |= 2; + } else { + GetKartCtrl()->ChaseFnumber(&body->_3c8, 0.f, 1.f); + _8 &= ~2; + } + } +} void KartGame::DoItmCancel() { KartBody *body; From 9073695e69901ba2078acbebf92007134e6265ed Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 08:02:17 +0200 Subject: [PATCH 06/34] match DoStopItm__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 292b0468..766db6bd 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -133,7 +133,36 @@ void KartGame::DoItmCancel() { GetItemObjMgr()->abortItemShuffle(body->mMynum); } -void KartGame::DoStopItm() {} +void KartGame::DoStopItm() { + u8 num; + KartBody *body; + ItemObjMgr *itemMgr; + ItemObj *item; + + num = mBody->mMynum; + body = mBody; + + /* probably copy pasted this from DoItmCancel lmao */ + body->mCarStatus |= 0x80000000; + GetItemObjMgr()->abortItemShuffle(body->mMynum); + + itemMgr = GetItemObjMgr(); + item = itemMgr->getKartEquipItem(num, 0); + itemMgr->deleteHeartItem(num); + + if (item != nullptr) { + item->IsSuccessionItem() + ? item->setChildStateForceDisappear() + : item->setStateForceDisappear(); + } + + item = itemMgr->getKartEquipItem(num, 1); + if (item != nullptr) { + item->IsSuccessionItem() + ? item->setChildStateForceDisappear() + : item->setStateForceDisappear(); + } +} void KartGame::DoChange() {} From f60b20deeb89315c98fe1194deb1f9882f93d888 Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 22:05:12 +0200 Subject: [PATCH 07/34] fix redeclaration --- include/Kaneshige/Course/CrsGround.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/Kaneshige/Course/CrsGround.h b/include/Kaneshige/Course/CrsGround.h index c1d254e3..60478082 100644 --- a/include/Kaneshige/Course/CrsGround.h +++ b/include/Kaneshige/Course/CrsGround.h @@ -80,7 +80,6 @@ class CrsGround bool isAttributeCollision(); // 0x801a38a8 f32 getWallNormal(JGeometry::TVec3f *, JGeometry::TVec3f *); // 0x801a38f4 void addPullerVelocity(); // 0x801a3e9c - GeographyObj *getObject() const; // 0x802e0154 // Inlines void getVelocity(JGeometry::TVec3f *dest) const { dest->set(mVelocity); } From 13dd36674d23a5e06417f3f0dbb318266473b6bd Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 07:03:43 +0200 Subject: [PATCH 08/34] match DoChange__8KartGameFv --- include/Yamamoto/KartGame.h | 4 +- include/Yamamoto/KartRescue.h | 7 +++- include/Yamamoto/kartBody.h | 12 +++++- src/Yamamoto/kartCtrlStrat.cpp | 77 +++++++++++++++++++++++++++++++--- 4 files changed, 90 insertions(+), 10 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index 872dcb64..55e7f72d 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -93,7 +93,9 @@ class KartGame u32 _4; u8 _8; u8 _9; - u8 _A[0x4]; + u8 _A; + u8 mTimeToChange; + u8 _C[0x2]; u16 _E; u16 _10; u16 mCountDownDuration; // 12 diff --git a/include/Yamamoto/KartRescue.h b/include/Yamamoto/KartRescue.h index edb38c9d..8cd9db1c 100644 --- a/include/Yamamoto/KartRescue.h +++ b/include/Yamamoto/KartRescue.h @@ -34,8 +34,11 @@ class KartRescue u8 _0[0xc]; // CrsGround mGround; // c u8 _6c[0x74 - 0x6c]; // padding up to offset 0x74 - u8 mFlags; // 74 - u8 _75[0x8c - 0x75]; // remaining padding + u8 mFlags; // 74 0x20: in rescue animation + u8 _75; + u8 mState; // 0: no rescue 2: got out of course 3: lakitu holds us 4: lakitu lets us down + u8 _77; // seems to be some kind of frame counter when getting rescued + u8 _78[0x8c - 0x78]; // remaining padding JGeometry::TVec3f _8c; // JGeometry::TVec3f _98; // JGeometry::TVec3f _a4; // diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index a32c0d6d..828d0896 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -29,6 +29,14 @@ #include "Yamamoto/KartTire.h" #include "Yamamoto/KartTumble.h" +enum GameStatus { + gsHasCoDriver = 1<<0, +}; + +enum CarStatus { + csInDriverChange = 1<<7, +}; + class KartBody { public: @@ -102,7 +110,7 @@ class KartBody KartSus *mKartSus[4]; ExModel *mBodyModel; DriverModel *mDriverModels[2]; - ExModel *mExModels[2]; + DriverModel *mExModels[2]; KartShadowModel *mShadowModel; CrsGround mBodyGround; CrsArea mShadowArea; @@ -285,7 +293,7 @@ class KartBody f32 _564; f32 _568; u8 _56c[4]; // padding? - u64 mCarStatus; // 570, 574 + u64 mCarStatus; // 570, 574 | 0x400000:off track u32 mGameStatus; // 578 u32 _57c; u32 _580; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 766db6bd..39197102 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -21,9 +21,9 @@ bool KartGame::Init(int kartNo) { _10 = 0; mCountDownDuration = 0; - _A[0] = 0; - _A[1] = 0; - _A[2] = 0; + _A = 0; + mTimeToChange = 0; + _C[0] = 0; isRight = RaceMgr::getCurrentManager()->getStartPoint(&_20, &_2C, kartNo); @@ -112,7 +112,7 @@ void KartGame::WatchAcceleration() { body = mBody; gamePad = GetKartCtrl()->GetDriveCont(num); - if ((body->mCarStatus & 0x400000) && (body->getRescue()->_6c[10] >= 3)) { + if ((body->mCarStatus & 0x400000) && (body->getRescue()->mState >= 3)) { pad = GetKartCtrl()->getKartPad(num); if (gamePad->testButton(pad->mAccelBtn)) { body->_3c8 = GetKartCtrl()->fcnvge(body->_3c8, body->_3d0, 1.f , 1.f); @@ -164,7 +164,74 @@ void KartGame::DoStopItm() { } } -void KartGame::DoChange() {} +void KartGame::DoChange() { + u8 num; + KartBody *body; + KartGamePad *gpDriver; + KartGamePad *gpCoDriv; + bool possible; + bool change; + + num = mBody->mMynum; + body = mBody; + + gpDriver = GetKartCtrl()->GetDriveCont(num); + gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); + + change = false; + possible = GetKartCtrl()->MakeChangePossible(num); + + if (body->getChecker()->CheckCheange(num)) { + mTimeToChange = 0; + return; + } + + if (mTimeToChange) + mTimeToChange--; + + // single player kart + if ((body->mGameStatus & gsHasCoDriver) == false) { + if (gpDriver->testTrigger(GetKartCtrl()->getKartPad(num)->mTrigZ)) + mTimeToChange = 20; + + if (body->mCarStatus & csInDriverChange) { + if (!(body->mExModels[0])->IsChange() && !(body->mExModels[1])->IsChange()) + body->mCarStatus &= ~csInDriverChange; + + } else if ((gpDriver->testTrigger(GetKartCtrl()->getKartPad(num)->mTrigZ) + || possible || mTimeToChange != 0)) { + change = true; + mTimeToChange = 0; + } + // with co-driver, but already in change + } else if (body->mCarStatus & csInDriverChange) { + if (gpDriver->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ) && + gpCoDriv->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ)) { + mTimeToChange = 20; + } + + if (!(body->mExModels[0])->IsChange() && + !(body->mExModels[1])->IsChange()) { + body->mCarStatus &= ~csInDriverChange; + } + // with co-driver and ready to change + } else if ((gpDriver->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ) && + gpCoDriv->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ)) || + mTimeToChange != 0) { + change = true; + mTimeToChange = 0; + } + + if (!change) + return; + + body->mCarStatus &= ~(1ull<<38); + body->mCarStatus |= csInDriverChange;; + + GetKartCtrl()->getKartAnime(num)->mFlags |= 1; + GetKartCtrl()->getKartSound(num)->DoChangeVoice(); + GetKartCtrl()->getKartSound(num)->DoChangeStarSound(); +} void KartGame::DoSlide() {} From 99fdad852a7130f48b8efb01bdb05265e9e334b1 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 07:40:11 +0200 Subject: [PATCH 09/34] match DoDriftTurboSterr__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 39197102..f103fc08 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -1,6 +1,7 @@ #include "Kaneshige/RaceMgr.h" #include "Sato/ItemObjMgr.h" #include "Yamamoto/KartGame.h" +#include "Yamamoto/kartBody.h" #include "Yamamoto/kartCtrl.h" #include "JSystem/JAudio/JASFakeMatch2.h" @@ -235,7 +236,14 @@ void KartGame::DoChange() { void KartGame::DoSlide() {} -void KartGame::DoDriftTurboSterr() {} +void KartGame::DoDriftTurboSterr() { + KartBody *body; + + body = mBody; + + if (body->mDriftSterr != 0 && body->mDriftSterr < 0x1E) + body->mDriftSterr++; +} void KartGame::SetDriftTurboSterr() {} From de815a7cc91e421531359b6cb9e2018988bac1e0 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 09:13:40 +0200 Subject: [PATCH 10/34] match SetDriftTurboSterr__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index f103fc08..143fcae6 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -245,7 +245,30 @@ void KartGame::DoDriftTurboSterr() { body->mDriftSterr++; } -void KartGame::SetDriftTurboSterr() {} +void KartGame::SetDriftTurboSterr() { + int num; + int threshold; + KartBody *body; + + body = mBody; + num = mBody->mMynum; + + threshold = (body->mGameStatus & gsHasCoDriver) ? 2 : 6; + if ((body->mDriftSterr) < threshold) + return; + + body->mMTState++; + + if (body->mMTState == 1) + GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100C9); + else if (body->mMTState == 2) + GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100CA); + + if (body->mMTState >= 2) + body->mMTState = 2; + + body->mDriftSterr = 0; +} void KartGame::CheckDriftTurbo() { // void JUTGamePad::getMainStickX() const {} From a0512575ebd613cc36e466f870796fc380c27e3a Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 09:56:27 +0200 Subject: [PATCH 11/34] cleanup --- include/Yamamoto/KartGame.h | 2 +- include/Yamamoto/kartBody.h | 2 +- src/Yamamoto/kartCtrlStrat.cpp | 116 +++++++++++---------------------- 3 files changed, 41 insertions(+), 79 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index 55e7f72d..47743d6e 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -91,7 +91,7 @@ class KartGame // void CheckBalloonPlayer(); KartBody *mBody; // 00 u32 _4; - u8 _8; + u8 _8; // probably a bitmask u8 _9; u8 _A; u8 mTimeToChange; diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 828d0896..ff6bd5cb 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -293,7 +293,7 @@ class KartBody f32 _564; f32 _568; u8 _56c[4]; // padding? - u64 mCarStatus; // 570, 574 | 0x400000:off track + u64 mCarStatus; // 570, 574 | 0x400000: could be off track u32 mGameStatus; // 578 u32 _57c; u32 _580; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 143fcae6..ff2352ce 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -9,8 +9,6 @@ // comments inside functions are inline functions being called in that function bool KartGame::Init(int kartNo) { - bool isRight; - mBody = GetKartCtrl()->getKartBody(kartNo); _8 = 0; _9 = 0; @@ -26,7 +24,7 @@ bool KartGame::Init(int kartNo) { mTimeToChange = 0; _C[0] = 0; - isRight = RaceMgr::getCurrentManager()->getStartPoint(&_20, &_2C, kartNo); + bool isRight = RaceMgr::getCurrentManager()->getStartPoint(&_20, &_2C, kartNo); _20.y += 300.f; @@ -34,21 +32,13 @@ bool KartGame::Init(int kartNo) { } void KartGame::GetGorundTireNum() { - u8 num; - int idx; - KartBody *body; - KartSus *sus[4]; - ExGeographyObj *exGeo; + u8 num = mBody->mMynum; - // lgtm - num = mBody->mMynum; - - body = mBody; + KartBody *body = mBody; body->mTouchNum = 0; - - // the compiler will optimize all of these redundant calls out, right?... right???? - idx = num; + KartSus *sus[4]; + int idx = num; sus[0] = GetKartCtrl()->getKartSus(idx * 4 + 0); sus[1] = GetKartCtrl()->getKartSus(idx * 4 + 1); sus[2] = GetKartCtrl()->getKartSus(idx * 4 + 2); @@ -68,34 +58,32 @@ void KartGame::GetGorundTireNum() { GetKartCtrl()->getKartSound(num)->DoSlipSound(num); - JGeometry::TVec3f _geo0; - _geo0.set(body->mPlayerPosMtx[0][3], + // TODO: what kind of vectors are this? + JGeometry::TVec3f _vec0; + _vec0.set(body->mPlayerPosMtx[0][3], body->mPlayerPosMtx[1][3], body->mPlayerPosMtx[2][3]); - body->mShadowArea.searchShadow(_geo0); + body->mShadowArea.searchShadow(_vec0); if(body->mTouchNum != 0 && body->_58c == 7) { - exGeo = (ExGeographyObj*)body->mBodyGround.getObject(); + // TODO: is getObject return type wrong or is the cast here ok? first one probably + ExGeographyObj *exGeo = (ExGeographyObj*)body->mBodyGround.getObject(); - JGeometry::TVec3f _geo2; - _geo2.set(0.f, -3.5f, 0.f); + JGeometry::TVec3f _vec2; + _vec2.set(0.f, -3.5f, 0.f); - exGeo->AddVel(_geo0, _geo2); + exGeo->AddVel(_vec0, _vec2); } } void KartGame::WatchEffectAcceleration() { - int num; - KartPad *pad; - KartBody *body; - KartGamePad *gamePad; - - num = mBody->mMynum; - body = mBody; + KartBody *body = mBody; + int num = body->mMynum; + + const KartGamePad *gamePad = GetKartCtrl()->GetDriveCont(num); + const KartPad *pad = GetKartCtrl()->getKartPad(num); - gamePad = GetKartCtrl()->GetDriveCont(num); - pad = GetKartCtrl()->getKartPad(num); if (gamePad->testButton(pad->mAccelBtn)) { body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 1.f, 0.050000001f , 0.050000001f); } else { @@ -104,17 +92,12 @@ void KartGame::WatchEffectAcceleration() { } void KartGame::WatchAcceleration() { - int num; - KartPad *pad; - KartBody *body; - KartGamePad *gamePad; - - num = mBody->mMynum; - body = mBody; + KartBody *body = mBody; + int num = body->mMynum; - gamePad = GetKartCtrl()->GetDriveCont(num); + const KartGamePad *gamePad = GetKartCtrl()->GetDriveCont(num); if ((body->mCarStatus & 0x400000) && (body->getRescue()->mState >= 3)) { - pad = GetKartCtrl()->getKartPad(num); + KartPad *pad = GetKartCtrl()->getKartPad(num); if (gamePad->testButton(pad->mAccelBtn)) { body->_3c8 = GetKartCtrl()->fcnvge(body->_3c8, body->_3d0, 1.f , 1.f); _8 |= 2; @@ -126,29 +109,21 @@ void KartGame::WatchAcceleration() { } void KartGame::DoItmCancel() { - KartBody *body; - - body = mBody; + KartBody *body = mBody; body->mCarStatus |= 0x80000000; GetItemObjMgr()->abortItemShuffle(body->mMynum); } void KartGame::DoStopItm() { - u8 num; - KartBody *body; - ItemObjMgr *itemMgr; - ItemObj *item; - - num = mBody->mMynum; - body = mBody; + KartBody *body = mBody; + u8 num = body->mMynum; - /* probably copy pasted this from DoItmCancel lmao */ body->mCarStatus |= 0x80000000; GetItemObjMgr()->abortItemShuffle(body->mMynum); - itemMgr = GetItemObjMgr(); - item = itemMgr->getKartEquipItem(num, 0); + ItemObjMgr *itemMgr = GetItemObjMgr(); + ItemObj *item = itemMgr->getKartEquipItem(num, 0); itemMgr->deleteHeartItem(num); if (item != nullptr) { @@ -166,21 +141,14 @@ void KartGame::DoStopItm() { } void KartGame::DoChange() { - u8 num; - KartBody *body; - KartGamePad *gpDriver; - KartGamePad *gpCoDriv; - bool possible; - bool change; - - num = mBody->mMynum; - body = mBody; + KartBody *body = mBody; + int num = body->mMynum; - gpDriver = GetKartCtrl()->GetDriveCont(num); - gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); - - change = false; - possible = GetKartCtrl()->MakeChangePossible(num); + const KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(num); + const KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); + + bool change = false; + const bool possible = GetKartCtrl()->MakeChangePossible(num); if (body->getChecker()->CheckCheange(num)) { mTimeToChange = 0; @@ -237,23 +205,17 @@ void KartGame::DoChange() { void KartGame::DoSlide() {} void KartGame::DoDriftTurboSterr() { - KartBody *body; - - body = mBody; + KartBody *body = mBody; if (body->mDriftSterr != 0 && body->mDriftSterr < 0x1E) body->mDriftSterr++; } void KartGame::SetDriftTurboSterr() { - int num; - int threshold; - KartBody *body; - - body = mBody; - num = mBody->mMynum; + KartBody *body = mBody; + const int num = mBody->mMynum; - threshold = (body->mGameStatus & gsHasCoDriver) ? 2 : 6; + const int threshold = (body->mGameStatus & gsHasCoDriver) ? 2 : 6; if ((body->mDriftSterr) < threshold) return; From ef73daef578da5e789ddaa9a94a11e2ec8c87c74 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sat, 11 Oct 2025 16:46:46 +0200 Subject: [PATCH 12/34] KartCtrlStrat: WIP --- include/Yamamoto/kartBody.h | 3 ++- src/Yamamoto/kartBody.cpp | 2 +- src/Yamamoto/kartCtrlStrat.cpp | 46 ++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index ff6bd5cb..71b46f7b 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -34,6 +34,7 @@ enum GameStatus { }; enum CarStatus { + csDoesSlide = 1<<2, csInDriverChange = 1<<7, }; @@ -319,7 +320,7 @@ class KartBody u8 mMynum; u8 _5b4; u8 _5b5; // also some timer - u8 _5b6; // dash timer? + u8 mSlideTimer; // dash timer? u8 mCameraNum; u8 _5b8[8]; u8 _5c0; diff --git a/src/Yamamoto/kartBody.cpp b/src/Yamamoto/kartBody.cpp index 606ee270..a2b23db5 100644 --- a/src/Yamamoto/kartBody.cpp +++ b/src/Yamamoto/kartBody.cpp @@ -1926,7 +1926,7 @@ void KartBody::Init(int index) { _5b0 = 0; _5b1 = 0; mDriver = 0; - _5b6 = 0; + mSlideTimer = 0; mMynum = 0; _5c5 = 0; _592 = 0; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index ff2352ce..706e5b63 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -68,7 +68,7 @@ void KartGame::GetGorundTireNum() { if(body->mTouchNum != 0 && body->_58c == 7) { // TODO: is getObject return type wrong or is the cast here ok? first one probably - ExGeographyObj *exGeo = (ExGeographyObj*)body->mBodyGround.getObject(); + ExGeographyObj *exGeo = static_cast(body->mBodyGround.getObject()); JGeometry::TVec3f _vec2; _vec2.set(0.f, -3.5f, 0.f); @@ -187,9 +187,9 @@ void KartGame::DoChange() { } else if ((gpDriver->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ) && gpCoDriv->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ)) || mTimeToChange != 0) { - change = true; - mTimeToChange = 0; - } + change = true; + mTimeToChange = 0; + } if (!change) return; @@ -202,7 +202,43 @@ void KartGame::DoChange() { GetKartCtrl()->getKartSound(num)->DoChangeStarSound(); } -void KartGame::DoSlide() {} +void KartGame::DoSlide() { + const int num = mBody->mMynum; + KartBody *body = mBody; + + if (body->getChecker()->CheckPartsClearKey(num) || !(body->mGameStatus & gsHasCoDriver)) { + return; + } + + if (body->mSlideTimer != 0) + body->mSlideTimer--; + + if (body->mSlideTimer == 0) + body->mCarStatus &= ~csDoesSlide; + + if ((body->mCarStatus & csDoesSlide)) { + if (body->mSlideTimer >= 29) { + body->_2cc.x += body->_2f0.x * body->_528; + body->_2cc.y += body->_2f0.y * body->_528; + body->_2cc.z += body->_2f0.z * body->_528; + } + + return; + } + + KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); + if (body->getTouchNum() == 0) + return; + + if (GetKartCtrl()->GetCarSpeed(num) <= 50.f) + return; + + if (!gpCoDriv->testTrigger(JUTGamePad::L) && !gpCoDriv->testTrigger(JUTGamePad::R)) { + return; + } + + body->mSlideTimer = 35; +} void KartGame::DoDriftTurboSterr() { KartBody *body = mBody; From d917d715340e315eb2de36dacf901d0d9a37f40b Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 12 Oct 2025 14:29:09 +0200 Subject: [PATCH 13/34] match DoSlide__8KartGameFv --- include/Sato/JPEffectPerformer.h | 3 ++- src/Yamamoto/kartCtrlStrat.cpp | 43 +++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/include/Sato/JPEffectPerformer.h b/include/Sato/JPEffectPerformer.h index 089fe5b3..916b061b 100644 --- a/include/Sato/JPEffectPerformer.h +++ b/include/Sato/JPEffectPerformer.h @@ -16,6 +16,7 @@ class JPEffectPerformer Effect_Unknown6 = 0x6, // Something reflection related...? Effect_Unknown12 = 0x12, // Star react. Effect_Burn = 0x13, + Effect_Unknown1b = 0x1b, // something slide related Effect_Star = 0x1c }; @@ -102,4 +103,4 @@ class JPEffectPerformer // void JPStartFootSmokeEmitterCallBack::draw(JPABaseEmitter *); // void PermissionCounterObserver::reset(); // void PermissionCounterObserver::calc(); -#endif // JPEFFECTPERFORMER_H \ No newline at end of file +#endif // JPEFFECTPERFORMER_H diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 706e5b63..27d5bd92 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -1,5 +1,6 @@ #include "Kaneshige/RaceMgr.h" #include "Sato/ItemObjMgr.h" +#include "Sato/JPEffectPerformer.h" #include "Yamamoto/KartGame.h" #include "Yamamoto/kartBody.h" #include "Yamamoto/kartCtrl.h" @@ -210,11 +211,13 @@ void KartGame::DoSlide() { return; } - if (body->mSlideTimer != 0) + if (body->mSlideTimer != 0) { body->mSlideTimer--; + } - if (body->mSlideTimer == 0) + if (body->mSlideTimer == 0) { body->mCarStatus &= ~csDoesSlide; + } if ((body->mCarStatus & csDoesSlide)) { if (body->mSlideTimer >= 29) { @@ -227,17 +230,45 @@ void KartGame::DoSlide() { } KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); - if (body->getTouchNum() == 0) - return; - - if (GetKartCtrl()->GetCarSpeed(num) <= 50.f) + if (body->getTouchNum() == 0 || (GetKartCtrl()->GetCarSpeed(num) <= 50.f)) { return; + } if (!gpCoDriv->testTrigger(JUTGamePad::L) && !gpCoDriv->testTrigger(JUTGamePad::R)) { return; } body->mSlideTimer = 35; + + if (RaceMgr::getCurrentManager()->isMirror()) { + if (gpCoDriv->testTrigger(JUTGamePad::L)) { + body->_528 = -50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x10; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 1); + } else if (gpCoDriv->testTrigger(JUTGamePad::R)) { + body->_528 = 50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x20; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 0); + } + } else { + if (gpCoDriv->testTrigger(JUTGamePad::R)) { + body->_528 = -50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x10; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 1); + } else if (gpCoDriv->testTrigger(JUTGamePad::L)) { + body->_528 = 50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x20; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 0); + } + } + + body->_2cc.x += body->_2f0.x * body->_528; + body->_2cc.y += body->_2f0.y * body->_528; + body->_2cc.z += body->_2f0.z * body->_528; + + body->mCarStatus |= csDoesSlide; + GetKartCtrl()->getKartSound(num)->DoStrikeSound(); + GetKartCtrl()->getKartSound(num)->DoTandemVoice(2); } void KartGame::DoDriftTurboSterr() { From 22aa72aafee6962804edf872f396b0d76aa0749e Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 12 Oct 2025 14:33:34 +0200 Subject: [PATCH 14/34] enum cleanup --- include/Yamamoto/kartBody.h | 18 +++++++++--------- src/Yamamoto/kartCtrlStrat.cpp | 22 +++++++++++----------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 71b46f7b..a3b7abb3 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -29,18 +29,18 @@ #include "Yamamoto/KartTire.h" #include "Yamamoto/KartTumble.h" -enum GameStatus { - gsHasCoDriver = 1<<0, -}; - -enum CarStatus { - csDoesSlide = 1<<2, - csInDriverChange = 1<<7, -}; - class KartBody { public: + enum GameStatus { + HasCoDriver = 1<<0, + }; + + enum CarStatus { + DoesSlide = 1<<2, + InDriverChange = 1<<7, + }; + KartBody() {} void DegubBody(u32); diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 27d5bd92..d58aa7a0 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -160,13 +160,13 @@ void KartGame::DoChange() { mTimeToChange--; // single player kart - if ((body->mGameStatus & gsHasCoDriver) == false) { + if ((body->mGameStatus & KartBody::HasCoDriver) == false) { if (gpDriver->testTrigger(GetKartCtrl()->getKartPad(num)->mTrigZ)) mTimeToChange = 20; - if (body->mCarStatus & csInDriverChange) { + if (body->mCarStatus & KartBody::InDriverChange) { if (!(body->mExModels[0])->IsChange() && !(body->mExModels[1])->IsChange()) - body->mCarStatus &= ~csInDriverChange; + body->mCarStatus &= ~KartBody::InDriverChange; } else if ((gpDriver->testTrigger(GetKartCtrl()->getKartPad(num)->mTrigZ) || possible || mTimeToChange != 0)) { @@ -174,7 +174,7 @@ void KartGame::DoChange() { mTimeToChange = 0; } // with co-driver, but already in change - } else if (body->mCarStatus & csInDriverChange) { + } else if (body->mCarStatus & KartBody::InDriverChange) { if (gpDriver->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ) && gpCoDriv->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ)) { mTimeToChange = 20; @@ -182,7 +182,7 @@ void KartGame::DoChange() { if (!(body->mExModels[0])->IsChange() && !(body->mExModels[1])->IsChange()) { - body->mCarStatus &= ~csInDriverChange; + body->mCarStatus &= ~KartBody::InDriverChange; } // with co-driver and ready to change } else if ((gpDriver->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ) && @@ -196,7 +196,7 @@ void KartGame::DoChange() { return; body->mCarStatus &= ~(1ull<<38); - body->mCarStatus |= csInDriverChange;; + body->mCarStatus |= KartBody::InDriverChange;; GetKartCtrl()->getKartAnime(num)->mFlags |= 1; GetKartCtrl()->getKartSound(num)->DoChangeVoice(); @@ -207,7 +207,7 @@ void KartGame::DoSlide() { const int num = mBody->mMynum; KartBody *body = mBody; - if (body->getChecker()->CheckPartsClearKey(num) || !(body->mGameStatus & gsHasCoDriver)) { + if (body->getChecker()->CheckPartsClearKey(num) || !(body->mGameStatus & KartBody::HasCoDriver)) { return; } @@ -216,10 +216,10 @@ void KartGame::DoSlide() { } if (body->mSlideTimer == 0) { - body->mCarStatus &= ~csDoesSlide; + body->mCarStatus &= ~KartBody::DoesSlide; } - if ((body->mCarStatus & csDoesSlide)) { + if ((body->mCarStatus & KartBody::DoesSlide)) { if (body->mSlideTimer >= 29) { body->_2cc.x += body->_2f0.x * body->_528; body->_2cc.y += body->_2f0.y * body->_528; @@ -266,7 +266,7 @@ void KartGame::DoSlide() { body->_2cc.y += body->_2f0.y * body->_528; body->_2cc.z += body->_2f0.z * body->_528; - body->mCarStatus |= csDoesSlide; + body->mCarStatus |= KartBody::DoesSlide; GetKartCtrl()->getKartSound(num)->DoStrikeSound(); GetKartCtrl()->getKartSound(num)->DoTandemVoice(2); } @@ -282,7 +282,7 @@ void KartGame::SetDriftTurboSterr() { KartBody *body = mBody; const int num = mBody->mMynum; - const int threshold = (body->mGameStatus & gsHasCoDriver) ? 2 : 6; + const int threshold = (body->mGameStatus & KartBody::HasCoDriver) ? 2 : 6; if ((body->mDriftSterr) < threshold) return; From cf87690691787859c44b998299a53725f3ef4727 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 9 Nov 2025 17:32:38 +0100 Subject: [PATCH 15/34] match CheckDriftTurbo__8KartGameFv --- include/Yamamoto/kartBody.h | 5 +++ src/Yamamoto/kartCtrlStrat.cpp | 61 ++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index a3b7abb3..825dfeb4 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -32,13 +32,18 @@ class KartBody { public: + // TODO: move in KartGame enum GameStatus { HasCoDriver = 1<<0, + GsUnknown3 = 1<<3, }; enum CarStatus { + CsUnknown0 = 1<<0, + CsUnknown1 = 1<<1, DoesSlide = 1<<2, InDriverChange = 1<<7, + CsUnknown9 = 1<<9, }; KartBody() {} diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index d58aa7a0..ed04010a 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -299,8 +299,65 @@ void KartGame::SetDriftTurboSterr() { body->mDriftSterr = 0; } -void KartGame::CheckDriftTurbo() { - // void JUTGamePad::getMainStickX() const {} +void KartGame::CheckDriftTurbo(void) { + KartBody *body = mBody; + int num = body->mMynum; + + if (GetKartCtrl()->GetCarSpeed(num) <= 50.f) { + body->mCarStatus &= ~(1ull<<41); + body->mMTBoost = 0; + body->mDriftSterr = 0; + body->mMTState = 0; + return; + } + + if (body->mGameStatus & KartBody::GsUnknown3) + return; + + bool didDriftSterr = false; + KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); + + if (body->mCarStatus & KartBody::CsUnknown0) { + if (body->mGameStatus & KartBody::HasCoDriver) { + if (gpCoDriv->getMainStickX() < 0.5f) { + didDriftSterr = true; + DoDriftTurboSterr(); + } + } else if (body->mFrame >= -0.5f) { + didDriftSterr = true; + DoDriftTurboSterr(); + } + + if (!didDriftSterr) { + SetDriftTurboSterr(); + body->mDriftSterr = 1; + } + } else { + if ((body->mCarStatus & KartBody::CsUnknown1) != 0) { + if (body->mGameStatus & KartBody::HasCoDriver) { + if (gpCoDriv->getMainStickX() > -0.30000001f) { + didDriftSterr = true; + DoDriftTurboSterr(); + } + } else { + if (body->mFrame <= 0.5f) { + didDriftSterr = true; + DoDriftTurboSterr(); + } + } + + if (!didDriftSterr) { + SetDriftTurboSterr(); + body->mDriftSterr = 1; + } + } else { + body->mMTState = 0; + body->mDriftSterr = 0; + } + } + + body->mCarStatus &= ~(1ull<<41); + body->mMTBoost = 0; } void KartGame::DoWarmUpRoll() {} From f57f96d2231f1c153868f542128820622d037149 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 11 Nov 2025 11:53:35 +0100 Subject: [PATCH 16/34] match DoRollAnim__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 57 +++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index ed04010a..b9223697 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -362,7 +362,62 @@ void KartGame::CheckDriftTurbo(void) { void KartGame::DoWarmUpRoll() {} -void KartGame::DoRollAnim() {} +void KartGame::DoRollAnim() { + KartBody *body = mBody; + int kartNo = body->mMynum; + + KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(kartNo); + if (gpDriver->getMainStickX() >= 0.2f) { + body->_394 = -1.0f; + } else if (gpDriver->getMainStickX() <= -0.2f) { + body->_394 = 1.0f; + } else { + body->_394 = .0f; + } + + body->mLiftframe = GetKartCtrl()->fcnvge(body->mLiftframe, body->_394, 0.050000001f, 0.050000001f); + + if (GetKartCtrl()->getKartAnime(kartNo)->IsDrift(kartNo) == false && + GetKartCtrl()->getKartAnime(kartNo)->IsDriftStart(kartNo) == false) { + + if (gpDriver->getMainStickX() >= 0.2f) { + body->_39c = -1.0f; + } else if (gpDriver->getMainStickX() <= -0.2f) { + body->_39c = 1.0f; + } else { + body->_39c = 0.0f; + } + + body->_398 = GetKartCtrl()->fcnvge(body->_398, body->_39c, 0.050000001f, + 0.050000001f); + } + + if (body->mCarStatus & KartBody::CsUnknown0) { + body->_394 = -1.0f; + body->mLiftframe = -1.0f; + if (GetKartCtrl()->getKartAnime(kartNo)->IsDriftLeft(kartNo)) { + body->_39c = 1.0f; + body->_398 = 1.0f; + } else { + body->_39c = -1.0f; + body->_398 = -1.0f; + } + + return; + } + + if (body->mCarStatus & KartBody::CsUnknown1) { + body->_394 = 1.0f; + body->mLiftframe = 1.0f; + if (GetKartCtrl()->getKartAnime(kartNo)->IsDriftRight(kartNo)) { + body->_39c = -1.0f; + body->_398 = -1.0f; + } else { + body->_39c = 1.0f; + body->_398 = 1.0f; + } + } +} void KartGame::DoDriftClear() {} From 9b091da67716655639bfb5efb5610dc9299ed502 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 11 Nov 2025 12:25:20 +0100 Subject: [PATCH 17/34] match DoDriftClear__8KartGameFv --- include/Yamamoto/kartBody.h | 1 + src/Yamamoto/kartCtrlStrat.cpp | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 825dfeb4..228facda 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -42,6 +42,7 @@ class KartBody CsUnknown0 = 1<<0, CsUnknown1 = 1<<1, DoesSlide = 1<<2, + CsUnknown3 = 1<<3, InDriverChange = 1<<7, CsUnknown9 = 1<<9, }; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index b9223697..657cde31 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -419,7 +419,15 @@ void KartGame::DoRollAnim() { } } -void KartGame::DoDriftClear() {} +void KartGame::DoDriftClear() { + KartBody *body = mBody; + + body->mMTBoost = 0; + body->mDriftSterr = 0; + body->mMTState = 0; + body->mCarStatus &= ~(1ull << 41); + body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | (1ull << 47) | (1ull << 48)); +} void KartGame::DoRoll() {} From 58f054dea7f307c903c1ff9c379700a6ca6dde41 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sat, 29 Nov 2025 02:25:55 +0100 Subject: [PATCH 18/34] match DoRoll__8KartGameFv (98%) --- src/Yamamoto/kartCtrlStrat.cpp | 47 +++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 657cde31..b4716706 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -429,7 +429,52 @@ void KartGame::DoDriftClear() { body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | (1ull << 47) | (1ull << 48)); } -void KartGame::DoRoll() {} +void KartGame::DoRoll() { + KartBody *body = mBody; + + MakeJump(); + + // TODO: `fmr f31, f1` after DoWarmupRoll??? Is it returning? + DoWarmUpRoll(); + + if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f || GetKartCtrl()->GetCarSpeed(body->mMynum) <= 40.f && body->_3c8 == 0.f) { + DoDriftClear(); + } + + if (GetKartCtrl()->GetCarSpeed(body->mMynum) < 40.f && body->_510 > 2.44222f) { + DoDriftClear(); + } + + if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 80.f && body->_3cc != 0.f) { + DoDriftClear(); + } + + if (body->mCarStatus & KartBody::CsUnknown3) { + DoDriftClear(); + } + + f32 _unk0 = body->_458; + if (_unk0 < 2.f) { + body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, _unk0 * 0.0088235298f, 0.1f, 0.1f); + } else { + if (_unk0 < 18.f) { + body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, _unk0 * 0.0023529413f, 0.1f, 0.1f); + } else { + int touchNum = body->getTouchNum(); + f32 _unk2 = (touchNum == 0) + ? 0.023529412f * _unk0 + : (body->_4f8 / 170.f) * _unk0; + + GetKartCtrl()->ChaseFnumber(&body->_4c4, _unk2, body->_3b4); + } + } + + if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) { + body->_4c4 = 0.f; + } + + DoRollAnim(); +} void KartGame::DoTestPitch() { // void JUTGamePad::getMainStickY() const {} From 081ce790d6cfa4aafb3ba9a1fbb820d6efe42a57 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 13:10:51 +0100 Subject: [PATCH 19/34] match DoWarmUpRoll__8KartGameFv --- include/Kawano/driver.h | 2 + include/Sato/JPEffectPerformer.h | 1 + include/Yamamoto/KartGame.h | 2 +- include/Yamamoto/kartBody.h | 1 + src/Yamamoto/kartCtrlStrat.cpp | 99 +++++++++++++++++++++++++++++++- 5 files changed, 103 insertions(+), 2 deletions(-) diff --git a/include/Kawano/driver.h b/include/Kawano/driver.h index 14f3a791..809ac9cc 100644 --- a/include/Kawano/driver.h +++ b/include/Kawano/driver.h @@ -136,6 +136,8 @@ class DriverModel : public ExModel int IsChange(); int IsChangeBack(); int IsChangeFront(); + int IsSit(); + int IsStand(); public: u8 _8c[0xfc - 0x8c]; diff --git a/include/Sato/JPEffectPerformer.h b/include/Sato/JPEffectPerformer.h index 916b061b..af0e7c01 100644 --- a/include/Sato/JPEffectPerformer.h +++ b/include/Sato/JPEffectPerformer.h @@ -17,6 +17,7 @@ class JPEffectPerformer Effect_Unknown12 = 0x12, // Star react. Effect_Burn = 0x13, Effect_Unknown1b = 0x1b, // something slide related + Effect_Unknown1A = 0x1A, Effect_Star = 0x1c }; diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index 47743d6e..a060eca0 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -22,7 +22,7 @@ class KartGame void DoDriftTurboSterr(); void SetDriftTurboSterr(); void CheckDriftTurbo(); - void DoWarmUpRoll(); + f32 DoWarmUpRoll(); void DoRollAnim(); void DoDriftClear(); void DoRoll(); diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 228facda..e4707420 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -45,6 +45,7 @@ class KartBody CsUnknown3 = 1<<3, InDriverChange = 1<<7, CsUnknown9 = 1<<9, + CsUnknown15 = 1<<15, }; KartBody() {} diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index b4716706..8dcc0dd3 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -360,7 +360,104 @@ void KartGame::CheckDriftTurbo(void) { body->mMTBoost = 0; } -void KartGame::DoWarmUpRoll() {} +f32 KartGame::DoWarmUpRoll() { + int kartNo = mBody->mMynum; + KartBody *body = mBody; + + KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(kartNo); + if (body->mCarStatus & KartBody::DoesSlide) { + body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull<<41 | 1ull<<47 | 1ull<<48); + body->_4d8 = 0.f; + body->_4d4 = 0.f; + body->_4c4 = 0.f; + body->_394 = 0.f; + body->mLiftframe = 0.f; + body->_39c = 0.f; + body->_398 = 0.f; + body->mMTBoost = 0; + body->mDriftSterr = 0; + body->mMTState = 0; + body->mSterrNorm = 0.f; + } + + if (body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1) && + gpDriver->testTrigger(GetKartCtrl()->getKartPad(kartNo)->mTrigL | + GetKartCtrl()->getKartPad(kartNo)->mTrigR)) { + DoDriftClear(); + return 0.f; + } + + float ret; + if (gpDriver->testButton(GetKartCtrl()->getKartPad(kartNo)->mTrigL | + GetKartCtrl()->getKartPad(kartNo)->mTrigR)) { + if (body->mCarStatus & KartBody::CsUnknown0) { + body->mCarStatus |= (KartBody::CsUnknown0 | 1ull<<47); + body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull<<48); + ret = 150.f; + CheckDriftTurbo(); + } else if (body->mCarStatus & KartBody::CsUnknown1) { + body->mCarStatus |= (KartBody::CsUnknown1 | 1ull<<48); + body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull<<47); + ret = -150.f; + CheckDriftTurbo(); + } else { + ret = 0.f; + if (body->mFrame < -0.8f) { + ret = 150.f; + body->_4d4 = 0.f; + body->mCarStatus |= (KartBody::CsUnknown0 | 1ull<<47); + body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull<<48); + body->mSterrNorm = 0.043611001f; + if (body->mFrame < -0.90000004f) { + body->mSterrNorm = 0.1133888f; + } + } else if (body->mFrame > 0.8f) { + ret = -150.f; + body->_4d4 = 0.f; + body->mCarStatus |= (KartBody::CsUnknown1 | 1ull<<48); + body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull<<47); + body->mSterrNorm = 0.043611001f; + if (body->mFrame < 0.90000004f) { + body->mSterrNorm = 0.1133888f; + } + } else { + body->mMTBoost = 0; + body->mDriftSterr = 0; + body->mMTState = 0; + body->mCarStatus &= ~(1ull<<41); + body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull<<47 | 1ull<<48); + } + } + + KartAnime *anime = GetKartCtrl()->getKartAnime(kartNo); + if (!anime->IsProhibition(kartNo) && !body->mDriverModels[0]->IsSit() && + !body->getChecker()->CheckOnlyTandemPartsClearKey(kartNo) && + !(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) { + GetKartCtrl()->getKartAnime(kartNo)->mFlags |= 0x200u; + } + } else { + if (!(body->mCarStatus & KartBody::CsUnknown15) && body->mDriverModels[0]->IsSit() && + !body->mDriverModels[0]->IsStand() && !body->getChecker()->CheckOnlyTandemPartsClearKey(kartNo)) { + GetKartCtrl()->getKartAnime(kartNo)->mFlags |= 0x400u; + } + + if (body->mMTState >= 2u) { + body->mCarStatus |= 1ull<<41; + body->mMTBoost = body->mMTBoostMax; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1A, kartNo, body->mPos, 0); + GetKartCtrl()->getKartSound(body->mMynum)->DoKartMiniTuroboSound(); + GetKartCtrl()->getKartSound(body->mMynum)->DoTandemVoice(0); + body->getStrat()->DoMotor(MotorManager::MotorType_6); + } + + body->mDriftSterr = 0; + body->mMTState = 0; + body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull<<47 | 1ull<<48); + ret = 0.f; + } + + return ret; +} void KartGame::DoRollAnim() { KartBody *body = mBody; From 6f293e77ad085a0484c441cfce9d1fdf48ae7dae Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 13:20:41 +0100 Subject: [PATCH 20/34] match DoRoll__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 8dcc0dd3..7d1ec8ad 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -531,8 +531,7 @@ void KartGame::DoRoll() { MakeJump(); - // TODO: `fmr f31, f1` after DoWarmupRoll??? Is it returning? - DoWarmUpRoll(); + f32 warmupRollRet = DoWarmUpRoll(); if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f || GetKartCtrl()->GetCarSpeed(body->mMynum) <= 40.f && body->_3c8 == 0.f) { DoDriftClear(); @@ -550,17 +549,16 @@ void KartGame::DoRoll() { DoDriftClear(); } - f32 _unk0 = body->_458; - if (_unk0 < 2.f) { - body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, _unk0 * 0.0088235298f, 0.1f, 0.1f); + if (body->_458 < 2.f) { + body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, warmupRollRet * 0.0088235298f, 0.1f, 0.1f); } else { - if (_unk0 < 18.f) { - body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, _unk0 * 0.0023529413f, 0.1f, 0.1f); + if (body->_458 < 18.f) { + body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, warmupRollRet * 0.0023529413f, 0.1f, 0.1f); } else { int touchNum = body->getTouchNum(); f32 _unk2 = (touchNum == 0) - ? 0.023529412f * _unk0 - : (body->_4f8 / 170.f) * _unk0; + ? 0.023529412f * warmupRollRet + : (body->_4f8 / 170.f) * warmupRollRet; GetKartCtrl()->ChaseFnumber(&body->_4c4, _unk2, body->_3b4); } From 6323753525e507f85c5337ec0f613d18b5a4aa1b Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 14:06:03 +0100 Subject: [PATCH 21/34] match DoRollOver__8KartGameFv --- include/Yamamoto/KartGame.h | 2 +- include/Yamamoto/kartBody.h | 2 ++ src/Yamamoto/kartCtrlStrat.cpp | 13 ++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index a060eca0..ffe0e9a7 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -30,7 +30,7 @@ class KartGame void DoLiftTurbo(); void DoTurbo(); void DoRollThrow(); - void DoRollOver(); + int DoRollOver(); void DoWanWan(); void DoPushStart(); void DoBalance(f32 *, f32); diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index e4707420..138b0f9c 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -45,7 +45,9 @@ class KartBody CsUnknown3 = 1<<3, InDriverChange = 1<<7, CsUnknown9 = 1<<9, + CsUnknown12 = 1<<12, CsUnknown15 = 1<<15, + CsUnknown18 = 1<<18, }; KartBody() {} diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 7d1ec8ad..4a975813 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -581,7 +581,18 @@ void KartGame::DoTurbo() {} void KartGame::DoRollThrow() {} -void KartGame::DoRollOver() {} +// literally a no-op always returning 0 +int KartGame::DoRollOver() { + KartBody *body = mBody; + + if (body->getTouchNum() == 0 || + body->mCarStatus & (KartBody::CsUnknown12 | KartBody::CsUnknown18) || + body->mGameStatus & (KartBody::GsUnknown3)) { + return 0; + } + + return 0; +} void KartGame::DoWanWan() { // void ItemWanWanObj::getDifVel() const {} From 8d1b8aaba0d9f6de56594d9a6310b06aa08b2e25 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 18:50:34 +0100 Subject: [PATCH 22/34] match DoTestPitch__8KartGameFv --- include/Yamamoto/kartBody.h | 1 + src/Yamamoto/kartCtrlStrat.cpp | 37 +++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 138b0f9c..971894b7 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -44,6 +44,7 @@ class KartBody DoesSlide = 1<<2, CsUnknown3 = 1<<3, InDriverChange = 1<<7, + CsUnknown8 = 1<<8, CsUnknown9 = 1<<9, CsUnknown12 = 1<<12, CsUnknown15 = 1<<15, diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 4a975813..a9c3a4fe 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -1,4 +1,5 @@ #include "Kaneshige/RaceMgr.h" +#include "Osako/kartPad.h" #include "Sato/ItemObjMgr.h" #include "Sato/JPEffectPerformer.h" #include "Yamamoto/KartGame.h" @@ -572,7 +573,41 @@ void KartGame::DoRoll() { } void KartGame::DoTestPitch() { - // void JUTGamePad::getMainStickY() const {} + KartBody *body = mBody; + + KartGamePad *pad = GetKartCtrl()->GetDriveCont(body->mMynum); + if (body->getTouchNum() != 0) { + body->_4c0 = 0.f; + if (body->mCarStatus & (KartBody::CsUnknown8 | KartBody::CsUnknown9)) { + body->getStrat()->PitchClear(); + } + return; + } + + + f32 mainY = pad->getMainStickY(); + if (mainY > 0.f) { + body->mCarStatus |= KartBody::CsUnknown9; + body->mCarStatus &= ~KartBody::CsUnknown8; + } else if (mainY < 0.f) { + body->mCarStatus |= KartBody::CsUnknown8; + body->mCarStatus &= ~KartBody::CsUnknown9; + } + + f32 x; + f32 y = 0.0; + if (mainY < 0.5 && mainY > -0.5f) { + x = 0.0; + } else { + y = 0.2f; + x = 1.5f * mainY; + } + + GetKartCtrl()->ChaseFnumber(&body->_4c0, x, y); + if (body->_4c0 == 0.f) { + body->getStrat()->PitchClear(); + } + } void KartGame::DoLiftTurbo() {} From dacdc9106b4fdbc9cfe8774199e239c8dc32a645 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 28 Jan 2026 18:15:09 +0100 Subject: [PATCH 23/34] wip DoLiftTurbo__8KartGameFv --- include/Yamamoto/kartBody.h | 5 + src/Yamamoto/kartCtrlStrat.cpp | 362 ++++++++++++++++++++------------- 2 files changed, 221 insertions(+), 146 deletions(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 971894b7..ddb25c07 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -43,12 +43,17 @@ class KartBody CsUnknown1 = 1<<1, DoesSlide = 1<<2, CsUnknown3 = 1<<3, + CsUnknown5 = 1<<5, InDriverChange = 1<<7, CsUnknown8 = 1<<8, CsUnknown9 = 1<<9, + CsUnknown10 = 1<<10, + CsUnknown11 = 1<<11, CsUnknown12 = 1<<12, CsUnknown15 = 1<<15, CsUnknown18 = 1<<18, + CsUnknown26 = 1<<26, + CsUnknown27 = 1<<27, }; KartBody() {} diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index a9c3a4fe..4bea6e5b 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -1,3 +1,4 @@ +#include "JSystem/JGeometry/Vec.h" #include "Kaneshige/RaceMgr.h" #include "Osako/kartPad.h" #include "Sato/ItemObjMgr.h" @@ -7,6 +8,7 @@ #include "Yamamoto/kartCtrl.h" #include "JSystem/JAudio/JASFakeMatch2.h" +#include "dolphin/mtx.h" // comments inside functions are inline functions being called in that function @@ -62,15 +64,14 @@ void KartGame::GetGorundTireNum() { // TODO: what kind of vectors are this? JGeometry::TVec3f _vec0; - _vec0.set(body->mPlayerPosMtx[0][3], - body->mPlayerPosMtx[1][3], - body->mPlayerPosMtx[2][3]); + _vec0.set(body->mPlayerPosMtx[0][3], body->mPlayerPosMtx[1][3], body->mPlayerPosMtx[2][3]); body->mShadowArea.searchShadow(_vec0); - if(body->mTouchNum != 0 && body->_58c == 7) { - // TODO: is getObject return type wrong or is the cast here ok? first one probably - ExGeographyObj *exGeo = static_cast(body->mBodyGround.getObject()); + if (body->mTouchNum != 0 && body->_58c == 7) { + // TODO: is getObject return type wrong or is the cast here ok? + // first one probably + ExGeographyObj *exGeo = static_cast(body->mBodyGround.getObject()); JGeometry::TVec3f _vec2; _vec2.set(0.f, -3.5f, 0.f); @@ -82,14 +83,14 @@ void KartGame::GetGorundTireNum() { void KartGame::WatchEffectAcceleration() { KartBody *body = mBody; int num = body->mMynum; - + const KartGamePad *gamePad = GetKartCtrl()->GetDriveCont(num); const KartPad *pad = GetKartCtrl()->getKartPad(num); if (gamePad->testButton(pad->mAccelBtn)) { - body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 1.f, 0.050000001f , 0.050000001f); + body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 1.f, 0.050000001f, 0.050000001f); } else { - body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 0.f, 0.050000001f , 0.050000001f); + body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 0.f, 0.050000001f, 0.050000001f); } } @@ -101,7 +102,7 @@ void KartGame::WatchAcceleration() { if ((body->mCarStatus & 0x400000) && (body->getRescue()->mState >= 3)) { KartPad *pad = GetKartCtrl()->getKartPad(num); if (gamePad->testButton(pad->mAccelBtn)) { - body->_3c8 = GetKartCtrl()->fcnvge(body->_3c8, body->_3d0, 1.f , 1.f); + body->_3c8 = GetKartCtrl()->fcnvge(body->_3c8, body->_3d0, 1.f, 1.f); _8 |= 2; } else { GetKartCtrl()->ChaseFnumber(&body->_3c8, 0.f, 1.f); @@ -129,16 +130,14 @@ void KartGame::DoStopItm() { itemMgr->deleteHeartItem(num); if (item != nullptr) { - item->IsSuccessionItem() - ? item->setChildStateForceDisappear() - : item->setStateForceDisappear(); + item->IsSuccessionItem() ? item->setChildStateForceDisappear() + : item->setStateForceDisappear(); } item = itemMgr->getKartEquipItem(num, 1); if (item != nullptr) { - item->IsSuccessionItem() - ? item->setChildStateForceDisappear() - : item->setStateForceDisappear(); + item->IsSuccessionItem() ? item->setChildStateForceDisappear() + : item->setStateForceDisappear(); } } @@ -148,7 +147,7 @@ void KartGame::DoChange() { const KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(num); const KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); - + bool change = false; const bool possible = GetKartCtrl()->MakeChangePossible(num); @@ -169,26 +168,25 @@ void KartGame::DoChange() { if (!(body->mExModels[0])->IsChange() && !(body->mExModels[1])->IsChange()) body->mCarStatus &= ~KartBody::InDriverChange; - } else if ((gpDriver->testTrigger(GetKartCtrl()->getKartPad(num)->mTrigZ) - || possible || mTimeToChange != 0)) { + } else if ((gpDriver->testTrigger(GetKartCtrl()->getKartPad(num)->mTrigZ) || possible || + mTimeToChange != 0)) { change = true; mTimeToChange = 0; } - // with co-driver, but already in change + // with co-driver, but already in change } else if (body->mCarStatus & KartBody::InDriverChange) { if (gpDriver->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ) && gpCoDriv->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ)) { mTimeToChange = 20; } - if (!(body->mExModels[0])->IsChange() && - !(body->mExModels[1])->IsChange()) { + if (!(body->mExModels[0])->IsChange() && !(body->mExModels[1])->IsChange()) { body->mCarStatus &= ~KartBody::InDriverChange; } - // with co-driver and ready to change + // with co-driver and ready to change } else if ((gpDriver->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ) && gpCoDriv->testButton(GetKartCtrl()->getKartPad(num)->mTrigZ)) || - mTimeToChange != 0) { + mTimeToChange != 0) { change = true; mTimeToChange = 0; } @@ -196,8 +194,8 @@ void KartGame::DoChange() { if (!change) return; - body->mCarStatus &= ~(1ull<<38); - body->mCarStatus |= KartBody::InDriverChange;; + body->mCarStatus &= ~(1ull << 38); + body->mCarStatus |= KartBody::InDriverChange; GetKartCtrl()->getKartAnime(num)->mFlags |= 1; GetKartCtrl()->getKartSound(num)->DoChangeVoice(); @@ -208,7 +206,8 @@ void KartGame::DoSlide() { const int num = mBody->mMynum; KartBody *body = mBody; - if (body->getChecker()->CheckPartsClearKey(num) || !(body->mGameStatus & KartBody::HasCoDriver)) { + if (body->getChecker()->CheckPartsClearKey(num) || + !(body->mGameStatus & KartBody::HasCoDriver)) { return; } @@ -242,34 +241,34 @@ void KartGame::DoSlide() { body->mSlideTimer = 35; if (RaceMgr::getCurrentManager()->isMirror()) { - if (gpCoDriv->testTrigger(JUTGamePad::L)) { - body->_528 = -50.f * body->_3a4; - GetKartCtrl()->getKartAnime(num)->mFlags |= 0x10; - JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 1); - } else if (gpCoDriv->testTrigger(JUTGamePad::R)) { - body->_528 = 50.f * body->_3a4; - GetKartCtrl()->getKartAnime(num)->mFlags |= 0x20; + if (gpCoDriv->testTrigger(JUTGamePad::L)) { + body->_528 = -50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x10; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 1); + } else if (gpCoDriv->testTrigger(JUTGamePad::R)) { + body->_528 = 50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x20; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 0); + } + } else { + if (gpCoDriv->testTrigger(JUTGamePad::R)) { + body->_528 = -50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x10; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 1); + } else if (gpCoDriv->testTrigger(JUTGamePad::L)) { + body->_528 = 50.f * body->_3a4; + GetKartCtrl()->getKartAnime(num)->mFlags |= 0x20; JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 0); - } - } else { - if (gpCoDriv->testTrigger(JUTGamePad::R)) { - body->_528 = -50.f * body->_3a4; - GetKartCtrl()->getKartAnime(num)->mFlags |= 0x10; - JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 1); - } else if (gpCoDriv->testTrigger(JUTGamePad::L)) { - body->_528 = 50.f * body->_3a4; - GetKartCtrl()->getKartAnime(num)->mFlags |= 0x20; - JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1b, num, body->mPos, 0); - } - } - - body->_2cc.x += body->_2f0.x * body->_528; - body->_2cc.y += body->_2f0.y * body->_528; - body->_2cc.z += body->_2f0.z * body->_528; - - body->mCarStatus |= KartBody::DoesSlide; - GetKartCtrl()->getKartSound(num)->DoStrikeSound(); - GetKartCtrl()->getKartSound(num)->DoTandemVoice(2); + } + } + + body->_2cc.x += body->_2f0.x * body->_528; + body->_2cc.y += body->_2f0.y * body->_528; + body->_2cc.z += body->_2f0.z * body->_528; + + body->mCarStatus |= KartBody::DoesSlide; + GetKartCtrl()->getKartSound(num)->DoStrikeSound(); + GetKartCtrl()->getKartSound(num)->DoTandemVoice(2); } void KartGame::DoDriftTurboSterr() { @@ -290,9 +289,9 @@ void KartGame::SetDriftTurboSterr() { body->mMTState++; if (body->mMTState == 1) - GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100C9); + GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100C9); else if (body->mMTState == 2) - GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100CA); + GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100CA); if (body->mMTState >= 2) body->mMTState = 2; @@ -301,64 +300,64 @@ void KartGame::SetDriftTurboSterr() { } void KartGame::CheckDriftTurbo(void) { - KartBody *body = mBody; - int num = body->mMynum; + KartBody *body = mBody; + int num = body->mMynum; - if (GetKartCtrl()->GetCarSpeed(num) <= 50.f) { - body->mCarStatus &= ~(1ull<<41); + if (GetKartCtrl()->GetCarSpeed(num) <= 50.f) { + body->mCarStatus &= ~(1ull << 41); body->mMTBoost = 0; - body->mDriftSterr = 0; - body->mMTState = 0; - return; - } - - if (body->mGameStatus & KartBody::GsUnknown3) - return; - - bool didDriftSterr = false; - KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); - - if (body->mCarStatus & KartBody::CsUnknown0) { - if (body->mGameStatus & KartBody::HasCoDriver) { - if (gpCoDriv->getMainStickX() < 0.5f) { - didDriftSterr = true; - DoDriftTurboSterr(); - } - } else if (body->mFrame >= -0.5f) { + body->mDriftSterr = 0; + body->mMTState = 0; + return; + } + + if (body->mGameStatus & KartBody::GsUnknown3) + return; + + bool didDriftSterr = false; + KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); + + if (body->mCarStatus & KartBody::CsUnknown0) { + if (body->mGameStatus & KartBody::HasCoDriver) { + if (gpCoDriv->getMainStickX() < 0.5f) { + didDriftSterr = true; + DoDriftTurboSterr(); + } + } else if (body->mFrame >= -0.5f) { didDriftSterr = true; DoDriftTurboSterr(); - } - - if (!didDriftSterr) { - SetDriftTurboSterr(); - body->mDriftSterr = 1; - } - } else { - if ((body->mCarStatus & KartBody::CsUnknown1) != 0) { - if (body->mGameStatus & KartBody::HasCoDriver) { - if (gpCoDriv->getMainStickX() > -0.30000001f) { - didDriftSterr = true; - DoDriftTurboSterr(); - } - } else { - if (body->mFrame <= 0.5f) { - didDriftSterr = true; - DoDriftTurboSterr(); - } - } - - if (!didDriftSterr) { - SetDriftTurboSterr(); - body->mDriftSterr = 1; - } + } + + if (!didDriftSterr) { + SetDriftTurboSterr(); + body->mDriftSterr = 1; + } + } else { + if ((body->mCarStatus & KartBody::CsUnknown1) != 0) { + if (body->mGameStatus & KartBody::HasCoDriver) { + if (gpCoDriv->getMainStickX() > -0.30000001f) { + didDriftSterr = true; + DoDriftTurboSterr(); + } + } else { + if (body->mFrame <= 0.5f) { + didDriftSterr = true; + DoDriftTurboSterr(); + } + } + + if (!didDriftSterr) { + SetDriftTurboSterr(); + body->mDriftSterr = 1; + } } else { body->mMTState = 0; body->mDriftSterr = 0; } } - body->mCarStatus &= ~(1ull<<41); - body->mMTBoost = 0; + body->mCarStatus &= ~(1ull << 41); + body->mMTBoost = 0; } f32 KartGame::DoWarmUpRoll() { @@ -367,7 +366,8 @@ f32 KartGame::DoWarmUpRoll() { KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(kartNo); if (body->mCarStatus & KartBody::DoesSlide) { - body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull<<41 | 1ull<<47 | 1ull<<48); + body->mCarStatus &= + ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull << 41 | 1ull << 47 | 1ull << 48); body->_4d8 = 0.f; body->_4d4 = 0.f; body->_4c4 = 0.f; @@ -382,8 +382,8 @@ f32 KartGame::DoWarmUpRoll() { } if (body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1) && - gpDriver->testTrigger(GetKartCtrl()->getKartPad(kartNo)->mTrigL | - GetKartCtrl()->getKartPad(kartNo)->mTrigR)) { + gpDriver->testTrigger(GetKartCtrl()->getKartPad(kartNo)->mTrigL | + GetKartCtrl()->getKartPad(kartNo)->mTrigR)) { DoDriftClear(); return 0.f; } @@ -392,13 +392,13 @@ f32 KartGame::DoWarmUpRoll() { if (gpDriver->testButton(GetKartCtrl()->getKartPad(kartNo)->mTrigL | GetKartCtrl()->getKartPad(kartNo)->mTrigR)) { if (body->mCarStatus & KartBody::CsUnknown0) { - body->mCarStatus |= (KartBody::CsUnknown0 | 1ull<<47); - body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull<<48); + body->mCarStatus |= (KartBody::CsUnknown0 | 1ull << 47); + body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull << 48); ret = 150.f; CheckDriftTurbo(); } else if (body->mCarStatus & KartBody::CsUnknown1) { - body->mCarStatus |= (KartBody::CsUnknown1 | 1ull<<48); - body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull<<47); + body->mCarStatus |= (KartBody::CsUnknown1 | 1ull << 48); + body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull << 47); ret = -150.f; CheckDriftTurbo(); } else { @@ -406,8 +406,8 @@ f32 KartGame::DoWarmUpRoll() { if (body->mFrame < -0.8f) { ret = 150.f; body->_4d4 = 0.f; - body->mCarStatus |= (KartBody::CsUnknown0 | 1ull<<47); - body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull<<48); + body->mCarStatus |= (KartBody::CsUnknown0 | 1ull << 47); + body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull << 48); body->mSterrNorm = 0.043611001f; if (body->mFrame < -0.90000004f) { body->mSterrNorm = 0.1133888f; @@ -415,8 +415,8 @@ f32 KartGame::DoWarmUpRoll() { } else if (body->mFrame > 0.8f) { ret = -150.f; body->_4d4 = 0.f; - body->mCarStatus |= (KartBody::CsUnknown1 | 1ull<<48); - body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull<<47); + body->mCarStatus |= (KartBody::CsUnknown1 | 1ull << 48); + body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull << 47); body->mSterrNorm = 0.043611001f; if (body->mFrame < 0.90000004f) { body->mSterrNorm = 0.1133888f; @@ -425,8 +425,9 @@ f32 KartGame::DoWarmUpRoll() { body->mMTBoost = 0; body->mDriftSterr = 0; body->mMTState = 0; - body->mCarStatus &= ~(1ull<<41); - body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull<<47 | 1ull<<48); + body->mCarStatus &= ~(1ull << 41); + body->mCarStatus &= + ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull << 47 | 1ull << 48); } } @@ -434,26 +435,29 @@ f32 KartGame::DoWarmUpRoll() { if (!anime->IsProhibition(kartNo) && !body->mDriverModels[0]->IsSit() && !body->getChecker()->CheckOnlyTandemPartsClearKey(kartNo) && !(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) { - GetKartCtrl()->getKartAnime(kartNo)->mFlags |= 0x200u; + GetKartCtrl()->getKartAnime(kartNo)->mFlags |= 0x200u; } } else { if (!(body->mCarStatus & KartBody::CsUnknown15) && body->mDriverModels[0]->IsSit() && - !body->mDriverModels[0]->IsStand() && !body->getChecker()->CheckOnlyTandemPartsClearKey(kartNo)) { - GetKartCtrl()->getKartAnime(kartNo)->mFlags |= 0x400u; + !body->mDriverModels[0]->IsStand() && + !body->getChecker()->CheckOnlyTandemPartsClearKey(kartNo)) { + GetKartCtrl()->getKartAnime(kartNo)->mFlags |= 0x400u; } if (body->mMTState >= 2u) { - body->mCarStatus |= 1ull<<41; - body->mMTBoost = body->mMTBoostMax; - JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1A, kartNo, body->mPos, 0); - GetKartCtrl()->getKartSound(body->mMynum)->DoKartMiniTuroboSound(); - GetKartCtrl()->getKartSound(body->mMynum)->DoTandemVoice(0); - body->getStrat()->DoMotor(MotorManager::MotorType_6); + body->mCarStatus |= 1ull << 41; + body->mMTBoost = body->mMTBoostMax; + JPEffectPerformer::setEffect(JPEffectPerformer::Effect_Unknown1A, kartNo, body->mPos, + 0); + GetKartCtrl()->getKartSound(body->mMynum)->DoKartMiniTuroboSound(); + GetKartCtrl()->getKartSound(body->mMynum)->DoTandemVoice(0); + body->getStrat()->DoMotor(MotorManager::MotorType_6); } body->mDriftSterr = 0; body->mMTState = 0; - body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull<<47 | 1ull<<48); + body->mCarStatus &= + ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull << 47 | 1ull << 48); ret = 0.f; } @@ -462,7 +466,7 @@ f32 KartGame::DoWarmUpRoll() { void KartGame::DoRollAnim() { KartBody *body = mBody; - int kartNo = body->mMynum; + int kartNo = body->mMynum; KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(kartNo); if (gpDriver->getMainStickX() >= 0.2f) { @@ -473,21 +477,21 @@ void KartGame::DoRollAnim() { body->_394 = .0f; } - body->mLiftframe = GetKartCtrl()->fcnvge(body->mLiftframe, body->_394, 0.050000001f, 0.050000001f); + body->mLiftframe = + GetKartCtrl()->fcnvge(body->mLiftframe, body->_394, 0.050000001f, 0.050000001f); if (GetKartCtrl()->getKartAnime(kartNo)->IsDrift(kartNo) == false && GetKartCtrl()->getKartAnime(kartNo)->IsDriftStart(kartNo) == false) { if (gpDriver->getMainStickX() >= 0.2f) { - body->_39c = -1.0f; + body->_39c = -1.0f; } else if (gpDriver->getMainStickX() <= -0.2f) { - body->_39c = 1.0f; + body->_39c = 1.0f; } else { - body->_39c = 0.0f; + body->_39c = 0.0f; } - body->_398 = GetKartCtrl()->fcnvge(body->_398, body->_39c, 0.050000001f, - 0.050000001f); + body->_398 = GetKartCtrl()->fcnvge(body->_398, body->_39c, 0.050000001f, 0.050000001f); } if (body->mCarStatus & KartBody::CsUnknown0) { @@ -503,7 +507,7 @@ void KartGame::DoRollAnim() { return; } - + if (body->mCarStatus & KartBody::CsUnknown1) { body->_394 = 1.0f; body->mLiftframe = 1.0f; @@ -524,7 +528,8 @@ void KartGame::DoDriftClear() { body->mDriftSterr = 0; body->mMTState = 0; body->mCarStatus &= ~(1ull << 41); - body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | (1ull << 47) | (1ull << 48)); + body->mCarStatus &= + ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | (1ull << 47) | (1ull << 48)); } void KartGame::DoRoll() { @@ -534,7 +539,8 @@ void KartGame::DoRoll() { f32 warmupRollRet = DoWarmUpRoll(); - if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f || GetKartCtrl()->GetCarSpeed(body->mMynum) <= 40.f && body->_3c8 == 0.f) { + if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f || + GetKartCtrl()->GetCarSpeed(body->mMynum) <= 40.f && body->_3c8 == 0.f) { DoDriftClear(); } @@ -554,13 +560,13 @@ void KartGame::DoRoll() { body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, warmupRollRet * 0.0088235298f, 0.1f, 0.1f); } else { if (body->_458 < 18.f) { - body->_4c4 = GetKartCtrl()->fcnvge(body->_4c4, warmupRollRet * 0.0023529413f, 0.1f, 0.1f); + body->_4c4 = + GetKartCtrl()->fcnvge(body->_4c4, warmupRollRet * 0.0023529413f, 0.1f, 0.1f); } else { int touchNum = body->getTouchNum(); - f32 _unk2 = (touchNum == 0) - ? 0.023529412f * warmupRollRet - : (body->_4f8 / 170.f) * warmupRollRet; - + f32 _unk2 = (touchNum == 0) ? 0.023529412f * warmupRollRet + : (body->_4f8 / 170.f) * warmupRollRet; + GetKartCtrl()->ChaseFnumber(&body->_4c4, _unk2, body->_3b4); } } @@ -584,7 +590,6 @@ void KartGame::DoTestPitch() { return; } - f32 mainY = pad->getMainStickY(); if (mainY > 0.f) { body->mCarStatus |= KartBody::CsUnknown9; @@ -607,10 +612,75 @@ void KartGame::DoTestPitch() { if (body->_4c0 == 0.f) { body->getStrat()->PitchClear(); } - } -void KartGame::DoLiftTurbo() {} +void KartGame::DoLiftTurbo() { + KartBody *body = mBody; + + JGeometry::TVec3f vec0; + JGeometry::TVec3f vec1; + JGeometry::TVec3f vec2; + JGeometry::TVec3f vec3; + + if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) + body->_518 = 0.f; + + if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1)) || + body->getTouchNum() <= 1 || + body->mCarStatus & (KartBody::CsUnknown5 | KartBody::CsUnknown10 | KartBody::CsUnknown26 | + KartBody::CsUnknown27) || + body->mBodyGround.getAttribute() == 6) { + body->_564 = 0.f; + body->_518 = 0.f; + return; + } + + if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f) + return; + + if (GetKartCtrl()->GetCarSpeed(body->mMynum) >= 40.f && body->_3c8 != 0.f) { + GetKartCtrl()->DevMatrixByVector(&vec1, &body->mVel, body->_110); + vec1.x *= 1.075f; + vec1.z *= 1.015f; + + if (vec1.z < 0.f) + vec1.z *= -1.f; + + PSMTXMultVecSR(body->_110, &vec1, &body->mVel); + } + + body->_518 = body->_514; + + f32 v0 = body->_518 * (body->_4dc * body->_3c8); + + body->_564 = 0.38f; + f32 v1 = body->_564; + + vec0.set(body->_344.x, body->_344.y, body->_344.z); + + f32 v2 = v1 * v0; + f32 inv = 1.f - v1; + + vec1.set(body->_3a4 * v2, 0.f, body->_3a4 * (v0 * inv)); + + if (body->mCarStatus & KartBody::CsUnknown1) + vec1.x *= -1.f; + + PSMTXMultVec(body->_110, &vec0, &vec2); + PSMTXMultVecSR(body->_110, &vec1, &vec3); + body->DoForce(&vec2, &vec3); + + vec0.set(body->_344.x, body->_344.y, 0.5f * -(body->_344.z)); + vec1.set(body->_4dc * v2, 0.f, body->_3a4 * (body->_4dc * inv)); + + if (body->mCarStatus & KartBody::CsUnknown1) + vec1.x *= -1.f; + + PSMTXMultVec(body->_110, &vec0, &vec2); + PSMTXMultVecSR(body->_110, &vec1, &vec3); + + body->DoForce(&vec2, &vec3); +} void KartGame::DoTurbo() {} @@ -623,7 +693,7 @@ int KartGame::DoRollOver() { if (body->getTouchNum() == 0 || body->mCarStatus & (KartBody::CsUnknown12 | KartBody::CsUnknown18) || body->mGameStatus & (KartBody::GsUnknown3)) { - return 0; + return 0; } return 0; From 8cb31f3147eb083d7fcefa677bb5af9a23ca65d7 Mon Sep 17 00:00:00 2001 From: mina Date: Fri, 3 Apr 2026 00:22:03 +0200 Subject: [PATCH 24/34] kartBody: resolved DriftRight/Left --- include/Yamamoto/kartBody.h | 4 +-- src/Yamamoto/kartCtrlStrat.cpp | 62 +++++++++++++++++----------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index ddb25c07..6293e619 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -39,8 +39,8 @@ class KartBody }; enum CarStatus { - CsUnknown0 = 1<<0, - CsUnknown1 = 1<<1, + DriftLeft = 1<<0, + DriftRight = 1<<1, DoesSlide = 1<<2, CsUnknown3 = 1<<3, CsUnknown5 = 1<<5, diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 4bea6e5b..8f03af66 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -317,7 +317,7 @@ void KartGame::CheckDriftTurbo(void) { bool didDriftSterr = false; KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); - if (body->mCarStatus & KartBody::CsUnknown0) { + if (body->mCarStatus & KartBody::DriftLeft) { if (body->mGameStatus & KartBody::HasCoDriver) { if (gpCoDriv->getMainStickX() < 0.5f) { didDriftSterr = true; @@ -333,7 +333,7 @@ void KartGame::CheckDriftTurbo(void) { body->mDriftSterr = 1; } } else { - if ((body->mCarStatus & KartBody::CsUnknown1) != 0) { + if ((body->mCarStatus & KartBody::DriftRight) != 0) { if (body->mGameStatus & KartBody::HasCoDriver) { if (gpCoDriv->getMainStickX() > -0.30000001f) { didDriftSterr = true; @@ -367,7 +367,7 @@ f32 KartGame::DoWarmUpRoll() { KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(kartNo); if (body->mCarStatus & KartBody::DoesSlide) { body->mCarStatus &= - ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull << 41 | 1ull << 47 | 1ull << 48); + ~(KartBody::DriftLeft | KartBody::DriftRight | 1ull << 41 | 1ull << 47 | 1ull << 48); body->_4d8 = 0.f; body->_4d4 = 0.f; body->_4c4 = 0.f; @@ -381,7 +381,7 @@ f32 KartGame::DoWarmUpRoll() { body->mSterrNorm = 0.f; } - if (body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1) && + if (body->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight) && gpDriver->testTrigger(GetKartCtrl()->getKartPad(kartNo)->mTrigL | GetKartCtrl()->getKartPad(kartNo)->mTrigR)) { DoDriftClear(); @@ -391,14 +391,14 @@ f32 KartGame::DoWarmUpRoll() { float ret; if (gpDriver->testButton(GetKartCtrl()->getKartPad(kartNo)->mTrigL | GetKartCtrl()->getKartPad(kartNo)->mTrigR)) { - if (body->mCarStatus & KartBody::CsUnknown0) { - body->mCarStatus |= (KartBody::CsUnknown0 | 1ull << 47); - body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull << 48); + if (body->mCarStatus & KartBody::DriftLeft) { + body->mCarStatus |= (KartBody::DriftLeft | 1ull << 47); + body->mCarStatus &= ~(KartBody::DriftRight | 1ull << 48); ret = 150.f; CheckDriftTurbo(); - } else if (body->mCarStatus & KartBody::CsUnknown1) { - body->mCarStatus |= (KartBody::CsUnknown1 | 1ull << 48); - body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull << 47); + } else if (body->mCarStatus & KartBody::DriftRight) { + body->mCarStatus |= (KartBody::DriftRight | 1ull << 48); + body->mCarStatus &= ~(KartBody::DriftLeft | 1ull << 47); ret = -150.f; CheckDriftTurbo(); } else { @@ -406,8 +406,8 @@ f32 KartGame::DoWarmUpRoll() { if (body->mFrame < -0.8f) { ret = 150.f; body->_4d4 = 0.f; - body->mCarStatus |= (KartBody::CsUnknown0 | 1ull << 47); - body->mCarStatus &= ~(KartBody::CsUnknown1 | 1ull << 48); + body->mCarStatus |= (KartBody::DriftLeft | 1ull << 47); + body->mCarStatus &= ~(KartBody::DriftRight | 1ull << 48); body->mSterrNorm = 0.043611001f; if (body->mFrame < -0.90000004f) { body->mSterrNorm = 0.1133888f; @@ -415,8 +415,8 @@ f32 KartGame::DoWarmUpRoll() { } else if (body->mFrame > 0.8f) { ret = -150.f; body->_4d4 = 0.f; - body->mCarStatus |= (KartBody::CsUnknown1 | 1ull << 48); - body->mCarStatus &= ~(KartBody::CsUnknown0 | 1ull << 47); + body->mCarStatus |= (KartBody::DriftRight | 1ull << 48); + body->mCarStatus &= ~(KartBody::DriftLeft | 1ull << 47); body->mSterrNorm = 0.043611001f; if (body->mFrame < 0.90000004f) { body->mSterrNorm = 0.1133888f; @@ -427,14 +427,14 @@ f32 KartGame::DoWarmUpRoll() { body->mMTState = 0; body->mCarStatus &= ~(1ull << 41); body->mCarStatus &= - ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull << 47 | 1ull << 48); + ~(KartBody::DriftLeft | KartBody::DriftRight | 1ull << 47 | 1ull << 48); } } KartAnime *anime = GetKartCtrl()->getKartAnime(kartNo); if (!anime->IsProhibition(kartNo) && !body->mDriverModels[0]->IsSit() && !body->getChecker()->CheckOnlyTandemPartsClearKey(kartNo) && - !(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) { + !(body->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight))) { GetKartCtrl()->getKartAnime(kartNo)->mFlags |= 0x200u; } } else { @@ -457,7 +457,7 @@ f32 KartGame::DoWarmUpRoll() { body->mDriftSterr = 0; body->mMTState = 0; body->mCarStatus &= - ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | 1ull << 47 | 1ull << 48); + ~(KartBody::DriftLeft | KartBody::DriftRight | 1ull << 47 | 1ull << 48); ret = 0.f; } @@ -494,7 +494,7 @@ void KartGame::DoRollAnim() { body->_398 = GetKartCtrl()->fcnvge(body->_398, body->_39c, 0.050000001f, 0.050000001f); } - if (body->mCarStatus & KartBody::CsUnknown0) { + if (body->mCarStatus & KartBody::DriftLeft) { body->_394 = -1.0f; body->mLiftframe = -1.0f; if (GetKartCtrl()->getKartAnime(kartNo)->IsDriftLeft(kartNo)) { @@ -508,7 +508,7 @@ void KartGame::DoRollAnim() { return; } - if (body->mCarStatus & KartBody::CsUnknown1) { + if (body->mCarStatus & KartBody::DriftRight) { body->_394 = 1.0f; body->mLiftframe = 1.0f; if (GetKartCtrl()->getKartAnime(kartNo)->IsDriftRight(kartNo)) { @@ -529,7 +529,7 @@ void KartGame::DoDriftClear() { body->mMTState = 0; body->mCarStatus &= ~(1ull << 41); body->mCarStatus &= - ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | (1ull << 47) | (1ull << 48)); + ~(KartBody::DriftLeft | KartBody::DriftRight | (1ull << 47) | (1ull << 48)); } void KartGame::DoRoll() { @@ -571,7 +571,7 @@ void KartGame::DoRoll() { } } - if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) { + if (!(body->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight))) { body->_4c4 = 0.f; } @@ -622,10 +622,10 @@ void KartGame::DoLiftTurbo() { JGeometry::TVec3f vec2; JGeometry::TVec3f vec3; - if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) + if (!(body->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight))) body->_518 = 0.f; - if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1)) || + if (!(body->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight)) || body->getTouchNum() <= 1 || body->mCarStatus & (KartBody::CsUnknown5 | KartBody::CsUnknown10 | KartBody::CsUnknown26 | KartBody::CsUnknown27) || @@ -651,19 +651,19 @@ void KartGame::DoLiftTurbo() { body->_518 = body->_514; - f32 v0 = body->_518 * (body->_4dc * body->_3c8); + f32 unk0 = body->_518 * (body->_4dc * body->_3c8); body->_564 = 0.38f; - f32 v1 = body->_564; + f32 unk1 = body->_564; vec0.set(body->_344.x, body->_344.y, body->_344.z); - f32 v2 = v1 * v0; - f32 inv = 1.f - v1; + f32 unk2 = unk1 * unk0; + f32 inv = 1.f - unk1; - vec1.set(body->_3a4 * v2, 0.f, body->_3a4 * (v0 * inv)); + vec1.set(body->_3a4 * unk2, 0.f, body->_3a4 * (inv * unk0)); - if (body->mCarStatus & KartBody::CsUnknown1) + if (body->mCarStatus & KartBody::DriftRight) vec1.x *= -1.f; PSMTXMultVec(body->_110, &vec0, &vec2); @@ -671,9 +671,9 @@ void KartGame::DoLiftTurbo() { body->DoForce(&vec2, &vec3); vec0.set(body->_344.x, body->_344.y, 0.5f * -(body->_344.z)); - vec1.set(body->_4dc * v2, 0.f, body->_3a4 * (body->_4dc * inv)); + vec1.set(body->_4dc * unk2, 0.f, body->_3a4 * (body->_4dc * inv)); - if (body->mCarStatus & KartBody::CsUnknown1) + if (body->mCarStatus & KartBody::DriftRight) vec1.x *= -1.f; PSMTXMultVec(body->_110, &vec0, &vec2); From 8e1c8fcbd35fa2bbc7328755f36fa4317e2c704b Mon Sep 17 00:00:00 2001 From: mina Date: Fri, 15 May 2026 20:51:35 +0200 Subject: [PATCH 25/34] match DoLiftTurbo__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 117 +++++++++++++++++---------------- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 8f03af66..826eb6a4 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -615,71 +615,74 @@ void KartGame::DoTestPitch() { } void KartGame::DoLiftTurbo() { - KartBody *body = mBody; - - JGeometry::TVec3f vec0; - JGeometry::TVec3f vec1; - JGeometry::TVec3f vec2; + KartBody *kartBody = mBody; + f32 fVar3; JGeometry::TVec3f vec3; + JGeometry::TVec3f vec2; + JGeometry::TVec3f vec1; + JGeometry::TVec3f vec0; - if (!(body->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight))) - body->_518 = 0.f; + if (!(kartBody->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight))) { + kartBody->_518 = 0.0f; + } - if (!(body->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight)) || - body->getTouchNum() <= 1 || - body->mCarStatus & (KartBody::CsUnknown5 | KartBody::CsUnknown10 | KartBody::CsUnknown26 | - KartBody::CsUnknown27) || - body->mBodyGround.getAttribute() == 6) { - body->_564 = 0.f; - body->_518 = 0.f; + if (!(kartBody->mCarStatus & (KartBody::DriftLeft | KartBody::DriftRight)) || + kartBody->getTouchNum() <= 1 || + kartBody->mCarStatus & (KartBody::CsUnknown5 | KartBody::CsUnknown10 | KartBody::CsUnknown26 | KartBody::CsUnknown27) || + kartBody->mBodyGround.getAttribute() == 6 + ) { + kartBody->_564 = 0.0f; + kartBody->_518 = 0.0f; return; } - if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f) + if (GetKartCtrl()->GetCarSpeed(kartBody->mMynum) <= 30.0f) { return; - - if (GetKartCtrl()->GetCarSpeed(body->mMynum) >= 40.f && body->_3c8 != 0.f) { - GetKartCtrl()->DevMatrixByVector(&vec1, &body->mVel, body->_110); - vec1.x *= 1.075f; - vec1.z *= 1.015f; - - if (vec1.z < 0.f) - vec1.z *= -1.f; - - PSMTXMultVecSR(body->_110, &vec1, &body->mVel); } - - body->_518 = body->_514; - - f32 unk0 = body->_518 * (body->_4dc * body->_3c8); - - body->_564 = 0.38f; - f32 unk1 = body->_564; - - vec0.set(body->_344.x, body->_344.y, body->_344.z); - - f32 unk2 = unk1 * unk0; - f32 inv = 1.f - unk1; - - vec1.set(body->_3a4 * unk2, 0.f, body->_3a4 * (inv * unk0)); - - if (body->mCarStatus & KartBody::DriftRight) - vec1.x *= -1.f; - - PSMTXMultVec(body->_110, &vec0, &vec2); - PSMTXMultVecSR(body->_110, &vec1, &vec3); - body->DoForce(&vec2, &vec3); - - vec0.set(body->_344.x, body->_344.y, 0.5f * -(body->_344.z)); - vec1.set(body->_4dc * unk2, 0.f, body->_3a4 * (body->_4dc * inv)); - - if (body->mCarStatus & KartBody::DriftRight) - vec1.x *= -1.f; - - PSMTXMultVec(body->_110, &vec0, &vec2); - PSMTXMultVecSR(body->_110, &vec1, &vec3); - - body->DoForce(&vec2, &vec3); + + if (GetKartCtrl()->GetCarSpeed(kartBody->mMynum) >= 40.0f && kartBody->_3c8 != 0.0f) { + GetKartCtrl()->DevMatrixByVector(&vec2, &kartBody->mVel, kartBody->_110); + vec2.x *= 1.075f; + vec2.z *= 1.015f; + + if (vec2.z < 0.0f) { + vec2.z *= -1.0f; + } + + PSMTXMultVecSR(kartBody->_110, &vec2, &kartBody->mVel); + } + + kartBody->_518 = kartBody->_514; + + f32 fVar2 = kartBody->_4dc * kartBody->_3c8 * kartBody->_518; + + kartBody->_564 = 0.38f; + + f32 fVar4 = kartBody->_564; + vec3.set(kartBody->_344.x,kartBody->_344.y, kartBody->_344.z); + + fVar3 = fVar2 * fVar4; + fVar4 = 1.0f - fVar4; + vec2.set(kartBody->_3a4 * fVar3, 0.0f, kartBody->_3a4 * (fVar2 * fVar4)); + + if ((kartBody->mCarStatus & 2) != 0) { + vec2.x *= -1.0f; + } + + PSMTXMultVec(kartBody->_110, &vec3, &vec1); + PSMTXMultVecSR(kartBody->_110, &vec2, &vec0); + kartBody->DoForce(&vec1, &vec0); + + vec3.set(kartBody->_344.x, kartBody->_344.y,-(kartBody->_344).z * 0.5f); + vec2.set(kartBody->_3a4 * fVar3, 0.0f, kartBody->_3a4 * (kartBody->_4dc * fVar4)); + + if ((kartBody->mCarStatus & 2) != 0) { + vec2.x *= -1.0f; + } + + PSMTXMultVec(kartBody->_110, &vec3, &vec1); + PSMTXMultVecSR(kartBody->_110, &vec2, &vec0); + kartBody->DoForce(&vec1, &vec0); } void KartGame::DoTurbo() {} From 39ccd4f05c9a115bf6240a490c8f8269161e4070 Mon Sep 17 00:00:00 2001 From: mina Date: Fri, 15 May 2026 21:06:59 +0200 Subject: [PATCH 26/34] match DoActionCtrl__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 826eb6a4..93fcf0b6 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -766,7 +766,15 @@ void KartGame::DoActionMgr() { // void ItemObjMgr::getKartHitList(int) {} } -void KartGame::DoActionCtrl() {} +void KartGame::DoActionCtrl() { + // peak mwcc doing an extra compare when checking explicit against true + if (mBody->getChecker()->CheckCrash() == true) { + return; + } + + DoSlide(); + DoWanWan(); +} void KartGame::DoStatus() { // void KartCtrl::DoAnime(int) {} From e8def9b709a7d39dbfc979309cf514b95d0dcb79 Mon Sep 17 00:00:00 2001 From: 9mina Date: Thu, 21 May 2026 12:50:21 +0200 Subject: [PATCH 27/34] match DoFlagCtrl__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 93fcf0b6..28fe0933 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -757,7 +757,12 @@ void KartGame::ItemWatchMan(ItemObj *) {} void KartGame::AfterItemWatchMan() {} -void KartGame::DoFlagCtrl() {} +void KartGame::DoFlagCtrl() { + KartBody *kartBody = mBody; + + kartBody->_590 &= ~(0x04 | 0x08 | 0x10 | 0x40); + kartBody->getDamage()->mFlags &= ~(0x02); +} void KartGame::KeepWatch() {} From 311c2c76bb67d3f8b6192458a2c9de7def13f96a Mon Sep 17 00:00:00 2001 From: 9mina Date: Thu, 21 May 2026 13:57:16 +0200 Subject: [PATCH 28/34] match AfterItemWatchMan__8KartGameFv --- include/Yamamoto/KartGame.h | 2 +- src/Yamamoto/kartCtrlStrat.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index ffe0e9a7..0eaf36da 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -99,7 +99,7 @@ class KartGame u16 _E; u16 _10; u16 mCountDownDuration; // 12 - u8 _14[0x4]; + ItemObj *mIncomingItem; // 14, the item that's about to collide with the kart float _18[2]; JGeometry::TVec3f _20; JGeometry::TVec3f _2C; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 28fe0933..848d8f0a 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -755,7 +755,31 @@ void KartGame::RankWatchMan() {} void KartGame::ItemWatchMan(ItemObj *) {} -void KartGame::AfterItemWatchMan() {} +void KartGame::AfterItemWatchMan() { + // they probably just copy pasted the typical body myNum intro here + // in the original code, because kartBody gets r31 assigned + KartBody *kartBody; + + GetKartCtrl()->getKartSound(mBody->mMynum)->DoItemAlarm(); + if (_E == (0x01 | 0x02 | 0x04 | 0x10 | 0x20 | 0x40)) { + int kartNo = mIncomingItem->getOwnerNum(); + kartBody = GetKartCtrl()->getKartBody(kartNo); + + if (mIncomingItem->getState() != ItemObj::StateDivested + && !kartBody->getChecker()->CheckOnlyTandemPartsClearKey(kartNo) + && !GetKartCtrl()->CheckTandemItmGet(kartNo)) { + + GetKartCtrl()->getKartSound(kartNo)->DoItmHitVoice(); + GetKartCtrl()->getKartAnime(kartNo)->mFlags |= (1LL<<34); + } + + _E = 0; + } + + if (_E == (0x02 | 0x04 | 0x10 | 0x20 | 0x40)) { + _E = 0; + } +} void KartGame::DoFlagCtrl() { KartBody *kartBody = mBody; From 55451276b40dcadd8513d52e5052e977eb9d418d Mon Sep 17 00:00:00 2001 From: 9mina Date: Thu, 21 May 2026 14:10:56 +0200 Subject: [PATCH 29/34] match DoPushStart__8KartGameFv --- include/Yamamoto/KartGame.h | 2 +- include/Yamamoto/kartBody.h | 1 + src/Yamamoto/kartCtrlStrat.cpp | 14 +++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index 0eaf36da..4cfc940b 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -32,7 +32,7 @@ class KartGame void DoRollThrow(); int DoRollOver(); void DoWanWan(); - void DoPushStart(); + bool DoPushStart(); void DoBalance(f32 *, f32); void MakeClear(); void MakeBoardDash(); diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 6293e619..07b18ed9 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -52,6 +52,7 @@ class KartBody CsUnknown12 = 1<<12, CsUnknown15 = 1<<15, CsUnknown18 = 1<<18, + CsUnknown25 = 1<<25, CsUnknown26 = 1<<26, CsUnknown27 = 1<<27, }; diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 848d8f0a..6c99a95d 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -707,7 +707,19 @@ void KartGame::DoWanWan() { // void ItemWanWanObj::getPullVec(JGeometry::TVec3 *) {} } -void KartGame::DoPushStart() {} +bool KartGame::DoPushStart() { + const int timerEnd = 30; + KartBody *body = mBody; + + body->_594++; + body->_3c8 = body->_3d0; + if (body->_594 == timerEnd) { + body->mCarStatus &= ~(KartBody::CsUnknown25); + return true; + } + + return false; +} void KartGame::DoBalance(float *, float) {} From bf7d10be59591eab24e01133bd57a0a2bf0c6871 Mon Sep 17 00:00:00 2001 From: 9mina Date: Fri, 22 May 2026 00:49:33 +0200 Subject: [PATCH 30/34] match DoBalance__8KartGameFPff --- src/Yamamoto/kartCtrlStrat.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 6c99a95d..39c5349c 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -721,7 +721,21 @@ bool KartGame::DoPushStart() { return false; } -void KartGame::DoBalance(float *, float) {} +void KartGame::DoBalance(float *a2, float a3) { + KartBody *kartBody = mBody; + + if ((mBody->mCarStatus & (KartBody::CsUnknown5 | KartBody::CsUnknown10 + | KartBody::CsUnknown26 | KartBody::CsUnknown27))) { + return; + } + + f32 v0 = kartBody->_468; + if (v0 > -0.40122193f && v0 < 0.40122193f) { + return; + } + + *a2 *= a3; +} void KartGame::MakeClear() {} From 8dad275e4304a42ca8bb88f0872a5bfee506d3eb Mon Sep 17 00:00:00 2001 From: 9mina Date: Fri, 22 May 2026 00:52:12 +0200 Subject: [PATCH 31/34] match MakeClear__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 39c5349c..d6be043d 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -737,7 +737,16 @@ void KartGame::DoBalance(float *a2, float a3) { *a2 *= a3; } -void KartGame::MakeClear() {} +void KartGame::MakeClear() { + KartBody *body = mBody; + + body->_3c8 = 0.f; + body->getStrat()->LiftClear(); + body->getStrat()->PitchClear(); + body->getStrat()->AllGravyClear(); + body->getStrat()->DashClear(); + body->getStrat()->OtherClear(); +} void KartGame::MakeBoardDash() {} From a8d47a08462f8e2b11c75ef9783207447442c83d Mon Sep 17 00:00:00 2001 From: 9mina Date: Fri, 22 May 2026 01:25:09 +0200 Subject: [PATCH 32/34] match ItemWatchMan__8KartGameFP7ItemObj --- include/Yamamoto/KartGame.h | 2 +- src/Yamamoto/kartCtrlStrat.cpp | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/include/Yamamoto/KartGame.h b/include/Yamamoto/KartGame.h index 4cfc940b..88c34f33 100644 --- a/include/Yamamoto/KartGame.h +++ b/include/Yamamoto/KartGame.h @@ -54,7 +54,7 @@ class KartGame bool CheckBalloon(); void SetRank(); void RankWatchMan(); - void ItemWatchMan(ItemObj *); + void ItemWatchMan(ItemObj *incomingItem); void AfterItemWatchMan(); void DoFlagCtrl(); void KeepWatch(); diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index d6be043d..ff623711 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -788,7 +788,30 @@ void KartGame::SetRank() {} void KartGame::RankWatchMan() {} -void KartGame::ItemWatchMan(ItemObj *) {} +void KartGame::ItemWatchMan(ItemObj *incomingItem) { + if (!incomingItem) { + return; + } + + int kartNo = incomingItem->getOwnerNum(); + KartBody *kartBody = GetKartCtrl()->getKartBody(kartNo); + + RCMGetKartChecker(kartNo); + if (kartBody->getGame()->_E) { + return; + } + + if (kartBody->getChecker()->CheckOnlyTandemPartsClearKey(kartNo)) { + return; + } + + if (GetKartCtrl()->CheckTandemItmGet(kartNo)) { + return; + } + + kartBody->getGame()->_E = (0x08 | 0x10 | 0x20 | 0x40); + kartBody->getGame()->mIncomingItem = incomingItem; +} void KartGame::AfterItemWatchMan() { // they probably just copy pasted the typical body myNum intro here From 0a644ffec4c08b2eac0f5acaafc70e7cdf8b2e96 Mon Sep 17 00:00:00 2001 From: 9mina Date: Fri, 22 May 2026 01:35:36 +0200 Subject: [PATCH 33/34] match SetRank__8KartGameFv --- src/Yamamoto/kartCtrlStrat.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index ff623711..57c3f924 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -784,7 +784,12 @@ void KartGame::DoElementForce() {} bool KartGame::CheckBalloon() {} -void KartGame::SetRank() {} +void KartGame::SetRank() { + KartBody *kartBody = mBody; + + kartBody->mMyRank = RCMGetKartChecker(kartBody->mMynum)->getRank(); + kartBody->_59c = 0; +} void KartGame::RankWatchMan() {} From 57500c524841bdd6bbd21e53cff6cbb5cce291cf Mon Sep 17 00:00:00 2001 From: 9mina Date: Fri, 22 May 2026 03:29:47 +0200 Subject: [PATCH 34/34] match CheckBalloon__8KartGameFv --- include/Yamamoto/kartBody.h | 2 ++ include/Yamamoto/kartCtrl.h | 2 +- src/Yamamoto/kartCtrlStrat.cpp | 19 ++++++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 07b18ed9..1d1e84c0 100644 --- a/include/Yamamoto/kartBody.h +++ b/include/Yamamoto/kartBody.h @@ -52,6 +52,8 @@ class KartBody CsUnknown12 = 1<<12, CsUnknown15 = 1<<15, CsUnknown18 = 1<<18, + CsUnknown20 = 1<<20, + CsUnknown22 = 1<<22, CsUnknown25 = 1<<25, CsUnknown26 = 1<<26, CsUnknown27 = 1<<27, diff --git a/include/Yamamoto/kartCtrl.h b/include/Yamamoto/kartCtrl.h index 04e63b06..936d6c77 100644 --- a/include/Yamamoto/kartCtrl.h +++ b/include/Yamamoto/kartCtrl.h @@ -97,7 +97,7 @@ class KartCtrl : public KartMat // WHAT THE HELL ARE YOU DOING double GetTireRadius(int); bool IsBurn(int); bool IsWallReact(int); - u32 HaveBalloon(int); + bool HaveBalloon(int); int GetDriftCnt(int); bool IsMiniGame(); bool IsMiniGameEnd(); diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 57c3f924..35cf2869 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -782,7 +782,24 @@ void KartGame::DoBodyAction() {} void KartGame::DoElementForce() {} -bool KartGame::CheckBalloon() {} +bool KartGame::CheckBalloon() { + KartBody *kartBody = mBody; + int kartNo = kartBody->mMynum; + + if (RaceMgr::getCurrentManager()->getRaceMode() != BALLOON_BATTLE) { + return false; + } + + if (GetKartCtrl()->HaveBalloon(kartNo) && + !(kartBody->mCarStatus & KartBody::CsUnknown20) && + !(kartBody->mCarStatus & KartBody::CsUnknown22) && + !(kartBody->getThunder()->mFlags & 0x01) + ) { + return true; + } + + return false; +} void KartGame::SetRank() { KartBody *kartBody = mBody;