diff --git a/externals/NTSC_U.txt b/externals/NTSC_U.txt index 6f9c05c..ae92094 100644 --- a/externals/NTSC_U.txt +++ b/externals/NTSC_U.txt @@ -86,6 +86,7 @@ sInstance__17RPSysSceneCreator=0x806f4c88 sInstance__13RPSysPauseMgr=0x806f4cd0 update__13RPSysPauseMgrFv=0x802352d4 + # RP/RPSystem/RPSysProjectLocal sInstance__17RPSysProjectLocal=0x806f4ca0 diff --git a/externals/PAL.txt b/externals/PAL.txt index 67de766..b642d32 100644 --- a/externals/PAL.txt +++ b/externals/PAL.txt @@ -11,10 +11,14 @@ OSReport=0x80061470 # STL/cstdio vprintf=0x8000ceec vsprintf=0x8000cff0 +vsnprintf=0x8000cf68 sprintf=0x8000d168 +snprintf=0x8000d074 # STL/string strcmp=0x8000e8b0 +strlen=0x800071c0 +strncpy=0x8000e7f4 # TRK/runtime _savefpr_25=0x800077b8 @@ -25,6 +29,20 @@ _savefpr_28=0x800077c4 _restfpr_28=0x80007810 _savefpr_29=0x800077c8 _restfpr_29=0x80007814 + +_savegpr_24=0x8000784c +_restgpr_24=0x80007898 +_savegpr_25=0x80007850 +_restgpr_25=0x8000789c +_savegpr_26=0x80007854 +_restgpr_26=0x800078a0 +_savegpr_27=0x80007858 +_restgpr_27=0x800078a4 +_savegpr_28=0x8000785c +_restgpr_28=0x800078a8 +_savegpr_29=0x80007860 +_restgpr_29=0x800078ac + __register_global_object=0x800072a4 __destroy_arr=0x800075bc @@ -33,17 +51,26 @@ List_Init__Q24nw4r2utFPQ34nw4r2ut4ListUs=0x8010b9e0 List_GetNth__Q24nw4r2utFPCQ34nw4r2ut4ListUs=0x8010bc40 List_Append__Q24nw4r2utFPQ34nw4r2ut4ListPv=0x8010ba00 List_GetNext__Q24nw4r2utFPCQ34nw4r2ut4ListPCv=0x8010bc00 +List_GetPrev__Q24nw4r2utFPCQ34nw4r2ut4ListPCv=0x8010bc20 + +# nw4r/db/db_exception +Exception_Printf___Q24nw4r2dbFPCce=0x80166a10 +ShowFloat___Q24nw4r2dbFPC9OSContext=0x80167230 # EGG/core/eggExpHeap create__Q23EGG7ExpHeapFUlPQ23EGG4HeapUs=0x801c0e58 # EGG/core/eggException -setUserCallback__Q23EGG9ExceptionFPUs=0x801cee38 +setUserCallback__Q23EGG9ExceptionFPCUs=0x801cee38 +create__Q23EGG9ExceptionFUsUsUsPQ23EGG4HeapUs=0x801ceda8 # EGG/core/eggController getNthController__Q23EGG17CoreControllerMgrFi=0x801c4ab8 sInstance__Q23EGG17CoreControllerMgr=0x806f50a8 +# EGG/core/eggDvdRipper +loadToMainRAM__Q23EGG9DvdRipperFPCcPUcPQ23EGG4HeapQ33EGG9DvdRipper15EAllocDirectionUlPUlPUl=0x801c7ce0 + # RP/RPSystem/RPSysSceneMgr sInstance__13RPSysSceneMgr=0x806f5338 @@ -52,14 +79,25 @@ CheckInput__17RPSysSysMsgWinMgrFv=0x802355f4 sInstance__17RPSysSysMsgWinMgr=0x806f5380 # RP/RPSystem/RPSysSceneCreator -changeSceneAfterFade__17RPSysSceneCreatorFiPQ34nw4r2ut5Color=0x8022f074 +changeSceneAfterFade__17RPSysSceneCreatorFiQ34nw4r2ut5Color=0x8022f074 sInstance__17RPSysSceneCreator=0x806f5328 +# RP/RPSystem/RPSysPauseMgr +sInstance__13RPSysPauseMgr=0x806f5370 +update__13RPSysPauseMgrFv=0x802355f4 + + +# RP/RPSystem/RPSysProjectLocal +sInstance__17RPSysProjectLocal=0x806f5340 + # Sports2/Sp2StaticMem getStaticVar__Q23Sp29StaticMemFib=0x8026a26c setStaticVar__Q23Sp29StaticMemFiib=0x8026a228 sInstance__Q23Sp29StaticMem=0x806f5538 +# Sports2/Glf/Sp2GlfMain +sInstance__Q33Sp23Glf7GlfMain=0x806f5bb0 + # Sports2/Glf/Sp2GlfConfig choosePin__Q33Sp23Glf9GlfConfigFi=0x80406a00 sInstance__Q33Sp23Glf9GlfConfig=0x806f5b38 @@ -70,12 +108,37 @@ __dt__Q33Sp23Glf9GlfConfigFv=0x80406f30 Rand__3Sp2Fv=0x8025ccd0 Print__3Sp2FPCcUlbfff=0x803733b8 -# Sports2/Obj806f4cd0 -sInstance__Q26caddie11Obj806f4cd0=0x806f5370 -func_802352d4__Q26caddie11Obj806f4cd0Fv=0x802355f4 - -# Sports2/Glf/Sp2GlfBall -Stop__Q33Sp23Glf7GlfBallFb=0x80413e24 - -# Sports2/Glf/Sp2GlfBallMgr -sGlfBalls__Q33Sp23Glf10GlfBallMgr=0x806f5b88 +# Sports2/Glf/RPGlfBall +Calc__9RPGlfBallFUl=0x80413e88 +sFlags__9RPGlfBall=0x806fdfbc + +# Sports2/Glf/RPGlfPlayerManager +sInstance__18RPGlfPlayerManager=0x806f5b08 + + +PSMTXIdentity=0x8003e730 +PSMTXScaleApply=0x8003ef40 +PSMTXTransApply=0x8003eec0 +BeginDrawSphere__Q23EGG6DrawGXFv=0x801a66c4 +DrawDLWorld__Q23EGG6DrawGXFQ33EGG6DrawGX2DLRCQ34nw4r4math5MTX348_GXColor=0x801a89d4 +sDrawPass__13RPGrpRenderer=0x806f129c +sCurrentViewID__13RPGrpRenderer=0x806f12a0 +s_cameraMtx__Q23EGG6DrawGX=0x807cd080 +SCGetAspectRatio=0x80053f40 +GetPinPos__17RPGlfFieldManagerCFv=0x80402ef8 +GetDistFromPin__9RPGlfBallCFv=0x80411d28 +IsHoleOut__9RPGlfBallCFv=0x80411e7c +IsGreenOrCupAttr__9RPGlfBallCFv=0x80411dd8 +FrSqrt__Q24nw4r4mathFf=0x8013ba50 +sInstance__17RPGlfFieldManager=0x806f5b20 +sInstance__16RPGlfClubManager=0x806f5b60 +IsHideUI__17RPGlfFieldManagerCFv=0x80403098 +spSimBall__15RPGlfSimManager=0x806f5b88 +SetBlendMode__Q23EGG6DrawGXFQ33EGG6DrawGX5Blend=0x801a8810 +DrawLineStrip__Q23EGG6DrawGXFPCQ34nw4r4math4VEC3Us8_GXColorUc=0x801a6e00 +CalcDeltaXZ__12RPGlfUtilityFRQ34nw4r4math4VEC2RCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3=0x803ede4c +CalcDeltaAngle2D__12RPGlfUtilityFRCQ34nw4r4math4VEC2RCQ34nw4r4math4VEC2=0x803edb0c +Calculate__Q33Sp23Glf11SequenceMgrFv=0x803f9c54 +sInstance__Q33Sp23Glf11SequenceMgr=0x806f5b00 +NextShot__Q33Sp23Glf12SequenceMainFv=0x803f73b0 +Enter__Q33Sp23Glf5PhaseFv=0x803f9cbc diff --git a/include/loader/rzte.h b/include/loader/rzte.h index 3a399ed..f24ab7f 100644 --- a/include/loader/rzte.h +++ b/include/loader/rzte.h @@ -9,7 +9,7 @@ #ifdef CADDIE_REGION_NTSC_U const u32 CADDIE_ENTRYPOINT = 0x8022e2c0; #elif CADDIE_REGION_PAL -const u32 CADDIE_ENTRYPOINT = 0x80231230; +const u32 CADDIE_ENTRYPOINT = 0x8022e538; #else const u32 CADDIE_ENTRYPOINT = 0x00000000; #endif diff --git a/src/caddie/core/caddieSceneHookMgr.cpp b/src/caddie/core/caddieSceneHookMgr.cpp index a5fbee2..1170ff9 100644 --- a/src/caddie/core/caddieSceneHookMgr.cpp +++ b/src/caddie/core/caddieSceneHookMgr.cpp @@ -54,7 +54,11 @@ void SceneHookMgr::DoCalculate() { hookMgr.mGlobalSceneHook.onCalculate(GetCurrentScene()); } } +#ifdef CADDIE_REGION_NTSC_U kmBranch(0x8022f8f8, SceneHookMgr::DoCalculate); +#elif CADDIE_REGION_PAL +kmBranch(0x80232c64, SceneHookMgr::DoCalculate); +#endif /** * @brief Dispatch scene hook UserDraw callback @@ -71,7 +75,11 @@ void SceneHookMgr::DoUserDraw() { hookMgr.mGlobalSceneHook.onUserDraw(GetCurrentScene()); } } +#if CADDIE_REGION_NTSC_U kmBranch(0x802542a8, SceneHookMgr::DoUserDraw); +#elif CADDIE_REGION_PAL +kmBranch(0x802545c8, SceneHookMgr::DoUserDraw); +#endif /** * @brief Dispatch scene hook Exit callback @@ -88,7 +96,11 @@ void SceneHookMgr::DoExit() { hookMgr.mGlobalSceneHook.onExit(GetCurrentScene()); } } +#ifdef CADDIE_REGION_NTSC_U kmBranch(0x8022f6f4, SceneHookMgr::DoExit); +#elif CADDIE_REGION_PAL +kmBranch(0x8022f96c, SceneHookMgr::DoExit); +#endif /** * @brief Update pause manager @@ -101,6 +113,10 @@ void SceneHookMgr::DoUpdatePause() { RPSysPauseMgr::getInstance().update(); } } +#ifdef CADDIE_REGION_NTSC_U kmCall(0x80232984, SceneHookMgr::DoUpdatePause); +#elif CADDIE_REGION_PAL +kmCall(0x80232c50, SceneHookMgr::DoUpdatePause); +#endif } // namespace caddie diff --git a/src/caddie/kernel/caddieException.cpp b/src/caddie/kernel/caddieException.cpp index 33f1e74..4184e4f 100644 --- a/src/caddie/kernel/caddieException.cpp +++ b/src/caddie/kernel/caddieException.cpp @@ -18,7 +18,11 @@ namespace caddie { void Exception::InitConsole() { EGG::Exception::create(128, sConsoleMaxLines, 4, NULL, 1); } +#if CADDIE_REGION_NTSC_U kmCall(0x8022e2d4, Exception::InitConsole); +#elif CADDIE_REGION_PAL +kmCall(0x8022e54c, Exception::InitConsole); +#endif /** * @brief Resolves address to a map symbol, and prints it to the exception diff --git a/src/caddie/scene/cmn/caddieCmnPatches.cpp b/src/caddie/scene/cmn/caddieCmnPatches.cpp index 9cfb3d0..0d47bc0 100644 --- a/src/caddie/scene/cmn/caddieCmnPatches.cpp +++ b/src/caddie/scene/cmn/caddieCmnPatches.cpp @@ -7,7 +7,12 @@ namespace { * @brief Remove AB check */ bool IsABCheckAll() { return true; } + +#if CADDIE_REGION_NTSC_U kmBranch(0x8026a298, IsABCheckAll); +#elif CADDIE_REGION_PAL +kmBranch(0x8026a5b8, IsABCheckAll); +#endif } // namespace } // namespace caddie diff --git a/src/caddie/scene/glf/caddieGlfSceneHook.cpp b/src/caddie/scene/glf/caddieGlfSceneHook.cpp index 99e94ac..caaa641 100644 --- a/src/caddie/scene/glf/caddieGlfSceneHook.cpp +++ b/src/caddie/scene/glf/caddieGlfSceneHook.cpp @@ -6,6 +6,9 @@ #include "caddieInputMgr.h" #include "caddieMenuMgr.h" +#include +#include +#include #include #include #include @@ -42,8 +45,13 @@ // Convert yards to world units. #define YD(X) ((f32)(X) * 10.0f / 1.094f) +#if CADDIE_REGION_NTSC_U kmWrite32(0x803f8778, 0x60000000); kmWrite32(0x803f878c, 0x60000000); +#elif CADDIE_REGION_PAL +kmWrite32(0x803f8a98, 0x60000000); +kmWrite32(0x803f8aac, 0x60000000); +#endif namespace caddie { @@ -86,19 +94,27 @@ void GlfSceneHook::OnConfigure(RPSysScene* scene) { */ void GlfSceneHook::OnCalculate(RPSysScene* scene) { bool isMenuOpen = MenuMgr::GetInstance().IsVisible(); - Sp2::Glf::GlfMain::getInstance().setPause(isMenuOpen); + + // pause game if menu is open + // only in glf scene for now + if (scene->getSceneID() == RPSysSceneCreator::SCENE_GLF) { + Sp2::Glf::GlfMain::getInstance().setPause(isMenuOpen); + } if (MenuMgr::GetInstance().GetMenu() == NULL) { MenuMgr::GetInstance().OpenMenu(sGlfMenu); } // if game is paused, stop timer, else start it - bool paused = Sp2::Glf::GlfMain::getInstance().getPause(); - if (paused) { - sTimer->Stop(); - } - else { - sTimer->Start(); + // only in glf scene for now + if (scene->getSceneID() == RPSysSceneCreator::SCENE_GLF) { + bool paused = Sp2::Glf::GlfMain::getInstance().getPause(); + if (paused) { + sTimer->Stop(); + } + else { + sTimer->Start(); + } } // change the timer @@ -114,7 +130,12 @@ void GlfSceneHook::OnPausedSeqMgrCalc() { Sp2::Glf::SequenceMgr::getInstance().Calculate(); } + +#if CADDIE_REGION_NTSC_U kmCall(0x804175e8, GlfSceneHook::OnPausedSeqMgrCalc); +#elif CADDIE_REGION_PAL +kmCall(0x80417908, GlfSceneHook::OnPausedSeqMgrCalc); +#endif void GlfSceneHook::OnNextShot() { sTimer->Freeze(90); @@ -135,7 +156,12 @@ void GlfSceneHook::OnNextShot() { MenuMgr::GetInstance().OpenMenu(sGlfPostMenu); MenuMgr::GetInstance().SetVisible(true); } + +#if CADDIE_REGION_NTSC_U kmCall(0x803f8754, GlfSceneHook::OnNextShot); +#elif CADDIE_REGION_PAL +kmCall(0x803f8a74, GlfSceneHook::OnNextShot); +#endif void GlfSceneHook::OnUserDraw(RPSysScene* scene) { if (sTimer != NULL) { @@ -153,6 +179,8 @@ void GlfSceneHook::OnUserDraw(RPSysScene* scene) { char buffer[1024]; // Current pin display + // only show in glf scene + if (scene->getSceneID() == RPSysSceneCreator::SCENE_GLF) { u32 hole = Sp2::Glf::GlfConfig::getInstance().getCurrentHole(); u32 pin = Sp2::Glf::GlfConfig::getInstance().getPin(); @@ -245,7 +273,12 @@ void GlfSceneHook::DrawPutterGuide(const nw4r::math::VEC3* pPoints, u16 num, EGG::DrawGX::DrawLineStrip(pPoints, num, color, width); } } + +#if CADDIE_REGION_NTSC_U kmCall(0x803fab74, GlfSceneHook::DrawPutterGuide); +#elif CADDIE_REGION_PAL +kmCall(0x803fae94, GlfSceneHook::DrawPutterGuide); +#endif void GlfSceneHook::DrawReplaySphere() { if (RPGrpRenderer::GetDrawPass() != RPGrpRenderer::EDrawPass_DrawXLU) { @@ -338,7 +371,12 @@ void GlfSceneHook::DrawReplaySphere() { } EGG::DrawGX::s_cameraMtx = old; } + +#if CADDIE_REGION_NTSC_U kmBranch(0x80404b10, GlfSceneHook::DrawReplaySphere); +#elif CADDIE_REGION_PAL +kmBranch(0x80404e30, GlfSceneHook::DrawReplaySphere); +#endif /** * @brief Golf scene exit callback @@ -502,8 +540,22 @@ void GlfSceneHook::Apply_Wind() { dir = Sp2::Rand(Sp2::Glf::MAX_WIND_DIV); } + // golf and FG have different static mem indices for wind + // determine which index to use, then set wind for the current hole + int windStaticMemIdx; + switch (RPSysSceneMgr::getInstance().getCurrentSceneID()) { + case RPSysSceneCreator::SCENE_GLF: + windStaticMemIdx = Sp2::Glf::VAR_WIND; + break; + case RPSysSceneCreator::SCENE_DGL: + windStaticMemIdx = 9; + break; + default: + CADDIE_ASSERT(false); + return; + } Sp2::StaticMem::getInstance().setStaticVar( - Sp2::Glf::VAR_WIND + GetMenu().GetHoleInternal(), + windStaticMemIdx + GetMenu().GetHoleInternal(), Sp2::Glf::PackWind(dir, spd), false); } @@ -527,7 +579,12 @@ void GlfSceneHook::Apply_GlfConfig() { Apply_RepeatHole(); Apply_Pin(); } + +#if CADDIE_REGION_NTSC_U kmBranch(0x8040680c, GlfSceneHook::Apply_GlfConfig); +#elif CADDIE_REGION_PAL +kmBranch(0x80406b2c, GlfSceneHook::Apply_GlfConfig); +#endif /** * @brief Allow shot to be canceled by holding B + MINUS + 2 @@ -562,13 +619,23 @@ void GlfSceneHook::OnGlfBallCalc(RPGlfBall* ball, u32 frame, u32) { ball->Calc(frame); } + +#if CADDIE_REGION_NTSC_U kmCall(0x80414754, GlfSceneHook::OnGlfBallCalc); +#elif CADDIE_REGION_PAL +kmCall(0x80414a74, GlfSceneHook::OnGlfBallCalc); +#endif /** * @brief Disable Golf tutorial */ bool GlfSceneHook::ShouldShowTutorial() { return false; } + +#if CADDIE_REGION_NTSC_U kmBranch(0x803fa370, GlfSceneHook::ShouldShowTutorial); +#elif CADDIE_REGION_PAL +kmBranch(0x803fa690, GlfSceneHook::ShouldShowTutorial); +#endif /** * @brief Check whether the next hole can be played @@ -577,7 +644,11 @@ kmBranch(0x803fa370, GlfSceneHook::ShouldShowTutorial); bool GlfSceneHook::CanPlayNextHole() { return GetMenu().GetRepeatHole() ? true : !GlfUtil::IsNextRoundOver(); } +#if CADDIE_REGION_NTSC_U kmBranch(0x80406554, GlfSceneHook::CanPlayNextHole); +#elif CADDIE_REGION_PAL +kmBranch(0x80406874, GlfSceneHook::CanPlayNextHole); +#endif /** * @brief Number of holes played in the match @@ -599,7 +670,11 @@ u32 GlfSceneHook::GetNumHolesPlayed() { // Vanilla behavior return gmCurrent - gmFirst; } +#if CADDIE_REGION_NTSC_U kmBranch(0x80405f1c, GlfSceneHook::GetNumHolesPlayed); +#elif CADDIE_REGION_PAL +kmBranch(0x8040623c, GlfSceneHook::GetNumHolesPlayed); +#endif /** * @brief Access golf menu diff --git a/src/caddie/scene/glf/caddieGlfUtil.cpp b/src/caddie/scene/glf/caddieGlfUtil.cpp index 4bf55b5..a209276 100644 --- a/src/caddie/scene/glf/caddieGlfUtil.cpp +++ b/src/caddie/scene/glf/caddieGlfUtil.cpp @@ -143,6 +143,7 @@ u32 GlfUtil::GetGamemodeNthHole(u32 n) { case Sp2::Glf::GM_SPECIAL: return 19 + n; } + return 1+n; } } // namespace caddie diff --git a/src/caddie/ui/menu/caddieMenuMgr.cpp b/src/caddie/ui/menu/caddieMenuMgr.cpp index d015321..4569ef3 100644 --- a/src/caddie/ui/menu/caddieMenuMgr.cpp +++ b/src/caddie/ui/menu/caddieMenuMgr.cpp @@ -14,6 +14,11 @@ namespace caddie { * @brief Menu logic */ void MenuMgr::Calc() { + + if (mMenu == NULL || mOpenPage == NULL) { + return; + } + CalcInput(); // All players can control the menu diff --git a/src/main.cpp b/src/main.cpp index bcb2e51..f524957 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,10 +21,14 @@ void main() { // Always show exception handler static const u16 scEmptyCombo[] = {0}; EGG::Exception::setUserCallback(scEmptyCombo); +#endif - // Open symbol map - MapFile::GetInstance().LoadFromDVD("modules/main_NTSC_U.map", - MapFile::LINK_DYNAMIC); +#ifdef CADDIE_REGION_NTSC_U + MapFile::GetInstance().LoadFromDVD("modules/main_NTSC_U.map", + MapFile::LINK_DYNAMIC); +#elif CADDIE_REGION_PAL + MapFile::GetInstance().LoadFromDVD("modules/main_PAL.map", + MapFile::LINK_DYNAMIC); #endif // Skip MotionPlus video @@ -43,7 +47,20 @@ void main() { GlfSceneHook::OnUserDraw, GlfSceneHook::OnExit}); // Disable pausing in the Golf scene SceneHookMgr::GetInstance().AllowPause(RPSysSceneCreator::SCENE_GLF, false); + + SceneHookMgr::GetInstance().SetHook( + RPSysSceneCreator::SCENE_DGL, + (SceneHook){GlfSceneHook::OnConfigure, GlfSceneHook::OnCalculate, + GlfSceneHook::OnUserDraw, GlfSceneHook::OnExit}); + + SceneHookMgr::GetInstance().AllowPause(RPSysSceneCreator::SCENE_DGL, false); } +#ifdef CADDIE_REGION_NTSC_U kmBranch(0x80230b60, main); +#elif CADDIE_REGION_PAL +kmBranch(0x80230e2c, main); +#else +#error "No region defined!" +#endif } // namespace caddie