Start work on audio settings

This commit is contained in:
James Lambert 2023-04-27 20:29:56 -06:00
parent 6983afe8e1
commit 29919c1fa5
10 changed files with 153 additions and 15 deletions

29
src/menu/audio_options.c Normal file
View file

@ -0,0 +1,29 @@
#include "audio_options.h"
#include "../controls/controller.h"
void audioOptionsInit(struct AudioOptions* audioOptions) {
audioOptions->selectedItem = 0;
}
enum MenuDirection audioOptionsUpdate(struct AudioOptions* audioOptions) {
int controllerDir = controllerGetDirectionDown(0);
if (controllerGetButtonDown(0, B_BUTTON)) {
return MenuDirectionUp;
}
if (controllerDir & ControllerDirectionLeft) {
return MenuDirectionLeft;
}
if (controllerDir & ControllerDirectionRight) {
return MenuDirectionRight;
}
return MenuDirectionStay;
}
void audioOptionsRender(struct AudioOptions* audioOptions, struct RenderState* renderState, struct GraphicsTask* task) {
}

15
src/menu/audio_options.h Normal file
View file

@ -0,0 +1,15 @@
#ifndef __MENU_AUDIO_OPTIONS_H__
#define __MENU_AUDIO_OPTIONS_H__
#include "./menu.h"
#include "../graphics/graphics.h"
struct AudioOptions {
short selectedItem;
};
void audioOptionsInit(struct AudioOptions* audioOptions);
enum MenuDirection audioOptionsUpdate(struct AudioOptions* audioOptions);
void audioOptionsRender(struct AudioOptions* audioOptions, struct RenderState* renderState, struct GraphicsTask* task);
#endif

View file

@ -21,6 +21,11 @@
#define SEPARATOR_SPACE 3
#define USE_DEFAULTS_X 190
#define USE_DEFAULTS_Y 186
#define USE_DEFAULTS_WIDTH 96
#define USE_DEFAULTS_HEIGHT 16
struct ControllerIcon {
char x, y;
char w, h;
@ -230,6 +235,13 @@ void controlsMenuInit(struct ControlsMenu* controlsMenu) {
controlsLayout(controlsMenu);
controlsMenu->useDefaults = menuBuildButton(
&gDejaVuSansFont,
"Use Defaults",
USE_DEFAULTS_X, USE_DEFAULTS_Y,
USE_DEFAULTS_WIDTH, USE_DEFAULTS_HEIGHT
);
controlsMenu->scrollOutline = menuBuildOutline(CONTROLS_X, CONTROLS_Y, CONTROLS_WIDTH, CONTROLS_HEIGHT, 1);
}
@ -251,7 +263,7 @@ enum MenuDirection controlsMenuUpdate(struct ControlsMenu* controlsMenu) {
if (controllerDir & ControllerDirectionDown) {
controlsMenu->selectedRow = controlsMenu->selectedRow + 1;
if (controlsMenu->selectedRow == ControllerActionCount) {
if (controlsMenu->selectedRow == ControllerActionCount + 1) {
controlsMenu->selectedRow = 0;
}
}
@ -260,7 +272,7 @@ enum MenuDirection controlsMenuUpdate(struct ControlsMenu* controlsMenu) {
controlsMenu->selectedRow = controlsMenu->selectedRow - 1;
if (controlsMenu->selectedRow < 0) {
controlsMenu->selectedRow = ControllerActionCount - 1;
controlsMenu->selectedRow = ControllerActionCount;
}
}
@ -286,9 +298,14 @@ enum MenuDirection controlsMenuUpdate(struct ControlsMenu* controlsMenu) {
controlsMenu->scrollOffset = newScroll;
controlsLayout(controlsMenu);
}
}
if (controllerGetButtonDown(0, A_BUTTON)) {
if (controllerGetButtonDown(0, A_BUTTON)) {
if (controlsMenu->selectedRow >= 0 && controlsMenu->selectedRow < ControllerActionCount) {
controlsMenu->waitingForAction = gControllerDataRows[controlsMenu->selectedRow].action;
} else if (controlsMenu->selectedRow == ControllerActionCount) {
controllerSetDefaultSource();
controlsLayout(controlsMenu);
}
}
@ -296,11 +313,18 @@ enum MenuDirection controlsMenuUpdate(struct ControlsMenu* controlsMenu) {
return MenuDirectionUp;
}
if (controllerDir & ControllerDirectionLeft) {
return MenuDirectionLeft;
}
if (controllerDir & ControllerDirectionRight) {
return MenuDirectionRight;
}
return MenuDirectionStay;
}
void controlsMenuRender(struct ControlsMenu* controlsMenu, struct RenderState* renderState, struct GraphicsTask* task) {
gSPDisplayList(renderState->dl++, ui_material_list[SOLID_TRANSPARENT_OVERLAY_INDEX]);
gDPFillRectangle(renderState->dl++, CONTROLS_X, CONTROLS_Y, CONTROLS_X + CONTROLS_WIDTH, CONTROLS_Y + CONTROLS_HEIGHT);
gSPDisplayList(renderState->dl++, ui_material_revert_list[SOLID_TRANSPARENT_OVERLAY_INDEX]);
@ -328,11 +352,34 @@ void controlsMenuRender(struct ControlsMenu* controlsMenu, struct RenderState* r
);
}
if (controlsMenu->selectedRow == ControllerActionCount) {
gDPPipeSync(renderState->dl++);
gDPSetEnvColor(renderState->dl++, gSelectionOrange.r, gSelectionOrange.g, gSelectionOrange.b, gSelectionOrange.a);
gDPFillRectangle(
renderState->dl++,
USE_DEFAULTS_X,
USE_DEFAULTS_Y,
USE_DEFAULTS_X + USE_DEFAULTS_WIDTH,
USE_DEFAULTS_Y + USE_DEFAULTS_HEIGHT
);
}
gSPDisplayList(renderState->dl++, controlsMenu->useDefaults.outline);
gSPDisplayList(renderState->dl++, ui_material_revert_list[SOLID_ENV_INDEX]);
gDPSetScissor(renderState->dl++, G_SC_NON_INTERLACE, CONTROLS_X, CONTROLS_Y, CONTROLS_X + CONTROLS_WIDTH, CONTROLS_Y + CONTROLS_HEIGHT);
gSPDisplayList(renderState->dl++, ui_material_list[DEJAVU_SANS_INDEX]);
gDPPipeSync(renderState->dl++);
gDPSetScissor(renderState->dl++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WD, SCREEN_HT);
menuSetRenderColor(renderState, controlsMenu->selectedRow == ControllerActionCount, &gColorBlack, &gColorWhite);
gSPDisplayList(renderState->dl++, controlsMenu->useDefaults.text);
gDPPipeSync(renderState->dl++);
gDPSetEnvColor(renderState->dl++, gColorWhite.r, gColorWhite.g, gColorWhite.b, gColorWhite.a);
gDPSetScissor(renderState->dl++, G_SC_NON_INTERLACE, CONTROLS_X, CONTROLS_Y, CONTROLS_X + CONTROLS_WIDTH, CONTROLS_Y + CONTROLS_HEIGHT);
for (int i = 0; i < ControllerActionCount; ++i) {
if (controlsMenu->selectedRow == i) {
gDPPipeSync(renderState->dl++);
@ -352,6 +399,7 @@ void controlsMenuRender(struct ControlsMenu* controlsMenu, struct RenderState* r
}
renderStateInlineBranch(renderState, controlsMenu->headers[i].headerText);
}
gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_INDEX]);
gSPDisplayList(renderState->dl++, ui_material_list[BUTTON_ICONS_INDEX]);

View file

@ -8,6 +8,8 @@
#define MAX_SOURCES_PER_ACTION 4
#define MAX_CONTROLS_SECTIONS 4
#include "./menu.h"
#define SOURCE_ICON_COUNT MAX_SOURCES_PER_ACTION * GFX_ENTRIES_PER_IMAGE + GFX_ENTRIES_PER_END_DL
struct ControlsMenuRow {
@ -27,6 +29,8 @@ struct ControlsMenu {
struct ControlsMenuHeader headers[MAX_CONTROLS_SECTIONS];
Gfx headerSeparators[MAX_CONTROLS_SECTIONS + GFX_ENTRIES_PER_END_DL];
struct MenuButton useDefaults;
short selectedRow;
short scrollOffset;

View file

@ -24,7 +24,7 @@ void mainMenuInit(struct MainMenu* mainMenu) {
newGameInit(&mainMenu->newGameMenu);
optionsMenuInit(&mainMenu->optionsMenu);
mainMenu->state = MainMenuStateLanding;
mainMenu->state = MainMenuStateOptions;
mainMenuReadCamera(mainMenu);

View file

@ -148,6 +148,12 @@ struct MenuButton menuBuildButton(struct Font* font, char* message, int x, int y
result.text = menuBuildText(font, message, x + 4, y + 2);
result.outline = menuBuildOutline(x, y, width, height, 0);
result.x = x;
result.y = y;
result.w = width;
result.h = height;
return result;
}

View file

@ -9,6 +9,8 @@
struct MenuButton {
Gfx* outline;
Gfx* text;
short x, y;
short w, h;
};
enum MenuDirection {

View file

@ -40,23 +40,45 @@ void optionsMenuInit(struct OptionsMenu* options) {
);
controlsMenuInit(&options->controlsMenu);
audioOptionsInit(&options->audioOptions);
}
enum MainMenuState optionsMenuUpdate(struct OptionsMenu* options) {
enum MenuDirection menuDirection = MenuDirectionStay;
switch (options->tabs.selectedTab) {
case 0:
case OptionsMenuTabsControls:
menuDirection = controlsMenuUpdate(&options->controlsMenu);
break;
case OptionsMenuTabsAudio:
menuDirection = audioOptionsUpdate(&options->audioOptions);
break;
}
switch (menuDirection) {
case MenuDirectionUp:
return MainMenuStateLanding;
default:
return MainMenuStateOptions;
};
if (menuDirection == MenuDirectionUp) {
return MainMenuStateLanding;
}
if (menuDirection == MenuDirectionLeft) {
if (options->tabs.selectedTab == 0) {
tabsSetSelectedTab(&options->tabs, OptionsMenuTabsCount - 1);
} else {
tabsSetSelectedTab(&options->tabs, options->tabs.selectedTab - 1);
}
tabsSetSelectedTab(&options->tabs, options->tabs.selectedTab);
}
if (menuDirection == MenuDirectionRight) {
if (options->tabs.selectedTab == OptionsMenuTabsCount - 1) {
tabsSetSelectedTab(&options->tabs, 0);
} else {
tabsSetSelectedTab(&options->tabs, options->tabs.selectedTab + 1);
}
}
return MainMenuStateOptions;
}
void optionsMenuRender(struct OptionsMenu* options, struct RenderState* renderState, struct GraphicsTask* task) {
@ -79,8 +101,11 @@ void optionsMenuRender(struct OptionsMenu* options, struct RenderState* renderSt
gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_INDEX]);
switch (options->tabs.selectedTab) {
case 0:
case OptionsMenuTabsControls:
controlsMenuRender(&options->controlsMenu, renderState, task);
break;
case OptionsMenuTabsAudio:
audioOptionsRender(&options->audioOptions, renderState, task);
break;
}
}

View file

@ -6,6 +6,14 @@
#include "./menu_state.h"
#include "./tabs.h"
#include "./controls.h"
#include "./audio_options.h"
enum OptionsMenuTabs {
OptionsMenuTabsControls,
OptionsMenuTabsAudio,
OptionsMenuTabsCount,
};
struct OptionsMenu {
Gfx* menuOutline;
@ -14,6 +22,7 @@ struct OptionsMenu {
struct Tabs tabs;
struct ControlsMenu controlsMenu;
struct AudioOptions audioOptions;
};
void optionsMenuInit(struct OptionsMenu* options);

View file

@ -14,7 +14,7 @@ void tabsSetSelectedTab(struct Tabs* tabs, int index) {
return;
}
tabs->selectedTab = 0;
tabs->selectedTab = index;
Gfx* dl = tabs->tabOutline;
@ -48,7 +48,7 @@ void tabsSetSelectedTab(struct Tabs* tabs, int index) {
if (selectedTab) {
gDPFillRectangle(dl++, tabs->x, tabs->y + TAB_HEIGHT, selectedTab->x, tabs->y + TAB_HEIGHT + 1);
gDPFillRectangle(dl++, tabs->x + selectedTab->width, tabs->y + TAB_HEIGHT, tabs->x + tabs->width, tabs->y + TAB_HEIGHT + 1);
gDPFillRectangle(dl++, selectedTab->x + selectedTab->width, tabs->y + TAB_HEIGHT, tabs->x + tabs->width, tabs->y + TAB_HEIGHT + 1);
}
gSPEndDisplayList(dl++);