Merge pull request #133 from gamemasterplc/main

Finish board/main.c
This commit is contained in:
gamemasterplc 2024-01-19 17:42:21 -06:00 committed by GitHub
commit 6542cbde63
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 179 additions and 55 deletions

View file

@ -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

View file

@ -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"),

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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; i<work->count; 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; i<work->count; 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(&param, 0, sizeof(UnkMsmStruct_01));
param.unk00 = 6;
OSf32tos8(&vol, &param.unk05);
OSf32tos16(&pan, &param.unk06);
msmSeSetParam(tauntActiveFXTbl[port], &param);
} else {
if(HuPadBtnDown[port] & PAD_TRIGGER_L) {
tauntActiveFXTbl[port] = HuAudFXPlay(tauntFXTbl[character]);
}
}
}
}
s32 BoardDataDirReadAsync(s32 data_num)
{
s32 status = HuDataDirReadAsync(data_num);