[MOD] Level Select & Sound Effects Jukebox (#76)

* level select mod

* map name

* move mod to c file

* Sfx Jukebox

* fix bank boundaries

* fix

* expert modes

* co-authored-by @petrie911

* add sfx
This commit is contained in:
Alejandro Asenjo Nitti
2024-01-12 14:11:40 -03:00
committed by GitHub
parent 410a5b017b
commit 921bceb967
11 changed files with 331 additions and 129 deletions
+1 -1
View File
@@ -235,7 +235,7 @@ void func_EBFBE0_80194BD0(void);
void func_EBFBE0_80194CE4(void);
void func_EBFBE0_801952B4(void);
void func_EBFBE0_801958DC(void);
void func_EBFBE0_80195944(void);
void Option_ExpertSoundUpdate(void);
void func_EBFBE0_80195B74(void);
void func_EBFBE0_80196260(void);
void func_EBFBE0_801962A4(void);
-1
View File
@@ -71,7 +71,6 @@ extern s32 gLevelMode;
extern s32 gTeamShields[];
extern s32 D_801778BC;
extern s32 gVersusMode;
extern s32 D_80177B48;
extern s32 D_80177B50[];
extern s32 D_80177B70[];
extern s32 D_80177E7C;
+24
View File
@@ -0,0 +1,24 @@
#ifndef MODS_H
#define MODS_H
/**
* Level Select:
* Press left or right on the D-PAD to choose which level to play,
* useful for debugging and speedrunning training.
*/
#define MODS_LEVEL_SELECT 0
/**
* Sound Effects Jukebox:
* Ability to play sound effects inside the expert sound menu
*/
#define MODS_SFX_JUKEBOX 0
/* ************************* */
#if MODS_LEVEL_SELECT == 1
void Map_LevelSelect(void);
#endif
#endif
+1 -1
View File
@@ -514,7 +514,7 @@ extern s32 gMainController;
extern s32 D_80177B00[4][4];
extern s32 D_80177B40;
extern u8 D_Timer_80177B44;
extern s32 D_80177B48;
extern s32 gCurrentPlanet; // D_80177B48
extern u8 D_80177B4C;
extern s32 D_80177B50[7];
extern u8 D_80177B6C;
@@ -1,8 +1,10 @@
Option_ExpertSoundUpdate = 0x80195944;
planet = 0x801AF4A0; // type:Planet segment:ovl_menu size:0x38
sPlanetNames = 0x801AF9F4; // type:s32 segment:ovl_menu size:0xF
GetPlanetId = 0x801A6480; // force_migration:True segment:ovl_menu
D_EBFBE0_801AE638 = 0x801AE638; // type:MenuContext segment:ovl_menu size:0x240
D_EBFBE0_801AE99C = 0x801AE99C; // force_migration:True segment:ovl_menu
sPlanetList = 0x801AF7E8;
spectrumAnalizerMode = 0x801B9318;
D_EBFBE0_801B6E50 = 0x801B6E50; // force_migration:True segment:ovl_menu
D_EBFBE0_801B7BA0 = 0x801B7BA0;
@@ -106,4 +108,5 @@ D_EBFBE0_801CCC10 = 0x801CCC10;
D_EBFBE0_801CCF10 = 0x801CCF10;
D_EBFBE0_801CD210 = 0x801CD210;
D_EBFBE0_801CD510 = 0x801CD510;
sCurrentPlanetId = 0x801CD954;
// sPlanetsPositions = 0x801CE960; // force_migration:True segment:ovl_menu
+1 -1
View File
@@ -473,7 +473,7 @@ gMainController = 0x80177AF8;
D_80177B00 = 0x80177B00;
D_80177B40 = 0x80177B40;
D_Timer_80177B44 = 0x80177B44;
D_80177B48 = 0x80177B48;
gCurrentPlanet = 0x80177B48;
D_80177B50 = 0x80177B50;
D_80177B70 = 0x80177B70;
D_80177B8C = 0x80177B8C;
+3 -3
View File
@@ -399,14 +399,14 @@ void func_800884E4(void) {
s32 var_v1;
s32 i;
D_80177B70[D_80177B48] = gHitCount;
D_80177B70[gCurrentPlanet] = gHitCount;
var_v1 = 0xFF0000;
for (i = 0; i < 3; i++) {
if (gTeamShields[3 - i] <= 0) {
D_80177B50[D_80177B48] ^= var_v1;
D_80177B50[gCurrentPlanet] ^= var_v1;
} else {
D_80177B50[D_80177B48] |= var_v1;
D_80177B50[gCurrentPlanet] |= var_v1;
}
var_v1 >>= 8;
}
+36
View File
@@ -0,0 +1,36 @@
#include "global.h"
#include "fox_map.h"
extern PlanetId sPlanetList[15];
extern s32 sCurrentPlanetId;
void Map_LevelSelect(void) {
static char* sLevelSelectPlanetNames[] = {
"CORNERIA", "METEO", "TITANIA", "SECTOR X", "AQUAS", "BOLSE", "VENOM", "FORTUNA",
"AREA 6", "MACBETH", "SECTOR Z", "ZONESS", "KATINA", "SECTOR Y", "SOLAR",
};
if (gControllerPress[0].button & L_JPAD) {
gCurrentPlanet--;
if (gCurrentPlanet < 0) {
gCurrentPlanet = 14;
}
sCurrentPlanetId = sPlanetList[gCurrentPlanet];
}
if (gControllerPress[0].button & R_JPAD) {
gCurrentPlanet++;
if (gCurrentPlanet > 14) {
gCurrentPlanet = 0;
}
sCurrentPlanetId = sPlanetList[gCurrentPlanet];
}
/* Draw */
RCP_SetupDL(&gMasterDisp, 0x53);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_DisplaySmallText(20, 200, 1.0f, 1.0f, "PLANET:");
Graphics_DisplaySmallText(80, 200, 1.0f, 1.0f, sLevelSelectPlanetNames[gCurrentPlanet]);
}
+119
View File
@@ -0,0 +1,119 @@
#include "global.h"
#include "fox_map.h"
u32 prevSfx = 0;
u32 sfx = 0x09000000;
s32 sfxId = 0;
s32 sfxBank = 0;
int holdTimer = 0;
void decimalToHex(int num, char* hexString, size_t hexStringLength) {
int i;
// Define hexadecimal digits
char hexDigits[] = "0123456789ABCDEF";
// Check for null pointer or insufficient buffer size
if (hexString == NULL || hexStringLength < 9) {
// You might need to adjust the buffer size based on the maximum expected length
return;
}
// Ensure the buffer is null-terminated
hexString[8] = '\0';
// Iterate through each hex digit
for (i = 7; i >= 0; --i) {
// Extract the 4 bits representing one hex digit
int hexValue = (num >> (i * 4)) & 0xF;
// Convert the 4-bit value to its corresponding hex character
hexString[7 - i] = hexDigits[hexValue];
}
}
void Option_ExpertSoundUpdate(void) {
char hexString[9]; // Buffer to store the hexadecimal string
if ((gControllerPress[gMainController].button & R_TRIG) && (sfxBank < 4)) {
sfxBank++;
} else if ((gControllerPress[gMainController].button & L_TRIG) && (sfxBank > 0)) {
sfxBank--;
}
sfx &= 0x0FFFFFFF;
sfx |= (sfxBank << 28);
if (gControllerHold[gMainController].button & (U_JPAD | D_JPAD)) {
holdTimer++;
} else {
holdTimer = 0;
}
if (((gControllerHold[gMainController].button & U_JPAD) && (holdTimer > 15)) ||
(gControllerPress[gMainController].button & U_JPAD)) {
sfxId++;
} else if (((gControllerHold[gMainController].button & D_JPAD) && (holdTimer > 15)) ||
(gControllerPress[gMainController].button & D_JPAD)) {
sfxId--;
} else if (gControllerPress[gMainController].button & L_JPAD) {
sfxId -= 0x10;
} else if (gControllerPress[gMainController].button & R_JPAD) {
sfxId += 0x10;
}
if (((sfxBank == 0) || (sfxBank == 4)) && (sfxId > 0x3F)) {
sfxId = 0x3F;
} else if (((sfxBank == 2) || (sfxBank == 3)) && (sfxId > 0xA7)) {
sfxId = 0xA7;
} else if ((sfxBank == 1) && (sfxId > 0x8F)) {
sfxId = 0x8F;
} else if (sfxId < 0) {
sfxId = 0;
}
sfx &= 0xFFFFFF00;
sfx |= sfxId & 0xFF;
if (prevSfx != sfx) {
Audio_PlaySfx(0x49000002, &D_800C5D28, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C);
prevSfx = sfx;
}
decimalToHex(sfx, hexString, sizeof(hexString));
if (gControllerPress[gMainController].button & A_BUTTON) {
func_800182F4(0x100100FF);
func_800182F4(0x110100FF);
Audio_PlaySfx(sfx, &D_800C5D28, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C);
D_EBFBE0_801B9320 = true;
}
if (gControllerPress[gMainController].button & B_BUTTON) {
if (!D_EBFBE0_801B9320) {
func_8001D444(0, 36, 0, 255);
gDrawMode = DRAWMODE_0;
D_EBFBE0_801B9124 = 1000;
D_EBFBE0_801B912C = 0;
D_EBFBE0_801B9244 = 1;
} else {
Audio_PlaySfx(0x4900101D, &D_800C5D28, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C);
Audio_KillSfx(&D_800C5D28);
func_800182F4(0x100100FF);
func_800182F4(0x110100FF);
D_EBFBE0_801B9320 = false;
}
}
// Spectrum Analizer mode selector
if (gControllerPress[gMainController].button & R_CBUTTONS) {
spectrumAnalizerMode++;
if (spectrumAnalizerMode > 2) {
spectrumAnalizerMode = 0;
}
}
/* Draw */
RCP_SetupDL(&gMasterDisp, 0x53);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_DisplaySmallText(20, 50, 1.0f, 1.0f, "SFX ID:");
Graphics_DisplaySmallText(80, 50, 1.0f, 1.0f, hexString);
}
File diff suppressed because it is too large Load Diff
+22 -10
View File
@@ -4,6 +4,8 @@
* Description: Starfox Option Menu Handler
*/
#include "mods.h"
#include "global.h"
#include "fox_option.h"
@@ -339,7 +341,7 @@ UnkStruct_D_EBFBE0_801B9250 D_EBFBE0_801B9408;
#endif
void func_EBFBE0_80191B20(void) {
s32 var_a1_2;
bool enableExpertModes;
bool var_v0_2;
s32 i;
@@ -357,18 +359,24 @@ void func_EBFBE0_80191B20(void) {
D_EBFBE0_801AE5D0[i] = D_EBFBE0_801AE5A0[i];
}
var_a1_2 = 1;
enableExpertModes = true;
for (i = 0; i < 16; i++) {
if (i == SAVE_SLOT_VENOM_1) {
continue;
}
if (!(gSaveFile.save.data.planet[i].normalMedal & 1)) {
var_a1_2 = 0;
#if MODS_LEVEL_SELECT == 1
enableExpertModes = true;
#elif MODS_SFX_JUKEBOX == 1
enableExpertModes = true;
#else
enableExpertModes = false;
#endif
break;
}
}
D_EBFBE0_801B91C8 = var_a1_2;
D_EBFBE0_801B91C8 = enableExpertModes;
D_80178348 = 0;
D_80178350 = 0;
D_80178354 = 0;
@@ -399,7 +407,7 @@ void func_EBFBE0_80191B20(void) {
if ((D_80161A34 == 5) || (D_80161A34 == 8)) {
if (D_80161A34 == 8) {
D_80177B90[D_80177B48] = 13;
D_80177B90[gCurrentPlanet] = 13;
if (D_800D3180[9] == 1) {
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_1].played = 1;
if (var_v0_2 != 0) {
@@ -409,7 +417,7 @@ void func_EBFBE0_80191B20(void) {
}
Save_Write();
} else if (D_800D3180[9] == 2) {
D_80177BB0[D_80177B48] = 1;
D_80177BB0[gCurrentPlanet] = 1;
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_2].played = 1;
if (var_v0_2) {
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_2].expertClear = 1;
@@ -577,7 +585,7 @@ void func_EBFBE0_80192190(void) {
case 6:
// Expert Sound Options
func_EBFBE0_80195944();
Option_ExpertSoundUpdate();
break;
case 2000:
@@ -1627,7 +1635,10 @@ void func_EBFBE0_801958DC(void) {
}
// Expert Sound Options
void func_EBFBE0_80195944(void) {
#if MODS_SFX_JUKEBOX == 1
#include "../../mods/sfxjukebox.c"
#else
void Option_ExpertSoundUpdate(void) {
s32 pad;
f32 sp28 = D_EBFBE0_801B931C;
@@ -1665,6 +1676,7 @@ void func_EBFBE0_80195944(void) {
}
}
}
#endif
void func_EBFBE0_80195B74(void) {
u8* temp_v0_4;
@@ -3851,7 +3863,7 @@ s32 func_EBFBE0_8019C8C4(void) {
s32 var_a0 = 0;
s32 temp[10];
for (i = 0; i < D_80177B48 + 1; i++) {
for (i = 0; i < gCurrentPlanet + 1; i++) {
var_v0 += ((D_80177B50[i] & 0x00FF0000) >> 16) & 1;
var_v0 += ((D_80177B50[i] & 0x0000FF00) >> 8) & 1;
var_v0 += (D_80177B50[i] & 0x000000FF) & 1;
@@ -4165,7 +4177,7 @@ void func_EBFBE0_8019D624(void) {
sp142[10][1] = D_EBFBE0_801B9150[1][0];
sp142[10][2] = D_EBFBE0_801B9150[2][0];
sp122[10] = D_80177B48 + 1;
sp122[10] = gCurrentPlanet + 1;
sp116[10] = gLifeCount[0];