From 82ae793e4af04fa58f4d722f14fcbec801c7dfa5 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 5 Oct 2025 23:04:55 +0200 Subject: [PATCH 01/24] 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 2220031..8bbc766 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 8cef958..0756240 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 361699af8e66e361b32830c0355abe2ebada20ef Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 5 Oct 2025 23:53:15 +0200 Subject: [PATCH 02/24] 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 8bbc766..872dcb6 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 0756240..9536079 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 a6cce3cd50e4dc32b7599f433ef515bd63336807 Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 05:32:17 +0200 Subject: [PATCH 03/24] 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 b00b487..0af84e6 100644 --- a/include/Kaneshige/Course/CrsGround.h +++ b/include/Kaneshige/Course/CrsGround.h @@ -79,6 +79,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 a5756a4..7c80cc3 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 e20646b..c99285f 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 9536079..ca3f46d 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 a5e6e5bd2857aa4354ced470f2ba80f3f3e93b79 Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 06:14:52 +0200 Subject: [PATCH 04/24] 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 ca3f46d..71e5988 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 63c9b379ef09f9da5703c8f2f3d1160fe3611a97 Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 07:11:36 +0200 Subject: [PATCH 05/24] 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 e4f2eab..edb38c9 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 71e5988..292b046 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 824273c59c02748a56e6f6babe3f9fa71ec450a2 Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 08:02:17 +0200 Subject: [PATCH 06/24] 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 292b046..766db6b 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 7b488bc64f9bbbd68c46dd00a054c0b78649ff55 Mon Sep 17 00:00:00 2001 From: 9mina Date: Mon, 6 Oct 2025 22:05:12 +0200 Subject: [PATCH 07/24] 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 0af84e6..b00b487 100644 --- a/include/Kaneshige/Course/CrsGround.h +++ b/include/Kaneshige/Course/CrsGround.h @@ -79,7 +79,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 f1add184d769553857096f55128428a332dce417 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 07:03:43 +0200 Subject: [PATCH 08/24] 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 872dcb6..55e7f72 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 edb38c9..8cd9db1 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 a32c0d6..828d089 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 766db6b..3919710 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 cc4c9eb26c97415fccebdabef6b0f830d45f7c94 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 07:40:11 +0200 Subject: [PATCH 09/24] 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 3919710..f103fc0 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 0529efb24c3d107f561fc3b66a306a7e9af9ac39 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 09:13:40 +0200 Subject: [PATCH 10/24] 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 f103fc0..143fcae 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 f33f5f5aebed1c53fbaff717c98019ae05ba0f43 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 8 Oct 2025 09:56:27 +0200 Subject: [PATCH 11/24] 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 55e7f72..47743d6 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 828d089..ff6bd5c 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 143fcae..ff2352c 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 f04256eb70787964352577893fd336973481d905 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sat, 11 Oct 2025 16:46:46 +0200 Subject: [PATCH 12/24] 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 ff6bd5c..71b46f7 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 606ee27..a2b23db 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 ff2352c..706e5b6 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 1b98e0a4e6d4212417fd4864e4dbb4edaad4a7f8 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 12 Oct 2025 14:29:09 +0200 Subject: [PATCH 13/24] 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 089fe5b..916b061 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 706e5b6..27d5bd9 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 7cc61e6e0594b037f79e549928cf87e60e7e164a Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 12 Oct 2025 14:33:34 +0200 Subject: [PATCH 14/24] 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 71b46f7..a3b7abb 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 27d5bd9..d58aa7a 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 26b28c84cc466179263c8bd607263dca650fc129 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sun, 9 Nov 2025 17:32:38 +0100 Subject: [PATCH 15/24] 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 a3b7abb..825dfeb 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 d58aa7a..ed04010 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 d90e9d2a433386cef0c736ebcdc7452c630c5560 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 11 Nov 2025 11:53:35 +0100 Subject: [PATCH 16/24] 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 ed04010..b922369 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 ce0009da10d3adc00cace6e86412394b80a6ed68 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 11 Nov 2025 12:25:20 +0100 Subject: [PATCH 17/24] 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 825dfeb..228facd 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 b922369..657cde3 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 20e1a2e6bbba514bb27d3fc71028a1014680f3b4 Mon Sep 17 00:00:00 2001 From: 9mina Date: Sat, 29 Nov 2025 02:25:55 +0100 Subject: [PATCH 18/24] 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 657cde3..b471670 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 729d1aefda95071b9f7801de05fc72633ad0b6c2 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 13:10:51 +0100 Subject: [PATCH 19/24] 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 14f3a79..809ac9c 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 916b061..af0e7c0 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 47743d6..a060eca 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 228facd..e470742 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 b471670..8dcc0dd 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 c6fcb3a3052beece2d47783bbda5d449f038ef60 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 13:20:41 +0100 Subject: [PATCH 20/24] 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 8dcc0dd..7d1ec8a 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 2db08828621e85192111076a012b9b3f122c9d4e Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 14:06:03 +0100 Subject: [PATCH 21/24] 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 a060eca..ffe0e9a 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 e470742..138b0f9 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 7d1ec8a..4a97581 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 4cc53413093e859f1f3dff06ff12efdd09039760 Mon Sep 17 00:00:00 2001 From: 9mina Date: Tue, 20 Jan 2026 18:50:34 +0100 Subject: [PATCH 22/24] 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 138b0f9..971894b 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 4a97581..a9c3a4f 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 f48e9442dbbcee61c98e326585157f7e78d28c7d Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 28 Jan 2026 18:15:09 +0100 Subject: [PATCH 23/24] wip DoLiftTurbo__8KartGameFv --- include/Yamamoto/kartBody.h | 5 +++ src/Yamamoto/kartCtrlStrat.cpp | 72 +++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/include/Yamamoto/kartBody.h b/include/Yamamoto/kartBody.h index 971894b..ddb25c0 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 a9c3a4f..8e2dbe5 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 @@ -610,7 +612,75 @@ void KartGame::DoTestPitch() { } -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); + f32 v = vec1.z * 1.015f; + vec1.z *= 1.015f; + vec1.x *= 1.075f; + + if (v < 0.f) + vec1.z = v * -1.f; + + PSMTXMultVecSR(body->_110, &vec1, &body->mVel); + } + + body->_564 = 0.38f; + + f32 v0 = body->_518 * (body->_4dc * body->_3c8); + + body->_518 = body->_514; + + f32 v1 = v0 * body->_564; + f32 v2 = v0 * body->_564; + f32 inv = 1.f - body->_564; + + + vec0.set(body->_344.x, body->_344.y, body->_344.z); + + + 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->_3a4 * v2, 0.f, body->_4dc * inv); + + if (body->mCarStatus & KartBody::CsUnknown1) + vec1.x *= -1.f; + + PSMTXMultVec(body->_110, &vec0, &vec1); + PSMTXMultVecSR(body->_110, &vec1, &vec3); + + body->DoForce(&vec2, &vec3); +} void KartGame::DoTurbo() {} From d854b163c4b0f1e66c1a07c9c2031e7b255740d8 Mon Sep 17 00:00:00 2001 From: 9mina Date: Wed, 28 Jan 2026 21:40:13 +0100 Subject: [PATCH 24/24] wip ahhhhh --- src/Yamamoto/kartCtrlStrat.cpp | 1344 ++++++++++++++++++-------------- 1 file changed, 765 insertions(+), 579 deletions(-) diff --git a/src/Yamamoto/kartCtrlStrat.cpp b/src/Yamamoto/kartCtrlStrat.cpp index 8e2dbe5..2a27a2d 100644 --- a/src/Yamamoto/kartCtrlStrat.cpp +++ b/src/Yamamoto/kartCtrlStrat.cpp @@ -12,256 +12,294 @@ // comments inside functions are inline functions being called in that function -bool KartGame::Init(int kartNo) { - 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; +bool +KartGame::Init(int kartNo) +{ + 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; + mTimeToChange = 0; + _C[0] = 0; + + bool isRight = + RaceMgr::getCurrentManager()->getStartPoint(&_20, &_2C, kartNo); + + _20.y += 300.f; + + return isRight; +} + +void +KartGame::GetGorundTireNum() +{ + u8 num = mBody->mMynum; + + KartBody *body = mBody; + body->mTouchNum = 0; + + 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); + 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); + + // TODO: what kind of vectors are this? + JGeometry::TVec3f _vec0; + _vec0.set(body->mPlayerPosMtx[0][3], body->mPlayerPosMtx[1][3], + body->mPlayerPosMtx[2][3]); - _A = 0; - mTimeToChange = 0; - _C[0] = 0; + 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()); + + JGeometry::TVec3f _vec2; + _vec2.set(0.f, -3.5f, 0.f); + + exGeo->AddVel(_vec0, _vec2); + } +} + +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); + } else { + body->mKartRPM = GetKartCtrl()->fcnvge( + body->mKartRPM, 0.f, 0.050000001f, 0.050000001f); + } +} - bool isRight = RaceMgr::getCurrentManager()->getStartPoint(&_20, &_2C, kartNo); +void +KartGame::WatchAcceleration() +{ + KartBody *body = mBody; + int num = body->mMynum; + + const KartGamePad *gamePad = GetKartCtrl()->GetDriveCont(num); + 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); + _8 |= 2; + } else { + GetKartCtrl()->ChaseFnumber(&body->_3c8, 0.f, 1.f); + _8 &= ~2; + } + } +} - _20.y += 300.f; +void +KartGame::DoItmCancel() +{ + KartBody *body = mBody; - return isRight; + body->mCarStatus |= 0x80000000; + GetItemObjMgr()->abortItemShuffle(body->mMynum); } -void KartGame::GetGorundTireNum() { - u8 num = mBody->mMynum; +void +KartGame::DoStopItm() +{ + KartBody *body = mBody; + u8 num = body->mMynum; + + body->mCarStatus |= 0x80000000; + GetItemObjMgr()->abortItemShuffle(body->mMynum); - KartBody *body = mBody; - body->mTouchNum = 0; + ItemObjMgr *itemMgr = GetItemObjMgr(); + ItemObj *item = itemMgr->getKartEquipItem(num, 0); + itemMgr->deleteHeartItem(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); - sus[3] = GetKartCtrl()->getKartSus(idx * 4 + 3); + if (item != nullptr) { + item->IsSuccessionItem() ? item->setChildStateForceDisappear() + : item->setStateForceDisappear(); + } - if (sus[0]->_124 & 1) - ++body->mTouchNum; + item = itemMgr->getKartEquipItem(num, 1); + if (item != nullptr) { + item->IsSuccessionItem() ? item->setChildStateForceDisappear() + : item->setStateForceDisappear(); + } +} - if (sus[1]->_124 & 1) - ++body->mTouchNum; +void +KartGame::DoChange() +{ + KartBody *body = mBody; + int num = body->mMynum; - if (sus[2]->_124 & 1) - ++body->mTouchNum; + const KartGamePad *gpDriver = GetKartCtrl()->GetDriveCont(num); + const KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); - if (sus[3]->_124 & 1) - ++body->mTouchNum; + bool change = false; + const bool possible = GetKartCtrl()->MakeChangePossible(num); - GetKartCtrl()->getKartSound(num)->DoSlipSound(num); + if (body->getChecker()->CheckCheange(num)) { + mTimeToChange = 0; + return; + } - // TODO: what kind of vectors are this? - JGeometry::TVec3f _vec0; - _vec0.set(body->mPlayerPosMtx[0][3], - body->mPlayerPosMtx[1][3], - body->mPlayerPosMtx[2][3]); + if (mTimeToChange) + mTimeToChange--; + + // single player kart + if ((body->mGameStatus & KartBody::HasCoDriver) == false) { + if (gpDriver->testTrigger( + GetKartCtrl()->getKartPad(num)->mTrigZ)) + mTimeToChange = 20; + + if (body->mCarStatus & KartBody::InDriverChange) { + if (!(body->mExModels[0])->IsChange() && + !(body->mExModels[1])->IsChange()) + body->mCarStatus &= ~KartBody::InDriverChange; + + } 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 & KartBody::InDriverChange) { + if (gpDriver->testButton( + GetKartCtrl()->getKartPad(num)->mTrigZ) && + gpCoDriv->testButton( + GetKartCtrl()->getKartPad(num)->mTrigZ)) { + mTimeToChange = 20; + } - body->mShadowArea.searchShadow(_vec0); + if (!(body->mExModels[0])->IsChange() && + !(body->mExModels[1])->IsChange()) { + body->mCarStatus &= ~KartBody::InDriverChange; + } + // 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(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 (!change) + return; - JGeometry::TVec3f _vec2; - _vec2.set(0.f, -3.5f, 0.f); + body->mCarStatus &= ~(1ull << 38); + body->mCarStatus |= KartBody::InDriverChange; + ; - exGeo->AddVel(_vec0, _vec2); - } -} - -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); - } else { - body->mKartRPM = GetKartCtrl()->fcnvge(body->mKartRPM, 0.f, 0.050000001f , 0.050000001f); - } -} - -void KartGame::WatchAcceleration() { - KartBody *body = mBody; - int num = body->mMynum; - - const KartGamePad *gamePad = GetKartCtrl()->GetDriveCont(num); - 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); - _8 |= 2; - } else { - GetKartCtrl()->ChaseFnumber(&body->_3c8, 0.f, 1.f); - _8 &= ~2; - } - } -} - -void KartGame::DoItmCancel() { - KartBody *body = mBody; - - body->mCarStatus |= 0x80000000; - GetItemObjMgr()->abortItemShuffle(body->mMynum); + GetKartCtrl()->getKartAnime(num)->mFlags |= 1; + GetKartCtrl()->getKartSound(num)->DoChangeVoice(); + GetKartCtrl()->getKartSound(num)->DoChangeStarSound(); } -void KartGame::DoStopItm() { - KartBody *body = mBody; - u8 num = body->mMynum; +void +KartGame::DoSlide() +{ + const int num = mBody->mMynum; + KartBody *body = mBody; - body->mCarStatus |= 0x80000000; - GetItemObjMgr()->abortItemShuffle(body->mMynum); + if (body->getChecker()->CheckPartsClearKey(num) || + !(body->mGameStatus & KartBody::HasCoDriver)) { + return; + } - ItemObjMgr *itemMgr = GetItemObjMgr(); - ItemObj *item = itemMgr->getKartEquipItem(num, 0); - itemMgr->deleteHeartItem(num); + if (body->mSlideTimer != 0) { + body->mSlideTimer--; + } + + if (body->mSlideTimer == 0) { + body->mCarStatus &= ~KartBody::DoesSlide; + } + + 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; + body->_2cc.z += body->_2f0.z * body->_528; + } + + return; + } + + KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); + if (body->getTouchNum() == 0 || + (GetKartCtrl()->GetCarSpeed(num) <= 50.f)) { + return; + } + + if (!gpCoDriv->testTrigger(JUTGamePad::L) && + !gpCoDriv->testTrigger(JUTGamePad::R)) { + return; + } + + body->mSlideTimer = 35; - 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() { - KartBody *body = mBody; - int num = body->mMynum; - - 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; - return; - } - - if (mTimeToChange) - mTimeToChange--; - - // single player kart - if ((body->mGameStatus & KartBody::HasCoDriver) == false) { - if (gpDriver->testTrigger(GetKartCtrl()->getKartPad(num)->mTrigZ)) - mTimeToChange = 20; - - if (body->mCarStatus & KartBody::InDriverChange) { - if (!(body->mExModels[0])->IsChange() && !(body->mExModels[1])->IsChange()) - body->mCarStatus &= ~KartBody::InDriverChange; - - } 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 & 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()) { - body->mCarStatus &= ~KartBody::InDriverChange; - } - // 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 |= KartBody::InDriverChange;; - - GetKartCtrl()->getKartAnime(num)->mFlags |= 1; - GetKartCtrl()->getKartSound(num)->DoChangeVoice(); - GetKartCtrl()->getKartSound(num)->DoChangeStarSound(); -} - -void KartGame::DoSlide() { - const int num = mBody->mMynum; - KartBody *body = mBody; - - if (body->getChecker()->CheckPartsClearKey(num) || !(body->mGameStatus & KartBody::HasCoDriver)) { - return; - } - - if (body->mSlideTimer != 0) { - body->mSlideTimer--; - } - - if (body->mSlideTimer == 0) { - body->mCarStatus &= ~KartBody::DoesSlide; - } - - 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; - body->_2cc.z += body->_2f0.z * body->_528; - } - - return; - } - - KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); - 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 (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); + 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); + 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); + 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); + JPEffectPerformer::setEffect( + JPEffectPerformer::Effect_Unknown1b, num, + body->mPos, 0); } } @@ -274,41 +312,48 @@ void KartGame::DoSlide() { GetKartCtrl()->getKartSound(num)->DoTandemVoice(2); } -void KartGame::DoDriftTurboSterr() { - KartBody *body = mBody; +void +KartGame::DoDriftTurboSterr() +{ + KartBody *body = mBody; - if (body->mDriftSterr != 0 && body->mDriftSterr < 0x1E) - body->mDriftSterr++; + if (body->mDriftSterr != 0 && body->mDriftSterr < 0x1E) + body->mDriftSterr++; } -void KartGame::SetDriftTurboSterr() { - KartBody *body = mBody; - const int num = mBody->mMynum; +void +KartGame::SetDriftTurboSterr() +{ + KartBody *body = mBody; + const int num = mBody->mMynum; - const int threshold = (body->mGameStatus & KartBody::HasCoDriver) ? 2 : 6; - if ((body->mDriftSterr) < threshold) - return; + const int threshold = + (body->mGameStatus & KartBody::HasCoDriver) ? 2 : 6; + if ((body->mDriftSterr) < threshold) + return; - body->mMTState++; + body->mMTState++; - if (body->mMTState == 1) - GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100C9); - else if (body->mMTState == 2) - GetKartCtrl()->getKartSound(num)->DoKartsetSeSound(0x100CA); + 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; + if (body->mMTState >= 2) + body->mMTState = 2; - body->mDriftSterr = 0; + body->mDriftSterr = 0; } -void KartGame::CheckDriftTurbo(void) { +void +KartGame::CheckDriftTurbo(void) +{ KartBody *body = mBody; - int num = body->mMynum; + int num = body->mMynum; if (GetKartCtrl()->GetCarSpeed(num) <= 50.f) { - body->mCarStatus &= ~(1ull<<41); - body->mMTBoost = 0; + body->mCarStatus &= ~(1ull << 41); + body->mMTBoost = 0; body->mDriftSterr = 0; body->mMTState = 0; return; @@ -317,7 +362,7 @@ void KartGame::CheckDriftTurbo(void) { if (body->mGameStatus & KartBody::GsUnknown3) return; - bool didDriftSterr = false; + bool didDriftSterr = false; KartGamePad *gpCoDriv = GetKartCtrl()->GetCoDriveCont(num); if (body->mCarStatus & KartBody::CsUnknown0) { @@ -327,8 +372,8 @@ void KartGame::CheckDriftTurbo(void) { DoDriftTurboSterr(); } } else if (body->mFrame >= -0.5f) { - didDriftSterr = true; - DoDriftTurboSterr(); + didDriftSterr = true; + DoDriftTurboSterr(); } if (!didDriftSterr) { @@ -353,418 +398,559 @@ void KartGame::CheckDriftTurbo(void) { SetDriftTurboSterr(); body->mDriftSterr = 1; } - } else { - body->mMTState = 0; - body->mDriftSterr = 0; - } - } + } else { + body->mMTState = 0; + body->mDriftSterr = 0; + } + } + + body->mCarStatus &= ~(1ull << 41); + body->mMTBoost = 0; +} + +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; + 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() +{ + KartBody *body = mBody; - body->mCarStatus &= ~(1ull<<41); body->mMTBoost = 0; + body->mDriftSterr = 0; + body->mMTState = 0; + body->mCarStatus &= ~(1ull << 41); + body->mCarStatus &= ~(KartBody::CsUnknown0 | KartBody::CsUnknown1 | + (1ull << 47) | (1ull << 48)); } -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; - 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() { - 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() { - KartBody *body = mBody; - - MakeJump(); - - f32 warmupRollRet = 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(); - } - - if (body->_458 < 2.f) { - 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); - } else { - int touchNum = body->getTouchNum(); - f32 _unk2 = (touchNum == 0) - ? 0.023529412f * warmupRollRet - : (body->_4f8 / 170.f) * warmupRollRet; - - GetKartCtrl()->ChaseFnumber(&body->_4c4, _unk2, body->_3b4); - } - } - - if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) { - body->_4c4 = 0.f; - } - - DoRollAnim(); -} - -void KartGame::DoTestPitch() { - 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; - } +void +KartGame::DoRoll() +{ + KartBody *body = mBody; + + MakeJump(); + + f32 warmupRollRet = DoWarmUpRoll(); + if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f || + GetKartCtrl()->GetCarSpeed(body->mMynum) <= 40.f && + body->_3c8 == 0.f) { + DoDriftClear(); + } - 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; - } + if (GetKartCtrl()->GetCarSpeed(body->mMynum) < 40.f && + body->_510 > 2.44222f) { + DoDriftClear(); + } - f32 x; - f32 y = 0.0; - if (mainY < 0.5 && mainY > -0.5f) { - x = 0.0; - } else { - y = 0.2f; - x = 1.5f * mainY; - } + if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 80.f && + body->_3cc != 0.f) { + DoDriftClear(); + } - GetKartCtrl()->ChaseFnumber(&body->_4c0, x, y); - if (body->_4c0 == 0.f) { - body->getStrat()->PitchClear(); - } + if (body->mCarStatus & KartBody::CsUnknown3) { + DoDriftClear(); + } + if (body->_458 < 2.f) { + 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); + } else { + int touchNum = body->getTouchNum(); + f32 _unk2 = (touchNum == 0) + ? 0.023529412f * warmupRollRet + : (body->_4f8 / 170.f) * warmupRollRet; + + GetKartCtrl()->ChaseFnumber(&body->_4c4, _unk2, + body->_3b4); + } + } + + if (!(body->mCarStatus & + (KartBody::CsUnknown0 | KartBody::CsUnknown1))) { + body->_4c4 = 0.f; + } + + DoRollAnim(); } -void KartGame::DoLiftTurbo() { - KartBody *body = mBody; +void +KartGame::DoTestPitch() +{ + KartBody *body = mBody; - JGeometry::TVec3f vec0; - JGeometry::TVec3f vec1; - JGeometry::TVec3f vec2; - JGeometry::TVec3f vec3; + 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; + } - if (!(body->mCarStatus & (KartBody::CsUnknown0 | KartBody::CsUnknown1))) - body->_518 = 0.f; + 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; + } - 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; - } + f32 x; + f32 y = 0.0; + if (mainY < 0.5 && mainY > -0.5f) { + x = 0.0; + } else { + y = 0.2f; + x = 1.5f * mainY; + } - if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f) - return; + GetKartCtrl()->ChaseFnumber(&body->_4c0, x, y); + if (body->_4c0 == 0.f) { + body->getStrat()->PitchClear(); + } +} - if (GetKartCtrl()->GetCarSpeed(body->mMynum) >= 40.f && body->_3c8 != 0.f) { - GetKartCtrl()->DevMatrixByVector(&vec1, &body->mVel, body->_110); - f32 v = vec1.z * 1.015f; - vec1.z *= 1.015f; - vec1.x *= 1.075f; +void +KartGame::DoLiftTurbo() +{ + KartBody *body = mBody; - if (v < 0.f) - vec1.z = v * -1.f; + 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; + } - PSMTXMultVecSR(body->_110, &vec1, &body->mVel); - } + if (GetKartCtrl()->GetCarSpeed(body->mMynum) <= 30.f) + return; - body->_564 = 0.38f; + if (GetKartCtrl()->GetCarSpeed(body->mMynum) >= 40.f && + body->_3c8 != 0.f) { + GetKartCtrl()->DevMatrixByVector(&vec1, &body->mVel, + body->_110); + f32 v = vec1.z * 1.015f; + vec1.z *= 1.015f; + vec1.x *= 1.075f; - f32 v0 = body->_518 * (body->_4dc * body->_3c8); + if (v < 0.f) + vec1.z = v * -1.f; - body->_518 = body->_514; + PSMTXMultVecSR(body->_110, &vec1, &body->mVel); + } + body->_518 = body->_514; - f32 v1 = v0 * body->_564; - f32 v2 = v0 * body->_564; - f32 inv = 1.f - body->_564; + f32 v0 = body->_518 * (body->_4dc * body->_3c8); + body->_564 = 0.38f; + vec0.set(body->_344.x, body->_344.y, body->_344.z); - vec0.set(body->_344.x, body->_344.y, body->_344.z); + f32 v1 = v0 * body->_564; + f32 inv = 1.f - body->_564; - vec1.set(body->_3a4 * v2, 0.f, body->_3a4 * v0 * inv); + vec1.set(body->_3a4 * v1, 0.f, body->_3a4 * v0 * inv); - if (body->mCarStatus & KartBody::CsUnknown1) - vec1.x *= -1.f; + if (body->mCarStatus & KartBody::CsUnknown1) + vec1.x *= -1.f; - PSMTXMultVec(body->_110, &vec0, &vec2); - PSMTXMultVecSR(body->_110, &vec1, &vec3); - body->DoForce(&vec2, &vec3); + 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->_3a4 * v2, 0.f, body->_4dc * inv); + vec0.set(body->_344.x, body->_344.y, 0.5f * -(body->_344.z)); + vec1.set(body->_4dc * v1, 0.f, body->_3a4 * inv); - if (body->mCarStatus & KartBody::CsUnknown1) - vec1.x *= -1.f; + if (body->mCarStatus & KartBody::CsUnknown1) + vec1.x *= -1.f; - PSMTXMultVec(body->_110, &vec0, &vec1); - PSMTXMultVecSR(body->_110, &vec1, &vec3); + PSMTXMultVec(body->_110, &vec0, &vec1); + PSMTXMultVecSR(body->_110, &vec1, &vec3); - body->DoForce(&vec2, &vec3); + body->DoForce(&vec2, &vec3); } -void KartGame::DoTurbo() {} +void +KartGame::DoTurbo() +{ +} -void KartGame::DoRollThrow() {} +void +KartGame::DoRollThrow() +{ +} // literally a no-op always returning 0 -int KartGame::DoRollOver() { - KartBody *body = mBody; +int +KartGame::DoRollOver() +{ + KartBody *body = mBody; - if (body->getTouchNum() == 0 || - body->mCarStatus & (KartBody::CsUnknown12 | KartBody::CsUnknown18) || - body->mGameStatus & (KartBody::GsUnknown3)) { - return 0; - } + if (body->getTouchNum() == 0 || + body->mCarStatus & + (KartBody::CsUnknown12 | KartBody::CsUnknown18) || + body->mGameStatus & (KartBody::GsUnknown3)) { + return 0; + } - return 0; + return 0; } -void KartGame::DoWanWan() { - // void ItemWanWanObj::getDifVel() const {} - // void ItemWanWanObj::getPullVec(JGeometry::TVec3 *) {} +void +KartGame::DoWanWan() +{ + // void ItemWanWanObj::getDifVel() const {} + // void ItemWanWanObj::getPullVec(JGeometry::TVec3 *) {} } -void KartGame::DoPushStart() {} +void +KartGame::DoPushStart() +{ +} -void KartGame::DoBalance(float *, float) {} +void +KartGame::DoBalance(float *, float) +{ +} -void KartGame::MakeClear() {} +void +KartGame::MakeClear() +{ +} -void KartGame::MakeBoardDash() {} +void +KartGame::MakeBoardDash() +{ +} -void KartGame::MakeJumpDash() {} +void +KartGame::MakeJumpDash() +{ +} -void KartGame::MakeSpJumpDash() {} +void +KartGame::MakeSpJumpDash() +{ +} -void KartGame::MakeMashDash() {} +void +KartGame::MakeMashDash() +{ +} -void KartGame::MakeGoldenMashDash() {} +void +KartGame::MakeGoldenMashDash() +{ +} -void KartGame::MakeStartDash() {} +void +KartGame::MakeStartDash() +{ +} -void KartGame::MakeCrashDash() {} +void +KartGame::MakeCrashDash() +{ +} -void KartGame::MakeWheelSpin() {} +void +KartGame::MakeWheelSpin() +{ +} -void KartGame::MakeJump() {} +void +KartGame::MakeJump() +{ +} -void KartGame::DoAirCheck() {} +void +KartGame::DoAirCheck() +{ +} -void KartGame::DoRearSlidePower() {} +void +KartGame::DoRearSlidePower() +{ +} -void KartGame::DoRearSlideBody() { - // void JGeometry::TVec3::div(float) {} +void +KartGame::DoRearSlideBody() +{ + // void JGeometry::TVec3::div(float) {} } -void KartGame::DoCorner() {} +void +KartGame::DoCorner() +{ +} -void KartGame::FrameWork(float, KartSus *, KartSus *) {} +void +KartGame::FrameWork(float, KartSus *, KartSus *) +{ +} -void KartGame::DoBodyAction() {} +void +KartGame::DoBodyAction() +{ +} -void KartGame::DoElementForce() {} +void +KartGame::DoElementForce() +{ +} -bool KartGame::CheckBalloon() {} +bool +KartGame::CheckBalloon() +{ +} -void KartGame::SetRank() {} +void +KartGame::SetRank() +{ +} -void KartGame::RankWatchMan() {} +void +KartGame::RankWatchMan() +{ +} -void KartGame::ItemWatchMan(ItemObj *) {} +void +KartGame::ItemWatchMan(ItemObj *) +{ +} -void KartGame::AfterItemWatchMan() {} +void +KartGame::AfterItemWatchMan() +{ +} -void KartGame::DoFlagCtrl() {} +void +KartGame::DoFlagCtrl() +{ +} -void KartGame::KeepWatch() {} +void +KartGame::KeepWatch() +{ +} -void KartGame::DoActionMgr() { - // void KartBody::getStar() {} - // void ItemObjMgr::getKartHitList(int) {} +void +KartGame::DoActionMgr() +{ + // void KartBody::getStar() {} + // void ItemObjMgr::getKartHitList(int) {} } -void KartGame::DoActionCtrl() {} +void +KartGame::DoActionCtrl() +{ +} -void KartGame::DoStatus() { - // void KartCtrl::DoAnime(int) {} +void +KartGame::DoStatus() +{ + // void KartCtrl::DoAnime(int) {} }