Starship/src/mods/sfxjukebox.c
2024-11-20 19:22:25 -03:00

225 lines
7.0 KiB
C

#include "global.h"
#include "fox_map.h"
#include "fox_option.h"
#include "sf64audio_provisional.h"
extern s32 sSpectrumAnalyzerMode;
extern bool sMusicPlaying;
extern bool sMainMenuFromCancel;
extern OptionId sMenuEntryState;
extern s32 sMainMenuState;
static s32 showJukebox = 0;
static u32 prevSfx = NA_SE_NONE;
static u32 sfx = NA_SE_NONE;
static s32 sfxId = 0;
static u32 sfxBank = SFX_BANK_PLAYER;
static u32 sfxRange = 0;
static s32 sfxImport = 0;
static int holdTimer = 0;
static u8 sfxFlag = 0;
static u8 sfxFlags[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
static char* flagNames[] = { "F18", "F19", "F20", "F21", "F22", "F23", "STT", "F25", "F26", "SFX" };
static u8 bankSizes[] = { 0x33, 0x85, 0x9C, 0x9C, 0x37 };
static u32 sfxEditMode = 9;
static u32 srcEditMode = 0;
static u32 editMode = 0;
static s32 srcVec[3] = { 0, 0, 0 };
static f32 sfxSource[3] = { 0.0f, 0.0f, 0.0f };
static OSContPad* contPress;
static OSContPad* contHold;
void Jukebox_SelectFlag(u8* flag) {
if (contPress->button & (U_CBUTTONS | D_CBUTTONS | R_CBUTTONS | L_CBUTTONS)) {
*flag ^= 1;
}
}
void Jukebox_SelectWrap(u32* option, s32 range) {
if (contPress->button & (U_CBUTTONS | R_CBUTTONS)) {
(*option)++;
} else if (contPress->button & (D_CBUTTONS | L_CBUTTONS)) {
(*option)--;
}
*option = (*option + range) % range;
}
Jukebox_SelectClamp(s32* option, s32 range, s32 skip) {
if (contHold->button & (U_CBUTTONS | D_CBUTTONS)) {
holdTimer++;
} else {
holdTimer = 0;
}
if (((contHold->button & U_CBUTTONS) && (holdTimer > 15)) || (contPress->button & U_CBUTTONS)) {
(*option)++;
} else if (((contHold->button & D_CBUTTONS) && (holdTimer > 15)) || (contPress->button & D_CBUTTONS)) {
(*option)--;
} else if (contPress->button & L_CBUTTONS) {
*option -= skip;
} else if (contPress->button & R_CBUTTONS) {
*option += skip;
}
if (*option < 0) {
*option = 0;
} else if (*option >= range) {
*option = range - 1;
}
}
void Jukebox_UpdateSource(void) {
if (contPress->button & L_JPAD) {
srcEditMode--;
} else if (contPress->button & R_JPAD) {
srcEditMode++;
}
srcEditMode = (srcEditMode + 3) % 3;
if (contHold->button & (U_CBUTTONS | D_CBUTTONS | L_CBUTTONS | R_CBUTTONS)) {
holdTimer++;
} else {
holdTimer = 0;
}
if (((contHold->button & U_CBUTTONS) && (holdTimer > 15)) || (contPress->button & U_CBUTTONS)) {
sfxSource[srcEditMode] += 100.0f;
} else if (((contHold->button & D_CBUTTONS) && (holdTimer > 15)) || (contPress->button & D_CBUTTONS)) {
sfxSource[srcEditMode] -= 100.0f;
} else if (((contHold->button & R_CBUTTONS) && (holdTimer > 15)) || (contPress->button & R_CBUTTONS)) {
sfxSource[srcEditMode] += 10.0f;
} else if (((contHold->button & L_CBUTTONS) && (holdTimer > 15)) || (contPress->button & L_CBUTTONS)) {
sfxSource[srcEditMode] -= 10.0f;
}
}
void Jukebox_UpdateSfx(void) {
s32 i;
u16 flags = 0;
if (contPress->button & L_JPAD) {
sfxEditMode--;
} else if (contPress->button & R_JPAD) {
sfxEditMode++;
}
sfxEditMode = (sfxEditMode + 13) % 13;
switch (sfxEditMode) {
case 9:
Jukebox_SelectWrap(&sfxBank, 5);
break;
case 10:
Jukebox_SelectClamp(&sfxId, bankSizes[sfxBank], 0x10);
break;
case 11:
Jukebox_SelectFlag(&sfxFlag);
break;
case 12:
Jukebox_SelectWrap(&sfxRange, 4);
break;
case 8:
Jukebox_SelectClamp(&sfxImport, 0x100, 0x10);
break;
default:
if ((sfxEditMode >= 0) && (sfxEditMode < 8)) {
Jukebox_SelectFlag(&sfxFlags[sfxEditMode]);
}
break;
}
for (i = 0; i < 8; i++) {
flags |= sfxFlags[i] << (i + (i > 5));
}
sfx = SFX_PACK(sfxBank, sfxId, sfxRange, sfxImport, (sfxFlag << 27) | (flags << 18));
}
s32 sfxModeX[] = { 95, 104, 113, 122, 131, 140, 149, 158, 180, 0, 22, 43, 60 };
s32 srcModeX[] = { 45, 135, 225 };
void Jukebox_Update(void) {
s32 i;
contPress = &gControllerPress[gMainController];
contHold = &gControllerHold[gMainController];
if (contPress->button & U_JPAD) {
editMode--;
} else if (contPress->button & D_JPAD) {
editMode++;
}
editMode %= 2;
switch (editMode) {
case 0:
Jukebox_UpdateSfx();
break;
case 1:
Jukebox_UpdateSource();
break;
}
if (prevSfx != sfx) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
prevSfx = sfx;
}
if (contPress->button & A_BUTTON) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM, 1);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 1);
AUDIO_PLAY_SFX(sfx, sfxSource, 4);
sMusicPlaying = true;
}
if (contPress->button & B_BUTTON) {
if (!sMusicPlaying) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
AUDIO_PLAY_BGM(NA_BGM_SELECT);
gDrawMode = DRAW_NONE;
sMenuEntryState = 1000;
sMainMenuState = 0;
sMainMenuFromCancel = 1;
return;
} else {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
Audio_KillSfxBySource(sfxSource);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM, 1);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 1);
sMusicPlaying = false;
}
}
// Spectrum Analyzer mode selector
if (contPress->button & Z_TRIG) {
sSpectrumAnalyzerMode++;
if (sSpectrumAnalyzerMode > 2) {
sSpectrumAnalyzerMode = 0;
}
}
/* Draw */
RCP_SetupDL(&gMasterDisp, SETUPDL_83_POINT);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_Printf("SFX ID: %08X", sfx);
Graphics_DisplaySmallText(20, 50, 1.0f, 1.0f, D_801619A0);
Graphics_DisplaySmallText(20, 80, 1.0f, 1.0f, "B ID X R S FLAG IMP");
Graphics_Printf("%d %02X %d %d %d %d%d%d%d%d%d%d%d %02X", sfxBank, sfxId, sfxFlag, sfxRange, 1, sfxFlags[0],
sfxFlags[1], sfxFlags[2], sfxFlags[3], sfxFlags[4], sfxFlags[5], sfxFlags[6], sfxFlags[7],
sfxImport);
Graphics_DisplaySmallText(20, 70, 1.0f, 1.0f, D_801619A0);
// Graphics_DisplaySmallText(80, 50, 1.0f, 1.0f, hexString);
for (i = 0; i < 3; i++) {
Graphics_Printf("%5.0f", sfxSource[i]);
Graphics_DisplaySmallText(20 + 90 * i, 100, 1.0f, 1.0f, D_801619A0);
}
Graphics_DisplaySmallText(45, 110, 1.0f, 1.0f, "X");
Graphics_DisplaySmallText(135, 110, 1.0f, 1.0f, "Y");
Graphics_DisplaySmallText(225, 110, 1.0f, 1.0f, "Z");
switch (editMode) {
case 0:
Graphics_DisplaySmallText(20 + sfxModeX[sfxEditMode], 60, 1.0f, 1.0f, "V");
break;
case 1:
Graphics_DisplaySmallText(45 + 90 * srcEditMode, 90, 1.0f, 1.0f, "V");
break;
}
}