mirror of
https://github.com/izzy2lost/Starship.git
synced 2026-07-05 15:19:42 -07:00
[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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
+121
-112
File diff suppressed because it is too large
Load Diff
@@ -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];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user