diff --git a/configure.py b/configure.py index 61d65144..85eb8623 100755 --- a/configure.py +++ b/configure.py @@ -1083,8 +1083,8 @@ def MatchingFor(*versions): Object(Matching, "Kameda/J2DManager.cpp"), Object(Matching, "Kameda/Task.cpp"), Object(NonMatching, "Kameda/Goal2D.cpp"), - Object(NonMatching, "Kameda/PauseManager.cpp"), - Object(NonMatching, "Kameda/Pause2D.cpp"), + Object(Matching, "Kameda/PauseManager.cpp"), + Object(Matching, "Kameda/Pause2D.cpp"), Object(Matching, "Kameda/WipeManager.cpp"), Object(Matching, "Kameda/Fade.cpp"), Object(Matching, "Kameda/K2DPicture.cpp"), diff --git a/include/JSystem/JGeometry/Vec.h b/include/JSystem/JGeometry/Vec.h index 807349ea..6bd2be0d 100644 --- a/include/JSystem/JGeometry/Vec.h +++ b/include/JSystem/JGeometry/Vec.h @@ -102,11 +102,24 @@ namespace JGeometry { y += other.y; } - void scale(T scalar) { + void sub(const TVec2 &other) + { + x -= other.x; + y -= other.y; + } + + void scale(T scalar) + { x *= scalar; y *= scalar; } + void div(T divisor) + { + x /= divisor; + y /= divisor; + } + void zero() { x = y = 0; } f32 dot(const TVec2 &other) const { return x * other.x + y * other.y; } @@ -131,6 +144,70 @@ namespace JGeometry { bool isAbove(const TVec2 &other) const { return (x >= other.x) && (y >= other.y) ? true : false; } + // operators + + // TODO: Odd return type (reference to local variable), but improves match percentage. + const TVec2 &operator+(const TVec2 &operand) const + { + TVec2 result(*this); + result.x += operand.x; + result.y += operand.y; + return result; + } + + TVec2 operator-(const TVec2 &operand) const + { + TVec2 result(*this); + result.x -= operand.x; + result.y -= operand.y; + return result; + } + + TVec2 operator*(f32 scalar) const + { + TVec2 result(*this); + result.x *= scalar; + result.y *= scalar; + return result; + } + + // TODO: Odd return type (reference to local variable), but improves match percentage. + const TVec2 &operator/(f32 divisor) const + { + TVec2 result(*this); + result.x /= divisor; + result.y /= divisor; + return result; + } + + TVec2 &operator+=(const TVec2 &operand) + { + x += operand.x; + y += operand.y; + return *this; + } + + TVec2 &operator-=(const TVec2 &operand) + { + x -= operand.x; + y -= operand.y; + return *this; + } + + TVec2 &operator*=(f32 scalar) + { + x *= scalar; + y *= scalar; + return *this; + } + + TVec2 &operator/=(f32 divisor) + { + x /= divisor; + y /= divisor; + return *this; + } + T x, y; }; diff --git a/include/Kameda/Pause2D.h b/include/Kameda/Pause2D.h index a2e355a1..f7efbdb0 100644 --- a/include/Kameda/Pause2D.h +++ b/include/Kameda/Pause2D.h @@ -1,58 +1,101 @@ #ifndef PAUSE2D_H #define PAUSE2D_H +#include "JSystem/J2D/J2DAnmLoader.h" +#include "JSystem/J2D/J2DGrafContext.h" +#include "JSystem/J2D/J2DPane.h" +#include "JSystem/J2D/J2DPicture.h" +#include "JSystem/J2D/J2DScreen.h" +#include "JSystem/JGeometry/Vec.h" #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JORReflexible.h" #include "Kaneshige/HioMgr.h" #include "Osako/kartPad.h" -class Pause2DParam : public JORReflexible { +class Pause2DParam : public JORReflexible +{ public: - // Inline/Unused Pause2DParam(); virtual ~Pause2DParam() {} + + u8 mFlag; // 0x04 }; -class Pause2DHioNode : public HioNode { +class Pause2DHioNode : public HioNode +{ public: - Pause2DHioNode(); + Pause2DHioNode() : HioNode("ポーズ表示", &mParam, 0, 0) {} virtual ~Pause2DHioNode() {} Pause2DParam mParam; }; -class Pause2D { // Autogenerated +class Pause2D +{ public: - enum PauseStatus { - + enum PauseStatus + { + PAUSE_ZERO = 0, + PAUSE_ONE = 1, + PAUSE_TWO = 2, + PAUSE_THREE = 3, + PAUSE_FOUR = 4, }; - Pause2D(JKRHeap *); // 0x8013554c - void init(); // 0x80136308 - void draw(); // 0x801364d0 - void calc(KartGamePad *); // 0x8013653c - void selectorGP(KartGamePad *); // 0x8013672c - void selectorVS(KartGamePad *); // 0x80136854 - void selectorTA(KartGamePad *); // 0x801369d4 - void selectorMG(KartGamePad *); // 0x80136b54 - void selectorCommon(); // 0x80136cec - void setDrawGP(); // 0x80136d34 - void setDrawVS(); // 0x80136ee4 - void setDrawTA(); // 0x80137408 - void setDrawMG(); // 0x8013792c - void setDrawCommon(); // 0x80137ff4 - void getScale(int); // 0x801381b4 - static int getPauseSelector(); // 0x801381fc - static PauseStatus getPauseStatus(); // 0x80138204 - static void setPauseStatus(PauseStatus); // 0x8013820c - void setPadText(); // 0x80138214 - static int mPauseSelector; // 0x804162b8 - static PauseStatus mStatus; // 0x804162bc - // Inline/Unused + Pause2D(JKRHeap *heap); // 0x8013554c ~Pause2D(); - static void *mLineTag; - static void *mPrintMessageTag; - static void *mStarTag; - static void *mStarDrawTag; -}; // class Pause2D -#endif // PAUSE2D_H + + void init(); // 0x80136308 + void draw(); // 0x801364d0 + void calc(KartGamePad *pad); // 0x8013653c + void selectorGP(KartGamePad *pad); // 0x8013672c + void selectorVS(KartGamePad *pad); // 0x80136854 + void selectorTA(KartGamePad *pad); // 0x801369d4 + void selectorMG(KartGamePad *pad); // 0x80136b54 + void selectorCommon(); // 0x80136cec + void setDrawGP(); // 0x80136d34 + void setDrawVS(); // 0x80136ee4 + void setDrawTA(); // 0x80137408 + void setDrawMG(); // 0x8013792c + void setDrawCommon(); // 0x80137ff4 + f32 getScale(int); // 0x801381b4 + static int getPauseSelector(); // 0x801381fc + static PauseStatus getPauseStatus(); // 0x80138204 + static void setPauseStatus(PauseStatus status); // 0x8013820c + void setPadText(); // 0x80138214 + +private: + static int mPauseSelector; // 0x804162b8 + static PauseStatus mStatus; // 0x804162bc + + Pause2DHioNode *mHioNode; // 0x00 + J2DOrthoGraph *mOrthoGraph; // 0x04 + J2DScreen *mScreen; // 0x08 + J2DAnmTransform *mTransform; // 0x0c + J2DAnmColor *mColor; // 0x10 + s32 _14; // 0x14 + s32 _18; // 0x18 + s32 mAnmFrame[2]; // 0x1c + f32 mScale[2]; // 0x24 + J2DPicture *mMenuEntries[6]; // 0x2c + J2DPane *mPaneStarsPosOffset; // 0x44 + J2DPane *mPaneStarsPos[12]; // 0x48 + JGeometry::TVec2f mStarsPos[12]; // 0x78 + J2DPane *mStars[2]; // 0xd8 + s32 mCounter; // 0xe0 + JGeometry::TVec2f mInitialPos[2]; // 0xe4 + JGeometry::TVec2f mTargetPos[2]; // 0xf4 + JGeometry::TVec2f mDrawPos[2]; // 0x104 + + struct LinePane + { + J2DAnmBase *mAnm; // 0x00 + J2DPane *mPane; // 0x04 + f32 mScale; // 0x08 + } mPaneLines[6]; // 0x114 + + void (Pause2D::*mSelector)(KartGamePad *); // 0x15c + void (Pause2D::*mSetDraw)(); // 0x168 +}; + +#endif // PAUSE2D_H diff --git a/include/Kameda/PauseManager.h b/include/Kameda/PauseManager.h index 56ffb50d..ba6b1fa1 100644 --- a/include/Kameda/PauseManager.h +++ b/include/Kameda/PauseManager.h @@ -1,53 +1,84 @@ #ifndef PAUSEMANAGER_H #define PAUSEMANAGER_H +#include "JSystem/J2D/J2DGrafContext.h" +#include "JSystem/JKernel/JKRArchive.h" #include "JSystem/JKernel/JKRHeap.h" +#include "Kameda/Pause2D.h" +#include "Kameda/PrintMemoryCard.h" +#include "Kameda/Result2D.h" #include "Osako/kartPad.h" #include "types.h" -class PauseManager { +class PauseManager +{ public: - PauseManager(JKRHeap *); // 0x801343d0 - void reset(); // 0x801345fc - void draw(); // 0x801346d0 - void exec(); // 0x801348f8 - static bool tstPause(); // 0x80135288 - void wipeOut(int); // 0x80135290 - static int getPauseChoice(); // 0x801352d0 - void setTA(); // 0x8013541c - - void setResultStartFlag(bool flag) {mResultStart = flag; } + PauseManager(JKRHeap *heap); // 0x801343d0 + ~PauseManager(); + void reset(); // 0x801345fc + void setPause(); + void clrPause(); + void draw(); // 0x801346d0 + void exec(); // 0x801348f8 + static bool tstPause(); // 0x80135288 + void wipeIn(); + void wipeOut(int); // 0x80135290 + static int getPauseChoice(); // 0x801352d0 + void getCharRankPos(int); + void setTA(); // 0x8013541c + + void setResultStartFlag(bool flag) { mResultStart = flag; } void setGameOverFlag(bool flag) { mGameOver = flag; } void setExecFlag(bool flag) { mExec = flag; } void setPauseEndFlag(bool flag) { mPauseEnd = flag; } - + void enablePause() { _14 = 0; } - static PauseManager *getManager() { - return mThis; - } + static PauseManager *getManager() { return mThis; } + + JKRArchive *getArchive() const { return mArchive; } bool isResultStart() const { return mResultStart; } private: - static PauseManager *mThis; // 0x80416298 - static bool mIsPause; // 0x8041629c - static int mPauseSelector; // 0x804162a0 - static int mPauseChoice; // 0x804162a4 - static int mPauseNextChoice; // 0x804162a8 - static KartGamePad *mPausePad; // 0x804162ac - - u8 _0[0xe]; - bool mResultStart; - bool _f; - bool mGameOver; - u8 _11[0x13 - 0x11]; - bool mExec; - u32 _14; - bool mPauseEnd; - u8 _19[0x3c - 0x19]; + static PauseManager *mThis; // 0x80416298 + static bool mIsPause; // 0x8041629c + static int mPauseSelector; // 0x804162a0 + static int mPauseChoice; // 0x804162a4 + static int mPauseNextChoice; // 0x804162a8 + static KartGamePad *mPausePad; // 0x804162ac + + bool mNetFlag; // 0x00 + u8 _1[3]; // 0x01 + JKRArchive *mArchive; // 0x04 + PrintMemoryCard *mPrintMemoryCard; // 0x08 + u8 _c; // 0x0c + u8 _d; // 0x0d + bool mResultStart; // 0x0e + bool _f; // 0x0f + bool mGameOver; // 0x10 + u8 _11; // 0x11 + u8 _12; // 0x12 + bool mExec; // 0x13 + s32 _14; // 0x14 + bool mPauseEnd; // 0x18 + u8 _19; // 0x19 + u8 _1a; // 0x1a + u8 _1b; // 0x1b + Pause2D *mPause2D; // 0x1c + Result2D *mResult2D; // 0x20 + J2DOrthoGraph *mOrthoGraph; // 0x24 + s32 _28; // 0x28 + s32 mWipeOutFrame; // 0x2c + s32 mWipeOutDuration; // 0x30 + u32 _34; // 0x30 + bool _38; // 0x38 + u8 _39[3]; // 0x39 }; -inline PauseManager *GETPauseManager() { return PauseManager::getManager(); } +inline PauseManager *GETPauseManager() +{ + return PauseManager::getManager(); +} #endif diff --git a/include/Kameda/Result2D.h b/include/Kameda/Result2D.h index 5a111778..0eb8d13c 100644 --- a/include/Kameda/Result2D.h +++ b/include/Kameda/Result2D.h @@ -57,7 +57,7 @@ class Result2D { // Autogenerated void setDrawVS(); // 0x8014cb58 void setDrawTA(); // 0x8014cc10 void setDrawMG(); // 0x8014cd94 - void getResultSelector(); // 0x8014ce48 + static int getResultSelector(); // 0x8014ce48 void setRaceRank(); // 0x8014ce50 void setGPRank(); // 0x8014d924 void setVS(); // 0x8014df84 @@ -81,9 +81,12 @@ class Result2D { // Autogenerated void getFrameColor(JUTColor &); // 0x80150500 void getScale(int); // 0x8015057c void setScale(int); // 0x801505c4 - void setGPClr(); // 0x80150804 - void getAnmEnd(); // 0x80150830 - + static void setGPClr(); // 0x80150804 + bool getAnmEnd(); // 0x80150830 + + static inline bool getDrawFlag(); + static inline void setDrawFlag(bool drawFlag); + static const u64 mSetWordLineTag[9]; // 0x8036ec18 static const u64 mResultLayoutTag[11]; // 0x8036ec60 static const u64 mResultLineTag[20]; // 0x8036ecb8 @@ -101,6 +104,11 @@ class Result2D { // Autogenerated // Inline/Unused ~Result2D(); void getCharPos(int); + +public: + u8 _0[0x1980]; // 0x0 + u32 _1980; // 0x1980 + u8 _1984[0x1c24 - 0x1984]; // 0x1984 }; // class Result2D #endif // RESULT2D_H diff --git a/include/Kameda/SequenceInfo.h b/include/Kameda/SequenceInfo.h index 7bca7fbf..d19c317b 100644 --- a/include/Kameda/SequenceInfo.h +++ b/include/Kameda/SequenceInfo.h @@ -127,8 +127,10 @@ class SequenceInfo JMARandFast mRnd; // 00 int mStartNo[8]; // 004 KartGamePad *mDecidePad; // 024 +public: u8 _28; // 028 int _2c; // 02C +private: int _30; // 030 u8 mGhostFlags; // 034 u8 _35[0x3C - 0x35]; // 035 diff --git a/include/Kameda/WipeManager.h b/include/Kameda/WipeManager.h index 07833c4c..8511ec6a 100644 --- a/include/Kameda/WipeManager.h +++ b/include/Kameda/WipeManager.h @@ -71,6 +71,8 @@ class WipeManager void startWipe(int idx) { mMoveFlag[idx] = true; } void stopWipe(int idx) { mMoveFlag[idx] = false; } int getScreenCount() const { return mScrnCount; } + TWipeCurtain *getWipeCurtain() const { return mWipeCurtain; } + Mario *getMario() const { return mMario; } static WipeManager *getManager() { return mThis; } diff --git a/include/Osako/PadRecorder.h b/include/Osako/PadRecorder.h index bdcc8b22..934a6940 100644 --- a/include/Osako/PadRecorder.h +++ b/include/Osako/PadRecorder.h @@ -40,12 +40,12 @@ class PadRecorder KartPadRecord *getGhostRecord(u8 no); void playGhost(); // Inline - u32 getFrame() { return mFrame; }; + s32 getFrame() { return mFrame; }; void setFrame(u32 frame) { mFrame = frame; } static PadRecorder *mspRecorder; private: - u32 mFrame; + s32 mFrame; PadState mState; KartPadData mPadData[NUM_PLAYERPADS]; JUTGamePad::CButton mButton[NUM_PLAYERPADS]; diff --git a/src/Kameda/Pause2D.cpp b/src/Kameda/Pause2D.cpp index 924b6856..82d6872a 100644 --- a/src/Kameda/Pause2D.cpp +++ b/src/Kameda/Pause2D.cpp @@ -1,51 +1,1351 @@ #include "Kameda/Pause2D.h" -#include "mathHelper.h" + +#include "Inagaki/GameAudioMain.h" +#include "JSystem/J2D/J2DGrafContext.h" +#include "JSystem/JAudio/JASFakeMatch2.h" // For static initializer +#include "JSystem/JGeometry/Vec.h" +#include "JSystem/JKernel/JKRArchive.h" +#include "JSystem/JKernel/JKRFileLoader.h" +#include "JSystem/JMath/JMath.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "Kameda/PauseManager.h" +#include "Kameda/ReadPrintMessage.h" +#include "Kaneshige/RaceMgr.h" +#include "Osako/FontMgr.h" +#include "Osako/ResMgr.h" +#include "Osako/system.h" +#include "mathHelper.h" // For unused data +#include "string.h" int Pause2D::mPauseSelector; Pause2D::PauseStatus Pause2D::mStatus; -Pause2D::Pause2D(JKRHeap *) {} +Pause2DParam::Pause2DParam() : mFlag(1) {} + +Pause2D::Pause2D(JKRHeap *heap) +{ + mOrthoGraph = System::getJ2DOrtho(); + mHioNode = new (heap, 0) Pause2DHioNode(); + + switch (RCMGetManager()->getRaceMode()) + { + case GRAND_PRIX: + case AWARD_DEMO: + case STAFF_ROLL: + { + mScreen = new (heap, 0) J2DScreen(); + mScreen->set("pause2.blo", 0x40000, PauseManager::getManager()->getArchive()); + + void *bck = JKRGetNameResource("pause2.bck", PauseManager::getManager()->getArchive()); + mTransform = (J2DAnmTransform *)J2DAnmLoaderDataBase::load(bck); + mScreen->setAnimation(mTransform); + + mColor = (J2DAnmColor *)J2DAnmLoaderDataBase::load( + JKRGetNameResource("pause2.bpk", PauseManager::getManager()->getArchive())); + mScreen->setAnimation(mColor); + + for (int i = 0; i < 2; ++i) + { + mPaneLines[i].mPane = mScreen->search((u64)'Line1' + (u64)i); + mPaneLines[i].mAnm = J2DAnmLoaderDataBase::load(bck); + mPaneLines[i].mPane->setAnimation((J2DAnmTransform *)mPaneLines[i].mAnm); + } + + for (int i = 0; i < 4; ++i) + { + J2DPane *pane = mScreen->search((u64)'kr_a' + (u64)i); +#line 91 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mPaneStarsPos[i] = pane; + mStarsPos[i].x = mPaneStarsPos[i]->getTranslateX(); + mStarsPos[i].y = mPaneStarsPos[i]->getTranslateY(); + mPaneStarsPos[i]->hide(); + } + + for (int i = 0; i < 2; ++i) + { + J2DPicture *pane = (J2DPicture *)mScreen->search((u64)'PM1' + (u64)i); +#line 101 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mMenuEntries[i] = pane; + } + + mMenuEntries[0]->changeTexture("Mozi_Continue.bti", 0); + mMenuEntries[1]->changeTexture("Mozi_Quit.bti", 0); + + setPadText(); + + mSetDraw = &Pause2D::setDrawGP; + mSelector = &Pause2D::selectorGP; + + break; + } + case VERSUS_RACE: + { + mScreen = new (heap, 0) J2DScreen(); + mScreen->set("pause5.blo", 0x40000, PauseManager::getManager()->getArchive()); + + void *bck = JKRGetNameResource("pause5.bck", PauseManager::getManager()->getArchive()); + mTransform = (J2DAnmTransform *)J2DAnmLoaderDataBase::load(bck); + mScreen->setAnimation(mTransform); + + mColor = (J2DAnmColor *)J2DAnmLoaderDataBase::load( + JKRGetNameResource("pause5.bpk", PauseManager::getManager()->getArchive())); + mScreen->setAnimation(mColor); + + for (int i = 0; i < 5; ++i) + { + mPaneLines[i].mPane = mScreen->search((u64)'Line1' + (u64)i); + mPaneLines[i].mAnm = J2DAnmLoaderDataBase::load(bck); + mPaneLines[i].mPane->setAnimation((J2DAnmTransform *)mPaneLines[i].mAnm); + } + + for (int i = 0; i < 10; ++i) + { + J2DPane *pane = mScreen->search((u64)'kr_a' + (u64)i); +#line 135 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mPaneStarsPos[i] = pane; + mStarsPos[i].x = mPaneStarsPos[i]->getTranslateX(); + mStarsPos[i].y = mPaneStarsPos[i]->getTranslateY(); + mPaneStarsPos[i]->hide(); + } + + for (int i = 0; i < 5; ++i) + { + J2DPicture *pane = (J2DPicture *)mScreen->search((u64)'PM1' + (u64)i); +#line 145 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mMenuEntries[i] = pane; + } + + mSetDraw = &Pause2D::setDrawVS; + mSelector = &Pause2D::selectorVS; + + break; + } + case TIME_ATTACK: + { + mScreen = new (heap, 0) J2DScreen(); + mScreen->set("pause5.blo", 0x40000, PauseManager::getManager()->getArchive()); + + void *bck = JKRGetNameResource("pause5.bck", PauseManager::getManager()->getArchive()); + mTransform = (J2DAnmTransform *)J2DAnmLoaderDataBase::load(bck); + mScreen->setAnimation(mTransform); + + mColor = (J2DAnmColor *)J2DAnmLoaderDataBase::load( + JKRGetNameResource("pause5.bpk", PauseManager::getManager()->getArchive())); + mScreen->setAnimation(mColor); + + for (int i = 0; i < 5; ++i) + { + mPaneLines[i].mPane = mScreen->search((u64)'Line1' + (u64)i); + mPaneLines[i].mAnm = J2DAnmLoaderDataBase::load(bck); + mPaneLines[i].mPane->setAnimation((J2DAnmTransform *)mPaneLines[i].mAnm); + } + + for (int i = 0; i < 10; ++i) + { + J2DPane *pane = mScreen->search((u64)'kr_a' + (u64)i); +#line 172 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mPaneStarsPos[i] = pane; + mStarsPos[i].x = mPaneStarsPos[i]->getTranslateX(); + mStarsPos[i].y = mPaneStarsPos[i]->getTranslateY(); + mPaneStarsPos[i]->hide(); + } + + for (int i = 0; i < 5; ++i) + { + J2DPicture *pane = (J2DPicture *)mScreen->search((u64)'PM1' + (u64)i); +#line 182 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mMenuEntries[i] = pane; + } + + mSetDraw = &Pause2D::setDrawTA; + mSelector = &Pause2D::selectorTA; + + break; + } + case BALLOON_BATTLE: + case BOMB_BATTLE: + case ESCAPE_BATTLE: + { + mScreen = new (heap, 0) J2DScreen(); + mScreen->set("pause6.blo", 0x40000, PauseManager::getManager()->getArchive()); + + void *bck = JKRGetNameResource("pause6.bck", PauseManager::getManager()->getArchive()); + mTransform = (J2DAnmTransform *)J2DAnmLoaderDataBase::load(bck); + mScreen->setAnimation(mTransform); + + mColor = (J2DAnmColor *)J2DAnmLoaderDataBase::load( + JKRGetNameResource("pause6.bpk", PauseManager::getManager()->getArchive())); + mScreen->setAnimation(mColor); + + for (int i = 0; i < 6; ++i) + { + mPaneLines[i].mPane = mScreen->search((u64)'Line1' + (u64)i); + mPaneLines[i].mAnm = J2DAnmLoaderDataBase::load(bck); + mPaneLines[i].mPane->setAnimation((J2DAnmTransform *)mPaneLines[i].mAnm); + } + + for (int i = 0; i < 12; ++i) + { + J2DPane *pane = mScreen->search((u64)'kr_a' + (u64)i); +#line 211 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mPaneStarsPos[i] = pane; + mStarsPos[i].x = mPaneStarsPos[i]->getTranslateX(); + mStarsPos[i].y = mPaneStarsPos[i]->getTranslateY(); + mPaneStarsPos[i]->hide(); + } + + for (int i = 0; i < 6; ++i) + { + J2DPicture *pane = (J2DPicture *)mScreen->search((u64)'PM1' + (u64)i); +#line 221 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mMenuEntries[i] = pane; + } + + mMenuEntries[2]->changeTexture("Mozi_Change_Map.bti", 0); + mMenuEntries[3]->changeTexture("Mozi_Change_Character.bti", 0); + mMenuEntries[4]->changeTexture("Mozi_Change_MiniGame.bti", 0); + + mSetDraw = &Pause2D::setDrawMG; + mSelector = &Pause2D::selectorMG; + + break; + } + default: +#line 233 + JUT_ASSERT(0); + break; + } + + mPaneStarsPosOffset = mScreen->search((u64)'kr'); + + for (int i = 0; i < 2; ++i) + { + J2DPane *pane = mScreen->search((u64)'star1' + (u64)i); +#line 243 + JUT_ASSERT(pane->getTypeID() == J2DPane_Picture); + mStars[i] = pane; + } + + init(); +} + +void Pause2D::init() +{ + mStatus = PAUSE_ZERO; + _14 = -1; + _18 = 0; + + for (int i = 0; i < 2; ++i) + { + mAnmFrame[i] = 0; + } + + switch (RCMGetManager()->getRaceMode()) + { + case TIME_ATTACK: + case GRAND_PRIX: + case VERSUS_RACE: + case BALLOON_BATTLE: + case BOMB_BATTLE: + case ESCAPE_BATTLE: + case AWARD_DEMO: + case STAFF_ROLL: + mPauseSelector = 0; + break; + default: +#line 277 + JUT_ASSERT(0); + break; + } + + mCounter = 0; + mInitialPos[0] = mStarsPos[0]; + mTargetPos[0] = mStarsPos[0]; + mInitialPos[1] = mStarsPos[1]; + mTargetPos[1] = mStarsPos[1]; + mTransform->setFrame(0.0f); + mColor->setFrame(0.0f); + + for (int i = 0; i < 6; ++i) + { + mPaneLines[i].mScale = 0.0f; + } + + mScreen->animation(); + (this->*mSetDraw)(); +} + +Pause2D::~Pause2D() +{ + delete mHioNode; + // Symbol not available; implementation incomplete. +} + +void Pause2D::draw() +{ + if ((mHioNode->mParam.mFlag & 1) && PauseManager::tstPause()) + { + mOrthoGraph->setPort(); + mScreen->draw(0.0f, 0.0f, mOrthoGraph); + } +} + +void Pause2D::calc(KartGamePad *pad) +{ + if (!(mHioNode->mParam.mFlag & 1)) + return; + + if (pad != nullptr && mStatus != PAUSE_FOUR && mCounter == 0) + { + (this->*mSelector)(pad); + } + + switch (mStatus) + { + case PAUSE_ZERO: + break; + case PAUSE_ONE: + if (++_14 == 9) + { + mStatus = PAUSE_TWO; + } + break; + case PAUSE_TWO: + if (++_18 < 30) + { + _14 = 9; + } + else + { + mStatus = PAUSE_THREE; + } + break; + case PAUSE_THREE: + _14 = 9; + break; + case PAUSE_FOUR: + if (++_14 >= 20) + { + mStatus = PAUSE_ZERO; + } + break; + default: +#line 370 + JUT_ASSERT(0); + break; + } + + mTransform->setFrame((f32)_14); + mColor->setFrame((f32)_14); + mScreen->animation(); + + for (int i = 0; i < 2; ++i) + { + s32 frame = mAnmFrame[i] + 1; + mAnmFrame[i] = frame; + mAnmFrame[i] = frame % 50; + mScale[i] = getScale(mAnmFrame[i]); + } + + (this->*mSetDraw)(); +} + +void Pause2D::selectorGP(KartGamePad *pad) +{ + if (pad->testRepeat(JUTGamePad::MAINSTICK_UP)) + { + switch (mPauseSelector) + { + case 0: + mPauseSelector = 8; + break; + case 8: + mPauseSelector = 0; + break; + default: +#line 405 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } + else if (pad->testRepeat(JUTGamePad::MAINSTICK_DOWN)) + { + switch (mPauseSelector) + { + case 0: + mPauseSelector = 8; + break; + case 8: + mPauseSelector = 0; + break; + default: +#line 419 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } +} + +void Pause2D::selectorVS(KartGamePad *pad) +{ + if (pad->testRepeat(JUTGamePad::MAINSTICK_UP)) + { + switch (mPauseSelector) + { + case 8: + mPauseSelector = 8; + break; + case 0: + mPauseSelector = 0; + break; + case 1: + mPauseSelector = 1; + break; + case 2: + mPauseSelector = 2; + break; + case 4: + mPauseSelector = 4; + break; + default: +#line 453 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } + else if (pad->testRepeat(JUTGamePad::MAINSTICK_DOWN)) + { + switch (mPauseSelector) + { + case 1: + mPauseSelector = 1; + break; + case 2: + mPauseSelector = 2; + break; + case 4: + mPauseSelector = 4; + break; + case 8: + mPauseSelector = 8; + break; + case 0: + mPauseSelector = 0; + break; + default: +#line 476 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } +} + +void Pause2D::selectorTA(KartGamePad *pad) +{ + if (pad->testRepeat(JUTGamePad::MAINSTICK_UP)) + { + switch (mPauseSelector) + { + case 8: + mPauseSelector = 8; + break; + case 0: + mPauseSelector = 0; + break; + case 1: + mPauseSelector = 1; + break; + case 2: + mPauseSelector = 2; + break; + case 4: + mPauseSelector = 4; + break; + default: +#line 510 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } + else if (pad->testRepeat(JUTGamePad::MAINSTICK_DOWN)) + { + switch (mPauseSelector) + { + case 1: + mPauseSelector = 1; + break; + case 2: + mPauseSelector = 2; + break; + case 4: + mPauseSelector = 4; + break; + case 8: + mPauseSelector = 8; + break; + case 0: + mPauseSelector = 0; + break; + default: +#line 533 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } +} + +void Pause2D::selectorMG(KartGamePad *pad) +{ + if (pad->testRepeat(JUTGamePad::MAINSTICK_UP)) + { + switch (mPauseSelector) + { + case 8: + mPauseSelector = 8; + break; + case 0: + mPauseSelector = 0; + break; + case 1: + mPauseSelector = 1; + break; + case 3: + mPauseSelector = 3; + break; + case 4: + mPauseSelector = 4; + break; + case 6: + mPauseSelector = 6; + break; + default: +#line 570 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } + else if (pad->testRepeat(JUTGamePad::MAINSTICK_DOWN)) + { + switch (mPauseSelector) + { + case 1: + mPauseSelector = 1; + break; + case 3: + mPauseSelector = 3; + break; + case 4: + mPauseSelector = 4; + break; + case 6: + mPauseSelector = 6; + break; + case 8: + mPauseSelector = 8; + break; + case 0: + mPauseSelector = 0; + break; + default: +#line 596 + JUT_ASSERT(0); + break; + } + selectorCommon(); + } +} + +void Pause2D::selectorCommon() +{ + mAnmFrame[0] = 0; + mAnmFrame[1] = 0; + GameAudio::Main::getAudio()->startSystemSe(0x20000); + mCounter = 1; +} + +void Pause2D::setDrawGP() +{ + switch (mPauseSelector) + { + case 0: + { + mMenuEntries[0]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[0]; + mTargetPos[1] = mStarsPos[1]; + + if (++mPaneLines[0].mScale > 7.0f) + { + mPaneLines[0].mScale = 7.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + break; + } + case 8: + { + mMenuEntries[1]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[2]; + mTargetPos[1] = mStarsPos[3]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (++mPaneLines[1].mScale > 7.0f) + { + mPaneLines[1].mScale = 7.0f; + } + break; + } + default: +#line 643 + JUT_ASSERT(0); + break; + } + + for (int i = 0; i < 2; ++i) + { + mPaneLines[i].mAnm->setFrame(mPaneLines[i].mScale); + } + + setDrawCommon(); +} + +void Pause2D::setDrawVS() +{ + switch (mPauseSelector) + { + case 0: + { + mMenuEntries[0]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[0]; + mTargetPos[1] = mStarsPos[1]; + + if (++mPaneLines[0].mScale > 7.0f) + { + mPaneLines[0].mScale = 7.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + + break; + } + case 1: + { + mMenuEntries[1]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[2]; + mTargetPos[1] = mStarsPos[3]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (++mPaneLines[1].mScale > 7.0f) + { + mPaneLines[1].mScale = 7.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + + break; + } + case 2: + { + mMenuEntries[2]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[4]; + mTargetPos[1] = mStarsPos[5]; -void Pause2D::init() {} + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (++mPaneLines[2].mScale > 7.0f) + { + mPaneLines[2].mScale = 7.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } -void Pause2D::draw() {} + break; + } + case 4: + { + mMenuEntries[3]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[6]; + mTargetPos[1] = mStarsPos[7]; -void Pause2D::calc(KartGamePad *) {} + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (++mPaneLines[3].mScale > 7.0f) + { + mPaneLines[3].mScale = 7.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } -void Pause2D::selectorGP(KartGamePad *) {} + break; + } + case 8: + { + mMenuEntries[4]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[8]; + mTargetPos[1] = mStarsPos[9]; -void Pause2D::selectorVS(KartGamePad *) {} + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (++mPaneLines[4].mScale > 7.0f) + { + mPaneLines[4].mScale = 7.0f; + } -void Pause2D::selectorTA(KartGamePad *) {} + break; + } + default: +#line 716 + JUT_ASSERT(0); + break; + } -void Pause2D::selectorMG(KartGamePad *) {} + for (int i = 0; i < 5; ++i) + { + mPaneLines[i].mAnm->setFrame(mPaneLines[i].mScale); + } -void Pause2D::selectorCommon() {} + setDrawCommon(); +} + +void Pause2D::setDrawTA() +{ + switch (mPauseSelector) + { + case 0: + { + mMenuEntries[0]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[0]; + mTargetPos[1] = mStarsPos[1]; + + if (++mPaneLines[0].mScale > 7.0f) + { + mPaneLines[0].mScale = 7.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + + break; + } + case 1: + { + mMenuEntries[1]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[2]; + mTargetPos[1] = mStarsPos[3]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (++mPaneLines[1].mScale > 7.0f) + { + mPaneLines[1].mScale = 7.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + + break; + } + case 2: + { + mMenuEntries[2]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[4]; + mTargetPos[1] = mStarsPos[5]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (++mPaneLines[2].mScale > 7.0f) + { + mPaneLines[2].mScale = 7.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + + break; + } + case 4: + { + mMenuEntries[3]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[6]; + mTargetPos[1] = mStarsPos[7]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (++mPaneLines[3].mScale > 7.0f) + { + mPaneLines[3].mScale = 7.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + + break; + } + case 8: + { + mMenuEntries[4]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[8]; + mTargetPos[1] = mStarsPos[9]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (++mPaneLines[4].mScale > 7.0f) + { + mPaneLines[4].mScale = 7.0f; + } + + break; + } + default: +#line 788 + JUT_ASSERT(0); + break; + } + + for (int i = 0; i < 5; ++i) + { + mPaneLines[i].mAnm->setFrame(mPaneLines[i].mScale); + } + + setDrawCommon(); +} -void Pause2D::setDrawGP() {} +void Pause2D::setDrawMG() +{ + switch (mPauseSelector) + { + case 0: + { + mMenuEntries[0]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[0]; + mTargetPos[1] = mStarsPos[1]; -void Pause2D::setDrawVS() {} + if (++mPaneLines[0].mScale > 7.0f) + { + mPaneLines[0].mScale = 7.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + if (--mPaneLines[5].mScale < 0.0f) + { + mPaneLines[5].mScale = 0.0f; + } -void Pause2D::setDrawTA() {} + break; + } + case 1: + { + mMenuEntries[1]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[2]; + mTargetPos[1] = mStarsPos[3]; -void Pause2D::setDrawMG() {} + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (++mPaneLines[1].mScale > 7.0f) + { + mPaneLines[1].mScale = 7.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + if (--mPaneLines[5].mScale < 0.0f) + { + mPaneLines[5].mScale = 0.0f; + } -void Pause2D::setDrawCommon() {} + break; + } + case 3: + { + mMenuEntries[2]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[4]; + mTargetPos[1] = mStarsPos[5]; -void Pause2D::getScale(int) {} + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (++mPaneLines[2].mScale > 7.0f) + { + mPaneLines[2].mScale = 7.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + if (--mPaneLines[5].mScale < 0.0f) + { + mPaneLines[5].mScale = 0.0f; + } -int Pause2D::getPauseSelector() { + break; + } + case 4: + { + mMenuEntries[3]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[6]; + mTargetPos[1] = mStarsPos[7]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (++mPaneLines[3].mScale > 7.0f) + { + mPaneLines[3].mScale = 7.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + if (--mPaneLines[5].mScale < 0.0f) + { + mPaneLines[5].mScale = 0.0f; + } + + break; + } + case 6: + { + mMenuEntries[4]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[8]; + mTargetPos[1] = mStarsPos[9]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (++mPaneLines[4].mScale > 7.0f) + { + mPaneLines[4].mScale = 7.0f; + } + if (--mPaneLines[5].mScale < 0.0f) + { + mPaneLines[5].mScale = 0.0f; + } + + break; + } + case 8: + { + mMenuEntries[5]->updateScale(mScale[0]); + mTargetPos[0] = mStarsPos[10]; + mTargetPos[1] = mStarsPos[11]; + + if (--mPaneLines[0].mScale < 0.0f) + { + mPaneLines[0].mScale = 0.0f; + } + if (--mPaneLines[1].mScale < 0.0f) + { + mPaneLines[1].mScale = 0.0f; + } + if (--mPaneLines[2].mScale < 0.0f) + { + mPaneLines[2].mScale = 0.0f; + } + if (--mPaneLines[3].mScale < 0.0f) + { + mPaneLines[3].mScale = 0.0f; + } + if (--mPaneLines[4].mScale < 0.0f) + { + mPaneLines[4].mScale = 0.0f; + } + if (++mPaneLines[5].mScale > 7.0f) + { + mPaneLines[5].mScale = 7.0f; + } + + break; + } + default: +#line 880 + JUT_ASSERT(0); + break; + } + + for (int i = 0; i < 6; ++i) + { + mPaneLines[i].mAnm->setFrame(mPaneLines[i].mScale); + } + + setDrawCommon(); +} + +void Pause2D::setDrawCommon() +{ + for (int i = 0; i < 2; ++i) + { +#if 0 + if ((int)*(uint *)(this + 0xe0) < 8) + { + fVar2 = *(float *)(unaff_r2 + -0x63c0); + fVar1 = (float)((double)CONCAT44(0x43300000, *(uint *)(this + 0xe0) ^ 0x80000000) - *(double *)(unaff_r2 + -0x63d0)); + *(float *)(this + iVar6 + 0x104) = *(float *)(this + iVar6 + 0xe4) + (*(float *)(this + iVar6 + 0xf4) - *(float *)(this + iVar6 + 0xe4)) * fVar1 * fVar2; + *(float *)(this + iVar6 + 0x108) = *(float *)(this + iVar6 + 0xe8) + (*(float *)(this + iVar6 + 0xf8) - *(float *)(this + iVar6 + 0xe8)) * fVar1 * fVar2; + } + else + { + *(undefined4 *)(this + iVar6 + 0xe4) = *(undefined4 *)(this + iVar6 + 0xf4); + *(undefined4 *)(this + iVar6 + 0xe8) = *(undefined4 *)(this + iVar6 + 0xf8); + *(undefined4 *)(this + iVar6 + 0x104) = *(undefined4 *)(this + iVar6 + 0xe4); + *(undefined4 *)(this + iVar6 + 0x108) = *(undefined4 *)(this + iVar6 + 0xe8); + } +#endif + if (mCounter < 8) + { + // TODO: Something not right around this line (or in Vec2.h). + mDrawPos[i] = mInitialPos[i] + (mTargetPos[i] - mInitialPos[i]) * (f32)mCounter / 8.0f; + } + else + { + mInitialPos[i] = mTargetPos[i]; + mDrawPos[i] = mInitialPos[i]; + } + +#if 0 + fVar1 = *(float *)(*(int *)(this + 0x44) + 0xd8); + fVar2 = *(float *)(this + iVar6 + 0x108); + piVar4 = *(int **)(this + iVar7 + 0xd8); + piVar4[0x35] = (int)(*(float *)(this + iVar6 + 0x104) + *(float *)(*(int *)(this + 0x44) + 0xd4)); + piVar4[0x36] = (int)(fVar2 + fVar1); + (**(code **)(*piVar4 + 0x2c))(); +#endif + + mStars[i]->setOffset(mDrawPos[i].x + mPaneStarsPosOffset->getTranslateX(), + mDrawPos[i].y + mPaneStarsPosOffset->getTranslateY()); + +#if 0 + piVar4 = *(int **)(this + iVar7 + 0xd8); + iVar3 = *(int *)(this + 0x28); + piVar4[0x33] = iVar3; + piVar4[0x34] = iVar3; + (**(code **)(*piVar4 + 0x2c))(); +#endif + mStars[i]->updateScale(mScale[1]); + } + +#if 0 + iVar5 = *(int *)(this + 0xe0); + if (iVar5 != 0) + { + if (iVar5 < 8) + { + *(int *)(this + 0xe0) = iVar5 + 1; + } + else + { + *(undefined4 *)(this + 0xe0) = 0; + } + } +#endif + + s32 counter = mCounter; + if (counter != 0) + { + if (counter < 8) + { + ++mCounter; + } + else + { + mCounter = 0; + } + } +} + +f32 Pause2D::getScale(int frame) +{ + u32 num = (frame * 65535) / 50 + 0x7FFF; + return 1.0f + 0.3f * (0.5f + -0.5f * JMath::sincosTable_.mTable[(num >> 5) & 0x07FF].second); +} + +int Pause2D::getPauseSelector() +{ return mPauseSelector; } -Pause2D::PauseStatus Pause2D::getPauseStatus() { +Pause2D::PauseStatus Pause2D::getPauseStatus() +{ return mStatus; } -void Pause2D::setPauseStatus(Pause2D::PauseStatus status) { +void Pause2D::setPauseStatus(Pause2D::PauseStatus status) +{ mStatus = status; } -void Pause2D::setPadText() {} +void Pause2D::setPadText() +{ + struct PadTextInfo + { + J2DTextBox *pane; + u64 name; + int messageIdx; + }; + + PadTextInfo info[5] = { + {nullptr, (u64)'TMG01', 0}, + {nullptr, (u64)'TMG02', 0}, + {nullptr, (u64)'TTMGW', 4}, + {nullptr, (u64)'TMGW1', 1}, + {nullptr, (u64)'TMGW2', 2}, + }; + + JGeometry::TVec2f scale[5]; + + char buffer[64]; + for (int i = 0; i < 64; ++i) + { + buffer[i] = ' '; + } + buffer[63] = '\0'; + + for (int i = 0; i < 5; ++i) + { + J2DTextBox *pane = (J2DTextBox *)mScreen->search(info[i].name); +#line 1001 + JUT_ASSERT(pane->getTypeID() == J2DPane_TextBox); + info[i].pane = pane; + info[i].pane->setFont(FontMgr::mspResFont); + info[i].pane->setString(buffer); + scale[i].x = info[i].pane->mFontSize.x; + scale[i].y = info[i].pane->mFontSize.y; + } -#include "JSystem/JAudio/JASFakeMatch2.h" + for (int i = 0; i < 5; ++i) + { + void *bmcPtr = ResMgr::getPtr(ResMgr::mcColor); + void *bmdPtr = ResMgr::getPtr(ResMgr::mcRace); + + int messageIdx = info[i].messageIdx; + char *message = ReadPrintMessage::getMessage(bmdPtr, messageIdx); + + JUtility::TColor color( + ReadPrintMessage::getColor(bmcPtr, ReadPrintMessage::getDefaultColor(bmdPtr))); + info[i].pane->setFontColor(color, color); + + info[i].pane->setFontSize( + scale[i].x * ReadPrintMessage::getRate(bmdPtr, messageIdx) / 100.0f, + scale[i].y * ReadPrintMessage::getRate(bmdPtr, messageIdx) / 100.0f); + info[i].pane->setCharSpace((f32)ReadPrintMessage::getCharSpace(bmdPtr, messageIdx)); + + J2DTextBox::TFontSize fontSize; + info[i].pane->getFontSize(fontSize); + char buf[64]; + ReadPrintMessage::tagCnv(message, bmcPtr, fontSize, sizeof(buf), buf); + strncpy(info[i].pane->getStringPtr(), buf, sizeof(buf)); + } + + J2DPane *singlePane = mScreen->search((u64)'NSingle'); + J2DPane *tagPane = mScreen->search((u64)'NTag'); + + if (RCMGetManager()->getKartInfo(0)->getPad(1)) + { + singlePane->hide(); + tagPane->show(); + } + else + { + singlePane->show(); + tagPane->hide(); + } +} diff --git a/src/Kameda/PauseManager.cpp b/src/Kameda/PauseManager.cpp index f84c724b..76e7350b 100644 --- a/src/Kameda/PauseManager.cpp +++ b/src/Kameda/PauseManager.cpp @@ -1,34 +1,638 @@ #include "Kameda/PauseManager.h" -#include "mathHelper.h" -PauseManager *PauseManager::mThis; // 0x80416298 +#include "Inagaki/GameAudioMain.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "Kameda/Goal2D.h" +#include "Kameda/J2DManager.h" +#include "Kameda/Pause2D.h" +#include "Kameda/PrintMemoryCard.h" +#include "Kameda/Result2D.h" +#include "Kameda/SequenceInfo.h" +#include "Kameda/WipeManager.h" +#include "Kaneshige/RaceInfo.h" +#include "Kaneshige/RaceMgr.h" +#include "Osako/NetGameMgr.h" +#include "Osako/RaceApp.h" +#include "Osako/ResMgr.h" +#include "Osako/kartPad.h" +#include "Osako/system.h" +#include "mathHelper.h" // For unused data + +PauseManager *PauseManager::mThis; bool PauseManager::mIsPause; int PauseManager::mPauseSelector; int PauseManager::mPauseChoice; int PauseManager::mPauseNextChoice; KartGamePad *PauseManager::mPausePad; -PauseManager::PauseManager(JKRHeap *) {} +static int button; + +PauseManager::PauseManager(JKRHeap *heap) +{ + if (!heap) + { + heap = JKRHeap::getCurrentHeap(); + } + + mArchive = ResMgr::getArchive(ResMgr::mcArcMRAMLoc); + mOrthoGraph = System::getJ2DOrtho(); + mPrintMemoryCard = new (heap, 0) PrintMemoryCard(heap); + + mThis = this; + + mNetFlag = NetGameMgr::ptr()->getState() != 0; + _12 = 0; + mExec = false; + + mPause2D = new (heap, 0) Pause2D(heap); + mResult2D = new (heap, 0) Result2D(heap); + + _11 = 1; + for (int i = 0; i < RaceMgr::getManager()->getKartNumber(); ++i) + { + for (int j = 0; j < 2; ++j) + { + if (gSequenceInfo.getPad2Player(gRaceInfo.getKartInfo(i)->getPad(j)) != -1) + { + _11 = 0; + } + } + } + + reset(); +} + +PauseManager::~PauseManager() +{ + // Unknown implementation +} + +void PauseManager::reset() +{ + _12 = 1; + mExec = true; + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); -void PauseManager::reset() {} + mIsPause = false; + mPauseSelector = 0; + mPauseChoice = 13; + mPauseNextChoice = 13; + mPausePad = 0; -void PauseManager::draw() {} + _c = 0; + _d = 0; + mResultStart = false; + _f = 0; + mGameOver = false; + _14 = -1; + mPauseEnd = false; + mPause2D->init(); + mResult2D->init(); + _28 = 0; + mWipeOutFrame = 0; + mWipeOutDuration = 0; + _34 = 0; + _38 = 0; -void PauseManager::exec() { - //void Result2D::getDrawFlag() {} - //void Result2D::setDrawFlag(bool) {} + if (RaceMgr::getManager()->isReplayMode() && RaceMgr::getManager()->getRaceMode() == GRAND_PRIX) + { + Result2D::setGPClr(); + } + + mPrintMemoryCard->init(PrintMemoryCard::mcMsg40); } -bool PauseManager::tstPause() { +void PauseManager::setPause() +{ + // Unknown implementation +} + +void PauseManager::clrPause() +{ + // Unknown implementation +} + +void PauseManager::draw() +{ + if (!_12) + return; + + if (!mNetFlag) + { + mResult2D->draw(); + } + + if (_11 || (!mResultStart && !RaceMgr::getManager()->isReplayMode())) + { + mPause2D->draw(); + } + + if (_28) + { + switch (mPauseNextChoice) + { + case 1: + case 7: + WipeManager::getManager()->getMario()->draw((f32)(_28 + 1) / 40.0f, + JUTColor(0x00, 0x00, 0x00, 0xFF)); + break; + default: + _28 = 1; + } + } + + if (mWipeOutFrame > 0 && mWipeOutDuration > 0) + { + f32 f = (f32)mWipeOutFrame / (f32)mWipeOutDuration; + if (f > 1.0f) + { + f = 1.0f; + } + + WipeManager::getManager()->getWipeCurtain()->calc( + J2DManager::getManager()->getStatus2Kart(0x0), + f, + JUTColor(0x00, 0x00, 0x00, 0xFF)); + + WipeManager::getManager()->getWipeCurtain()->draw( + J2DManager::getManager()->getStatus2Kart(0x0), + f, + JUTColor(0x00, 0x00, 0x00, 0xFF)); + } + + if (_c) + { + mPrintMemoryCard->draw(); + } +} + +void PauseManager::exec() +{ + if (!mExec) + return; + + if (_14 >= 0) + { + _14 += 1; + } + + if (_c) + { + mPrintMemoryCard->calc(); + + switch (mPrintMemoryCard->get_14Thing()) + { + case 0: + _c = 0; + if (_d) + { + goto labelA; + } + goto labelB; + case 1: + _c = 0; + mPrintMemoryCard->init(PrintMemoryCard::mcMsg40); + mPrintMemoryCard->setStuff(0, 0, 0); + break; + } + return; + } + + if (mWipeOutFrame > 0 && mWipeOutDuration > 0) + { + if (mWipeOutFrame == mWipeOutDuration) + { + JUTFader *fader = System::mspDisplay->getFader(); + if (fader) + { + fader->startFadeOut(1); + } + } + mWipeOutFrame += 1; + } + + int var_28 = _28; + if (var_28) + { + if (var_28 < 40) + { + _28 = var_28 + 1; + return; + } + + mPauseChoice = mPauseNextChoice; + mPausePad = 0; + + J2DManager::getManager()->startPreRace(); + + _28 = 0; + Result2D::setDrawFlag(_38); + return; + } + + int var_34 = _34; + if (var_34) + { + if (var_34 < 11) + { + _34 = var_34 + 1; + } + else + { + mPauseChoice = mPauseNextChoice; + mPausePad = 0; + _34 = 0; + Result2D::setDrawFlag(_38); + + switch (mPauseNextChoice) + { + case 1: + case 7: + mPauseChoice = 13; + _28 = 1; + GameAudio::Main::getAudio()->fadeOutAll(40); + break; + default: + { + switch (mPauseNextChoice) + { + case 13: + if (!_38) + { + mIsPause = 0; + } + break; + default: + _34 = 1; + break; + } + break; + } + } + } + + mResult2D->calc(gSequenceInfo.getDecidePad()); + return; + } + + if (_14 < 120) + return; + + if (!tstPause() && !RaceMgr::getManager()->isReplayMode()) + { + if (_11) + { + mPausePad = &gGamePad1P; + mPauseSelector = 0; + mPauseChoice = 13; + } + else + { + KartGamePad *kartgamePad = gpaGamePad[0]; + if (kartgamePad && kartgamePad->testTrigger(JUTGamePad::START)) + { + mPausePad = kartgamePad; + mPauseSelector = 0; + mPauseChoice = 13; + } + } + } + + if (!mNetFlag && + ((mResultStart && Goal2D::mDrawEndFlag) || RaceMgr::getManager()->isReplayMode())) + { + mResult2D->calc(gSequenceInfo.getDecidePad()); + + if (RaceMgr::getManager()->isReplayMode() && + RaceApp::ptr()->getPadRecorder()->getFrame() >= MAX_INPUT_FRAME_COUNT) + { + mIsPause = 1; + mPause2D->init(); + Pause2D::setPauseStatus((Pause2D::PauseStatus)1); + GameAudio::Main::getAudio()->fadeOutAll(40); + mPauseNextChoice = 7; + _34 = 1; + _38 = 0; + } + else + { + KartGamePad *decidePad = gSequenceInfo.getDecidePad(); + if (decidePad->testTrigger(JUTGamePad::A) && Result2D::mResultState == 2 && + mResult2D->getAnmEnd()) + { + if (Result2D::getDrawFlag()) + { + switch (Result2D::getResultSelector()) + { + case 1: + case 7: + GameAudio::Main::getAudio()->startSystemSe(0x20002); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + GameAudio::Main::getAudio()->fadeOutAll(40); + + mPauseNextChoice = Result2D::getResultSelector(); + _34 = 1; + _38 = 0; + mResult2D->_1980 = 1; + break; + case 8: + mPauseNextChoice = Result2D::getResultSelector(); + if (RaceMgr::getManager()->isRaceModeGp()) + { + _c = 1; + _d = 0; + mPrintMemoryCard->init(PrintMemoryCard::mcMsg39); + mPrintMemoryCard->calc(); + break; + } + GameAudio::Main::getAudio()->startSystemSe(0x20023); + labelB: + _34 = 1; + _38 = 0; + mResult2D->_1980 = 1; + break; + default: + GameAudio::Main::getAudio()->startSystemSe(0x20002); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + mPauseNextChoice = Result2D::getResultSelector(); + _34 = 1; + _38 = 0; + mResult2D->_1980 = 1; + } + } + } + else + { + if (gSequenceInfo.getDecidePad()->testTrigger(JUTGamePad::START)) + { + if (RaceMgr::getManager()->isReplayMode()) + { + if (!Result2D::getDrawFlag()) + { + + mIsPause = 1; + mPause2D->init(); + Pause2D::setPauseStatus((Pause2D::PauseStatus)1); + GameAudio::Main::getAudio()->startSystemSe(0x20008); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)1); + mPauseNextChoice = 13; + _34 = 1; + _38 = 1; + Result2D::setDrawFlag(true); + mResult2D->init(); + } + else if (mResult2D->getAnmEnd()) + { + GameAudio::Main::getAudio()->startSystemSe(0x20009); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)0); + mPauseNextChoice = 13; + _34 = 1; + _38 = 0; + mResult2D->_1980 = 1; + } + } + } + else + { + if (gSequenceInfo.getDecidePad()->testTrigger(JUTGamePad::A)) + { + if (RaceMgr::getManager()->isReplayMode() && !Result2D::getDrawFlag()) + { + mIsPause = 1; + mPause2D->init(); + Pause2D::setPauseStatus((Pause2D::PauseStatus)1); + GameAudio::Main::getAudio()->startSystemSe(0x20008); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)1); + mPauseNextChoice = 13; + _34 = 1; + _38 = 1; + Result2D::setDrawFlag(true); + mResult2D->init(); + } + } + else if (gSequenceInfo.getDecidePad()->testTrigger(JUTGamePad::B) && + RaceMgr::getManager()->isReplayMode() && Result2D::getDrawFlag()) + { + GameAudio::Main::getAudio()->startSystemSe(0x20009); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)0); + mPauseNextChoice = 13; + _34 = 1; + _38 = 0; + mResult2D->_1980 = 1; + } + } + } + } + } + + if (!mPausePad) + return; + if (mNetFlag) + return; + if (mPauseEnd && _11 == 0x0) + return; + if (RaceMgr::getManager()->isReplayMode()) + return; + + mPause2D->calc(mPausePad); + if (tstPause()) + { + if (Pause2D::getPauseStatus() == (Pause2D::PauseStatus)3) + { + mPauseChoice = 13; + if (mPausePad->testTrigger(JUTGamePad::A)) + { + switch (Pause2D::getPauseSelector()) + { + case 1: + GameAudio::Main::getAudio()->startSystemSe(0x20023); + _28 = 1; + GameAudio::Main::getAudio()->fadeOutAll(40); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + mPauseNextChoice = Pause2D::getPauseSelector(); + return; + case 8: + if (RaceMgr::getManager()->isRaceModeGp()) + { + _c = 1; + _d = 1; + mPrintMemoryCard->init(PrintMemoryCard::mcMsg39); + mPrintMemoryCard->calc(); + return; + } + GameAudio::Main::getAudio()->startSystemSe(0x20023); + labelA: + button = 0; + Pause2D::setPauseStatus((Pause2D::PauseStatus)4); + return; + case 0: + GameAudio::Main::getAudio()->startSystemSe(0x20009); + button = 0; + Pause2D::setPauseStatus((Pause2D::PauseStatus)4); + return; + default: + GameAudio::Main::getAudio()->startSystemSe(0x20023); + button = 0; + Pause2D::setPauseStatus((Pause2D::PauseStatus)4); + } + } + else + { + if (!mPausePad->testTrigger(JUTGamePad::START)) + return; + + button = 1; + Pause2D::setPauseStatus((Pause2D::PauseStatus)4); + GameAudio::Main::getAudio()->startSystemSe(0x20009); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)0); + return; + } + } + else + { + if (Pause2D::getPauseStatus() != (Pause2D::PauseStatus)0) + return; + + mPauseChoice = 13; + switch (button) + { + case 0: + switch (Pause2D::getPauseSelector()) + { + case 0: + mIsPause = 0; + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)0); + default: + mPauseChoice = Pause2D::getPauseSelector(); + mPausePad = nullptr; + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + break; + } + break; + case 1: + mIsPause = 0; + mPauseSelector = 0; + mPauseChoice = 0; + mPausePad = nullptr; + break; + default: +#line 553 + JUT_ASSERT(0); + } + + return; + } + } + else + { + if (!mPausePad->testTrigger(JUTGamePad::START)) + return; + + mIsPause = 1; + mPause2D->init(); + Pause2D::setPauseStatus((Pause2D::PauseStatus)1); + GameAudio::Main::getAudio()->startSystemSe(0x20008); + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)1); + return; + } +} + +bool Result2D::getDrawFlag() +{ + return mDrawFlag; +} + +void Result2D::setDrawFlag(bool drawFlag) +{ + mDrawFlag = drawFlag; +} + +bool PauseManager::tstPause() +{ return mIsPause; } -void PauseManager::wipeOut(int) {} +void PauseManager::wipeIn() +{ + // Unknown implementation +} + +void PauseManager::wipeOut(int duration) +{ + mWipeOutFrame = 1; + mWipeOutDuration = duration; + + WipeManager::getManager()->getWipeCurtain()->reset(); +} + +int PauseManager::getPauseChoice() +{ + if (mPauseChoice == 8) + { + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + } + + if (mThis->_f) + { + mPauseChoice = 5; + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + } -int PauseManager::getPauseChoice() {} + if (mThis->mGameOver) + { + mPauseChoice = 9; + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + } + + switch (mPauseChoice) + { + case 2: + case 3: + case 4: + case 6: + gSequenceInfo._28 = 1; + break; + } + + switch (mPauseChoice) + { + case 4: + gSequenceInfo._2c = 0; + break; + case 6: + gSequenceInfo._2c = 1; + break; + } + + if (mPauseChoice == 5) + { + GameAudio::Main::getAudio()->setPause((GameAudio::Main::PAUSE_STATUS)2); + + if (gSequenceInfo.isEndGP()) + { + if (gSequenceInfo.isGameClr()) + { + mPauseChoice = 11; + } + else + { + mPauseChoice = 12; + } + } + } + + return mPauseChoice; +} + +void PauseManager::getCharRankPos(int) +{ + // Unknown implementation +} -void PauseManager::setTA() { - +void PauseManager::setTA() +{ + mResult2D->setTA(); } -#include "JSystem/JAudio/JASFakeMatch2.h" +#include "JSystem/JAudio/JASFakeMatch2.h" // For static initializer diff --git a/src/Kameda/Result2D.cpp b/src/Kameda/Result2D.cpp index 535a4c9a..e71c72ef 100644 --- a/src/Kameda/Result2D.cpp +++ b/src/Kameda/Result2D.cpp @@ -165,7 +165,10 @@ void Result2D::setDrawTA() {} void Result2D::setDrawMG() {} -void Result2D::getResultSelector() {} +int Result2D::getResultSelector() +{ + return mResultSelector; +} void Result2D::setRaceRank() {} @@ -215,6 +218,6 @@ void Result2D::setScale(int) {} void Result2D::setGPClr() {} -void Result2D::getAnmEnd() {} +bool Result2D::getAnmEnd() {} #include "JSystem/JAudio/JASFakeMatch2.h"