diff --git a/src/game/credits.c b/src/game/credits.c index 6063c6dde..6226594c2 100644 --- a/src/game/credits.c +++ b/src/game/credits.c @@ -122,7 +122,7 @@ struct creditsdata { /*0x0008*/ u32 unk0008; /*0x000c*/ struct particle particles[500]; /*0x2eec*/ u8 unk2eec; - /*0x2ef0*/ struct menu840 unk2ef0; + /*0x2ef0*/ struct menumodel menumodel; /*0x34a8*/ u8 unk34a8[0xcac]; /** @@ -1796,7 +1796,7 @@ Gfx *creditsDraw(Gfx *gdl) g_CreditsScrollStarted = true; scrolltimer240 = 0; - func0f0f37a4(&g_CreditsData->unk2ef0); + menuUnsetModel(&g_CreditsData->menumodel); } scrolltimer240 += g_Vars.diffframe240; @@ -1805,19 +1805,22 @@ Gfx *creditsDraw(Gfx *gdl) scrolltimer240 = 0; } - g_CreditsData->unk2ef0.unk54c = 0; - g_CreditsData->unk2ef0.unk524 = 0; - g_CreditsData->unk2ef0.unk520 = g_CreditsData->unk2ef0.unk548 = -0.26175770163536; - g_CreditsData->unk2ef0.unk528 = g_CreditsData->unk2ef0.unk550 = 0; - g_CreditsData->unk2ef0.unk538 = 833.0f - (scrolltimer240 / TICKS(14400.0f)) * 2413.0f; - g_CreditsData->unk2ef0.unk53c = VERSION == VERSION_PAL_FINAL ? 65.86 : 70.86; - g_CreditsData->unk2ef0.unk540 = -2050; - g_CreditsData->unk2ef0.unk544 = 1.467; - g_CreditsData->unk2ef0.unk00c = 1200; - g_CreditsData->unk2ef0.unk5b1_07 = true; - g_CreditsData->unk2ef0.partvisibility = NULL; + g_CreditsData->menumodel.newroty = 0; + g_CreditsData->menumodel.curroty = 0; - gdl = menuRenderModels(gdl, &g_CreditsData->unk2ef0, 4); + g_CreditsData->menumodel.currotx = g_CreditsData->menumodel.newrotx = -0.26175770163536; + g_CreditsData->menumodel.currotz = g_CreditsData->menumodel.newrotz = 0; + + g_CreditsData->menumodel.newposx = 833.0f - (scrolltimer240 / TICKS(14400.0f)) * 2413.0f; + g_CreditsData->menumodel.newposy = VERSION == VERSION_PAL_FINAL ? 65.86 : 70.86; + g_CreditsData->menumodel.newposz = -2050; + + g_CreditsData->menumodel.newscale = 1.467; + g_CreditsData->menumodel.newparams = MENUMODELPARAMS_SET_FILENUM(FILE_PPDMENU); + g_CreditsData->menumodel.drawbehinddialog = true; + g_CreditsData->menumodel.partvisibility = NULL; + + gdl = menuRenderModel(gdl, &g_CreditsData->menumodel, MENUMODELTYPE_CREDITSLOGO); gSPMatrix(gdl++, osVirtualToPhysical(matrix), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); @@ -1912,19 +1915,18 @@ void creditsReset(void) creditsResetParticles(); creditsResetSlides(); - func0f0f8bb4(&g_CreditsData->unk2ef0, 0x25800, 1); + menuResetModel(&g_CreditsData->menumodel, 0x25800, true); - g_CreditsData->unk2ef0.unk580 = 0; + g_CreditsData->menumodel.removingpiece = false; - func0f0f372c(&g_CreditsData->unk2ef0, 0, 0, 0, 0, 0, 0, 1, 5); + menuConfigureModel(&g_CreditsData->menumodel, 0, 0, 0, 0, 0, 0, 1, MENUMODELFLAG_HASSCALE | MENUMODELFLAG_HASROTATION); - g_CreditsData->unk2ef0.unk53c = 90; - g_CreditsData->unk2ef0.unk510 = 8.2; - g_CreditsData->unk2ef0.unk514 = -4.1; - g_CreditsData->unk2ef0.unk51c = 0.00393; - g_CreditsData->unk2ef0.unk54c = 0; - g_CreditsData->unk2ef0.unk524 = g_CreditsData->unk2ef0.unk54c; - g_CreditsData->unk2ef0.unk578 = 60; + g_CreditsData->menumodel.newposy = 90; + g_CreditsData->menumodel.curposx = 8.2; + g_CreditsData->menumodel.curposy = -4.1; + g_CreditsData->menumodel.curscale = 0.00393; + g_CreditsData->menumodel.curroty = g_CreditsData->menumodel.newroty = 0; + g_CreditsData->menumodel.rottimer60 = 60; g_CreditsUsingAltTitle = g_CreditsAltTitleRequested; diff --git a/src/game/endscreen.c b/src/game/endscreen.c index b4bf2cee1..add6d4949 100644 --- a/src/game/endscreen.c +++ b/src/game/endscreen.c @@ -432,19 +432,19 @@ struct menudialogdef *endscreenAdvance(void) return &g_NextMissionMenuDialog; } -void endscreen0f10d770(void) +void endscreenResetModels(void) { - func0f0f8bb4(&g_Menus[0].unk840, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), 0); - g_Menus[0].unk840.unk004 = bgunGetGunMem() + menugfxGetParticleArraySize(); + menuResetModel(&g_Menus[0].menumodel, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), false); + g_Menus[0].menumodel.allocstart = bgunGetGunMem() + menugfxGetParticleArraySize(); - func0f0f8bb4(&g_Menus[1].unk840, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), 0); - g_Menus[1].unk840.unk004 = bgunGetGunMem() + menugfxGetParticleArraySize(); + menuResetModel(&g_Menus[1].menumodel, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), false); + g_Menus[1].menumodel.allocstart = bgunGetGunMem() + menugfxGetParticleArraySize(); - func0f0f8bb4(&g_Menus[2].unk840, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), 0); - g_Menus[2].unk840.unk004 = bgunGetGunMem() + menugfxGetParticleArraySize(); + menuResetModel(&g_Menus[2].menumodel, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), false); + g_Menus[2].menumodel.allocstart = bgunGetGunMem() + menugfxGetParticleArraySize(); - func0f0f8bb4(&g_Menus[3].unk840, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), 0); - g_Menus[3].unk840.unk004 = bgunGetGunMem() + menugfxGetParticleArraySize(); + menuResetModel(&g_Menus[3].menumodel, bgunCalculateGunMemCapacity() - menugfxGetParticleArraySize(), false); + g_Menus[3].menumodel.allocstart = bgunGetGunMem() + menugfxGetParticleArraySize(); } #if VERSION >= VERSION_NTSC_1_0 @@ -687,7 +687,7 @@ void endscreenContinue(s32 context) menuPushDialog(&g_MissionContinueOrReplyMenuDialog); } } else { - endscreen0f10d770(); + endscreenResetModels(); if (context == 1) { menuPushRootDialog(endscreenAdvance(), MENUROOT_COOPCONTINUE); @@ -746,7 +746,7 @@ MenuDialogHandlerResult endscreenHandle2PCompleted(s32 operation, struct menudia && !isStageDifficultyUnlocked(g_MissionConfig.stageindex + 1, g_MissionConfig.difficulty)))) { menuPopDialog(); } else { - endscreen0f10d770(); + endscreenResetModels(); menuPushDialog(endscreenAdvance()); } #endif @@ -789,7 +789,7 @@ MenuDialogHandlerResult endscreenHandle2PFailed(s32 operation, struct menudialog || g_Vars.stagenum == STAGE_CITRAINING) { menuPopDialog(); } else { - endscreen0f10d770(); + endscreenResetModels(); menuPushDialog(&g_RetryMissionMenuDialog); } } @@ -1750,7 +1750,7 @@ void endscreenPushSolo(void) #endif { // Failed or aborted - endscreen0f10d770(); + endscreenResetModels(); menuPushRootDialog(&g_RetryMissionMenuDialog, MENUROOT_COOPCONTINUE); } else { // Completed @@ -1760,7 +1760,7 @@ void endscreenPushSolo(void) struct menudialogdef *definition = endscreenAdvance(); if (definition) { - endscreen0f10d770(); + endscreenResetModels(); menuPushRootDialog(definition, MENUROOT_COOPCONTINUE); } #endif diff --git a/src/game/mainmenu.c b/src/game/mainmenu.c index f4e60cfaa..1595df7fc 100644 --- a/src/game/mainmenu.c +++ b/src/game/mainmenu.c @@ -772,11 +772,11 @@ MenuDialogHandlerResult menudialog00103608(s32 operation, struct menudialogdef * { switch (operation) { case MENUOP_OPEN: - g_Menus[g_MpPlayerNum].unk840.unk010 = 0; + g_Menus[g_MpPlayerNum].menumodel.curparams = 0; setupLoadBriefing(g_MissionConfig.stagenum, - g_Menus[g_MpPlayerNum].unk840.unk004, - g_Menus[g_MpPlayerNum].unk840.unk008, &g_Briefing); + g_Menus[g_MpPlayerNum].menumodel.allocstart, + g_Menus[g_MpPlayerNum].menumodel.alloclen, &g_Briefing); break; case MENUOP_CLOSE: langClearBank(g_Briefing.langbank); @@ -3779,51 +3779,50 @@ void func0f105948(s32 weaponnum) if (weaponHasFlag(weaponnum, WEAPONFLAG_HIDEMENUMODEL) == false && (u32)wantindex >= 0 && useindex >= 0) { weapon = weaponFindById(weaponnum); - g_Menus[g_MpPlayerNum].unk840.unk000 = 8; - g_Menus[g_MpPlayerNum].unk840.unk010 = 0; - g_Menus[g_MpPlayerNum].unk840.unk00c = weaponGetFileNum(weaponnum); - g_Menus[g_MpPlayerNum].unk840.unk538 = 0; - g_Menus[g_MpPlayerNum].unk840.unk510 = 0; - g_Menus[g_MpPlayerNum].unk840.unk53c = 0; - g_Menus[g_MpPlayerNum].unk840.unk514 = 0; - g_Menus[g_MpPlayerNum].unk840.unk540 = 0; - g_Menus[g_MpPlayerNum].unk840.unk518 = 0; - g_Menus[g_MpPlayerNum].unk840.unk550 = 0; - g_Menus[g_MpPlayerNum].unk840.unk528 = 0; - g_Menus[g_MpPlayerNum].unk840.unk52c = gunconfig[useindex][0]; - g_Menus[g_MpPlayerNum].unk840.unk530 = gunconfig[useindex][1]; - g_Menus[g_MpPlayerNum].unk840.unk534 = gunconfig[useindex][2]; - g_Menus[g_MpPlayerNum].unk840.unk548 = gunconfig[useindex][3]; - g_Menus[g_MpPlayerNum].unk840.unk520 = gunconfig[useindex][3]; // @bug? Wrong index? + g_Menus[g_MpPlayerNum].menumodel.loaddelay = 8; + g_Menus[g_MpPlayerNum].menumodel.curparams = 0; + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_FILENUM(weaponGetFileNum(weaponnum)); - func0f0f372c(&g_Menus[g_MpPlayerNum].unk840, 0, 0, 0, 0, 0, 0, gunconfig[useindex][4], 1); + g_Menus[g_MpPlayerNum].menumodel.curposx = g_Menus[g_MpPlayerNum].menumodel.newposx = 0; + g_Menus[g_MpPlayerNum].menumodel.curposy = g_Menus[g_MpPlayerNum].menumodel.newposy = 0; + g_Menus[g_MpPlayerNum].menumodel.curposz = g_Menus[g_MpPlayerNum].menumodel.newposz = 0; - g_Menus[g_MpPlayerNum].unk840.unk51c = 0; - g_Menus[g_MpPlayerNum].unk840.partvisibility = weapon->partvisibility; - g_Menus[g_MpPlayerNum].unk840.unk554 = -1; + g_Menus[g_MpPlayerNum].menumodel.currotz = g_Menus[g_MpPlayerNum].menumodel.newrotz = 0; + + g_Menus[g_MpPlayerNum].menumodel.displacex = gunconfig[useindex][0]; + g_Menus[g_MpPlayerNum].menumodel.displacey = gunconfig[useindex][1]; + g_Menus[g_MpPlayerNum].menumodel.displacez = gunconfig[useindex][2]; + + g_Menus[g_MpPlayerNum].menumodel.newrotx = gunconfig[useindex][3]; + g_Menus[g_MpPlayerNum].menumodel.currotx = gunconfig[useindex][3]; + + menuConfigureModel(&g_Menus[g_MpPlayerNum].menumodel, 0, 0, 0, 0, 0, 0, gunconfig[useindex][4], MENUMODELFLAG_HASSCALE); + + g_Menus[g_MpPlayerNum].menumodel.curscale = 0; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = weapon->partvisibility; + g_Menus[g_MpPlayerNum].menumodel.zoom = -1; // These indexes correspond to WEAPON_DISGUISE40 and WEAPON_DISGUISE41 if (wantindex == 0x3e || wantindex == 0x3f) { if ((u32)wantindex == 0x3e) { - g_Menus[g_MpPlayerNum].unk840.unk00c = 0x0a01ffff; + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_MP_HEADBODY(MPHEAD_DARK_FROCK, MPBODY_DARKLAB); } else { - g_Menus[g_MpPlayerNum].unk840.unk00c = 0x0400ffff; + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_MP_HEADBODY(MPHEAD_DARK_COMBAT, MPBODY_DARK_AF1); } - g_Menus[g_MpPlayerNum].unk840.partvisibility = NULL; - g_Menus[g_MpPlayerNum].unk840.unk580 = 0; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = NULL; + g_Menus[g_MpPlayerNum].menumodel.removingpiece = false; - func0f0f372c(&g_Menus[g_MpPlayerNum].unk840, 0, 0, 0, 0, 0, 0, 1, 1); + menuConfigureModel(&g_Menus[g_MpPlayerNum].menumodel, 0, 0, 0, 0, 0, 0, 1, MENUMODELFLAG_HASSCALE); - g_Menus[g_MpPlayerNum].unk840.unk578 = TICKS(60); - g_Menus[g_MpPlayerNum].unk840.unk574 = TICKS(120); - g_Menus[g_MpPlayerNum].unk840.unk54c = -0.2f; - g_Menus[g_MpPlayerNum].unk840.unk524 = -0.2f; + g_Menus[g_MpPlayerNum].menumodel.rottimer60 = TICKS(60); + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 = TICKS(120); + g_Menus[g_MpPlayerNum].menumodel.curroty = g_Menus[g_MpPlayerNum].menumodel.newroty = -0.2f; } } else { - g_Menus[g_MpPlayerNum].unk840.bodymodeldef = NULL; - g_Menus[g_MpPlayerNum].unk840.unk010 = 0; - g_Menus[g_MpPlayerNum].unk840.unk00c = 0; + g_Menus[g_MpPlayerNum].menumodel.bodymodeldef = NULL; + g_Menus[g_MpPlayerNum].menumodel.curparams = 0; + g_Menus[g_MpPlayerNum].menumodel.newparams = 0; } } @@ -3831,11 +3830,11 @@ MenuDialogHandlerResult inventoryMenuDialog(s32 operation, struct menudialogdef { if (operation == MENUOP_TICK) { if (g_Menus[g_MpPlayerNum].curdialog && g_Menus[g_MpPlayerNum].curdialog->definition == dialogdef) { - g_Menus[g_MpPlayerNum].unk840.unk574 -= g_Vars.diffframe60; - g_Menus[g_MpPlayerNum].unk840.unk54c = 18.849555969238f * g_20SecIntervalFrac; - g_Menus[g_MpPlayerNum].unk840.unk524 = 18.849555969238f * g_20SecIntervalFrac; - g_Menus[g_MpPlayerNum].unk840.unk528 = 0; - g_Menus[g_MpPlayerNum].unk840.unk550 = 0; + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 -= g_Vars.diffframe60; + g_Menus[g_MpPlayerNum].menumodel.newroty = 18.849555969238f * g_20SecIntervalFrac; + g_Menus[g_MpPlayerNum].menumodel.curroty = 18.849555969238f * g_20SecIntervalFrac; + g_Menus[g_MpPlayerNum].menumodel.currotz = 0; + g_Menus[g_MpPlayerNum].menumodel.newrotz = 0; if (var80072d88 != g_InventoryWeapon) { func0f105948(g_InventoryWeapon); @@ -3843,9 +3842,9 @@ MenuDialogHandlerResult inventoryMenuDialog(s32 operation, struct menudialogdef } if (g_InventoryWeapon == WEAPON_DISGUISE40 || g_InventoryWeapon == WEAPON_DISGUISE41) { - g_Menus[g_MpPlayerNum].unk840.unk05c = ANIM_006A; - g_Menus[g_MpPlayerNum].unk840.unk578 = TICKS(60); - g_Menus[g_MpPlayerNum].unk840.unk574 = TICKS(120); + g_Menus[g_MpPlayerNum].menumodel.newanimnum = ANIM_006A; + g_Menus[g_MpPlayerNum].menumodel.rottimer60 = TICKS(60); + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 = TICKS(120); } } else { var80072d88 = 255; diff --git a/src/game/menu.c b/src/game/menu.c index 7840aabb9..898962604 100644 --- a/src/game/menu.c +++ b/src/game/menu.c @@ -1424,7 +1424,7 @@ void menuOpenDialog(struct menudialogdef *dialogdef, struct menudialog *dialog, void menuPushDialog(struct menudialogdef *dialogdef) { if (dialogdef) { - func0f0f37a4(&g_Menus[g_MpPlayerNum].unk840); + menuUnsetModel(&g_Menus[g_MpPlayerNum].menumodel); if (g_Menus[g_MpPlayerNum].depth < 6 && g_Menus[g_MpPlayerNum].numdialogs < ARRAYCOUNT(g_Menus[0].dialogs)) { struct menulayer *layer = &g_Menus[g_MpPlayerNum].layers[g_Menus[g_MpPlayerNum].depth]; @@ -1646,75 +1646,65 @@ void func0f0f3704(struct menudialogdef *dialogdef) menuPushDialog(dialogdef); } -void func0f0f372c(struct menu840 *arg0, f32 x, f32 y, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, u8 flags) +void menuConfigureModel(struct menumodel *menumodel, f32 x, f32 y, f32 z, f32 rotx, f32 roty, f32 rotz, f32 scale, u8 flags) { - arg0->unk5b1_05 = true; + menumodel->configuring = true; - if (flags & 2) { - arg0->unk538 = x; - arg0->unk53c = y; - arg0->unk540 = arg3; + if (flags & MENUMODELFLAG_HASPOSITION) { + menumodel->newposx = x; + menumodel->newposy = y; + menumodel->newposz = z; } - if (flags & 4) { - arg0->unk548 = arg4; - arg0->unk54c = arg5; - arg0->unk550 = arg6; + if (flags & MENUMODELFLAG_HASROTATION) { + menumodel->newrotx = rotx; + menumodel->newroty = roty; + menumodel->newrotz = rotz; } - if (flags & 1) { - arg0->unk544 = arg7; + if (flags & MENUMODELFLAG_HASSCALE) { + menumodel->newscale = scale; } - arg0->unk568 = flags; - arg0->unk564 = 0.0f; + menumodel->flags = flags; + menumodel->configurefrac = 0.0f; } -void func0f0f37a4(struct menu840 *arg0) +void menuUnsetModel(struct menumodel *menumodel) { - if (arg0->unk010 == 0x4fac5ace) { + if (menumodel->curparams == 0x4fac5ace) { challengeUnsetCurrent(); } - arg0->unk000 = 0; - arg0->unk00c = 0; - arg0->unk010 = 0; - arg0->bodymodeldef = 0; - arg0->headmodeldef = 0; - arg0->unk05c = 0; - arg0->unk05e = 0; - arg0->unk5b0 = 0; - arg0->unk5b1_01 = false; - arg0->unk5b1_02 = false; - arg0->unk5b1_03 = false; - arg0->unk5b1_04 = false; - arg0->unk5b1_05 = false; - arg0->unk5b1_06 = false; - arg0->unk5b1_07 = false; - arg0->partvisibility = NULL; - arg0->unk560 = -1; - arg0->headnum = -1; - arg0->bodynum = -1; - arg0->unk550 = 0.0f; - arg0->unk54c = 0.0f; - arg0->unk548 = 0.0f; - arg0->unk540 = 0.0f; - arg0->unk53c = 0.0f; - arg0->unk538 = 0.0f; - arg0->unk534 = 0.0f; - arg0->unk530 = 0.0f; - arg0->unk52c = 0.0f; - arg0->unk528 = 0.0f; - arg0->unk524 = 0.0f; - arg0->unk520 = 0.0f; - arg0->unk518 = 0.0f; - arg0->unk514 = 0.0f; - arg0->unk510 = 0.0f; - arg0->unk558 = 0.0f; - arg0->unk55c = 1.0f; - arg0->unk51c = 1.0f; - arg0->unk544 = 1.0f; - arg0->unk554 = -1.0f; + menumodel->loaddelay = 0; + menumodel->newparams = 0; + menumodel->curparams = 0; + menumodel->bodymodeldef = NULL; + menumodel->headmodeldef = NULL; + menumodel->newanimnum = 0; + menumodel->curanimnum = 0; + menumodel->perfectheadnum = 0; + menumodel->isperfecthead = false; + menumodel->unk5b1_02 = false; + menumodel->unk5b1_03 = false; + menumodel->reverseanim = false; + menumodel->configuring = false; + menumodel->unk5b1_06 = false; + menumodel->drawbehinddialog = false; + menumodel->partvisibility = NULL; + menumodel->unk560 = -1; + menumodel->headnum = -1; + menumodel->bodynum = -1; + menumodel->newrotx = menumodel->newroty = menumodel->newrotz = 0.0f; + menumodel->newposx = menumodel->newposy = menumodel->newposz = 0.0f; + menumodel->displacex = menumodel->displacey = menumodel->displacez = 0.0f; + menumodel->currotx = menumodel->curroty = menumodel->currotz = 0.0f; + menumodel->curposx = menumodel->curposy = menumodel->curposz = 0.0f; + menumodel->unk558 = 0.0f; + menumodel->unk55c = 1.0f; + menumodel->curscale = 1.0f; + menumodel->newscale = 1.0f; + menumodel->zoom = -1.0f; } Lights1 var80071468 = gdSPDefLights1(0x96, 0x96, 0x96, 0xff, 0xff, 0xff, 0xb2, 0x4d, 0x2e); @@ -1722,15 +1712,15 @@ Lights1 var80071468 = gdSPDefLights1(0x96, 0x96, 0x96, 0xff, 0xff, 0xff, 0xb2, 0 /** * Render the hudpiece as well as any models within dialogs. */ -Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) +Gfx *menuRenderModel(Gfx *gdl, struct menumodel *menumodel, s32 modeltype) { - f32 a; - f32 b; - f32 c; - f32 sp430; - f32 sp42c; - f32 sp428; - f32 sp424; + f32 rotx; + f32 roty; + f32 rotz; + f32 posx; + f32 posy; + f32 posz; + f32 scale; s32 totalfilelen; struct texpool texpool; s32 bodyfilelen2; @@ -1740,48 +1730,49 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) s32 headnum; if (g_Vars.stagenum != STAGE_CITRAINING && g_Vars.stagenum != STAGE_CREDITS) { - if (g_MenuData.unk5d5_01 && arg2 != 1 && arg2 < 3) { + if (g_MenuData.unk5d5_01 && modeltype != MENUMODELTYPE_HUDPIECE && modeltype < MENUMODELTYPE_3) { return gdl; } - if (thing->unk004 == NULL) { + if (menumodel->allocstart == NULL) { if (bgunChangeGunMem(GUNMEMOWNER_INVMENU)) { - thing->unk004 = bgunGetGunMem(); - thing->unk008 = bgunCalculateGunMemCapacity(); + menumodel->allocstart = bgunGetGunMem(); + menumodel->alloclen = bgunCalculateGunMemCapacity(); } else { return gdl; } } } - if (thing->unk004 == NULL) { + if (menumodel->allocstart == NULL) { return gdl; } - if (thing->unk00c != 0) { - if (thing->unk00c == thing->unk010) { - thing->unk00c = 0; - thing->unk000 = 0; + // If the caller has asked for a new model to be loaded, do it + if (menumodel->newparams != 0) { + if (menumodel->newparams == menumodel->curparams) { + menumodel->newparams = 0; + menumodel->loaddelay = 0; } else { - if (thing->unk010 == 0x4fac5ace) { + if (menumodel->curparams == 0x4fac5ace) { challengeUnsetCurrent(); } - if (thing->unk000 == 0) { - thing->unk000 = 1; + if (menumodel->loaddelay == 0) { + menumodel->loaddelay = 1; return gdl; } - thing->unk000--; + menumodel->loaddelay--; - if (thing->unk000 == 0) { - if ((thing->unk00c & 0xffff) == 0xffff || (thing->unk00c & 0x80000000)) { - if (thing->unk00c & 0x80000000) { - headnum = thing->unk00c & 0x3ff; - bodynum = (thing->unk00c & 0xffc00) >> 10; + if (menumodel->loaddelay == 0) { + if (MENUMODELPARAMS_GET_FILENUM(menumodel->newparams) == 0xffff || MENUMODELPARAMS_HAS_MASTER_HEADBODY(menumodel->newparams)) { + if (MENUMODELPARAMS_HAS_MASTER_HEADBODY(menumodel->newparams)) { + headnum = MENUMODELPARAMS_GET_MASTER_HEADNUM(menumodel->newparams); + bodynum = MENUMODELPARAMS_GET_MASTER_BODYNUM(menumodel->newparams); } else { - s32 mpheadnum = (thing->unk00c >> 16) & 0xff; - s32 mpbodynum = (thing->unk00c >> 24) & 0xff; + s32 mpheadnum = MENUMODELPARAMS_GET_MP_HEADNUM(menumodel->newparams); + s32 mpbodynum = MENUMODELPARAMS_GET_MP_BODYNUM(menumodel->newparams); bodynum = mpGetBodyId(mpbodynum); if (mpheadnum < mpGetNumHeads2()) { @@ -1789,7 +1780,7 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) } else { headnum = func0f14a9f8(mpheadnum - mpGetNumHeads2()); headnum = mpGetBeauHeadId(headnum); - thing->unk5b0 = (mpheadnum - mpGetNumHeads2()) & 0xff; + menumodel->perfectheadnum = (mpheadnum - mpGetNumHeads2()) & 0xff; } } @@ -1808,80 +1799,82 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) totalfilelen += 0x4000; - texInitPool(&texpool, thing->unk004 + totalfilelen, thing->unk008 - totalfilelen); + texInitPool(&texpool, menumodel->allocstart + totalfilelen, menumodel->alloclen - totalfilelen); - thing->headnum = headnum; - thing->bodynum = bodynum; - thing->bodymodeldef = modeldefLoad(bodyfilenum, thing->unk004, totalfilelen, &texpool); + menumodel->headnum = headnum; + menumodel->bodynum = bodynum; + menumodel->bodymodeldef = modeldefLoad(bodyfilenum, menumodel->allocstart, totalfilelen, &texpool); bodyfilelen2 = ALIGN64(fileGetLoadedSize(bodyfilenum)); - modelAllocateRwData(thing->bodymodeldef); + modelAllocateRwData(menumodel->bodymodeldef); if (headnum < 0) { - thing->headmodeldef = NULL; + menumodel->headmodeldef = NULL; } else { - thing->headmodeldef = modeldefLoad(headfilenum, thing->unk004 + bodyfilelen2, totalfilelen - bodyfilelen2, &texpool); + menumodel->headmodeldef = modeldefLoad(headfilenum, menumodel->allocstart + bodyfilelen2, totalfilelen - bodyfilelen2, &texpool); fileGetLoadedSize(headfilenum); - bodyCalculateHeadOffset(thing->headmodeldef, headnum, bodynum); - modelAllocateRwData(thing->headmodeldef); + bodyCalculateHeadOffset(menumodel->headmodeldef, headnum, bodynum); + modelAllocateRwData(menumodel->headmodeldef); } - modelInit(&thing->bodymodel, thing->bodymodeldef, thing->unk110, true); - animInit(&thing->bodyanim); + modelInit(&menumodel->bodymodel, menumodel->bodymodeldef, menumodel->rwdata, true); + animInit(&menumodel->bodyanim); - thing->bodymodel.rwdatalen = 256; - thing->bodymodel.anim = &thing->bodyanim; + menumodel->bodymodel.rwdatalen = 256; + menumodel->bodymodel.anim = &menumodel->bodyanim; - body0f02ce8c(bodynum, headnum, thing->bodymodeldef, thing->headmodeldef, totalfilelen * 0, &thing->bodymodel, false, 1); + body0f02ce8c(bodynum, headnum, menumodel->bodymodeldef, menumodel->headmodeldef, totalfilelen * 0, &menumodel->bodymodel, false, 1); } else { - totalfilelen = ALIGN64(fileGetInflatedSize(thing->unk00c)) + 0x4000; + totalfilelen = ALIGN64(fileGetInflatedSize(menumodel->newparams)) + 0x4000; if (1); - texInitPool(&texpool, &thing->unk004[(u32)totalfilelen], thing->unk008 - totalfilelen); + texInitPool(&texpool, &menumodel->allocstart[(u32)totalfilelen], menumodel->alloclen - totalfilelen); - thing->headnum = -1; - thing->bodynum = -1; - thing->bodymodeldef = modeldefLoad(thing->unk00c, thing->unk004, totalfilelen, &texpool); + menumodel->headnum = -1; + menumodel->bodynum = -1; + menumodel->bodymodeldef = modeldefLoad(menumodel->newparams, menumodel->allocstart, totalfilelen, &texpool); - fileGetLoadedSize(thing->unk00c); - modelAllocateRwData(thing->bodymodeldef); - modelInit(&thing->bodymodel, thing->bodymodeldef, thing->unk110, true); - animInit(&thing->bodyanim); + fileGetLoadedSize(menumodel->newparams); + modelAllocateRwData(menumodel->bodymodeldef); + modelInit(&menumodel->bodymodel, menumodel->bodymodeldef, menumodel->rwdata, true); + animInit(&menumodel->bodyanim); - thing->bodymodel.rwdatalen = 256; - thing->bodymodel.anim = &thing->bodyanim; + menumodel->bodymodel.rwdatalen = 256; + menumodel->bodymodel.anim = &menumodel->bodyanim; } - thing->unk010 = thing->unk00c; - thing->unk05e = 0; - thing->unk00c = 0; + menumodel->curparams = menumodel->newparams; + menumodel->curanimnum = 0; + menumodel->newparams = 0; } else { return gdl; } } } - if (thing->bodymodeldef != NULL) { + if (menumodel->bodymodeldef != NULL) { struct modelrenderdata renderdata = {NULL, true, 3}; - Mtxf *sp3b4; + Mtxf *matrices; s32 i; u32 stack[3]; - struct coord sp398; - f32 sp390[2]; - Mtxf sp350; - Mtxf sp310; - f32 sp30c[1]; - bool sp308; - struct coord sp2fc; - f32 sp2f8; - bool sp2f4; + struct coord tmpcoord; + f32 screenpos[2]; + Mtxf rotmtx; + Mtxf posmtx; + f32 screenz[1]; + bool haszoom; + struct coord zoompos; + f32 zoomy; + bool dodefaultzoom; - if (arg2 < 3 && g_MenuData.unk5d5_03) { + // Most models use the z-buffer and a scissor. + // Types 2 and 3 are unused. Type 4 is the credits scrolling logo. + if (modeltype < MENUMODELTYPE_3 && g_MenuData.usezbuf) { gdl = viPrepareZbuf(gdl); gdl = vi0000b1d0(gdl); - g_MenuData.unk5d5_03 = false; + g_MenuData.usezbuf = false; - if (arg2 != 2) { + if (modeltype != MENUMODELTYPE_2) { gdl = menuApplyScissor(gdl); } @@ -1891,221 +1884,217 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) gSPDisplayList(gdl++, var80061380); gSPDisplayList(gdl++, var800613a0); - sp308 = false; + haszoom = false; - if (thing->unk554 > 0.0f) { - sp2f4 = true; + // Handle updating the camera zoom in/out (eg. character selection dialog) + if (menumodel->zoom > 0.0f) { + dodefaultzoom = true; - if (thing->bodymodeldef->skel == &g_SkelChr) { - struct modelnode *node = modelGetPart(thing->bodymodeldef, MODELPART_CHR_0006); + if (menumodel->bodymodeldef->skel == &g_SkelChr) { + struct modelnode *node = modelGetPart(menumodel->bodymodeldef, MODELPART_CHR_0006); if (node) { struct modelrodata_position *rodata = &node->rodata->position; - f32 f0 = menuGetLinearOscPauseFrac(thing->unk574 / TICKS(480.0f)); + f32 frac = menuGetLinearOscPauseFrac(menumodel->zoomtimer60 / TICKS(480.0f)); - sp2fc.f[0] = 0.0f; - sp2fc.f[1] = 0.0f - (rodata->pos.f[1] / 7.6f * (1.0f - f0 * f0)); - sp2fc.f[2] = 0.0f; + zoompos.f[0] = 0.0f; + zoompos.f[1] = 0.0f - (rodata->pos.f[1] / 7.6f * (1.0f - frac * frac)); + zoompos.f[2] = 0.0f; - sp308 = true; + haszoom = true; - thing->unk554 = 100.0f + (1.0f - f0) * 270.0f; - sp2f8 = thing->unk554 / (rodata->pos.f[1] / 2.0f); + menumodel->zoom = 100.0f + (1.0f - frac) * 270.0f; + zoomy = menumodel->zoom / (rodata->pos.f[1] / 2.0f); - sp2f4 = false; + dodefaultzoom = false; - modelFindBboxRodata(&thing->bodymodel); + modelFindBboxRodata(&menumodel->bodymodel); } if (1); } - if (sp2f4) { - struct modelrodata_bbox *bbox = modelFindBboxRodata(&thing->bodymodel); + if (dodefaultzoom) { + struct modelrodata_bbox *bbox = modelFindBboxRodata(&menumodel->bodymodel); if (bbox) { - sp2fc.x = -(bbox->xmax - ((bbox->xmax - bbox->xmin) * 0.5f)); - sp2fc.y = -(bbox->ymax - ((bbox->ymax - bbox->ymin) * 0.5f)); - sp2fc.z = -(bbox->zmax - ((bbox->zmax - bbox->zmin) * 0.5f)); - sp308 = true; - sp2f8 = thing->unk554 / ((bbox->ymax - bbox->ymin) * 0.5f); + zoompos.x = -(bbox->xmax - ((bbox->xmax - bbox->xmin) * 0.5f)); + zoompos.y = -(bbox->ymax - ((bbox->ymax - bbox->ymin) * 0.5f)); + zoompos.z = -(bbox->zmax - ((bbox->zmax - bbox->zmin) * 0.5f)); + haszoom = true; + zoomy = menumodel->zoom / ((bbox->ymax - bbox->ymin) * 0.5f); } } } - mtx4LoadIdentity(&sp350); + mtx4LoadIdentity(&rotmtx); - if (arg2 == 1) { + // For the hudpiece, tween the position and scale to the new values and apply rotation. + if (modeltype == MENUMODELTYPE_HUDPIECE) { if (IS8MB()) { s32 i; - if (thing->unk510 != thing->unk538) { + if (menumodel->curposx != menumodel->newposx) { for (i = 0; i < g_Vars.diffframe60; i++) { - thing->unk510 = (thing->unk538 * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * thing->unk510); + menumodel->curposx = (menumodel->newposx * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * menumodel->curposx); } } - if (thing->unk514 != thing->unk53c) { + if (menumodel->curposy != menumodel->newposy) { for (i = 0; i < g_Vars.diffframe60; i++) { - thing->unk514 = (thing->unk53c * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * thing->unk514); + menumodel->curposy = (menumodel->newposy * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * menumodel->curposy); } } - if (thing->unk518 != thing->unk540) { + if (menumodel->curposz != menumodel->newposz) { for (i = 0; i < g_Vars.diffframe60; i++) { - thing->unk518 = (thing->unk540 * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * thing->unk518); + menumodel->curposz = (menumodel->newposz * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * menumodel->curposz); } } - if (thing->unk51c != thing->unk544) { + if (menumodel->curscale != menumodel->newscale) { for (i = 0; i < g_Vars.diffframe60; i++) { - thing->unk51c = (thing->unk544 * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * thing->unk51c); + menumodel->curscale = (menumodel->newscale * PALUPF(0.002f)) + ((1.0f - PALUPF(0.002f)) * menumodel->curscale); } } - sp430 = thing->unk510; + posx = menumodel->curposx; #if !PAL if (g_ViRes == VIRES_HI) { - sp430 *= 2.0f; + posx *= 2.0f; } #endif - sp42c = thing->unk514; - sp428 = thing->unk518; - sp424 = thing->unk51c; + posy = menumodel->curposy; + posz = menumodel->curposz; - a = thing->unk548; - b = thing->unk54c; - c = thing->unk550; + scale = menumodel->curscale; - thing->unk520 = a; - thing->unk524 = b; - thing->unk528 = c; + menumodel->currotx = rotx = menumodel->newrotx; + menumodel->curroty = roty = menumodel->newroty; + menumodel->currotz = rotz = menumodel->newrotz; - sp398.x = a; - sp398.y = b; - sp398.z = c; + tmpcoord.x = rotx; + tmpcoord.y = roty; + tmpcoord.z = rotz; - mtx4LoadRotation(&sp398, &sp350); + mtx4LoadRotation(&tmpcoord, &rotmtx); } } else { - if (thing->unk5b1_05) { + // If the caller is reconfiguring the model's position, rotation or scale, tween towards the new values. + if (menumodel->configuring) { #if VERSION >= VERSION_PAL_BETA - thing->unk564 += g_Vars.diffframe60freal / 40.0f; + menumodel->configurefrac += g_Vars.diffframe60freal / 40.0f; #else - thing->unk564 += g_Vars.diffframe60f / 40.0f; + menumodel->configurefrac += g_Vars.diffframe60f / 40.0f; #endif - if (thing->unk564 > 1.0f) { - thing->unk5b1_05 = false; - thing->unk510 = thing->unk538; - thing->unk514 = thing->unk53c; - thing->unk518 = thing->unk540; - thing->unk51c = thing->unk544; + if (menumodel->configurefrac > 1.0f) { + menumodel->configuring = false; + menumodel->curposx = menumodel->newposx; + menumodel->curposy = menumodel->newposy; + menumodel->curposz = menumodel->newposz; + menumodel->curscale = menumodel->newscale; } else { - f32 sp2d0 = (-cosf(thing->unk564 * M_PI) * 0.5f) + 0.5f; - f32 sp2cc = 1.0f - sp2d0; + f32 fracnew = (-cosf(menumodel->configurefrac * M_PI) * 0.5f) + 0.5f; + f32 fraccur = 1.0f - fracnew; - if (thing->unk568 & 2) { - sp430 = (thing->unk510 * sp2cc) + (sp2d0 * thing->unk538); - sp42c = (thing->unk514 * sp2cc) + (sp2d0 * thing->unk53c); - sp428 = (thing->unk518 * sp2cc) + (sp2d0 * thing->unk540); + if (menumodel->flags & MENUMODELFLAG_HASPOSITION) { + posx = (menumodel->curposx * fraccur) + (fracnew * menumodel->newposx); + posy = (menumodel->curposy * fraccur) + (fracnew * menumodel->newposy); + posz = (menumodel->curposz * fraccur) + (fracnew * menumodel->newposz); } else { - sp430 = thing->unk510 = thing->unk538; - sp42c = thing->unk514 = thing->unk53c; - sp428 = thing->unk518 = thing->unk540; + posx = menumodel->curposx = menumodel->newposx; + posy = menumodel->curposy = menumodel->newposy; + posz = menumodel->curposz = menumodel->newposz; } - if (thing->unk568 & 1) { - sp424 = (thing->unk51c * sp2cc) + (sp2d0 * thing->unk544); + if (menumodel->flags & MENUMODELFLAG_HASSCALE) { + scale = (menumodel->curscale * fraccur) + (fracnew * menumodel->newscale); } else { - sp424 = thing->unk51c = thing->unk544; + scale = menumodel->curscale = menumodel->newscale; } - if (thing->unk568 & 4) { + if (menumodel->flags & MENUMODELFLAG_HASROTATION) { f32 sp2bc[4]; f32 sp2ac[4]; f32 sp29c[4]; - struct coord sp290; + struct coord tmprot; - sp290.x = thing->unk520; - sp290.y = thing->unk524; - sp290.z = thing->unk528; + tmprot.x = menumodel->currotx; + tmprot.y = menumodel->curroty; + tmprot.z = menumodel->currotz; - quaternion0f096ca0(&sp290, sp2bc); + quaternion0f096ca0(&tmprot, sp2bc); - sp290.x = thing->unk548; - sp290.y = thing->unk54c; - sp290.z = thing->unk550; + tmprot.x = menumodel->newrotx; + tmprot.y = menumodel->newroty; + tmprot.z = menumodel->newrotz; - quaternion0f096ca0(&sp290, sp2ac); - quaternionSlerp(sp2bc, sp2ac, sp2d0, sp29c); - quaternionToMtx(sp29c, &sp350); + quaternion0f096ca0(&tmprot, sp2ac); + quaternionSlerp(sp2bc, sp2ac, fracnew, sp29c); + quaternionToMtx(sp29c, &rotmtx); } else { - a = thing->unk548; - b = thing->unk54c; - c = thing->unk550; + menumodel->currotx = rotx = menumodel->newrotx; + menumodel->curroty = roty = menumodel->newroty; + menumodel->currotz = rotz = menumodel->newrotz; - thing->unk520 = a; - thing->unk524 = b; - thing->unk528 = c; + tmpcoord.x = rotx; + tmpcoord.y = roty; + tmpcoord.z = rotz; - sp398.x = a; - sp398.y = b; - sp398.z = c; - - mtx4LoadRotation(&sp398, &sp350); + mtx4LoadRotation(&tmpcoord, &rotmtx); } } } - if (!thing->unk5b1_05) { - sp430 = thing->unk510 = thing->unk538; - sp42c = thing->unk514 = thing->unk53c; - sp428 = thing->unk518 = thing->unk540; - sp424 = thing->unk51c = thing->unk544; + if (!menumodel->configuring) { + posx = menumodel->curposx = menumodel->newposx; + posy = menumodel->curposy = menumodel->newposy; + posz = menumodel->curposz = menumodel->newposz; + + scale = menumodel->curscale = menumodel->newscale; if (1); - a = thing->unk548; - b = thing->unk54c; - c = thing->unk550; - thing->unk520 = a; - thing->unk524 = b; - thing->unk528 = c; + menumodel->currotx = rotx = menumodel->newrotx; + menumodel->curroty = roty = menumodel->newroty; + menumodel->currotz = rotz = menumodel->newrotz; - sp398.x = a; - sp398.y = b; - sp398.z = c; + tmpcoord.x = rotx; + tmpcoord.y = roty; + tmpcoord.z = rotz; - mtx4LoadRotation(&sp398, &sp350); + mtx4LoadRotation(&tmpcoord, &rotmtx); } } - sp30c[0] = -100.0f + sp428; + screenz[0] = -100.0f + posz; - if (arg2 == 1) { + if (modeltype == MENUMODELTYPE_HUDPIECE) { if (IS8MB()) { - sp390[0] = thing->unk510 * g_ScaleX; - sp390[1] = thing->unk514; + screenpos[0] = menumodel->curposx * g_ScaleX; + screenpos[1] = menumodel->curposy; } } else { - sp390[0] = sp430 * g_ScaleX + viGetViewLeft() + viGetViewWidth() * 0.5f; - sp390[1] = sp42c + viGetViewTop() + viGetViewHeight() * 0.5f; + screenpos[0] = posx * g_ScaleX + viGetViewLeft() + viGetViewWidth() * 0.5f; + screenpos[1] = posy + viGetViewTop() + viGetViewHeight() * 0.5f; } - cam0f0b4c3c(sp390, &sp398, 1.0f); - mtx4LoadIdentity(&sp310); + cam0f0b4c3c(screenpos, &tmpcoord, 1.0f); - if (thing->partvisibility != NULL) { - struct modelpartvisibility *ptr = thing->partvisibility; + mtx4LoadIdentity(&posmtx); + + // Show or hide model parts according to the visibility list + if (menumodel->partvisibility != NULL) { + struct modelpartvisibility *ptr = menumodel->partvisibility; while (ptr->part != 255) { - struct modelnode *node = modelGetPart(thing->bodymodeldef, ptr->part); + struct modelnode *node = modelGetPart(menumodel->bodymodeldef, ptr->part); if (node) { - union modelrwdata *rwdata = modelGetNodeRwData(&thing->bodymodel, node); + union modelrwdata *rwdata = modelGetNodeRwData(&menumodel->bodymodel, node); if (rwdata) { if (ptr->visible) { @@ -2120,39 +2109,40 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) } } - if (arg2 == 3) { - sp398.x = thing->unk510; - sp398.y = thing->unk514; - sp398.z = thing->unk518; + if (modeltype == MENUMODELTYPE_3) { + tmpcoord.x = menumodel->curposx; + tmpcoord.y = menumodel->curposy; + tmpcoord.z = menumodel->curposz; } else { - c = sp30c[0] / sp398.z; - sp398.x = c * sp398.x; - sp398.y = c * sp398.y; - sp398.z = c * sp398.z; + // Reusing rotz + rotz = screenz[0] / tmpcoord.z; + tmpcoord.x = rotz * tmpcoord.x; + tmpcoord.y = rotz * tmpcoord.y; + tmpcoord.z = rotz * tmpcoord.z; } #if VERSION < VERSION_NTSC_1_0 - if ((thing->unk010 & 0x80000000) != 0) { + if (MENUMODELPARAMS_HAS_MASTER_HEADBODY(menumodel->curparams)) { struct coord oldpos; struct coord newpos = {0, 0, 0}; u32 stack[3]; - modelUpdateInfo(&thing->bodymodel); + modelUpdateInfo(&menumodel->bodymodel); - modelGetRootPosition(&thing->bodymodel, &oldpos); + modelGetRootPosition(&menumodel->bodymodel, &oldpos); if (joyGetButtons(0, L_TRIG)) { - modelSetRootPosition(&thing->bodymodel, &newpos); + modelSetRootPosition(&menumodel->bodymodel, &newpos); } } #endif - mtx4LoadTranslation(&sp398, &sp310); + mtx4LoadTranslation(&tmpcoord, &posmtx); - if (sp308) { - mtx00015f04(sp424 * sp2f8, &sp310); + if (haszoom) { + mtx00015f04(scale * zoomy, &posmtx); } else { - mtx00015f04(sp424, &sp310); + mtx00015f04(scale, &posmtx); } { @@ -2161,30 +2151,31 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) Mtxf sp1c4; Mtxf sp184; - if (sp308) { - mtx4LoadTranslation(&sp2fc, &sp204); + if (haszoom) { + mtx4LoadTranslation(&zoompos, &sp204); } else { - sp398.x = thing->unk52c; - sp398.y = thing->unk530; - sp398.z = thing->unk534; - mtx4LoadTranslation(&sp398, &sp204); + tmpcoord.x = menumodel->displacex; + tmpcoord.y = menumodel->displacey; + tmpcoord.z = menumodel->displacez; + + mtx4LoadTranslation(&tmpcoord, &sp204); } - mtx4MultMtx4(&sp310, &sp350, &sp244); + mtx4MultMtx4(&posmtx, &rotmtx, &sp244); - if (arg2 == 3) { + if (modeltype == MENUMODELTYPE_3) { credits0f13ae04(&sp1c4); mtx4MultMtx4(&sp1c4, &sp244, &sp184); - mtx4MultMtx4(&sp184, &sp204, &thing->unk014); + mtx4MultMtx4(&sp184, &sp204, &menumodel->mtx); } else { - mtx4MultMtx4(&sp244, &sp204, &thing->unk014); + mtx4MultMtx4(&sp244, &sp204, &menumodel->mtx); } } gdl = menugfx0f0e2348(gdl); - if (arg2 < 3) { - if (arg2 != 0) { + if (modeltype < MENUMODELTYPE_3) { + if (modeltype != MENUMODELTYPE_DEFAULT) { gdl = func0f0d49c8(gdl); gSPMatrix(gdl++, osVirtualToPhysical(camGetPerspectiveMtxL()), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); } else { @@ -2205,52 +2196,57 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) } } - sp3b4 = gfxAllocate(thing->bodymodeldef->nummatrices * sizeof(Mtxf)); + // Allocate model matrices + matrices = gfxAllocate(menumodel->bodymodeldef->nummatrices * sizeof(Mtxf)); - for (i = 0; i < thing->bodymodeldef->nummatrices; i++) { - mtx4LoadIdentity(&sp3b4[i]); + for (i = 0; i < menumodel->bodymodeldef->nummatrices; i++) { + mtx4LoadIdentity(&matrices[i]); } - thing->bodymodel.matrices = sp3b4; + menumodel->bodymodel.matrices = matrices; - if (thing->unk05c && thing->unk05e != thing->unk05c) { - if (thing->unk5b1_04) { - modelSetAnimation(&thing->bodymodel, thing->unk05c, false, 0, PALUPF(-0.5f), 0.0f); - modelSetAnimFrame(&thing->bodymodel, modelGetNumAnimFrames(&thing->bodymodel)); + // Set new animation if requested + if (menumodel->newanimnum && menumodel->curanimnum != menumodel->newanimnum) { + if (menumodel->reverseanim) { + modelSetAnimation(&menumodel->bodymodel, menumodel->newanimnum, false, 0, PALUPF(-0.5f), 0.0f); + modelSetAnimFrame(&menumodel->bodymodel, modelGetNumAnimFrames(&menumodel->bodymodel)); } else { - modelSetAnimation(&thing->bodymodel, thing->unk05c, false, 0, PALUPF(0.5f), 0.0f); + modelSetAnimation(&menumodel->bodymodel, menumodel->newanimnum, false, 0, PALUPF(0.5f), 0.0f); } - thing->unk05e = thing->unk05c; + menumodel->curanimnum = menumodel->newanimnum; } - thing->unk05c = 0; + menumodel->newanimnum = 0; - if (thing->unk05e != 0) { - f32 sp178; + // Tick the animation, if any + if (menumodel->curanimnum != 0) { + f32 frame; u32 stack; - modelTickAnimQuarterSpeed(&thing->bodymodel, g_Vars.diffframe240, true); + modelTickAnimQuarterSpeed(&menumodel->bodymodel, g_Vars.diffframe240, true); - if (thing->unk5b1_04) { - sp178 = modelGetNumAnimFrames(&thing->bodymodel) - modelGetCurAnimFrame(&thing->bodymodel); + if (menumodel->reverseanim) { + frame = modelGetNumAnimFrames(&menumodel->bodymodel) - modelGetCurAnimFrame(&menumodel->bodymodel); } else { - sp178 = modelGetCurAnimFrame(&thing->bodymodel); + frame = modelGetCurAnimFrame(&menumodel->bodymodel); } - if (sp178 >= modelGetNumAnimFrames(&thing->bodymodel) - 1) { - thing->unk05e = 0; + if (frame >= modelGetNumAnimFrames(&menumodel->bodymodel) - 1) { + menumodel->curanimnum = 0; } } - mtx4Copy(&thing->unk014, sp3b4); + mtx4Copy(&menumodel->mtx, matrices); - renderdata.unk00 = &thing->unk014; - renderdata.unk10 = thing->bodymodel.matrices; - modelSetMatricesWithAnim(&renderdata, &thing->bodymodel); + renderdata.unk00 = &menumodel->mtx; + renderdata.unk10 = menumodel->bodymodel.matrices; - if (thing->bodymodeldef->skel == &g_SkelHudPiece) { - struct modelnode *node = modelGetPart(thing->bodymodeldef, MODELPART_HUDPIECE_0000); + modelSetMatricesWithAnim(&renderdata, &menumodel->bodymodel); + + if (menumodel->bodymodeldef->skel == &g_SkelHudPiece) { + // Update the hudpiece's liquid texture + struct modelnode *node = modelGetPart(menumodel->bodymodeldef, MODELPART_HUDPIECE_0000); if (node) { struct modelrodata_gundl *rodata = &node->rodata->gundl; @@ -2272,44 +2268,46 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) } } - node = modelGetPart(thing->bodymodeldef, MODELPART_HUDPIECE_0002); + // Rotate the hudpiece's rotor thing + node = modelGetPart(menumodel->bodymodeldef, MODELPART_HUDPIECE_0002); if (node) { - s32 sp160; + s32 mtxindex = modelFindNodeMtxIndex(node, 0); Mtxf sp120; Mtxf spe0; - sp160 = modelFindNodeMtxIndex(node, 0); + mtx4LoadIdentity(&sp120); mtx4LoadXRotation(menuGetCosOscFrac(4), &sp120); - mtx4MultMtx4((Mtxf *)((uintptr_t)sp3b4 + sp160 * sizeof(Mtxf)), &sp120, &spe0); - mtx4Copy(&spe0, (Mtxf *)((uintptr_t)sp3b4 + sp160 * sizeof(Mtxf))); + mtx4MultMtx4((Mtxf *)((uintptr_t)matrices + mtxindex * sizeof(Mtxf)), &sp120, &spe0); + mtx4Copy(&spe0, (Mtxf *)((uintptr_t)matrices + mtxindex * sizeof(Mtxf))); } - node = modelGetPart(thing->bodymodeldef, MODELPART_HUDPIECE_0001); + // Make the menu projection lines come from the hudpiece eye + node = modelGetPart(menumodel->bodymodeldef, MODELPART_HUDPIECE_0001); if (node) { if (g_MenuData.root == MENUROOT_MAINMENU || g_MenuData.root == MENUROOT_FILEMGR || g_MenuData.root == MENUROOT_MPSETUP || g_MenuData.root == MENUROOT_TRAINING) { - s32 index = modelFindNodeMtxIndex(node, 0); - struct coord spd0; - f32 spc8[2]; + s32 mtxindex = modelFindNodeMtxIndex(node, 0); + struct coord pos; + f32 screenpos[2]; - spd0.x = sp3b4[index].m[3][0]; - spd0.y = sp3b4[index].m[3][1]; - spd0.z = sp3b4[index].m[3][2]; + pos.x = matrices[mtxindex].m[3][0]; + pos.y = matrices[mtxindex].m[3][1]; + pos.z = matrices[mtxindex].m[3][2]; - cam0f0b4d04(&spd0, spc8); - var8009de98 = ((s32)spc8[0] - viGetWidth() / 2) / g_ScaleX; - var8009de9c = (s32)spc8[1] - viGetHeight() / 2; + cam0f0b4d04(&pos, screenpos); + + g_MenuProjectFromX = ((s32)screenpos[0] - viGetWidth() / 2) / g_ScaleX; + g_MenuProjectFromY = (s32)screenpos[1] - viGetHeight() / 2; } } } gSPSetLights1(gdl++, var80071468); - gSPLookAtX(gdl++, &camGetLookAt()->l[0]); - gSPLookAtY(gdl++, &camGetLookAt()->l[1]); + gSPLookAt(gdl++, camGetLookAt()); renderdata.unk30 = 1; renderdata.envcolour = 0xffffffff; @@ -2319,21 +2317,22 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) renderdata.gdl = gdl; renderdata.zbufferenabled = true; - modelRender(&renderdata, &thing->bodymodel); + + modelRender(&renderdata, &menumodel->bodymodel); gdl = renderdata.gdl; mtx00016760(); - for (i = 0; i < thing->bodymodeldef->nummatrices; i++) { + for (i = 0; i < menumodel->bodymodeldef->nummatrices; i++) { Mtxf sp70; - mtx4Copy((Mtxf *)((uintptr_t)thing->bodymodel.matrices + i * sizeof(Mtxf)), &sp70); - mtxF2L(&sp70, &thing->bodymodel.matrices[i]); + mtx4Copy((Mtxf *)((uintptr_t)menumodel->bodymodel.matrices + i * sizeof(Mtxf)), &sp70); + mtxF2L(&sp70, &menumodel->bodymodel.matrices[i]); } mtx00016784(); - if (arg2 < 3) { + if (modeltype < MENUMODELTYPE_3) { gdl = func0f0d479c(gdl); } @@ -2491,9 +2490,9 @@ Gfx *dialogRender(Gfx *gdl, struct menudialog *dialog, struct menu *menu, bool l if (g_Menus[g_MpPlayerNum].curdialog == dialog && (dialog->definition->flags & MENUDIALOGFLAG_0002) && !lightweight - && g_Menus[g_MpPlayerNum].unk840.unk5b1_07 == 1) { + && g_Menus[g_MpPlayerNum].menumodel.drawbehinddialog == true) { gSPSetGeometryMode(gdl++, G_ZBUFFER); - gdl = menuRenderModels(gdl, &g_Menus[g_MpPlayerNum].unk840, 2); + gdl = menuRenderModel(gdl, &g_Menus[g_MpPlayerNum].menumodel, MENUMODELTYPE_2); gSPClearGeometryMode(gdl++, G_ZBUFFER); } @@ -2729,10 +2728,10 @@ Gfx *dialogRender(Gfx *gdl, struct menudialog *dialog, struct menu *menu, bool l if (g_Menus[g_MpPlayerNum].curdialog == dialog && (dialog->definition->flags & MENUDIALOGFLAG_0002) && !lightweight - && !g_Menus[g_MpPlayerNum].unk840.unk5b1_07) { + && !g_Menus[g_MpPlayerNum].menumodel.drawbehinddialog) { gSPSetGeometryMode(gdl++, G_ZBUFFER); - gdl = menuRenderModels(gdl, &g_Menus[g_MpPlayerNum].unk840, 0); + gdl = menuRenderModel(gdl, &g_Menus[g_MpPlayerNum].menumodel, MENUMODELTYPE_DEFAULT); gSPClearGeometryMode(gdl++, G_ZBUFFER); @@ -3509,7 +3508,7 @@ void menuPushRootDialog(struct menudialogdef *dialogdef, s32 root) || root == MENUROOT_MPSETUP || root == MENUROOT_TRAINING || root == MENUROOT_FILEMGR) { - if (IS8MB() && (g_MenuData.unk5d4 == 0 || g_MenuData.unk01c.unk5b1_04)) { + if (IS8MB() && (g_MenuData.unk5d4 == 0 || g_MenuData.hudpiece.reverseanim)) { if (!g_MenuData.unk5d5_04) { g_MenuData.unk5d5_05 = true; } @@ -3599,8 +3598,8 @@ Gfx *menuRenderDialogs(Gfx *gdl) if (g_MenuData.root == MENUROOT_MPPAUSE || g_MenuData.root == MENUROOT_PICKTARGET || g_MenuData.root == MENUROOT_MPENDSCREEN) { - var8009de98 = g_Menus[g_MpPlayerNum].curdialog->x + g_Menus[g_MpPlayerNum].curdialog->width / 2 - viGetWidth() / (g_ScaleX * 2); - var8009de9c = g_Menus[g_MpPlayerNum].curdialog->y + g_Menus[g_MpPlayerNum].curdialog->height / 2 - viGetHeight() / 2; + g_MenuProjectFromX = g_Menus[g_MpPlayerNum].curdialog->x + g_Menus[g_MpPlayerNum].curdialog->width / 2 - viGetWidth() / (g_ScaleX * 2); + g_MenuProjectFromY = g_Menus[g_MpPlayerNum].curdialog->y + g_Menus[g_MpPlayerNum].curdialog->height / 2 - viGetHeight() / 2; gdl = menuRenderDialog(gdl, g_Menus[g_MpPlayerNum].curdialog, &g_Menus[g_MpPlayerNum], 0); } else { @@ -3686,40 +3685,36 @@ Gfx *menuRenderDialogs(Gfx *gdl) u32 var800714e8 = 0; -void func0f0f8bb4(struct menu840 *arg0, u32 arg1, u32 arg2) +void menuResetModel(struct menumodel *menumodel, u32 allocationlen, bool allocate) { - arg0->unk008 = arg1; - arg0->unk004 = arg2 ? mempAlloc(arg1, MEMPOOL_STAGE) : NULL; - arg0->unk54c = 0.0f; - arg0->unk000 = 0; - arg0->unk00c = 0xffff; - arg0->bodymodeldef = NULL; - arg0->unk010 = 0; - arg0->unk56c = 0; - arg0->unk570 = 0; - arg0->partvisibility = NULL; - arg0->unk5b1_01 = false; - arg0->unk5b1_02 = false; - arg0->unk5b1_04 = false; - arg0->unk5b1_06 = false; - arg0->headnum = -1; - arg0->bodynum = -1; - arg0->unk538 = 0.0f; - arg0->unk510 = 0.0f; - arg0->unk53c = 0.0f; - arg0->unk514 = 0.0f; - arg0->unk540 = 0.0f; - arg0->unk518 = 0.0f; - arg0->unk544 = 0.0f; - arg0->unk51c = 0.0f; - arg0->unk548 = 0.0f; - arg0->unk520 = 0.0f; - arg0->unk550 = 0.0f; - arg0->unk528 = 0.0f; - arg0->unk534 = 0.0f; - arg0->unk530 = 0.0f; - arg0->unk52c = 0.0f; - arg0->unk524 = arg0->unk54c; + menumodel->alloclen = allocationlen; + menumodel->allocstart = allocate ? mempAlloc(allocationlen, MEMPOOL_STAGE) : NULL; + menumodel->loaddelay = 0; + menumodel->newparams = MENUMODELPARAMS_SET_FILENUM(0xffff); + menumodel->bodymodeldef = NULL; + menumodel->curparams = 0; + + menumodel->curposx = menumodel->newposx = 0.0f; + menumodel->curposy = menumodel->newposy = 0.0f; + menumodel->curposz = menumodel->newposz = 0.0f; + + menumodel->curscale = menumodel->newscale = 0.0f; + + menumodel->currotx = menumodel->newrotx = 0.0f; + menumodel->curroty = menumodel->newroty = 0.0f; + menumodel->currotz = menumodel->newrotz = 0.0f; + + menumodel->displacex = menumodel->displacey = menumodel->displacez = 0.0f; + + menumodel->unk56c = 0; + menumodel->unk570 = 0; + menumodel->partvisibility = NULL; + menumodel->isperfecthead = false; + menumodel->unk5b1_02 = false; + menumodel->reverseanim = false; + menumodel->unk5b1_06 = false; + menumodel->headnum = -1; + menumodel->bodynum = -1; } void menuReset(void) @@ -3759,10 +3754,10 @@ void menuReset(void) } for (i = 0; i < ARRAYCOUNT(g_Menus); i++) { - g_Menus[i].unk840.unk004 = NULL; + g_Menus[i].menumodel.allocstart = NULL; } - g_MenuData.unk01c.unk004 = NULL; + g_MenuData.hudpiece.allocstart = NULL; if (g_Vars.stagenum == STAGE_CITRAINING) { g_MissionConfig.iscoop = false; @@ -3782,24 +3777,24 @@ void menuReset(void) } for (i = 0; i < max; i++) { - func0f0f8bb4(&g_Menus[i].unk840, IS4MB() ? 0xb400 : 0x25800, 1); + menuResetModel(&g_Menus[i].menumodel, IS4MB() ? 0xb400 : 0x25800, true); } if (IS8MB()) { - func0f0f8bb4(&g_MenuData.unk01c, 0xc800, 1); + menuResetModel(&g_MenuData.hudpiece, 0xc800, true); } - g_MenuData.unk01c.unk00c = FILE_GHUDPIECE; - g_MenuData.unk01c.unk524 = g_MenuData.unk01c.unk54c = -M_PI; - g_MenuData.unk01c.unk520 = g_MenuData.unk01c.unk548 = 0; - g_MenuData.unk01c.unk528 = g_MenuData.unk01c.unk550 = 0; - g_MenuData.unk01c.unk510 = g_MenuData.unk01c.unk538 = -205.5f; - g_MenuData.unk01c.unk514 = g_MenuData.unk01c.unk53c = 244.7f; - g_MenuData.unk01c.unk518 = g_MenuData.unk01c.unk540 = 68.3f; - g_MenuData.unk01c.unk51c = g_MenuData.unk01c.unk544 = 0.12209f; - g_MenuData.unk01c.unk5b1_01 = false; - g_MenuData.unk01c.unk574 = 0; - g_MenuData.unk01c.unk580 = 0; + g_MenuData.hudpiece.newparams = MENUMODELPARAMS_SET_FILENUM(FILE_GHUDPIECE); + g_MenuData.hudpiece.curroty = g_MenuData.hudpiece.newroty = -M_PI; + g_MenuData.hudpiece.currotx = g_MenuData.hudpiece.newrotx = 0; + g_MenuData.hudpiece.currotz = g_MenuData.hudpiece.newrotz = 0; + g_MenuData.hudpiece.curposx = g_MenuData.hudpiece.newposx = -205.5f; + g_MenuData.hudpiece.curposy = g_MenuData.hudpiece.newposy = 244.7f; + g_MenuData.hudpiece.curposz = g_MenuData.hudpiece.newposz = 68.3f; + g_MenuData.hudpiece.curscale = g_MenuData.hudpiece.newscale = 0.12209f; + g_MenuData.hudpiece.isperfecthead = false; + g_MenuData.hudpiece.zoomtimer60 = 0; + g_MenuData.hudpiece.removingpiece = false; } g_MenuData.unk5d4 = 0; @@ -3894,7 +3889,7 @@ void menuSwipe(s32 direction) g_Menus[g_MpPlayerNum].curdialog->state = MENUDIALOGSTATE_PREOPEN; g_Menus[g_MpPlayerNum].curdialog->statefrac = 0.0f; - func0f0f37a4(&g_Menus[g_MpPlayerNum].unk840); + menuUnsetModel(&g_Menus[g_MpPlayerNum].menumodel); menuPlaySound(MENUSOUND_SWIPE); } @@ -5186,10 +5181,10 @@ Gfx *menuRender(Gfx *gdl) // Calculate hudpiece things then render it if (g_MenuData.unk5d5_05) { - g_MenuData.unk01c.unk05e = 0; - g_MenuData.unk01c.unk05c = 0x40d; - g_MenuData.unk01c.unk580 = 0; - g_MenuData.unk01c.unk5b1_04 = false; + g_MenuData.hudpiece.curanimnum = 0; + g_MenuData.hudpiece.newanimnum = ANIM_040D; + g_MenuData.hudpiece.removingpiece = false; + g_MenuData.hudpiece.reverseanim = false; g_MenuData.unk5d4 = 1; g_MenuData.unk5d5_05 = false; } @@ -5202,11 +5197,11 @@ Gfx *menuRender(Gfx *gdl) // Everyone 1 in 100 frames on average, calculate a new X/Y for the hudpiece // Note: unintentional 64-bit float comparison done here if (RANDOMFRAC() < 0.01) { - g_MenuData.unk01c.unk538 = RANDOMFRAC() * 80.0f + -205.5f - 40.0f; - g_MenuData.unk01c.unk53c = RANDOMFRAC() * 80.0f + 244.7f - 40.0f; + g_MenuData.hudpiece.newposx = RANDOMFRAC() * 80.0f + -205.5f - 40.0f; + g_MenuData.hudpiece.newposy = RANDOMFRAC() * 80.0f + 244.7f - 40.0f; } - var8009de98 = var8009de9c = 0; + g_MenuProjectFromX = g_MenuProjectFromY = 0; if (g_MenuData.root == MENUROOT_MPSETUP) { if (g_MenuData.count <= 0) { @@ -5234,13 +5229,13 @@ Gfx *menuRender(Gfx *gdl) } if (removepiece) { - if (g_MenuData.unk01c.unk580 == 0) { - g_MenuData.unk01c.unk5b1_04 = true; - g_MenuData.unk01c.unk05e = 0; - g_MenuData.unk01c.unk05c = 0x40d; - g_MenuData.unk01c.unk580 = 1; - } else if (g_MenuData.unk01c.unk05e == 0) { - g_MenuData.unk01c.unk580 = 0; + if (!g_MenuData.hudpiece.removingpiece) { + g_MenuData.hudpiece.reverseanim = true; + g_MenuData.hudpiece.curanimnum = 0; + g_MenuData.hudpiece.newanimnum = ANIM_040D; + g_MenuData.hudpiece.removingpiece = true; + } else if (g_MenuData.hudpiece.curanimnum == 0) { + g_MenuData.hudpiece.removingpiece = false; g_MenuData.unk5d4 = 0; } } @@ -5248,20 +5243,20 @@ Gfx *menuRender(Gfx *gdl) mainOverrideVariable("usePiece", &usepiece); if (usepiece) { - g_MenuData.unk5d5_03 = false; + g_MenuData.usezbuf = false; - gdl = menuRenderModels(gdl, &g_MenuData.unk01c, 1); + gdl = menuRenderModel(gdl, &g_MenuData.hudpiece, MENUMODELTYPE_HUDPIECE); gSPClearGeometryMode(gdl++, G_ZBUFFER); - g_MenuData.unk5d5_03 = true; + g_MenuData.usezbuf = true; } } else { - var8009de98 = var8009de9c = 0; + g_MenuProjectFromX = g_MenuProjectFromY = 0; } if (g_MenuData.unk5d5_04) { - var8009de98 = g_MenuData.unk670; - var8009de9c = g_MenuData.unk674; + g_MenuProjectFromX = g_MenuData.unk670; + g_MenuProjectFromY = g_MenuData.unk674; } // Render the second layer of the background (for the combat simulator cone, diff --git a/src/game/menugfx.c b/src/game/menugfx.c index a0e4b1bd4..636289cd5 100644 --- a/src/game/menugfx.c +++ b/src/game/menugfx.c @@ -1401,7 +1401,7 @@ Gfx *menugfxRenderBgFailure(Gfx *gdl) spb4 = M_TAU * g_20SecIntervalFrac; - var8009de98 = var8009de9c = 0; + g_MenuProjectFromX = g_MenuProjectFromY = 0; gdl = func0f0d4a3c(gdl, 0); @@ -1578,8 +1578,8 @@ Gfx *menugfxRenderBgCone(Gfx *gdl) */ Gfx *func0f0e458c(Gfx *gdl) { - var8009de98 = 0; - var8009de9c = -20 - viGetHeight() / 2; + g_MenuProjectFromX = 0; + g_MenuProjectFromY = -20 - viGetHeight() / 2; gdl = func0f0d4a3c(gdl, 0); @@ -1590,15 +1590,15 @@ Gfx *func0f0e458c(Gfx *gdl) gdl = menugfxDrawPlane(gdl, -1000, viGetHeight() + 10, 2000, viGetHeight() + 10, 0xffff00af, 0xffff00af, MENUPLANE_05); gdl = func0f0d4c80(gdl); - var8009de98 = var8009de9c = 0; + g_MenuProjectFromX = g_MenuProjectFromY = 0; return gdl; } Gfx *func0f0e46b0(Gfx *gdl, f32 arg1) { - s32 y1 = (var8009de9c + 120) + arg1 * (0.0f - (var8009de9c + 120)); - s32 y2 = (var8009de9c + 120) + arg1 * (240.0f - (var8009de9c + 120)); + s32 y1 = (g_MenuProjectFromY + 120) + arg1 * (0.0f - (g_MenuProjectFromY + 120)); + s32 y2 = (g_MenuProjectFromY + 120) + arg1 * (240.0f - (g_MenuProjectFromY + 120)); gdl = func0f0d4a3c(gdl, 0); @@ -1634,7 +1634,7 @@ Gfx *menugfxRenderBgFailureCopy(Gfx *gdl) spb4 = M_TAU * g_20SecIntervalFrac; - var8009de98 = var8009de9c = 0; + g_MenuProjectFromX = g_MenuProjectFromY = 0; gdl = func0f0d4a3c(gdl, 0); @@ -1809,8 +1809,8 @@ Gfx *menugfxRenderBgSuccess(Gfx *gdl) f0 = menuGetLinearIntervalFrac(10.0f); // Draw the two haze layers - var8009de98 = 0; - var8009de9c = 0; + g_MenuProjectFromX = 0; + g_MenuProjectFromY = 0; gdl = func0f0d4a3c(gdl, 0); diff --git a/src/game/menuitem.c b/src/game/menuitem.c index 7fa289e9c..2bf147771 100644 --- a/src/game/menuitem.c +++ b/src/game/menuitem.c @@ -2748,8 +2748,8 @@ char *menuitemScrollableGetText(u32 type) return challengeGetConfigDescription(g_Menus[g_MpPlayerNum].training.mpconfig); case DESCRIPTION_MPCHALLENGE: if (!challengeIsLoaded()) { - g_Menus[g_MpPlayerNum].unk840.unk010 = 0x4fac5ace; - challengeLoadAndStoreCurrent(g_Menus[g_MpPlayerNum].unk840.unk004, g_Menus[g_MpPlayerNum].unk840.unk008); + g_Menus[g_MpPlayerNum].menumodel.curparams = 0x4fac5ace; + challengeLoadAndStoreCurrent(g_Menus[g_MpPlayerNum].menumodel.allocstart, g_Menus[g_MpPlayerNum].menumodel.alloclen); } return challengeGetCurrentDescription(); case DESCRIPTION_CHRBIO: return ciGetChrBioDescription(); diff --git a/src/game/menutick.c b/src/game/menutick.c index f1e713d35..e6fefe0d3 100644 --- a/src/game/menutick.c +++ b/src/game/menutick.c @@ -690,9 +690,9 @@ void menuTick(void) if (g_Vars.currentplayer->gunctrl.gunmemowner == GUNMEMOWNER_INVMENU && g_Vars.stagenum != STAGE_CITRAINING) { g_MenuData.unk5d5_01 = true; - if (g_Menus[0].unk840.unk004) { + if (g_Menus[0].menumodel.allocstart) { bgunFreeGunMem(); - g_Menus[0].unk840.unk004 = NULL; + g_Menus[0].menumodel.allocstart = NULL; } } } diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index 7656332f4..915f09fe5 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -550,35 +550,35 @@ MenuItemHandlerResult func0f179d6c(s32 operation, struct menuitem *item, union h /** * This function is used by both player body selection and bot body selection. */ -MenuItemHandlerResult mpCharacterBodyMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data, s32 mpheadnum, s32 mpbodynum, bool isplayer) +MenuItemHandlerResult mpCharacterBodyMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data, s32 mpbodynum, s32 mpheadnum, bool isplayer) { switch (operation) { case MENUOP_GETOPTIONCOUNT: data->carousel.value = mpGetNumBodies(); break; case MENUOP_11: - g_Menus[g_MpPlayerNum].unk840.unk05c = 0x1fc; - g_Menus[g_MpPlayerNum].unk840.unk00c = mpbodynum << 16 | 0xffff | mpheadnum << 24; - g_Menus[g_MpPlayerNum].unk840.unk574 += g_Vars.diffframe60; + g_Menus[g_MpPlayerNum].menumodel.newanimnum = ANIM_01FC; + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_MP_HEADBODY(mpheadnum, mpbodynum); + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 += g_Vars.diffframe60; - if (g_Menus[g_MpPlayerNum].unk840.unk574 > TICKS(480)) { - g_Menus[g_MpPlayerNum].unk840.unk574 -= TICKS(480); + if (g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 > TICKS(480)) { + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 -= TICKS(480); } - if (g_Menus[g_MpPlayerNum].unk840.unk578 > 0) { - g_Menus[g_MpPlayerNum].unk840.unk578 -= g_Vars.diffframe60; + if (g_Menus[g_MpPlayerNum].menumodel.rottimer60 > 0) { + g_Menus[g_MpPlayerNum].menumodel.rottimer60 -= g_Vars.diffframe60; } else { #if VERSION >= VERSION_PAL_BETA - f32 value = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60freal; + f32 value = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60freal; #else - f32 value = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60f; + f32 value = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60f; #endif - g_Menus[g_MpPlayerNum].unk840.unk54c = value; - g_Menus[g_MpPlayerNum].unk840.unk524 = value; + g_Menus[g_MpPlayerNum].menumodel.newroty = value; + g_Menus[g_MpPlayerNum].menumodel.curroty = value; } - g_Menus[g_MpPlayerNum].unk840.partvisibility = NULL; - g_Menus[g_MpPlayerNum].unk840.unk554 = 30; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = NULL; + g_Menus[g_MpPlayerNum].menumodel.zoom = 30; break; case MENUOP_21: if (!challengeIsFeatureUnlocked(mpGetBodyRequiredFeature(data->carousel.value))) { @@ -587,34 +587,36 @@ MenuItemHandlerResult mpCharacterBodyMenuHandler(s32 operation, struct menuitem break; #if VERSION >= VERSION_NTSC_1_0 case MENUOP_FOCUS: - g_Menus[g_MpPlayerNum].unk840.unk000 = 3; + g_Menus[g_MpPlayerNum].menumodel.loaddelay = 3; break; #endif case MENUOP_GETSELECTEDINDEX: - data->carousel.value = mpheadnum; + data->carousel.value = mpbodynum; break; case MENUOP_SET: case MENUOP_CHECKPREFOCUSED: - g_Menus[g_MpPlayerNum].unk840.unk580 = 0; + g_Menus[g_MpPlayerNum].menumodel.removingpiece = false; - func0f0f372c(&g_Menus[g_MpPlayerNum].unk840, 0, 0, 0, 0, 0, 0, 1, 1); + menuConfigureModel(&g_Menus[g_MpPlayerNum].menumodel, 0, 0, 0, 0, 0, 0, 1, MENUMODELFLAG_HASSCALE); - g_Menus[g_MpPlayerNum].unk840.unk510 = 8.2f; - g_Menus[g_MpPlayerNum].unk840.unk514 = -4.1f; - g_Menus[g_MpPlayerNum].unk840.unk53c = -4.1f; + g_Menus[g_MpPlayerNum].menumodel.curposx = 8.2f; + g_Menus[g_MpPlayerNum].menumodel.newposx = 8.2f; - g_Menus[g_MpPlayerNum].unk840.unk538 = 8.2f; - g_Menus[g_MpPlayerNum].unk840.unk51c = 0.002f; - g_Menus[g_MpPlayerNum].unk840.unk524 = -0.2f; - g_Menus[g_MpPlayerNum].unk840.unk54c = -0.2f; + g_Menus[g_MpPlayerNum].menumodel.curposy = -4.1f; + g_Menus[g_MpPlayerNum].menumodel.newposy = -4.1f; - g_Menus[g_MpPlayerNum].unk840.unk578 = TICKS(60); - g_Menus[g_MpPlayerNum].unk840.unk574 = TICKS(120); - g_Menus[g_MpPlayerNum].unk840.unk000 = 8; + g_Menus[g_MpPlayerNum].menumodel.curscale = 0.002f; + + g_Menus[g_MpPlayerNum].menumodel.curroty = -0.2f; + g_Menus[g_MpPlayerNum].menumodel.newroty = -0.2f; + + g_Menus[g_MpPlayerNum].menumodel.rottimer60 = TICKS(60); + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 = TICKS(120); + g_Menus[g_MpPlayerNum].menumodel.loaddelay = 8; #if VERSION >= VERSION_NTSC_1_0 if (operation == MENUOP_CHECKPREFOCUSED) { - g_Menus[g_MpPlayerNum].unk840.unk000 = 16; + g_Menus[g_MpPlayerNum].menumodel.loaddelay = 16; } #endif @@ -1879,30 +1881,30 @@ MenuItemHandlerResult mpCharacterHeadMenuHandler(s32 operation, struct menuitem break; case MENUOP_11: #if VERSION >= VERSION_PAL_BETA - diffframe = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60freal; + diffframe = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60freal; #else - diffframe = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60f; + diffframe = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60f; #endif - g_Menus[g_MpPlayerNum].unk840.unk54c = diffframe; - g_Menus[g_MpPlayerNum].unk840.unk524 = diffframe; + g_Menus[g_MpPlayerNum].menumodel.newroty = diffframe; + g_Menus[g_MpPlayerNum].menumodel.curroty = diffframe; if (mpheadnum < mpGetNumHeads2()) { headnum = mpGetHeadId(mpheadnum); - g_Menus[g_MpPlayerNum].unk840.unk00c = g_HeadsAndBodies[headnum].filenum; - g_Menus[g_MpPlayerNum].unk840.unk5b1_01 = false; + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_FILENUM(g_HeadsAndBodies[headnum].filenum); + g_Menus[g_MpPlayerNum].menumodel.isperfecthead = false; } else { headnum = mpGetBeauHeadId(func0f14a9f8(mpheadnum - mpGetNumHeads2())); - g_Menus[g_MpPlayerNum].unk840.unk00c = g_HeadsAndBodies[headnum].filenum; - g_Menus[g_MpPlayerNum].unk840.unk5b1_01 = true; - g_Menus[g_MpPlayerNum].unk840.unk5b0 = mpheadnum - mpGetNumHeads2(); + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_FILENUM(g_HeadsAndBodies[headnum].filenum); + g_Menus[g_MpPlayerNum].menumodel.isperfecthead = true; + g_Menus[g_MpPlayerNum].menumodel.perfectheadnum = mpheadnum - mpGetNumHeads2(); } - g_Menus[g_MpPlayerNum].unk840.unk574 = 0; - g_Menus[g_MpPlayerNum].unk840.partvisibility = visibility; - g_Menus[g_MpPlayerNum].unk840.unk554 = 30; + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 = 0; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = visibility; + g_Menus[g_MpPlayerNum].menumodel.zoom = 30; break; case MENUOP_21: if (!challengeIsFeatureUnlocked(mpGetHeadRequiredFeature(data->carousel.value))) { @@ -1915,22 +1917,26 @@ MenuItemHandlerResult mpCharacterHeadMenuHandler(s32 operation, struct menuitem case MENUOP_SET: case MENUOP_FOCUS: #if VERSION >= VERSION_NTSC_1_0 - g_Menus[g_MpPlayerNum].unk840.unk000 = 3; + g_Menus[g_MpPlayerNum].menumodel.loaddelay = 3; #endif mpGetNumHeads2(); - func0f0f372c(&g_Menus[g_MpPlayerNum].unk840, 0, 0, 0, 0, 0, 0, 1, 1); + menuConfigureModel(&g_Menus[g_MpPlayerNum].menumodel, 0, 0, 0, 0, 0, 0, 1, MENUMODELFLAG_HASSCALE); - g_Menus[g_MpPlayerNum].unk840.unk510 = 0; - g_Menus[g_MpPlayerNum].unk840.unk514 = 0; - g_Menus[g_MpPlayerNum].unk840.unk53c = -3; - g_Menus[g_MpPlayerNum].unk840.unk538 = 0; - g_Menus[g_MpPlayerNum].unk840.unk51c = 0.01f; - g_Menus[g_MpPlayerNum].unk840.unk524 = -0.3f; - g_Menus[g_MpPlayerNum].unk840.unk54c = -0.3f; - g_Menus[g_MpPlayerNum].unk840.unk544 = 1; - g_Menus[g_MpPlayerNum].unk840.unk554 = 30; + g_Menus[g_MpPlayerNum].menumodel.curposx = 0; + g_Menus[g_MpPlayerNum].menumodel.curposy = 0; + + g_Menus[g_MpPlayerNum].menumodel.newposx = 0; + g_Menus[g_MpPlayerNum].menumodel.newposy = -3; + + g_Menus[g_MpPlayerNum].menumodel.curscale = 0.01f; + + g_Menus[g_MpPlayerNum].menumodel.curroty = -0.3f; + g_Menus[g_MpPlayerNum].menumodel.newroty = -0.3f; + + g_Menus[g_MpPlayerNum].menumodel.newscale = 1; + g_Menus[g_MpPlayerNum].menumodel.zoom = 30; break; } @@ -4051,12 +4057,12 @@ MenuDialogHandlerResult menudialog0017e3fc(s32 operation, struct menudialogdef * { switch (operation) { case MENUOP_OPEN: - g_Menus[g_MpPlayerNum].unk840.unk010 = 0; + g_Menus[g_MpPlayerNum].menumodel.curparams = 0; g_Menus[g_MpPlayerNum].training.mpconfig = challengeLoadBySlot( g_Menus[g_MpPlayerNum].training.unke1c, - g_Menus[g_MpPlayerNum].unk840.unk004, - g_Menus[g_MpPlayerNum].unk840.unk008); + g_Menus[g_MpPlayerNum].menumodel.allocstart, + g_Menus[g_MpPlayerNum].menumodel.alloclen); break; case MENUOP_CLOSE: break; @@ -4628,16 +4634,16 @@ MenuDialogHandlerResult mpCombatChallengesMenuDialog(s32 operation, struct menud && g_Menus[g_MpPlayerNum].curdialog && g_Menus[g_MpPlayerNum].curdialog->definition == dialogdef && !challengeIsLoaded()) { - g_Menus[g_MpPlayerNum].unk840.unk010 = 0x4fac5ace; + g_Menus[g_MpPlayerNum].menumodel.curparams = 0x4fac5ace; challengeLoadAndStoreCurrent( - g_Menus[g_MpPlayerNum].unk840.unk004, - g_Menus[g_MpPlayerNum].unk840.unk008); + g_Menus[g_MpPlayerNum].menumodel.allocstart, + g_Menus[g_MpPlayerNum].menumodel.alloclen); } } if (operation == MENUOP_CLOSE) { - if (g_Menus[g_MpPlayerNum].unk840.unk010 == 0x4fac5ace) { + if (g_Menus[g_MpPlayerNum].menumodel.curparams == 0x4fac5ace) { challengeUnsetCurrent(); } } diff --git a/src/game/savebuffer.c b/src/game/savebuffer.c index d7ee77cca..b7fb2aef3 100644 --- a/src/game/savebuffer.c +++ b/src/game/savebuffer.c @@ -21,8 +21,8 @@ Vp var80070f10; s32 var8009de90; s32 var8009de94; -s32 var8009de98; -s32 var8009de9c; +s32 g_MenuProjectFromX; +s32 g_MenuProjectFromY; void func0f0d4690(Mtxf *mtx) { @@ -317,8 +317,8 @@ Gfx *menugfxDrawPlane(Gfx *gdl, s32 x1, s32 y1, s32 x2, s32 y2, u32 colour1, u32 vertices[1].y = y2; vertices[1].z = -10; - tmp1 = (f32) var8009de98 * a1 / scale; - tmp2 = (f32) var8009de9c * a1 / scale; + tmp1 = (f32) g_MenuProjectFromX * a1 / scale; + tmp2 = (f32) g_MenuProjectFromY * a1 / scale; vertices[2].x = vertices[0].v[0] + (s16) tmp1; vertices[2].y = vertices[0].v[1] + (s16) tmp2; diff --git a/src/game/trainingmenus.c b/src/game/trainingmenus.c index 53ba1232f..db90ba2a8 100644 --- a/src/game/trainingmenus.c +++ b/src/game/trainingmenus.c @@ -229,11 +229,9 @@ MenuDialogHandlerResult frTrainingInfoMenuDialog(s32 operation, struct menudialo break; case MENUOP_TICK: if (g_Menus[g_MpPlayerNum].curdialog && g_Menus[g_MpPlayerNum].curdialog->definition == dialogdef) { - g_Menus[g_MpPlayerNum].unk840.unk574 -= g_Vars.diffframe60; - g_Menus[g_MpPlayerNum].unk840.unk54c = 18.849555969238f * g_20SecIntervalFrac; - g_Menus[g_MpPlayerNum].unk840.unk524 = 18.849555969238f * g_20SecIntervalFrac; - g_Menus[g_MpPlayerNum].unk840.unk528 = 0; - g_Menus[g_MpPlayerNum].unk840.unk550 = 0; + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 -= g_Vars.diffframe60; + g_Menus[g_MpPlayerNum].menumodel.curroty = g_Menus[g_MpPlayerNum].menumodel.newroty = 18.849555969238f * g_20SecIntervalFrac; + g_Menus[g_MpPlayerNum].menumodel.currotz = g_Menus[g_MpPlayerNum].menumodel.newrotz = 0; } break; case MENUOP_CLOSE: @@ -1538,14 +1536,14 @@ MenuDialogHandlerResult ciCharacterProfileMenuDialog(s32 operation, struct menud case MENUOP_OPEN: if (bodynum == BODY_DRCAROLL) { scale = 0.7f; - g_Menus[g_MpPlayerNum].unk840.unk554 = -1; + g_Menus[g_MpPlayerNum].menumodel.zoom = -1; } else { - g_Menus[g_MpPlayerNum].unk840.unk554 = 30; + g_Menus[g_MpPlayerNum].menumodel.zoom = 30; scale = 1.0f; } - g_Menus[g_MpPlayerNum].unk840.unk574 = TICKS(120); - g_Menus[g_MpPlayerNum].unk840.unk580 = 0; + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 = TICKS(120); + g_Menus[g_MpPlayerNum].menumodel.removingpiece = false; #if VERSION == VERSION_PAL_FINAL if (g_ViRes != VIRES_HI) { @@ -1585,14 +1583,15 @@ MenuDialogHandlerResult ciCharacterProfileMenuDialog(s32 operation, struct menud scale = 0.8f; } - func0f0f372c(&g_Menus[g_MpPlayerNum].unk840, x, y, 0, 0, 0, 0, scale, 7); + menuConfigureModel(&g_Menus[g_MpPlayerNum].menumodel, x, y, 0, 0, 0, 0, scale, + MENUMODELFLAG_HASSCALE | MENUMODELFLAG_HASPOSITION | MENUMODELFLAG_HASROTATION); - g_Menus[g_MpPlayerNum].unk840.unk510 = 8.2f; - g_Menus[g_MpPlayerNum].unk840.unk514 = -4.1f; - g_Menus[g_MpPlayerNum].unk840.unk51c = 0.00393f; - g_Menus[g_MpPlayerNum].unk840.unk524 = 0; - g_Menus[g_MpPlayerNum].unk840.unk54c = 0; - g_Menus[g_MpPlayerNum].unk840.unk578 = TICKS(60); + g_Menus[g_MpPlayerNum].menumodel.curposx = 8.2f; + g_Menus[g_MpPlayerNum].menumodel.curposy = -4.1f; + g_Menus[g_MpPlayerNum].menumodel.curscale = 0.00393f; + g_Menus[g_MpPlayerNum].menumodel.curroty = 0; + g_Menus[g_MpPlayerNum].menumodel.newroty = 0; + g_Menus[g_MpPlayerNum].menumodel.rottimer60 = TICKS(60); break; case MENUOP_CLOSE: break; @@ -1612,10 +1611,10 @@ MenuDialogHandlerResult ciCharacterProfileMenuDialog(s32 operation, struct menud { 255 }, }; - g_Menus[g_MpPlayerNum].unk840.partvisibility = vis; - g_Menus[g_MpPlayerNum].unk840.unk05c = 318; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = vis; + g_Menus[g_MpPlayerNum].menumodel.newanimnum = ANIM_013E; } else { - g_Menus[g_MpPlayerNum].unk840.unk05c = 106; + g_Menus[g_MpPlayerNum].menumodel.newanimnum = ANIM_006A; } if (bodynum == BODY_THEKING) { @@ -1624,23 +1623,21 @@ MenuDialogHandlerResult ciCharacterProfileMenuDialog(s32 operation, struct menud { 255 }, }; - g_Menus[g_MpPlayerNum].unk840.partvisibility = vis; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = vis; } - g_Menus[g_MpPlayerNum].unk840.unk00c = 0xffff; - g_Menus[g_MpPlayerNum].unk840.unk00c |= (mpheadnum << 16); - g_Menus[g_MpPlayerNum].unk840.unk00c |= (mpbodynum << 24); + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_MP_HEADBODY(mpheadnum, mpbodynum); - if (g_Menus[g_MpPlayerNum].unk840.unk578 > 0) { - g_Menus[g_MpPlayerNum].unk840.unk578 -= g_Vars.diffframe60; + if (g_Menus[g_MpPlayerNum].menumodel.rottimer60 > 0) { + g_Menus[g_MpPlayerNum].menumodel.rottimer60 -= g_Vars.diffframe60; } else { #if VERSION >= VERSION_PAL_BETA - f32 tmp = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60freal; + f32 roty = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60freal; #else - f32 tmp = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60f; + f32 roty = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60f; #endif - g_Menus[g_MpPlayerNum].unk840.unk54c = tmp; - g_Menus[g_MpPlayerNum].unk840.unk524 = tmp; + g_Menus[g_MpPlayerNum].menumodel.newroty = roty; + g_Menus[g_MpPlayerNum].menumodel.curroty = roty; } break; @@ -1887,58 +1884,54 @@ MenuDialogHandlerResult dtTrainingDetailsMenuDialog(s32 operation, struct menudi #if VERSION == VERSION_PAL_FINAL if (g_ViRes == VIRES_HI) { if (optionsGetScreenRatio() == SCREENRATIO_16_9) { - g_Menus[g_MpPlayerNum].unk840.unk538 = 84; - g_Menus[g_MpPlayerNum].unk840.unk510 = 84; + g_Menus[g_MpPlayerNum].menumodel.newposx = 84; + g_Menus[g_MpPlayerNum].menumodel.curposx = 84; } else { - g_Menus[g_MpPlayerNum].unk840.unk538 = 104; - g_Menus[g_MpPlayerNum].unk840.unk510 = 104; + g_Menus[g_MpPlayerNum].menumodel.newposx = 104; + g_Menus[g_MpPlayerNum].menumodel.curposx = 104; } } else { if (optionsGetScreenRatio() == SCREENRATIO_16_9) { - g_Menus[g_MpPlayerNum].unk840.unk538 = 64; - g_Menus[g_MpPlayerNum].unk840.unk510 = 64; + g_Menus[g_MpPlayerNum].menumodel.newposx = 64; + g_Menus[g_MpPlayerNum].menumodel.curposx = 64; } else { - g_Menus[g_MpPlayerNum].unk840.unk538 = 84; - g_Menus[g_MpPlayerNum].unk840.unk510 = 84; + g_Menus[g_MpPlayerNum].menumodel.newposx = 84; + g_Menus[g_MpPlayerNum].menumodel.curposx = 84; } } #elif VERSION == VERSION_PAL_BETA if (optionsGetScreenRatio() == SCREENRATIO_16_9) { - g_Menus[g_MpPlayerNum].unk840.unk538 = 64; - g_Menus[g_MpPlayerNum].unk840.unk510 = 64; + g_Menus[g_MpPlayerNum].menumodel.newposx = 64; + g_Menus[g_MpPlayerNum].menumodel.curposx = 64; } else { - g_Menus[g_MpPlayerNum].unk840.unk538 = 84; - g_Menus[g_MpPlayerNum].unk840.unk510 = 84; + g_Menus[g_MpPlayerNum].menumodel.newposx = 84; + g_Menus[g_MpPlayerNum].menumodel.curposx = 84; } #else if (optionsGetScreenRatio() == SCREENRATIO_16_9) { - g_Menus[g_MpPlayerNum].unk840.unk538 = 70; - g_Menus[g_MpPlayerNum].unk840.unk510 = 70; + g_Menus[g_MpPlayerNum].menumodel.newposx = 70; + g_Menus[g_MpPlayerNum].menumodel.curposx = 70; } else { - g_Menus[g_MpPlayerNum].unk840.unk538 = 90; - g_Menus[g_MpPlayerNum].unk840.unk510 = 90; + g_Menus[g_MpPlayerNum].menumodel.newposx = 90; + g_Menus[g_MpPlayerNum].menumodel.curposx = 90; } #endif - g_Menus[g_MpPlayerNum].unk840.unk544 /= 2.5f; + g_Menus[g_MpPlayerNum].menumodel.newscale /= 2.5f; } break; case MENUOP_CLOSE: break; case MENUOP_TICK: if (g_Menus[g_MpPlayerNum].curdialog && g_Menus[g_MpPlayerNum].curdialog->definition == dialogdef) { - s32 weaponnum = dtGetWeaponByDeviceIndex(dtGetIndexBySlot(g_DtSlot)); - - if (weaponnum == WEAPON_DISGUISE41) { - g_Menus[g_MpPlayerNum].unk840.unk05c = ANIM_006A; - g_Menus[g_MpPlayerNum].unk840.unk578 = TICKS(60); - g_Menus[g_MpPlayerNum].unk840.unk574 = TICKS(120); + if (dtGetWeaponByDeviceIndex(dtGetIndexBySlot(g_DtSlot)) == WEAPON_DISGUISE41) { + g_Menus[g_MpPlayerNum].menumodel.newanimnum = ANIM_006A; + g_Menus[g_MpPlayerNum].menumodel.rottimer60 = TICKS(60); + g_Menus[g_MpPlayerNum].menumodel.zoomtimer60 = TICKS(120); } - g_Menus[g_MpPlayerNum].unk840.unk54c = 18.849555969238f * g_20SecIntervalFrac; - g_Menus[g_MpPlayerNum].unk840.unk524 = 18.849555969238f * g_20SecIntervalFrac; - g_Menus[g_MpPlayerNum].unk840.unk550 = 0; - g_Menus[g_MpPlayerNum].unk840.unk528 = 0; + g_Menus[g_MpPlayerNum].menumodel.curroty = g_Menus[g_MpPlayerNum].menumodel.newroty = 18.849555969238f * g_20SecIntervalFrac; + g_Menus[g_MpPlayerNum].menumodel.currotz = g_Menus[g_MpPlayerNum].menumodel.newrotz = 0; } break; } @@ -2651,15 +2644,11 @@ MenuDialogHandlerResult ciHangarHolographMenuDialog(s32 operation, struct menudi switch (operation) { case MENUOP_OPEN: - g_Menus[g_MpPlayerNum].unk840.unk548 = 0; - g_Menus[g_MpPlayerNum].unk840.unk520 = 0; - g_Menus[g_MpPlayerNum].unk840.unk54c = 0; - g_Menus[g_MpPlayerNum].unk840.unk524 = 0; - g_Menus[g_MpPlayerNum].unk840.unk538 = 0; - g_Menus[g_MpPlayerNum].unk840.unk510 = 0; - g_Menus[g_MpPlayerNum].unk840.unk53c = 0; - g_Menus[g_MpPlayerNum].unk840.unk514 = 0; - g_Menus[g_MpPlayerNum].unk840.unk51c = 0; + g_Menus[g_MpPlayerNum].menumodel.currotx = g_Menus[g_MpPlayerNum].menumodel.newrotx = 0; + g_Menus[g_MpPlayerNum].menumodel.curroty = g_Menus[g_MpPlayerNum].menumodel.newroty = 0; + g_Menus[g_MpPlayerNum].menumodel.curposx = g_Menus[g_MpPlayerNum].menumodel.newposx = 0; + g_Menus[g_MpPlayerNum].menumodel.curposy = g_Menus[g_MpPlayerNum].menumodel.newposy = 0; + g_Menus[g_MpPlayerNum].menumodel.curscale = 0; break; case MENUOP_CLOSE: break; @@ -2675,29 +2664,24 @@ MenuDialogHandlerResult ciHangarHolographMenuDialog(s32 operation, struct menudi offset = items[index].y_offset; size = items[index].size * 0.001f; - g_Menus[g_MpPlayerNum].unk840.unk544 = size; - g_Menus[g_MpPlayerNum].unk840.unk514 = offset; - g_Menus[g_MpPlayerNum].unk840.unk53c = offset; + g_Menus[g_MpPlayerNum].menumodel.newscale = size; + g_Menus[g_MpPlayerNum].menumodel.curposy = offset; + g_Menus[g_MpPlayerNum].menumodel.newposy = offset; - if (g_Menus[g_MpPlayerNum].unk840.unk00c != items[index].fileid) { - g_Menus[g_MpPlayerNum].unk840.unk000 = 8; + if (g_Menus[g_MpPlayerNum].menumodel.newparams != items[index].fileid) { + g_Menus[g_MpPlayerNum].menumodel.loaddelay = 8; } - g_Menus[g_MpPlayerNum].unk840.unk00c = items[index].fileid; - g_Menus[g_MpPlayerNum].unk840.unk54c = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60freal; - g_Menus[g_MpPlayerNum].unk840.unk524 += 0.01f * g_Vars.diffframe60freal; - g_Menus[g_MpPlayerNum].unk840.partvisibility = g_BioPartVisibility; + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_FILENUM(items[index].fileid); + g_Menus[g_MpPlayerNum].menumodel.newroty = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60freal; + g_Menus[g_MpPlayerNum].menumodel.curroty += 0.01f * g_Vars.diffframe60freal; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = g_BioPartVisibility; } else { - g_Menus[g_MpPlayerNum].unk840.unk548 = 0; - g_Menus[g_MpPlayerNum].unk840.unk520 = 0; - g_Menus[g_MpPlayerNum].unk840.unk54c = 0; - g_Menus[g_MpPlayerNum].unk840.unk524 = 0; - g_Menus[g_MpPlayerNum].unk840.unk538 = 0; - g_Menus[g_MpPlayerNum].unk840.unk510 = 0; - g_Menus[g_MpPlayerNum].unk840.unk53c = 0; - g_Menus[g_MpPlayerNum].unk840.unk514 = 0; - g_Menus[g_MpPlayerNum].unk840.unk544 = 0; - g_Menus[g_MpPlayerNum].unk840.unk51c = 0; + g_Menus[g_MpPlayerNum].menumodel.currotx = g_Menus[g_MpPlayerNum].menumodel.newrotx = 0; + g_Menus[g_MpPlayerNum].menumodel.curroty = g_Menus[g_MpPlayerNum].menumodel.newroty = 0; + g_Menus[g_MpPlayerNum].menumodel.curposx = g_Menus[g_MpPlayerNum].menumodel.newposx = 0; + g_Menus[g_MpPlayerNum].menumodel.curposy = g_Menus[g_MpPlayerNum].menumodel.newposy = 0; + g_Menus[g_MpPlayerNum].menumodel.curscale = g_Menus[g_MpPlayerNum].menumodel.newscale = 0; } #else if (g_Menus[g_MpPlayerNum].curdialog->definition == dialogdef) { @@ -2709,18 +2693,18 @@ MenuDialogHandlerResult ciHangarHolographMenuDialog(s32 operation, struct menudi offset = items[index].y_offset; size = items[index].size * 0.001f; - g_Menus[g_MpPlayerNum].unk840.unk544 = size; - g_Menus[g_MpPlayerNum].unk840.unk514 = offset; - g_Menus[g_MpPlayerNum].unk840.unk53c = offset; - g_Menus[g_MpPlayerNum].unk840.unk00c = items[index].fileid; + g_Menus[g_MpPlayerNum].menumodel.newscale = size; + g_Menus[g_MpPlayerNum].menumodel.curposy = offset; + g_Menus[g_MpPlayerNum].menumodel.newposy = offset; + g_Menus[g_MpPlayerNum].menumodel.newparams = MENUMODELPARAMS_SET_FILENUM(items[index].fileid); #if VERSION >= VERSION_PAL_BETA - g_Menus[g_MpPlayerNum].unk840.unk54c = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60freal; - g_Menus[g_MpPlayerNum].unk840.unk524 += 0.01f * g_Vars.diffframe60freal; + g_Menus[g_MpPlayerNum].menumodel.newroty = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60freal; + g_Menus[g_MpPlayerNum].menumodel.curroty += 0.01f * g_Vars.diffframe60freal; #else - g_Menus[g_MpPlayerNum].unk840.unk54c = g_Menus[g_MpPlayerNum].unk840.unk524 + 0.01f * g_Vars.diffframe60f; - g_Menus[g_MpPlayerNum].unk840.unk524 += 0.01f * g_Vars.diffframe60f; + g_Menus[g_MpPlayerNum].menumodel.newroty = g_Menus[g_MpPlayerNum].menumodel.curroty + 0.01f * g_Vars.diffframe60f; + g_Menus[g_MpPlayerNum].menumodel.curroty += 0.01f * g_Vars.diffframe60f; #endif - g_Menus[g_MpPlayerNum].unk840.partvisibility = g_BioPartVisibility; + g_Menus[g_MpPlayerNum].menumodel.partvisibility = g_BioPartVisibility; } #endif } diff --git a/src/include/bss.h b/src/include/bss.h index 67eb234e9..bca6b3b48 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -163,8 +163,8 @@ extern s16 g_SpawnPoints[]; extern s32 g_NumSpawnPoints; extern s32 var8009de90; extern s32 var8009de94; -extern s32 var8009de98; -extern s32 var8009de9c; +extern s32 g_MenuProjectFromX; +extern s32 g_MenuProjectFromY; extern u8 g_MpSelectedPlayersForStats[MAX_PLAYERS]; extern char g_CheatMarqueeString[]; extern u8 *g_BlurBuffer; diff --git a/src/include/constants.h b/src/include/constants.h index 3a8e7ea97..db19cbbcc 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -1683,6 +1683,25 @@ #define MENUITEMTYPE_CONTROLLER 0x19 #define MENUITEMTYPE_END 0x1a +#define MENUMODELFLAG_HASSCALE 0x01 +#define MENUMODELFLAG_HASPOSITION 0x02 +#define MENUMODELFLAG_HASROTATION 0x04 + +#define MENUMODELPARAMS_HAS_MASTER_HEADBODY(params) (((params) & 0x80000000) != 0) +#define MENUMODELPARAMS_GET_MASTER_HEADNUM(params) ((params) & 0x3ff) +#define MENUMODELPARAMS_GET_MASTER_BODYNUM(params) (((params) & 0xffc00) >> 10) +#define MENUMODELPARAMS_GET_MP_HEADNUM(params) (((params) >> 16) & 0xff) +#define MENUMODELPARAMS_GET_MP_BODYNUM(params) (((params) >> 24) & 0xff) +#define MENUMODELPARAMS_GET_FILENUM(params) ((params) & 0xffff) +#define MENUMODELPARAMS_SET_FILENUM(filenum) (filenum) +#define MENUMODELPARAMS_SET_MP_HEADBODY(mpheadnum, mpbodynum) (0xffff | ((mpheadnum) << 16) | ((mpbodynum) << 24)) + +#define MENUMODELTYPE_DEFAULT 0 +#define MENUMODELTYPE_HUDPIECE 1 +#define MENUMODELTYPE_2 2 +#define MENUMODELTYPE_3 3 +#define MENUMODELTYPE_CREDITSLOGO 4 + #define MENUOP_GETOPTIONCOUNT 1 #define MENUOP_GETOPTGROUPCOUNT 2 #define MENUOP_GETOPTIONTEXT 3 diff --git a/src/include/game/endscreen.h b/src/include/game/endscreen.h index f8b6ccfe2..c12cf2566 100644 --- a/src/include/game/endscreen.h +++ b/src/include/game/endscreen.h @@ -28,7 +28,7 @@ char *endscreenMenuTextCurrentStageName3(struct menuitem *item); char *endscreenMenuTitleStageFailed(struct menuitem *item); char *endscreenMenuTextMissionTime(struct menuitem *item); struct menudialogdef *endscreenAdvance(void); -void endscreen0f10d770(void); +void endscreenResetModels(void); void endscreenContinue(s32 context); char *endscreenMenuTextTimedCheatName(struct menuitem *item); char *endscreenMenuTextCompletionCheatName(struct menuitem *item); diff --git a/src/include/game/menu.h b/src/include/game/menu.h index c6158141b..46fd44ad6 100644 --- a/src/include/game/menu.h +++ b/src/include/game/menu.h @@ -60,9 +60,9 @@ void menuCloseDialog(void); void menuUpdateCurFrame(void); void menuPopDialog(void); void func0f0f3704(struct menudialogdef *dialogdef); -void func0f0f372c(struct menu840 *arg0, f32 x, f32 y, f32 arg3, f32 arg4, f32 arg5, f32 arg6, f32 arg7, u8 flags); -void func0f0f37a4(struct menu840 *arg0); -Gfx *menuRenderModels(Gfx *gdl, struct menu840 *arg1, s32 arg2); +void menuConfigureModel(struct menumodel *menumodel, f32 x, f32 y, f32 z, f32 rotx, f32 roty, f32 rotz, f32 scale, u8 flags); +void menuUnsetModel(struct menumodel *menumodel); +Gfx *menuRenderModel(Gfx *gdl, struct menumodel *menumodel, s32 modeltype); void menuGetTeamTitlebarColours(u32 *top, u32 *middle, u32 *bottom); Gfx *menuApplyScissor(Gfx *gdl); Gfx *dialogRender(Gfx *gdl, struct menudialog *dialog, struct menu *menu, bool lightweight); @@ -85,7 +85,7 @@ void menuPushRootDialog(struct menudialogdef *dialogdef, s32 arg1); void func0f0f85e0(struct menudialogdef *dialogdef, s32 root); Gfx *menuRenderDialog(Gfx *gdl, struct menudialog *dialog, struct menu *menu, bool lightweight); Gfx *menuRenderDialogs(Gfx *gdl); -void func0f0f8bb4(struct menu840 *arg0, u32 arg1, u32 arg2); +void menuResetModel(struct menumodel *menumodel, u32 allocationlen, bool allocate); void menuReset(void); void menuSwipe(s32 direction); void dialogTick(struct menudialog *dialog, struct menuinputs *inputs, u32 tickflags); diff --git a/src/include/game/mplayer/setup.h b/src/include/game/mplayer/setup.h index 00d42360b..ebb915747 100644 --- a/src/include/game/mplayer/setup.h +++ b/src/include/game/mplayer/setup.h @@ -9,7 +9,7 @@ s16 mpChooseRandomStage(void); MenuItemHandlerResult mpArenaMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data); char *mpMenuTextWeaponNameForSlot(struct menuitem *item); char *mpMenuTextSetupName(struct menuitem *item); -MenuItemHandlerResult mpCharacterBodyMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data, s32 mpheadnum, s32 mpbodynum, bool isplayer); +MenuItemHandlerResult mpCharacterBodyMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data, s32 mpbodynum, s32 mpheadnum, bool isplayer); MenuDialogHandlerResult menudialog0017a174(s32 operation, struct menudialogdef *dialogdef, union handlerdata *data); MenuItemHandlerResult mpChallengesListHandler(s32 operation, struct menuitem *item, union handlerdata *data); char *mpMenuTextKills(struct menuitem *item); diff --git a/src/include/types.h b/src/include/types.h index 74acdd7bf..58d52fb33 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3815,71 +3815,70 @@ struct perfectheadtexturelist { struct textureconfig selectedtexture; }; -struct menu840 { - /*0x000*/ u8 unk000; - /*0x001*/ u8 unk001; +struct menumodel { + /*0x000*/ u8 loaddelay; /*0x002*/ s16 headnum; - /*0x004*/ u8 *unk004; - /*0x008*/ u32 unk008; - /*0x00c*/ u32 unk00c; - /*0x010*/ s32 unk010; - /*0x014*/ Mtxf unk014; + /*0x004*/ u8 *allocstart; + /*0x008*/ u32 alloclen; + /*0x00c*/ u32 newparams; + /*0x010*/ u32 curparams; + /*0x014*/ Mtxf mtx; /*0x054*/ struct modeldef *bodymodeldef; /*0x058*/ struct modeldef *headmodeldef; - /*0x05c*/ s16 unk05c; - /*0x05e*/ s16 unk05e; + /*0x05c*/ s16 newanimnum; + /*0x05e*/ s16 curanimnum; /*0x060*/ struct model bodymodel; /*0x084*/ struct anim bodyanim; - /*0x110*/ u32 unk110[256]; - /*0x510*/ f32 unk510; - /*0x514*/ f32 unk514; - /*0x518*/ f32 unk518; - /*0x51c*/ f32 unk51c; - /*0x520*/ f32 unk520; - /*0x524*/ f32 unk524; - /*0x528*/ f32 unk528; - /*0x52c*/ f32 unk52c; - /*0x530*/ f32 unk530; - /*0x534*/ f32 unk534; - /*0x538*/ f32 unk538; - /*0x53c*/ f32 unk53c; - /*0x540*/ f32 unk540; - /*0x544*/ f32 unk544; - /*0x548*/ f32 unk548; - /*0x54c*/ f32 unk54c; - /*0x550*/ f32 unk550; - /*0x554*/ f32 unk554; - /*0x558*/ f32 unk558; - /*0x55c*/ f32 unk55c; - /*0x560*/ s16 unk560; - /*0x564*/ f32 unk564; - /*0x568*/ u8 unk568; + /*0x110*/ u32 rwdata[256]; + /*0x510*/ f32 curposx; + /*0x514*/ f32 curposy; + /*0x518*/ f32 curposz; + /*0x51c*/ f32 curscale; + /*0x520*/ f32 currotx; + /*0x524*/ f32 curroty; + /*0x528*/ f32 currotz; + /*0x52c*/ f32 displacex; + /*0x530*/ f32 displacey; + /*0x534*/ f32 displacez; + /*0x538*/ f32 newposx; + /*0x53c*/ f32 newposy; + /*0x540*/ f32 newposz; + /*0x544*/ f32 newscale; + /*0x548*/ f32 newrotx; + /*0x54c*/ f32 newroty; + /*0x550*/ f32 newrotz; + /*0x554*/ f32 zoom; // character selection: far = 100, near = 370 + /*0x558*/ f32 unk558; // unused + /*0x55c*/ f32 unk55c; // unused + /*0x560*/ s16 unk560; // unused + /*0x564*/ f32 configurefrac; + /*0x568*/ u8 flags; /*0x56a*/ s16 bodynum; - /*0x56c*/ u32 unk56c; - /*0x570*/ u32 unk570; - /*0x574*/ s32 unk574; - /*0x578*/ s32 unk578; - /*0x57c*/ u32 unk57c; - /*0x580*/ u32 unk580; - /*0x584*/ u32 unk584; - /*0x588*/ u32 unk588; - /*0x58c*/ u32 unk58c; - /*0x590*/ u32 unk590; - /*0x594*/ u32 unk594; - /*0x598*/ u32 unk598; - /*0x59c*/ u32 unk59c; - /*0x5a0*/ u32 unk5a0; - /*0x5a4*/ u32 unk5a4; - /*0x5a8*/ u32 unk5a8; - /*0x5ac*/ u32 unk5ac; - /*0x5b0*/ u8 unk5b0; - /*0x5b1*/ u8 unk5b1_01 : 1; - /*0x5b1*/ u8 unk5b1_02 : 1; - /*0x5b1*/ u8 unk5b1_03 : 1; - /*0x5b1*/ u8 unk5b1_04 : 1; - /*0x5b1*/ u8 unk5b1_05 : 1; - /*0x5b1*/ u8 unk5b1_06 : 1; - /*0x5b1*/ u8 unk5b1_07 : 1; + /*0x56c*/ s32 unk56c; // unused + /*0x570*/ s32 unk570; // unused + /*0x574*/ s32 zoomtimer60; + /*0x578*/ s32 rottimer60; + /*0x57c*/ s32 unk57c; // unused + /*0x580*/ bool removingpiece; + /*0x584*/ s32 unk584; // unused + /*0x588*/ s32 unk588; // unused + /*0x58c*/ s32 unk58c; // unused + /*0x590*/ s32 unk590; // unused + /*0x594*/ s32 unk594; // unused + /*0x598*/ s32 unk598; // unused + /*0x59c*/ s32 unk59c; // unused + /*0x5a0*/ s32 unk5a0; // unused + /*0x5a4*/ s32 unk5a4; // unused + /*0x5a8*/ s32 unk5a8; // unused + /*0x5ac*/ s32 unk5ac; // unused + /*0x5b0*/ u8 perfectheadnum; + /*0x5b1*/ u8 isperfecthead : 1; + /*0x5b1*/ u8 unk5b1_02 : 1; // unused + /*0x5b1*/ u8 unk5b1_03 : 1; // unused + /*0x5b1*/ u8 reverseanim : 1; + /*0x5b1*/ u8 configuring : 1; + /*0x5b1*/ u8 unk5b1_06 : 1; // unused + /*0x5b1*/ u8 drawbehinddialog : 1; /*0x5b4*/ struct modelpartvisibility *partvisibility; }; @@ -3924,7 +3923,7 @@ struct menu { /*0x83d*/ u8 unk83d; /*0x83e*/ u8 unk83e; /*0x83f*/ u8 unk83f; - /*0x840*/ struct menu840 unk840; + /*0x840*/ struct menumodel menumodel; /*0xdf8*/ s8 bannernum; /*0xdfc*/ struct menudfc unkdfc[4]; @@ -4738,11 +4737,11 @@ struct menudata { /*0x016*/ u8 screenshottimer; /*0x017*/ u8 playerjoinalpha[MAX_PLAYERS]; /*0x01b*/ s8 bannernum; - /*0x01c*/ struct menu840 unk01c; + /*0x01c*/ struct menumodel hudpiece; /*0x5d4*/ u8 unk5d4; /*0x5d5*/ u8 unk5d5_01 : 1; /*0x5d5*/ u8 unk5d5_02 : 1; - /*0x5d5*/ u8 unk5d5_03 : 1; + /*0x5d5*/ u8 usezbuf : 1; /*0x5d5*/ u8 unk5d5_04 : 1; /*0x5d5*/ u8 unk5d5_05 : 1; /*0x5d5*/ u8 unk5d5_06 : 1;