From 44e4c89f6aebf6031815474f2cabf779df8958e9 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Fri, 19 Jan 2024 17:42:00 -0600 Subject: [PATCH] Finish board/main.c --- config/GMPE01_00/symbols.txt | 4 +- configure.py | 2 +- include/dolphin/os/OSFastCast.h | 18 ++++ include/game/board/main.h | 26 ++++- src/REL/w03Dll/statue.c | 2 +- src/game/board/main.c | 182 ++++++++++++++++++++++++-------- 6 files changed, 179 insertions(+), 55 deletions(-) diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index dbc6d8d6..fdc0f023 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -5159,8 +5159,8 @@ jumptable_801397BC = .data:0x801397BC; // type:object size:0x24 scope:local confettiLightTbl = .data:0x801397E0; // type:object size:0x48 scope:local last5GfxSprTbl = .data:0x80139828; // type:object size:0xC scope:local last5GfxPosTbl = .data:0x80139834; // type:object size:0x30 scope:local -tauntActiveSfxTbl = .data:0x80139864; // type:object size:0x10 scope:local -tauntSfxTbl = .data:0x80139874; // type:object size:0x24 scope:local +tauntActiveFXTbl = .data:0x80139864; // type:object size:0x10 scope:local +tauntFXTbl = .data:0x80139874; // type:object size:0x24 scope:local diceJumpObj = .data:0x80139898; // type:object size:0x10 scope:local motDoneF = .data:0x801398A8; // type:object size:0x10 scope:local bowserSuitMot = .data:0x801398B8; // type:object size:0xA scope:local data:2byte diff --git a/configure.py b/configure.py index 6fe46b5f..63cdb22b 100644 --- a/configure.py +++ b/configure.py @@ -359,7 +359,7 @@ config.libs = [ Object(Matching, "game/flag.c"), Object(Matching, "game/saveload.c"), Object(NonMatching, "game/sreset.c"), - Object(NonMatching, "game/board/main.c"), + Object(Matching, "game/board/main.c"), Object(NonMatching, "game/board/player.c"), Object(NonMatching, "game/board/model.c"), Object(Matching, "game/board/window.c"), diff --git a/include/dolphin/os/OSFastCast.h b/include/dolphin/os/OSFastCast.h index cd81d882..696b7953 100644 --- a/include/dolphin/os/OSFastCast.h +++ b/include/dolphin/os/OSFastCast.h @@ -76,6 +76,24 @@ static inline u8 __OSf32tou8(register f32 inF) static inline void OSf32tou8(f32 *f, u8 *out) { *out = __OSf32tou8(*f); } +static inline s8 __OSf32tos8(register f32 inF) +{ + u32 tmp; + register u32 *tmpPtr = &tmp; + register s8 out; + // clang-format off + asm { + psq_st inF, 0(tmpPtr), 0x1, OS_FASTCAST_S8 + lbz out, 0(tmpPtr) + extsb out, out //HACK to match fast cast inlines + } + // clang-format on + + return out; +} + +static inline void OSf32tos8(f32 *f, s8 *out) { *out = __OSf32tos8(*f); } + static inline u16 __OSf32tou16(register f32 inF) { u32 tmp; diff --git a/include/game/board/main.h b/include/game/board/main.h index fdf8d377..b2b7d33d 100644 --- a/include/game/board/main.h +++ b/include/game/board/main.h @@ -74,6 +74,11 @@ typedef void (*BoardCameraPosCalcFunc)(BoardCameraData *camera); typedef void (*BoardTurnStartHook)(s32 player, s32 space); +extern BoardTurnStartHook boardTurnStartFunc; +extern BoardFunc boardTurnFunc; +extern BoardLightHook boardLightResetHook; +extern BoardLightHook boardLightSetHook; + void BoardCommonInit(BoardFunc create, BoardFunc destroy); void BoardKill(void); s32 BoardIsKill(void); @@ -121,11 +126,14 @@ s32 BoardCameraCullCheck(Vec *point, float radius); s32 BoardCameraMotionIsDone(void); void BoardCameraMotionWait(void); void BoardCameraInit(void); -void BoardMGCreate(s32 param); +void BoardMGDoneFlagSet(s32 flag); +s32 BoardMGDoneFlagGet(); +void BoardMGExit(void); +void BoardMGCreate(s32 arg0); void BoardEventFlagSet(void); void BoardEventFlagReset(void); s32 BoardEventFlagGet(void); - +void BoardMTXCalcLookAt(Mtx dest, Vec *eye, Vec *up, Vec *target); float BoardArcSin(float value); float BoardArcCos(float value); void BoardRandInit(void); @@ -134,13 +142,21 @@ u32 BoardRandMod(u32 value); float BoardRandFloat(void); float BoardVecDistXZCalc(Vec *vec1, Vec *vec2); s32 BoardVecMaxDistXZCheck(Vec *vec1, Vec *vec2, float max_dist); +void BoardVecDAngleCalcVec(Vec *vec1); +float BoardVecDAngleCalc(float value); +s32 BoardVecDAngleCalcRange(float *value, float min, float range); s32 BoardVecMinDistCheck(Vec *vec1, Vec *vec2, float min_dist); - +void BoardFilterFadeOut(s16 len); +void BoardFilterFadeInit(s16 len, u8 max_alpha); +s32 BoardFilterFadePauseCheck(void); +s32 BoardFilterFadeCheck(void); +void BoardConfettiCreate(Vec *pos, s16 count, float range); void BoardConfettiKill(void); void BoardConfettiStop(void); - void BoardLast5GfxInit(void); - +void BoardLast5GfxShowSet(s32 show); +void BoardTauntInit(void); +void BoardTauntKill(void); s32 BoardDataDirReadAsync(s32 data_num); void BoardDataAsyncWait(s32 status); diff --git a/src/REL/w03Dll/statue.c b/src/REL/w03Dll/statue.c index ac4610e4..086efc20 100644 --- a/src/REL/w03Dll/statue.c +++ b/src/REL/w03Dll/statue.c @@ -28,7 +28,7 @@ s32 BoardVecDAngleCalcRange(f32*, f32, f32); s32 BoardPlayerMotBlendCheck(s32); void BoardPlayerMotBlendSet(s32, s32, s32); f32 BoardPlayerRotYGet(s32); -void BoardConfettiCreate(Point3d*, s32, f32); +void BoardConfettiCreate(Point3d*, s16, f32); double atan2(double y, double x); void omVibrate(s16, s16, s16, s16); f32 BoardModelMotionTimeGet(s16); diff --git a/src/game/board/main.c b/src/game/board/main.c index 6935323d..4dfe0381 100644 --- a/src/game/board/main.c +++ b/src/game/board/main.c @@ -10,6 +10,8 @@ #include "game/hsfdraw.h" #include "game/board/main.h" #include "game/board/player.h" +#include "game/pad.h" +#include "game/msm.h" typedef struct camera_view { s16 x_rot; @@ -28,8 +30,8 @@ void *boardBowserHook; void *boardStarShowNextHook; void *boardStarGiveHook; BoardFunc boardTurnFunc; -BoardLightHook boardLightSetHook; BoardLightHook boardLightResetHook; +BoardLightHook boardLightSetHook; static BoardFunc destroyFunc; static BoardFunc createFunc; static s32 cameraUseBackup; @@ -38,8 +40,8 @@ static omObjData *cameraObj; Process *boardObjMan; Process *boardMainProc; -static BoardCameraData cameraBackup; BoardCameraData boardCamera; +static BoardCameraData cameraBackup; static OverlayID nextOvl = OVL_INVALID; @@ -60,21 +62,6 @@ extern void BoardMGSetupPlayClear(void); extern void BoardStartExec(void); extern s8 boardTutorialF; -extern s16 boardPlayerMdl[4]; - -void BoardKill(void); -s32 BoardTurnNext(void); -void BoardCameraInit(void); -void BoardCameraMotionWait(void); -void BoardCameraTargetPlayerSet(s32 player); -void BoardCameraViewSet(s32 type); -void BoardCameraOffsetSet(float x, float y, float z); -void BoardCameraMoveSet(s32 move); -void BoardCameraMotionStartEx(s16 model_target, Vec *rot_target, Vec *offset_end, float zoom_target, float fov_target, s16 max_time); -void BoardRandInit(void); -float BoardRandFloat(void); -s32 BoardDataDirReadAsync(s32 data_num); -void BoardDataAsyncWait(s32 status); static void InitBoardFunc(omObjData *object); static void ExecBoardFunc(omObjData *object); @@ -84,7 +71,6 @@ static void UpdateCamera(omObjData *object); static void CalcCameraTarget(BoardCameraData *camera); static void CalcCameraPos(BoardCameraData *camera); - static void MainFunc(void); static void DestroyMainFunc(void); @@ -789,6 +775,11 @@ void BoardLightResetExec(void) Hu3DReflectNoSet(0); } +static BoardCameraData *BoardCameraGet(void) +{ + return &boardCamera; +} + void BoardCameraBackup(void) { cameraUseBackup = TRUE; @@ -1208,7 +1199,7 @@ void BoardCameraInit(void) cameraObj = omAddObjEx(boardObjMan, 32258, 0, 0, -1, UpdateCamera); } -static void CalcCameraView(void) +static inline void CalcCameraView(void) { BoardCameraData *camera = &boardCamera; CalcCameraTarget(camera); @@ -1785,6 +1776,31 @@ void BoardConfettiCreate(Vec *pos, s16 count, float range) HuAudFXPlay(774); } +void BoardConfettiKill(void) +{ + if(confettiObj) { + OM_GET_WORK_PTR(confettiObj, ConfettiWork)->kill = 1; + } +} + +void BoardConfettiStop(void) +{ + if(confettiObj) { + s32 i; + ConfettiParticle *particle; + ConfettiWork *work = OM_GET_WORK_PTR(confettiObj, ConfettiWork); + work->paused = 1; + particle = work->data; + for(i=0; icount; i++, particle++) { + if(particle->time != -1) { + if(particle->time > 16) { + particle->time = 16; + } + } + } + } +} + static void UpdateConfetti(omObjData *object) { ConfettiWork *work = OM_GET_WORK_PTR(object, ConfettiWork); @@ -1934,31 +1950,6 @@ static void DrawConfetti(ModelData *model, Mtx matrix) } } -void BoardConfettiKill(void) -{ - if(confettiObj) { - OM_GET_WORK_PTR(confettiObj, ConfettiWork)->kill = 1; - } -} - -void BoardConfettiStop(void) -{ - if(confettiObj) { - s32 i; - ConfettiParticle *particle; - ConfettiWork *work = OM_GET_WORK_PTR(confettiObj, ConfettiWork); - work->paused = 1; - particle = work->data; - for(i=0; icount; i++, particle++) { - if(particle->time != -1) { - if(particle->time > 16) { - particle->time = 16; - } - } - } - } -} - typedef struct last5_gfx_work { struct { u8 kill : 1; @@ -2112,7 +2103,7 @@ static void UpdateLast5Gfx(omObjData *object) } } -void BoardLast5GfxShowSet(s32 visible) +void BoardLast5GfxShowSet(s32 show) { s32 i; Last5GfxWork *work; @@ -2122,7 +2113,7 @@ void BoardLast5GfxShowSet(s32 visible) work = OM_GET_WORK_PTR(last5GfxObj, Last5GfxWork); for(i=0; i<3; i++) { - if(visible) { + if(show) { HuSprAttrReset(work->group, i, SPRITE_ATTR_HIDDEN); } else { HuSprAttrSet(work->group, i, SPRITE_ATTR_HIDDEN); @@ -2133,6 +2124,105 @@ void BoardLast5GfxShowSet(s32 visible) } } +static s32 tauntActiveFXTbl[4] = { -1, -1, -1, -1 }; +static s32 tauntFXTbl[8] = { + 294, + 358, + 422, + 486, + 550, + 614, + 678, + 742 +}; + +typedef struct taunt_work { + u8 kill : 1; +} TauntWork; + +static void TauntUpdate(omObjData *object); + +void BoardTauntInit(void) +{ + int i; + tauntObj = omAddObjEx(boardObjMan, 32258, 0, 0, -1, TauntUpdate); + for(i=0; i<4; i++) { + tauntActiveFXTbl[i] = -1; + } + _SetFlag(FLAG_ID_MAKE(1, 14)); +} + +void BoardTauntKill(void) +{ + TauntWork *work; + if(!tauntObj) { + return; + } + work = OM_GET_WORK_PTR(tauntObj, TauntWork); + work->kill = 1; + _SetFlag(FLAG_ID_MAKE(1, 14)); +} + +static void TauntUpdate(omObjData *object) +{ + int i; + s32 port; + s32 character; + TauntWork *work; + work = OM_GET_WORK_PTR(object, TauntWork); + if(work->kill || BoardIsKill()) { + for(i=0; i<4; i++) { + if(tauntActiveFXTbl[i] >= 0) { + HuAudFXStop(tauntActiveFXTbl[i]); + tauntActiveFXTbl[i] = -1; + } + } + tauntObj = NULL; + omDelObjEx(HuPrcCurrentGet(), object); + return; + } + for(i=0; i<4; i++) { + if(tauntActiveFXTbl[i] >= 0 && HuAudFXStatusGet(tauntActiveFXTbl[i]) == 0) { + tauntActiveFXTbl[i] = -1; + } + } + if(BoardPauseActiveCheck()) { + return; + } + if(_CheckFlag(FLAG_ID_MAKE(1, 14))) { + return; + } + if(WipeStatGet() != 0) { + return; + } + if(GWSystem.player_curr == -1) { + return; + } + for(i=0; i<4; i++) { + + if(i == GWSystem.player_curr || GWPlayer[i].com) { + continue; + } + port = GWPlayer[i].port & 0x3; + character = GWPlayer[i].character & 0x7; + if(tauntActiveFXTbl[port] >= 0) { + UnkMsmStruct_01 param; + float vol, pan; + vol = (64.0f*(HuPadSubStkX[port]/59.0f))+64.0f; + pan = 8191.0f*(HuPadSubStkY[port]/59.0f); + memset(¶m, 0, sizeof(UnkMsmStruct_01)); + param.unk00 = 6; + OSf32tos8(&vol, ¶m.unk05); + OSf32tos16(&pan, ¶m.unk06); + msmSeSetParam(tauntActiveFXTbl[port], ¶m); + } else { + if(HuPadBtnDown[port] & PAD_TRIGGER_L) { + tauntActiveFXTbl[port] = HuAudFXPlay(tauntFXTbl[character]); + } + } + } +} + s32 BoardDataDirReadAsync(s32 data_num) { s32 status = HuDataDirReadAsync(data_num);