diff --git a/src/melee/lb/lbaudio_ax.c b/src/melee/lb/lbaudio_ax.c index 5245c2fb54..2495c1493e 100644 --- a/src/melee/lb/lbaudio_ax.c +++ b/src/melee/lb/lbaudio_ax.c @@ -1,9 +1,11 @@ #include "lbaudio_ax.static.h" #include "baselib/forward.h" +#include #include #include +#include #include #include #include @@ -806,16 +808,44 @@ int fn_800250A0(int arg0, int arg1, int arg2, int arg3) /// #fn_800262A0 -/// #fn_800263B4 - +void fn_800263B4(void* ptr) +{ + if (ptr != NULL) { + void* p = ptr; + HSD_ObjFree(&lbl_80433710, p); + } +} /// #lbAudioAx_800263E8 /// #lbAudioAx_800264E4 /// #lbAudioAx_80026510 -/// #lbAudioAx_800265C4 +bool lbAudioAx_800265C4(HSD_GObj* arg0, int arg1) +{ + HSD_GObj* gobj; + + PAD_STACK(16); + gobj = M2C_FIELD(HSD_GObj_Entities, HSD_GObj**, 0xF8); + + while (gobj != NULL) { + int* user_data = gobj->user_data; + if (user_data != NULL) { + if ((u32)user_data[2] == (u32)arg0) { + if (user_data[12] != -1 && user_data[12] == arg1) { + AXDriverKeyOff(user_data[12]); + if (gobj != NULL) { + HSD_GObjPLink_80390228(gobj); + } + return true; + } + } + } + gobj = gobj->next; + } + return false; +} /// #fn_80026650 /// #fn_800267B0 diff --git a/src/melee/lb/lbaudio_ax.h b/src/melee/lb/lbaudio_ax.h index 0e4cb2df83..a20cbac84f 100644 --- a/src/melee/lb/lbaudio_ax.h +++ b/src/melee/lb/lbaudio_ax.h @@ -77,11 +77,11 @@ /* 025E38 */ bool fn_80025E38(HSD_GObj* gobj); /* 025FAC */ UNK_RET fn_80025FAC(UNK_PARAMS); /* 0262A0 */ UNK_RET fn_800262A0(UNK_PARAMS); -/* 0263B4 */ UNK_RET fn_800263B4(UNK_PARAMS); +/* 0263B4 */ void fn_800263B4(void* ptr); /* 0263E8 */ HSD_GObj* lbAudioAx_800263E8(float, HSD_GObj*, int, int, int, int, int, int, int, int, int); /* 0264E4 */ bool lbAudioAx_800264E4(UNK_T); /* 026510 */ void lbAudioAx_80026510(HSD_GObj*); -/* 0265C4 */ enum_t lbAudioAx_800265C4(HSD_GObj*, enum_t sfx); +/* 0265C4 */ bool lbAudioAx_800265C4(HSD_GObj*, int sfx); /* 026650 */ UNK_RET fn_80026650(UNK_PARAMS); /* 0267B0 */ UNK_RET fn_800267B0(UNK_PARAMS); /* 0268B4 */ UNK_RET fn_800268B4(UNK_PARAMS); diff --git a/src/melee/lb/lbbgflash.c b/src/melee/lb/lbbgflash.c index 4d1d557455..d0132debf1 100644 --- a/src/melee/lb/lbbgflash.c +++ b/src/melee/lb/lbbgflash.c @@ -17,12 +17,34 @@ extern s32 lbl_804D3840; extern s32 lbl_804D3844; extern lbl_80433658_t lbl_80433658; +typedef struct BgFlashData2 { + u8 state; + u8 pad1[3]; + int x4; + int x8; + u8 xC; + u8 xD; + u8 xE; + u8 xF; + f32 x10; + f32 x14; + f32 x18; + f32 x1C; + u8 pad2[0x10]; + u8 x30; + u8 x31; + u8 x32; + u8 x33; + s32 x34; + s32 x38; + s32 x3C; +} BgFlashData2; + /// #fn_8001FC08 /// #fn_8001FEC4 /// #fn_800204C8 - /// #lbBgFlash_800205F0 void lbBgFlash_8002063C(int count) diff --git a/src/melee/lb/lbbgflash.h b/src/melee/lb/lbbgflash.h index 593c6dd4b4..42eab3bf1f 100644 --- a/src/melee/lb/lbbgflash.h +++ b/src/melee/lb/lbbgflash.h @@ -8,7 +8,7 @@ /* 01FC08 */ UNK_RET fn_8001FC08(UNK_PARAMS); /* 01FEC4 */ UNK_RET fn_8001FEC4(UNK_PARAMS); -/* 0204C8 */ UNK_RET fn_800204C8(UNK_PARAMS); +/* 0204C8 */ void fn_800204C8(void); /* 0205F0 */ void lbBgFlash_800205F0(void); /* 02063C */ void lbBgFlash_8002063C(int); /* 020688 */ void lbBgFlash_80020688(int); diff --git a/src/melee/lb/lbmthp.c b/src/melee/lb/lbmthp.c index c4da0ef288..c348a4bd0a 100644 --- a/src/melee/lb/lbmthp.c +++ b/src/melee/lb/lbmthp.c @@ -1,7 +1,9 @@ #include "lbmthp.static.h" +#include #include #include +#include /// #fn_8001E910 @@ -145,8 +147,49 @@ void lbMthp_8001F87C(void) lbl_804333E0.unk_14C = 0; } -/// #lbMthp8001F890 +void* lbMthp8001F890(HSD_GObj* gobj) +{ + lbl_804335B8.x70 = 0; + lbl_804335B8.x74 = lbl_804335B8.x6C; + lbl_804335B8.x76 = lbl_804335B8.x6E; + lbl_804335B8.x78 = 6; + lbl_804335B8.x7C = 0; + lbl_804335B8.x84 = lbl_804D7CE0; + lbl_804335B8.x80 = lbl_804D7CE0; + lbl_804335B8.x88 = &lbl_804335B8.x70; + lbl_804335B8.x8C = 0; + lbl_804335B8.x90 = (struct HSD_SObj_803A477C_t_ext*)HSD_SObjLib_803A477C(gobj, (int)&lbl_804335B8.x88, 0, 0, 0x80, 0); + lbl_804335B8.x90->x40 |= 0x10; + return lbl_804335B8.x90; +} -/// #lbMthp8001F928 +void lbMthp8001F928(HSD_GObj* gobj, int arg1) +{ + u16* pWidth = &lbl_804335B8.x6C; + u16* pHeight = &lbl_804335B8.x6E; + + /* First texture - full size */ + GXInitTexObj(&lbl_804335B8.tex0, lbl_804335B8.x20, lbl_804335B8.x6C, + lbl_804335B8.x6E, 1, 0, 0, 0); + GXInitTexObjLOD(&lbl_804335B8.tex0, 0, 0, lbl_804D7CE0, lbl_804D7CE0, + lbl_804D7CE0, 0, 0, 0); + GXLoadTexObj(&lbl_804335B8.tex0, 0); + + /* Second texture - half size */ + GXInitTexObj(&lbl_804335B8.tex1, lbl_804335B8.x44, (u16) (*pWidth >> 1), + (u16) (*pHeight >> 1), 1, 0, 0, 0); + GXInitTexObjLOD(&lbl_804335B8.tex1, 0, 0, lbl_804D7CE0, lbl_804D7CE0, + lbl_804D7CE0, 0, 0, 0); + GXLoadTexObj(&lbl_804335B8.tex1, 1); + + /* Third texture - half size */ + GXInitTexObj(&lbl_804335B8.tex2, lbl_804335B8.x68, (u16) (*pWidth >> 1), + (u16) (*pHeight >> 1), 1, 0, 0, 0); + GXInitTexObjLOD(&lbl_804335B8.tex2, 0, 0, lbl_804D7CE0, lbl_804D7CE0, + lbl_804D7CE0, 0, 0, 0); + GXLoadTexObj(&lbl_804335B8.tex2, 2); + + HSD_SObjLib_803A49E0(gobj, arg1); +} /// #lbMthp8001FAA0 diff --git a/src/melee/lb/lbmthp.h b/src/melee/lb/lbmthp.h index 25ddcf1f24..67a94fd04c 100644 --- a/src/melee/lb/lbmthp.h +++ b/src/melee/lb/lbmthp.h @@ -62,7 +62,7 @@ typedef struct THPDecComp { /* 01F67C */ void lbMthp_8001F67C(HSD_GObj*, int); /* 01F800 */ void lbMthp_8001F800(void); /* 01F87C */ void lbMthp_8001F87C(void); -/* 01F890 */ UNK_T lbMthp8001F890(HSD_GObj*); +/* 01F890 */ void* lbMthp8001F890(HSD_GObj*); /* 01F928 */ void lbMthp8001F928(HSD_GObj*, int); /* 01FAA0 */ UNK_RET lbMthp8001FAA0(const char* filename, int, int); diff --git a/src/melee/lb/lbmthp.static.h b/src/melee/lb/lbmthp.static.h index 5abfd0a344..97e800cad8 100644 --- a/src/melee/lb/lbmthp.static.h +++ b/src/melee/lb/lbmthp.static.h @@ -3,6 +3,8 @@ #include "lbmthp.h" // IWYU pragma: export +#include + struct lbl_804333E0_t { /* 0x000 */ char pad_0[0x84]; /* 0x084 */ s32 unk_84; /* inferred */ @@ -23,4 +25,39 @@ STATIC_ASSERT(sizeof(struct lbl_804333E0_t) == 0x1D8); /* 4333E0 */ static struct lbl_804333E0_t lbl_804333E0; /* 4D7CC0 */ static float lb_804D7CC0; +/* HSD_SObj_803A477C_t extended for this function */ +struct HSD_SObj_803A477C_t_ext { + /* 0x00 */ u8 pad0[0x10]; + /* 0x10 */ float x10, x14; + /* 0x18 */ u8 pad18[0x3C - 0x18]; + /* 0x3C */ u8 x3C, x3D, x3E, x3F; + /* 0x40 */ u32 x40; +}; + +struct lbl_804335B8_t { + /* 0x00 */ GXTexObj tex0; /* 0x00-0x20 (size 0x20) */ + /* 0x20 */ void* x20; /* image ptr for tex0 */ + /* 0x24 */ GXTexObj tex1; /* 0x24-0x44 (size 0x20) */ + /* 0x44 */ void* x44; /* image ptr for tex1 */ + /* 0x48 */ GXTexObj tex2; /* 0x48-0x68 (size 0x20) */ + /* 0x68 */ void* x68; /* image ptr for tex2 */ + /* 0x6C */ u16 x6C; /* width */ + /* 0x6E */ u16 x6E; /* height */ + /* 0x70 */ s32 x70; + /* 0x74 */ u16 x74; + /* 0x76 */ u16 x76; + /* 0x78 */ s32 x78; + /* 0x7C */ s32 x7C; + /* 0x80 */ float x80; + /* 0x84 */ float x84; + /* 0x88 */ void* x88; + /* 0x8C */ s32 x8C; + /* 0x90 */ struct HSD_SObj_803A477C_t_ext* x90; + /* 0x94 */ char pad_94[0xA0 - 0x94]; +}; /* size = 0xA0 */ +STATIC_ASSERT(sizeof(struct lbl_804335B8_t) == 0xA0); + +/* 4335B8 */ static struct lbl_804335B8_t lbl_804335B8; +/* 4D7CE0 */ static float lbl_804D7CE0; + #endif diff --git a/src/melee/lb/lbrefract.c b/src/melee/lb/lbrefract.c index deb33fbec7..f991bab54d 100644 --- a/src/melee/lb/lbrefract.c +++ b/src/melee/lb/lbrefract.c @@ -4,10 +4,14 @@ #include #include +#include #include +#include #include #include +extern HSD_DObjInfo hsdDObj; + /* 021F34 */ static UNK_RET fn_80021F34(UNK_PARAMS); /* 021F70 */ static UNK_RET fn_80021F70(UNK_PARAMS); /* 021FB4 */ static UNK_RET fn_80021FB4(UNK_PARAMS); @@ -16,6 +20,7 @@ /* 022120 */ static void fn_80022120(lbRefract_CallbackData* arg0, s32 arg1, u32 arg2, u32* arg3, u32* arg4, u8* arg5, u8* arg6); +/* 022608 */ static void fn_80022608(HSD_DObj* dobj, Mtx vmtx, Mtx pmtx, u32 rendermode); /* 022DF8 */ static inline float lbRefract_80022DF8(float x); /* 02219C */ s32 lbRefract_8002219C(lbRefract_CallbackData*, s32, s32, u16, u16); @@ -88,12 +93,78 @@ s32 lbRefract_8002219C(lbRefract_CallbackData* arg0, s32 arg1, s32 arg2, } } +void lbRefract_8002247C(HSD_CObj* cobj) { + s32 proj_type; + + if (lbl_804336D0[0] == 0) { + return; + } + + proj_type = HSD_CObjGetProjectionType(cobj); + + switch (proj_type) { + case 1: + { + f32 scale = 0.5F; + f32 trans = 0.5F; + MTXLightPerspective((MtxPtr)((char*)lbl_804336D0 + 0x10), + M2C_FIELD(cobj, f32*, 0x40), + M2C_FIELD(cobj, f32*, 0x44), + scale, scale, scale, trans); + break; + } + case 2: + { + f32 scale = 0.5F; + MTXLightFrustum((MtxPtr)((char*)lbl_804336D0 + 0x10), + M2C_FIELD(cobj, f32*, 0x40), + M2C_FIELD(cobj, f32*, 0x44), + M2C_FIELD(cobj, f32*, 0x48), + M2C_FIELD(cobj, f32*, 0x4c), + M2C_FIELD(cobj, f32*, 0x38), + scale, 0.5F, scale, scale); + break; + } + default: + { + f32 scale = 0.5F; + MTXLightOrtho((MtxPtr)((char*)lbl_804336D0 + 0x10), + M2C_FIELD(cobj, f32*, 0x40), + M2C_FIELD(cobj, f32*, 0x44), + M2C_FIELD(cobj, f32*, 0x48), + M2C_FIELD(cobj, f32*, 0x4c), + scale, 0.5F, scale, scale); + break; + } + } +} + +void lbRefract_80022560(void) +{ + if (lbl_804336D0[0] != 0) { + GXSetTexCopySrc(0, 0, 0x280, 0x1E0); + GXSetTexCopyDst(0x140, 0xF0, 4, 1); + GXCopyTex((void*)lbl_804336D0[1], 0); + GXPixModeSync(); + GXInvalidateTexAll(); + } +} + void lbRefract_800225D4(void) { GXSetTevDirect(0); GXSetNumIndStages(0); HSD_StateInvalidate(-1); } + +static void fn_80022608(HSD_DObj* dobj, Mtx vmtx, Mtx pmtx, u32 rendermode) +{ + hsdDObj.disp(dobj, vmtx, pmtx, rendermode); + GXSetTevDirect(0); + GXSetNumIndStages(0); + HSD_StateInvalidate(-1); +} + void lbRefract_80022BB8(void) { lbl_804336D0[0] += 1; diff --git a/src/melee/lb/lbsnap.c b/src/melee/lb/lbsnap.c index 3c9243865d..596713ccf5 100644 --- a/src/melee/lb/lbsnap.c +++ b/src/melee/lb/lbsnap.c @@ -295,25 +295,26 @@ int lbSnap_8001DF6C(int chan) { struct Unk80433380_48* ptr = &lbSnap_80433380.x48[chan]; char text[0x21]; + int ret; PAD_STACK(8); if (ptr->unk0 == 0 && lbSnap_80433380.x54_stateChanged[chan] != 0) { ptr->unk0 = 8; } - if (ptr->unk0 == 0) { + ret = ptr->unk0; + if (ret == 0) { lbSnap_80433380.x48[chan].unk0 = 8; lbSnap_8001D4A4(chan, text); lbSnap_803BACC8.x14 = lbSnap_80433380.x0->xC + ((int) &lbSnap_80433380.x0->x38 - (int) &lbSnap_80433380.x0->x0); lbSnap_803BACC8.x1C = lbSnap_80433380.x0; - return lb_8001BB48(chan, text, &lbSnap_803BACC8.x14, &lbSnap_803BACC8, + ret = lb_8001BB48(chan, text, &lbSnap_803BACC8.x14, &lbSnap_803BACC8, lbSnap_80433380.x4_string, lbSnap_80433380.x44_LbMcSnap_MemSnapIconData[0], lbSnap_80433380.x44_LbMcSnap_MemSnapIconData[1], 0); - } else { - return ptr->unk0; } + return ret; } int lbSnap_8001E058(int chan, int index)