diff --git a/config.yml b/config.yml index 6e7b92c6..dbfa5f0d 100644 --- a/config.yml +++ b/config.yml @@ -1,5 +1,14 @@ # Supported Star Fox 64 Versions: US, JP +09f0d105f476b00efa5303a3ebc42e60a7753b7a: + name: Star Fox 64 (U) (V1.1) (Compressed) + preprocess: + decompress_mio0: + method: mio0-comptool + type: decompress + target: f7475fb11e7e6830f82883412638e8390791ab87 + restart: true + f7475fb11e7e6830f82883412638e8390791ab87: name: Star Fox 64 (U) (V1.1) path: assets/yaml/us/rev1 diff --git a/include/mods.h b/include/mods.h index e578db1c..7fe9a71f 100644 --- a/include/mods.h +++ b/include/mods.h @@ -96,8 +96,8 @@ void RamMod_Update(void); void Spawner(void); #endif -#define DEBUG_SKIP_BRIEFING 1 #define DEBUG_BOSS_KILLER 0 +#define DEBUG_VERSUS 0 /* diff --git a/src/engine/fox_beam.c b/src/engine/fox_beam.c index 62d2d39d..b95015e6 100644 --- a/src/engine/fox_beam.c +++ b/src/engine/fox_beam.c @@ -1237,7 +1237,7 @@ void PlayerShot_DrawShot(PlayerShot* shot) { Matrix_MultVec3f(gGfxMatrix, &sp11C, &sShotViewPos); if ((sShotViewPos.z < 0.0f) && (sShotViewPos.z > -10000.0f)) { var_fv1 = fabsf(sShotViewPos.x); // probably fake. The use of temps was likely different - if (var_fv1 < (fabsf(sShotViewPos.z * 0.5f) + 500.0f)) { + if (var_fv1 < (fabsf(sShotViewPos.z * /* 0.5f */ 1.5f) + 500.0f)) { if (fabsf(sShotViewPos.y) < (fabsf(sShotViewPos.z * 0.5f) + 500.0f)) { isDrawn = true; } diff --git a/src/engine/fox_display.c b/src/engine/fox_display.c index 480f7375..48c8f25d 100644 --- a/src/engine/fox_display.c +++ b/src/engine/fox_display.c @@ -35,7 +35,7 @@ void KillBoss(void); #endif void Display_DrawHelpAlert(void) { - bool sp7C; + bool centered; // Enemy pos is centered, so both help arrows should be displayed f32 sp78; f32 sp74; Vec3f sp68; @@ -44,11 +44,13 @@ void Display_DrawHelpAlert(void) { if ((gPlayState == PLAY_PAUSE) || (gTeamHelpActor == NULL)) { return; } + if ((gTeamHelpActor->obj.status != OBJ_ACTIVE) || (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_ACTIVE)) { gTeamHelpActor = NULL; gTeamHelpTimer = 0; return; } + if (gTeamHelpTimer != 0) { gTeamHelpTimer--; if (gTeamHelpTimer == 0) { @@ -67,9 +69,9 @@ void Display_DrawHelpAlert(void) { Matrix_MultVec3f(gCalcMatrix, &sp68, &sp5C); - sp7C = false; + centered = false; if ((sp5C.z < 0.0f) && (sp5C.z > -12000.0f) && (fabsf(sp5C.x) < fabsf(sp5C.z * 0.4f))) { - sp7C = true; + centered = true; } RCP_SetupDL(&gMasterDisp, SETUPDL_12); @@ -86,19 +88,19 @@ void Display_DrawHelpAlert(void) { break; } - switch (sp7C) { + switch (centered) { case false: if (gTeamHelpActor->sfxSource[0] > 0.0f) { - sp78 = 20.0f; + sp78 = 20.0f * OTRGetAspectRatio()-8; sp74 = M_PI / 2; } else { - sp78 = -20.0f; + sp78 = -20.0f * OTRGetAspectRatio()+8; sp74 = -M_PI / 2; } Matrix_Push(&gGfxMatrix); // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Display_DrawHelpAlert", sp7C); + FrameInterpolation_RecordOpenChild("Display_DrawHelpAlert", centered); Matrix_Translate(gGfxMatrix, sp78, 0.0f, -50.0f, MTXF_APPLY); Matrix_RotateZ(gGfxMatrix, sp74, MTXF_APPLY); @@ -112,20 +114,22 @@ void Display_DrawHelpAlert(void) { break; case true: + // right arrow (both at the same time) Matrix_Push(&gGfxMatrix); // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Display_DrawHelpAlert", sp7C); - - Matrix_Translate(gGfxMatrix, 20.0f, 0.0f, -50.0f, MTXF_APPLY); + FrameInterpolation_RecordOpenChild("Display_DrawHelpAlert", centered); + Matrix_Translate(gGfxMatrix, 20.0f * OTRGetAspectRatio() - 8, 0.0f, -50.0f, MTXF_APPLY); Matrix_RotateZ(gGfxMatrix, -M_PI / 2, MTXF_APPLY); Matrix_Scale(gGfxMatrix, 0.03f, 0.03f, 0.03f, MTXF_APPLY); Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, D_1023700); Matrix_Pop(&gGfxMatrix); sp78 = -20.0f; + + // left arrow (both in simultaneous) Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, -20.0f, 0.0f, -50.0f, MTXF_APPLY); + Matrix_Translate(gGfxMatrix, -20.0f * OTRGetAspectRatio() + 8, 0.0f, -50.0f, MTXF_APPLY); Matrix_RotateZ(gGfxMatrix, M_PI / 2, MTXF_APPLY); Matrix_Scale(gGfxMatrix, 0.03f, 0.03f, 0.03f, MTXF_APPLY); Matrix_SetGfxMtx(&gMasterDisp); @@ -136,23 +140,23 @@ void Display_DrawHelpAlert(void) { FrameInterpolation_RecordCloseChild(); break; } - - switch (sp7C) { + + switch (centered) { case false: RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 0, 255); if (sp78 < 0.0f) { - Graphics_DisplaySmallText(43 - 19, 106, 1.0f, 1.0f, "HELP!!"); + Graphics_DisplaySmallText(OTRGetRectDimensionFromLeftEdge(38.0f), 106, 1.0f, 1.0f, "HELP!!"); } else { - Graphics_DisplaySmallText(SCREEN_WIDTH - 43 - 19, 106, 1.0f, 1.0f, "HELP!!"); + Graphics_DisplaySmallText(OTRGetRectDimensionFromRightEdge(248), 106, 1.0f, 1.0f, "HELP!!"); } break; case true: RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 0, 255); - Graphics_DisplaySmallText(43 - 19, 106, 1.0f, 1.0f, "HELP!!"); - Graphics_DisplaySmallText(SCREEN_WIDTH - 43 - 19, 106, 1.0f, 1.0f, "HELP!!"); + Graphics_DisplaySmallText(OTRGetRectDimensionFromLeftEdge(38.0f) , 106, 1.0f, 1.0f, "HELP!!"); + Graphics_DisplaySmallText(OTRGetRectDimensionFromRightEdge(248), 106, 1.0f, 1.0f, "HELP!!"); break; } } @@ -1361,7 +1365,7 @@ bool Display_CheckPlayerVisible(s32 index, s32 reflectY) { Matrix_MultVec3f(gGfxMatrix, &src, &dest); if ((dest.z < 200.0f) && (dest.z > -12000.0f)) { - if (fabsf(dest.x) < (fabsf(dest.z * 0.5f) + 500.0f)) { + if (fabsf(dest.x) < (fabsf(dest.z * /*0.5f*/ 1.5f) + 500.0f)) { if (fabsf(dest.y) < (fabsf(dest.z * 0.5f) + 500.0f)) { if (reflectY == 0) { sPlayersVisible[index] = true; @@ -2133,11 +2137,11 @@ void Display_Update(void) { #if 0 RCP_SetupDL(&gMasterDisp, SETUPDL_83); gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255); - Graphics_DisplaySmallText(10, 210, 1.0f, 1.0f, "PATH1:"); - Graphics_DisplaySmallNumber(60, 210, (int) ABS(path1)); - Graphics_DisplaySmallText(10, 220, 1.0f, 1.0f, "PATH2:"); - Graphics_DisplaySmallNumber(60, 220, (int) ABS(path2)); - if (path1 < 0.0f) Graphics_DisplaySmallText(110, 210, 1.0f, 1.0f, "NEG:"); - if (path2 < 0.0f) Graphics_DisplaySmallText(110, 220, 1.0f, 1.0f, "NEG:"); + Graphics_DisplaySmallText(10, 210, 1.0f, 1.0f, "STICK_X:"); + Graphics_DisplaySmallNumber(60, 210, (int) ABS(gInputPress->stick_x)); + Graphics_DisplaySmallText(10, 220, 1.0f, 1.0f, "STICK_Y:"); + Graphics_DisplaySmallNumber(60, 220, (int) ABS(gInputPress->stick_y)); + if (gInputPress->stick_x < 0) Graphics_DisplaySmallText(110, 210, 1.0f, 1.0f, "NEG:"); + if (gInputPress->stick_y < 0) Graphics_DisplaySmallText(110, 220, 1.0f, 1.0f, "NEG:"); #endif } diff --git a/src/engine/fox_hud.c b/src/engine/fox_hud.c index d75d993e..89d7b618 100644 --- a/src/engine/fox_hud.c +++ b/src/engine/fox_hud.c @@ -117,10 +117,15 @@ Gfx sRadioDamageDL[] = { gsSPEndDisplayList(), }; +void HUD_MatrixTranslateCoordLeft(f32* transX, f32* transY) { + *transX = OTRGetRectDimensionFromLeftEdge(*transX) - (SCREEN_WIDTH / 2.0f); + *transY = (SCREEN_HEIGHT / 2.0f) - *transY; +} + // Used in the status screen, and when losing a life void HUD_LivesCount1_Draw(f32 xPos, f32 yPos, s32 lifeCount) { - u8* sLifeIconTex[] = { aArwingLifeIconTex, aBlueMarineLifeIconTex, aLandmasterLifeIconTex }; - u16* sLifeIconTLUT[] = { aArwingLifeIconTLUT, aBlueMarineLifeIconTLUT, aLandmasterLifeIconTLUT }; + u8* sLifeIconTex[] = { aArwingLifeIconTex, aLandmasterLifeIconTex, aBlueMarineLifeIconTex }; + u16* sLifeIconTLUT[] = { aArwingLifeIconTLUT, aLandmasterLifeIconTLUT, aBlueMarineLifeIconTLUT }; Player* player; s32 lifeIconIdx; s32 maxLives; @@ -203,16 +208,22 @@ void HUD_TeamDownWrench_Draw(s32 arg0) { } } } else { + f32 x = 48.0f; + f32 y = 0.0f; + HUD_MatrixTranslateCoordLeft(&x, &y); + y = -81.0f; + Lib_InitOrtho(&gMasterDisp); Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, -234.0f, -167.0f, -600.0f, MTXF_APPLY); + Matrix_Translate(gGfxMatrix, x, y, -600.0f, MTXF_APPLY); Matrix_RotateZ(gGfxMatrix, M_PI / 4, MTXF_APPLY); - Matrix_Scale(gGfxMatrix, 0.68f, 0.68f, 1.0f, MTXF_APPLY); + Matrix_Scale(gGfxMatrix, 0.31f, 0.31f, 1.0f, MTXF_APPLY); Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, aDownWrenchDL); Matrix_RotateZ(gGfxMatrix, 3 * M_PI / 2, MTXF_APPLY); Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, aDownWrenchDL); Matrix_Pop(&gGfxMatrix); + Lib_InitPerspective(&gMasterDisp); } } @@ -304,11 +315,6 @@ void HUD_BoostGaugeCool_Draw(f32 xPos, f32 yPos, f32 xScale, f32 yScale) { } } -void HUD_MatrixTranslateCoord(f32* transX, f32* transY) { - *transX = OTRGetRectDimensionFromLeftEdge(*transX) - (SCREEN_WIDTH / 2.0f); - *transY = (SCREEN_HEIGHT / 2.0f) - *transY; -} - void HUD_GoldRings_Draw(void) { Gfx* sGoldRingDLs[] = { aGoldRingFrame1DL, aGoldRingFrame2DL, aGoldRingFrame3DL, aGoldRingFrame4DL, @@ -381,7 +387,7 @@ void HUD_GoldRings_Draw(void) { scale += 0.06f; } - HUD_MatrixTranslateCoord(&x, &y); + HUD_MatrixTranslateCoordLeft(&x, &y); Matrix_Translate(gGfxMatrix, x, y, -100.0f, MTXF_NEW); Matrix_Scale(gGfxMatrix, scale, scale, scale, MTXF_APPLY); Matrix_Scale(gGfxMatrix, ringScale, ringScale, ringScale, MTXF_APPLY); @@ -403,7 +409,7 @@ void HUD_GoldRings_Draw(void) { RCP_SetupDL(&gMasterDisp, SETUPDL_62); gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255); - HUD_MatrixTranslateCoord(&D_800D1AC4[i + 1], &D_800D1AD8[i + 1]); + HUD_MatrixTranslateCoordLeft(&D_800D1AC4[i + 1], &D_800D1AD8[i + 1]); Matrix_Push(&gGfxMatrix); Matrix_Translate(gGfxMatrix, D_800D1AC4[i + 1], D_800D1AD8[i + 1], -100.0f, MTXF_NEW); @@ -436,7 +442,7 @@ void HUD_GoldRings_Draw(void) { scale += 0.06f; } - HUD_MatrixTranslateCoord(&x, &y); + HUD_MatrixTranslateCoordLeft(&x, &y); Matrix_Translate(gGfxMatrix, x, y, -100.0f, MTXF_NEW); Matrix_Scale(gGfxMatrix, scale, scale, scale, MTXF_APPLY); Matrix_Scale(gGfxMatrix, ringScale, ringScale, ringScale, MTXF_APPLY); @@ -913,8 +919,8 @@ void HUD_DrawLevelClearScreen(void) { // Used in gameplay hud void HUD_LivesCount2_Draw(f32 x, f32 y, s32 number) { - u8* sLivesCounterTexs[] = { aArwingLifeIconTex, aBlueMarineLifeIconTex, aLandmasterLifeIconTex }; - u16* sLivesCounterTLUTs[] = { aArwingLifeIconTLUT, aBlueMarineLifeIconTLUT, aLandmasterLifeIconTLUT }; + u8* sLivesCounterTexs[] = { aArwingLifeIconTex, aLandmasterLifeIconTex, aBlueMarineLifeIconTex }; + u16* sLivesCounterTLUTs[] = { aArwingLifeIconTLUT, aLandmasterLifeIconTLUT, aBlueMarineLifeIconTLUT }; Player* player = &gPlayer[0]; f32 x0; f32 x1; @@ -1492,8 +1498,7 @@ void HUD_PauseScreen_Update(void) { case 3: Graphics_FillRectangle(&gMasterDisp, OTRGetRectDimensionFromLeftEdge(0), 0, - OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH), SCREEN_HEIGHT, 0, 0, 0, - 255); + OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH), SCREEN_HEIGHT, 0, 0, 0, 255); gFillScreenAlphaTarget = 0; @@ -1543,8 +1548,7 @@ void HUD_PauseScreen_Update(void) { case 4: Graphics_FillRectangle(&gMasterDisp, OTRGetRectDimensionFromLeftEdge(0), 0, - OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH), SCREEN_HEIGHT, 0, 0, 0, - 255); + OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH), SCREEN_HEIGHT, 0, 0, 0, 255); if (sPauseScreenTimer[0] < 140) { break; } @@ -1563,8 +1567,7 @@ void HUD_PauseScreen_Update(void) { case 5: Graphics_FillRectangle(&gMasterDisp, OTRGetRectDimensionFromLeftEdge(0), 0, - OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH ), SCREEN_HEIGHT, 0, 0, 0, - 255); + OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH), SCREEN_HEIGHT, 0, 0, 0, 255); for (i = 0; i < 6; i++) { if (gPrevPlanetTeamShields[i] == -1) { @@ -2012,6 +2015,9 @@ void HUD_RadarMarks_Setup(void) { } } +static f32 gHudOffsetRect = 0.0f; +static f32 gHudOffsetPers = 0.0f; + s32 HUD_RadarMarks_Update(void) { s32 i; f32 scale; @@ -2020,11 +2026,32 @@ s32 HUD_RadarMarks_Update(void) { f32 z1; f32 x = 0; f32 y = 0; - s32 pad; f32 temp; f32 temp2; f32 temp3; + switch (gCurrentLevel) { + case LEVEL_CORNERIA: + gHudOffsetRect = OTRGetDimensionFromRightEdge(0.0f); + gHudOffsetPers = gHudOffsetRect * 2.15f; + break; + + case LEVEL_SECTOR_Z: + gHudOffsetRect = OTRGetDimensionFromRightEdge(0.0f); + gHudOffsetPers = gHudOffsetRect * 5.50f; + break; + + case LEVEL_BOLSE: + gHudOffsetRect = OTRGetDimensionFromRightEdge(0.0f); + gHudOffsetPers = gHudOffsetRect * 2.70f; + break; + + default: + gHudOffsetRect = OTRGetDimensionFromRightEdge(0.0f); + gHudOffsetPers = gHudOffsetRect * 3.35f; + break; + } + if (!gVersusMode) { if (gLevelMode != LEVELMODE_ALL_RANGE) { return 0; @@ -2098,7 +2125,7 @@ s32 HUD_RadarMarks_Update(void) { } HUD_RadarMarks_Setup(); - HUD_RadarWindow_Draw(x, y); + HUD_RadarWindow_Draw(x + gHudOffsetRect, y); if (!gVersusMode && ((gCurrentLevel == LEVEL_SECTOR_Z) || (gCurrentLevel == LEVEL_FORTUNA) || (gCurrentLevel == LEVEL_VENOM_2) || @@ -2109,15 +2136,18 @@ s32 HUD_RadarMarks_Update(void) { switch (gCurrentLevel) { case LEVEL_SECTOR_Z: - Lib_TextureRect_IA8(&gMasterDisp, D_SZ_60012D0, 16, 9, 251.0f + D_800D1E10, 181.0f, 1.00f, 1.00f); + Lib_TextureRect_IA8(&gMasterDisp, D_SZ_60012D0, 16, 9, gHudOffsetRect + 251.0f + D_800D1E10, 181.0f, + 1.00f, 1.00f); break; case LEVEL_FORTUNA: - Lib_TextureRect_IA8(&gMasterDisp, D_FO_6001260, 16, 16, 251.0f + D_800D1E10, 178.0f, 1.00f, 1.00f); + Lib_TextureRect_IA8(&gMasterDisp, D_FO_6001260, 16, 16, gHudOffsetRect + 251.0f + D_800D1E10, 178.0f, + 1.00f, 1.00f); break; case LEVEL_BOLSE: - Lib_TextureRect_IA8(&gMasterDisp, D_BO_6000C80, 16, 16, 251.0f + D_800D1E10, 178.0f, 1.00f, 1.00f); + Lib_TextureRect_IA8(&gMasterDisp, D_BO_6000C80, 16, 16, gHudOffsetRect + (251.0f + D_800D1E10), 178.0f, + 1.00f, 1.00f); break; case LEVEL_SECTOR_Y: @@ -2128,22 +2158,25 @@ s32 HUD_RadarMarks_Update(void) { if ((y < 150.0f) || (y > 206.0f)) { break; } - Lib_TextureRect_IA8(&gMasterDisp, D_SY_6000840, 64, 64, 250.0f + D_800D1E10, temp, 0.25f, 0.25f); + Lib_TextureRect_IA8(&gMasterDisp, D_SY_6000840, 64, 64, gHudOffsetRect + 250.0f + D_800D1E10, temp, + 0.25f, 0.25f); } break; case LEVEL_KATINA: - Lib_TextureRect_IA8(&gMasterDisp, D_KA_6001260, 8, 8, 254.0f + D_800D1E10, 182.0f, 1.00f, 1.00f); + Lib_TextureRect_IA8(&gMasterDisp, D_KA_6001260, 8, 8, 254.0f + D_800D1E10 + gHudOffsetRect, 182.0f, + 1.00f, 1.00f); break; case LEVEL_VENOM_2: - Lib_TextureRect_IA8(&gMasterDisp, D_VE2_6002890, 16, 16, 251.0f + D_800D1E10, 178.0f, 1.00f, 1.00f); + Lib_TextureRect_IA8(&gMasterDisp, D_VE2_6002890, 16, 16, gHudOffsetRect + 251.0f + D_800D1E10, 178.0f, + 1.00f, 1.00f); break; } } Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, x1, y1, z1, MTXF_APPLY); + Matrix_Translate(gGfxMatrix, x1 + gHudOffsetPers, y1, z1, MTXF_APPLY); if ((gCurrentLevel == LEVEL_SECTOR_Z) && (D_hud_80161710 != 0)) { Matrix_Push(&gGfxMatrix); @@ -2215,49 +2248,51 @@ void HUD_RadioCharacterName_Draw(void) { RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT); gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255); + f32 xPos = OTRGetRectDimensionFromLeftEdge(73.0f); + switch ((s32) gRadioMsgRadioId) { case RCID_FOX: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "FOX"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "FOX"); break; case RCID_FALCO: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "FALCO"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "FALCO"); break; case RCID_SLIPPY: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "SLIPPY"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "SLIPPY"); break; case RCID_PEPPY: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "PEPPY"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "PEPPY"); break; case RCID_WOLF: case RCID_WOLF_2: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "WOLF"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "WOLF"); break; case RCID_LEON: case RCID_LEON_2: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "LEON"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "LEON"); break; case RCID_PIGMA: case RCID_PIGMA_2: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "PIGMA"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "PIGMA"); break; case RCID_ANDREW: case RCID_ANDREW_2: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "ANDREW"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "ANDREW"); break; case RCID_BILL: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "BILL"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "BILL"); break; case RCID_KATT: - Graphics_DisplaySmallText(73, 173, 1.0f, 1.0f, "KATT"); + Graphics_DisplaySmallText(xPos, 173, 1.0f, 1.0f, "KATT"); break; } } @@ -2588,12 +2623,18 @@ void HUD_RadioDamage_Draw(void) { if ((D_80161788 != 0) || (D_8016178C != 0)) { RCP_SetupDL(&gMasterDisp, SETUPDL_12); gDPSetPrimColor(gMasterDisp++, 0, 0, r, g, b, alpha); + f32 x = 48.0f; + f32 y = 0.0f; + HUD_MatrixTranslateCoordLeft(&x, &y); + y = -81.0f; + Lib_InitOrtho(&gMasterDisp); Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, -53.9f, -38.5f, -139.4f, MTXF_APPLY); - Matrix_Scale(gGfxMatrix, 1.0f, 1.0f, 1.0f, MTXF_APPLY); + Matrix_Translate(gGfxMatrix, x, y, -139.4f, MTXF_APPLY); + Matrix_Scale(gGfxMatrix, 2.25f, 2.25f, 2.25f, MTXF_APPLY); Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, sRadioDamageDL); Matrix_Pop(&gGfxMatrix); + Lib_InitPerspective(&gMasterDisp); } } @@ -2751,7 +2792,6 @@ void HUD_VsModePortraitTex_Draw(f32 xPos, f32 yPos, f32 scale, s32 idx) { Lib_TextureRect_RGBA16(&gMasterDisp, sVsModeFaceDL[idx], 44, 44, xPos, yPos, scale, scale); } -// LTODO: Align these void HUD_EdgeArrows_Draw(s32 idx, bool arg1) { f32 D_800D1EF8[] = { 0.0f, 0.0f, -9.0f, 9.0f, 10.0f, 10.0f, 10.0f, 10.0f, 0.0f, 0.0f, -8.0f, 8.0f }; f32 D_800D1F28[] = { -7.0f, 7.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f, -8.0f, 0.0f, 0.0f }; @@ -2773,11 +2813,20 @@ void HUD_EdgeArrows_Draw(s32 idx, bool arg1) { Matrix_RotateZ(gGfxMatrix, M_DTOR * D_800D1F88[idx], MTXF_APPLY); } + // Simplified perspective alignment based on X position + f32 xPos = D_800D1EF8[idx]; + + if (xPos < 0.0f) { + xPos = xPos * OTRGetAspectRatio() + 1; + } else if (xPos > 0.0f) { + xPos = xPos * OTRGetAspectRatio() - 1; + } + if (arg1) { - Matrix_Translate(gGfxMatrix, D_800D1EF8[idx] + D_800D1FE8[idx], D_800D1F28[idx] + D_800D2018[idx], - D_800D1F58[idx], MTXF_APPLY); + Matrix_Translate(gGfxMatrix, xPos + D_800D1FE8[idx], D_800D1F28[idx] + D_800D2018[idx], D_800D1F58[idx], + MTXF_APPLY); } else { - Matrix_Translate(gGfxMatrix, D_800D1EF8[idx], D_800D1F28[idx], D_800D1F58[idx], MTXF_APPLY); + Matrix_Translate(gGfxMatrix, xPos, D_800D1F28[idx], D_800D1F58[idx], MTXF_APPLY); } Matrix_RotateZ(gGfxMatrix, M_DTOR * D_800D1FB8[idx], MTXF_APPLY); @@ -2897,8 +2946,7 @@ void HUD_KillCountStars_Update(void) { } void HUD_VS_ShieldGaugeFrame_Draw(f32 xPos, f32 yPos, f32 xScale, f32 yScale) { - Lib_TextureRect_IA8(&gMasterDisp, aVsShieldGaugeFrameTex, 80, 26, xPos, yPos, xScale, - yScale); + Lib_TextureRect_IA8(&gMasterDisp, aVsShieldGaugeFrameTex, 80, 26, xPos, yPos, xScale, yScale); } void HUD_VS_ShieldGaugeTex_Draw(f32 xPos, f32 yPos, f32 xScale, f32 yScale, f32 width) { diff --git a/src/engine/fox_message.c b/src/engine/fox_message.c index 5b7a9d06..888b0f2b 100644 --- a/src/engine/fox_message.c +++ b/src/engine/fox_message.c @@ -19,8 +19,8 @@ u16 Message_IdFromPtr(u16* msgPtr) { MsgLookup* lookup = (MsgLookup*) LOAD_ASSET(gMsgLookup); while (lookup->msgPtr != NULL) { - if(GameEngine_OTRSigCheck(msgPtr)){ - if(strcmp(((char*) msgPtr) + 7, lookup->path) == 0){ + if (GameEngine_OTRSigCheck(msgPtr)) { + if (strcmp(((char*) msgPtr) + 7, lookup->path) == 0) { return lookup->msgId; } } else { @@ -65,7 +65,7 @@ void Message_DisplayChar(Gfx** gfxPtr, u16 msgChar, s32 xpos, s32 ypos) { gDPLoadTextureBlock_4b((*gfxPtr)++, gTextCharTextures[msgChar >> 2], G_IM_FMT_CI, 16, 13, msgChar % 4U, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle((*gfxPtr)++, xpos << 2, ypos << 2, (xpos + 13) << 2, (ypos + 13) << 2, G_TX_RENDERTILE, 64, 0, + gSPWideTextureRectangle((*gfxPtr)++, xpos << 2, ypos << 2, (xpos + 13) << 2, (ypos + 13) << 2, G_TX_RENDERTILE, 64, 0, 1024, 1024); } diff --git a/src/engine/fox_radio.c b/src/engine/fox_radio.c index 91708ad6..eb443767 100644 --- a/src/engine/fox_radio.c +++ b/src/engine/fox_radio.c @@ -125,9 +125,18 @@ void Radio_PlayMessage(u16* msg, RadioCharacterId character) { switch (gGameState) { case GSTATE_TITLE: + gRadioPrintPosY = 176; + gRadioPrintPosX = OTRGetRectDimensionFromLeftEdge(85.0f); + gRadioTextBoxPosX = OTRGetRectDimensionFromLeftEdge(80.0f); + gRadioTextBoxPosY = 174.0f; + gRadioTextBoxScaleX = 4.63f; + gRadioPortraitPosX = OTRGetRectDimensionFromLeftEdge(32.0f); + gRadioPortraitPosY = 174.0f; + break; + case GSTATE_ENDING: gRadioPrintPosY = 176; - gRadioPrintPosX = 85; + gRadioPrintPosX = 85.0f; gRadioTextBoxPosX = 80.0f; gRadioTextBoxPosY = 174.0f; gRadioTextBoxScaleX = 4.63f; @@ -137,11 +146,11 @@ void Radio_PlayMessage(u16* msg, RadioCharacterId character) { case GSTATE_PLAY: gRadioPrintPosY = 180; - gRadioPrintPosX = 79; - gRadioTextBoxPosX = 74.0f; + gRadioPrintPosX = OTRGetRectDimensionFromLeftEdge(79.0f); + gRadioTextBoxPosX = OTRGetRectDimensionFromLeftEdge(74.0f); gRadioTextBoxPosY = 178.0f; gRadioTextBoxScaleX = 4.53f; - gRadioPortraitPosX = 26.0f; + gRadioPortraitPosX = OTRGetRectDimensionFromLeftEdge(26.0f); gRadioPortraitPosY = 178.0f; break; } @@ -428,10 +437,12 @@ void func_radio_800BAAE8(void) { if (mirror) { Lib_TextureRect_RGBA16_MirX(&gMasterDisp, radioPortraitTex, 44, 44, gRadioPortraitPosX, - gRadioPortraitPosY + 20.0f + sp38 + gRadioPortraitScaleY, 1.0f, gRadioPortraitScaleY); + gRadioPortraitPosY + 20.0f + sp38 + gRadioPortraitScaleY, 1.0f, + gRadioPortraitScaleY); } else { Lib_TextureRect_RGBA16(&gMasterDisp, radioPortraitTex, 44, 44, gRadioPortraitPosX, - gRadioPortraitPosY + 20.0f + sp38 + gRadioPortraitScaleY, 1.0f, gRadioPortraitScaleY); + gRadioPortraitPosY + 20.0f + sp38 + gRadioPortraitScaleY, 1.0f, + gRadioPortraitScaleY); } } } @@ -602,13 +613,12 @@ void Radio_Draw(void) { if (!(fakeTemp)) { ret = Audio_GetCurrentVoiceStatus(); - if (gRadioMsgCharIndex < 60) { - if (gRadioMsg[gRadioMsgCharIndex + 1] == MSGCHAR_NXT && *gRadioMsg != 38) { + if (gRadioMsg[gRadioMsgCharIndex + 1] != MSGCHAR_END) { + if (gRadioMsg[gRadioMsgCharIndex + 1] == MSGCHAR_NXT) { if (ret == 0) { gRadioState = 31; } - } - else { + } else { gRadioMsgCharIndex++; } } @@ -700,12 +710,12 @@ void Radio_Draw(void) { (gCurrentRadioPortrait != RCID_1000)) { RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 0, 255); - Graphics_DisplaySmallText(31, 167, 1.0f, 1.0f, "DOWN"); + Graphics_DisplaySmallText(OTRGetRectDimensionFromLeftEdge(31.0f), 167, 1.0f, 1.0f, "DOWN"); HUD_TeamDownWrench_Draw(1); } if (((gCurrentRadioPortrait != RCID_STATIC) && (gCurrentRadioPortrait != RCID_STATIC + 1)) && (gCurrentRadioPortrait != RCID_1000)) { - HUD_TeamShields_Draw(22.0f, 165.0f, gTeamShields[idx]); + HUD_TeamShields_Draw(OTRGetRectDimensionFromLeftEdge(22.0f), 165.0f, gTeamShields[idx]); } } @@ -749,11 +759,11 @@ void Radio_Draw(void) { (gCurrentRadioPortrait != RCID_STATIC + 1) && (gCurrentRadioPortrait != RCID_1000)) { RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 0, 255); - Graphics_DisplaySmallText(31, 167, 1.0f, 1.0f, "DOWN"); + Graphics_DisplaySmallText(OTRGetRectDimensionFromLeftEdge(31.0f), 167, 1.0f, 1.0f, "DOWN"); } if (((gCurrentRadioPortrait != RCID_STATIC) && (gCurrentRadioPortrait != RCID_STATIC + 1)) && (gCurrentRadioPortrait != RCID_1000)) { - HUD_TeamShields_Draw(22.0f, 165.0f, gActors[idx].health * 2.55f); + HUD_TeamShields_Draw(OTRGetRectDimensionFromLeftEdge(22.0f), 165.0f, gActors[idx].health * 2.55f); } } if (((gCurrentRadioPortrait != RCID_STATIC) && (gCurrentRadioPortrait != RCID_STATIC + 1)) && diff --git a/src/overlays/ovl_menu/fox_option.c b/src/overlays/ovl_menu/fox_option.c index 4cb71e02..6510ef6e 100644 --- a/src/overlays/ovl_menu/fox_option.c +++ b/src/overlays/ovl_menu/fox_option.c @@ -971,6 +971,11 @@ void Option_MainMenu_Update(void) { } if (gControllerPress[gMainController].button & (A_BUTTON | START_BUTTON)) { +#if DEBUG_VERSUS == 0 + if (sMainMenuCursor == 2) { + break; + } +#endif AUDIO_PLAY_SFX(NA_SE_ARWING_DECIDE, gDefaultSfxSource, 4); sLightningYpos = sOptionCardPosY[sMainMenuCursor]; sDrawCursor = false; @@ -2158,6 +2163,7 @@ void Option_RankingMenu_Draw(void) { Option_Color_FlashRed(&D_menu_801B93F0); colorGB = D_menu_801B93F0; gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255); + // Selection arrow Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7004010, 8, 8, 70.0f, (D_menu_801B93E4 * 17.0f) + 55.0f, 1.0f, 1.0f); } @@ -2240,13 +2246,19 @@ void Option_80197914(void) { for (i = 0, vec1 = D_menu_801AF100, vec2 = D_menu_801AF118; i < 2; i++, vec1++, vec2++) { Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, vec1->x, vec1->y, -500.0f, MTXF_APPLY); + // @port: Tag the transform. + FrameInterpolation_RecordOpenChild("RANKING_BORDERS", i); + + Matrix_Translate(gGfxMatrix, vec1->x, vec1->y, -500.0f, MTXF_APPLY); // @port: Increase the scale by 2.5f to compensate for missing borders Matrix_Scale(gGfxMatrix, vec2->x * 4, vec2->y + 2.5f, 1.0f, MTXF_APPLY); Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, D_menu_801AEF30); Matrix_Pop(&gGfxMatrix); + + // @port Pop the transform id. + FrameInterpolation_RecordCloseChild(); } } @@ -2605,11 +2617,17 @@ f32 D_menu_801AF144 = 2.7f; void Option_RankingRouteMedal_Draw(f32 xPos, f32 yPos, f32 zPos) { RCP_SetupDL(&gMasterDisp, SETUPDL_53); Matrix_Push(&gGfxMatrix); + // @port: Tag the transform. + FrameInterpolation_RecordOpenChild("Option_RankingRouteMedal_Draw", (u32) xPos << 8 | (u32) yPos); + Matrix_Translate(gGfxMatrix, xPos - D_menu_801AF140, yPos + D_menu_801AF144, zPos, MTXF_APPLY); Matrix_Scale(gGfxMatrix, D_menu_801AF13C, D_menu_801AF13C, D_menu_801AF13C, MTXF_APPLY); Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, aMapMedalDL); Matrix_Pop(&gGfxMatrix); + + // @port Pop the transform id. + FrameInterpolation_RecordCloseChild(); } s32 Option_GetRouteLineColor(PlanetId start, PlanetId end) { diff --git a/src/overlays/ovl_menu/fox_title.c b/src/overlays/ovl_menu/fox_title.c index 57d13a51..5dc79d88 100644 --- a/src/overlays/ovl_menu/fox_title.c +++ b/src/overlays/ovl_menu/fox_title.c @@ -3629,21 +3629,21 @@ void Title_Radio_PlayMessage(u16** msgList, RadioCharacterId character) { switch (gGameState) { case GSTATE_TITLE: gRadioPrintPosY = 176; - gRadioPrintPosX = 85; - gRadioTextBoxPosX = 80.0f; + gRadioPrintPosX = OTRGetRectDimensionFromLeftEdge(85); + gRadioTextBoxPosX = OTRGetRectDimensionFromLeftEdge(80.0f); gRadioTextBoxPosY = 174.0f; gRadioTextBoxScaleX = 4.63f; - gRadioPortraitPosX = 32.0f; + gRadioPortraitPosX = OTRGetRectDimensionFromLeftEdge(32.0f); gRadioPortraitPosY = 174.0f; break; case GSTATE_PLAY: gRadioPrintPosY = 179; - gRadioPrintPosX = 79; - gRadioTextBoxPosX = 74.0f; + gRadioPrintPosX = OTRGetRectDimensionFromLeftEdge(79); + gRadioTextBoxPosX = OTRGetRectDimensionFromLeftEdge(74.0f); gRadioTextBoxPosY = 178.0f; gRadioTextBoxScaleX = 4.53f; - gRadioPortraitPosX = 26.0f; + gRadioPortraitPosX = OTRGetRectDimensionFromLeftEdge(26.0f); gRadioPortraitPosY = 178.0f; } diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp index 54e3b487..dfe99eb8 100644 --- a/src/port/ui/ImguiUI.cpp +++ b/src/port/ui/ImguiUI.cpp @@ -100,24 +100,24 @@ void DrawSettingsMenu(){ .isPercentage = true, })) { float val = CVarGetFloat("gMainMusicVolume", 1.0f) * 100; - gSaveFile.save.data.musicVolume = val; - Audio_SetVolume(AUDIO_TYPE_MUSIC, val); + gSaveFile.save.data.musicVolume = (u8) val; + Audio_SetVolume(AUDIO_TYPE_MUSIC, (u8) val); } if (UIWidgets::CVarSliderFloat("Voice Volume", "gVoiceVolume", 0.0f, 1.0f, 1.0f, { .format = "%.0f%%", .isPercentage = true, })) { float val = CVarGetFloat("gVoiceVolume", 1.0f) * 100; - gSaveFile.save.data.voiceVolume = val; - Audio_SetVolume(AUDIO_TYPE_VOICE, val); + gSaveFile.save.data.voiceVolume = (u8) val; + Audio_SetVolume(AUDIO_TYPE_VOICE, (u8) val); } if (UIWidgets::CVarSliderFloat("Sound Effects Volume", "gSFXMusicVolume", 0.0f, 1.0f, 1.0f, { .format = "%.0f%%", .isPercentage = true, })) { float val = CVarGetFloat("gSFXMusicVolume", 1.0f) * 100; - gSaveFile.save.data.sfxVolume = val; - Audio_SetVolume(AUDIO_TYPE_SFX, val); + gSaveFile.save.data.sfxVolume = (u8) val; + Audio_SetVolume(AUDIO_TYPE_SFX, (u8) val); } static std::unordered_map audioBackendNames = { @@ -543,7 +543,7 @@ void DrawDebugMenu() { }); UIWidgets::CVarCheckbox("SFX Jukebox", "gSfxJukebox", { - .tooltip = "Allows you to play sound effects from the game" + .tooltip = "Press L in the Expert Sound options to play sound effects from the game" }); UIWidgets::CVarCheckbox("Spawner Mod", "gSpawnerMod", { diff --git a/tools/Torch b/tools/Torch index c7d12dad..ed4ee26f 160000 --- a/tools/Torch +++ b/tools/Torch @@ -1 +1 @@ -Subproject commit c7d12dadb52c69bf2ada005006cfd0da5a14f615 +Subproject commit ed4ee26fe6d6ec113efc54d188c5864f44c1e14d