Start work on audio settings
This commit is contained in:
parent
6983afe8e1
commit
29919c1fa5
29
src/menu/audio_options.c
Normal file
29
src/menu/audio_options.c
Normal 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
15
src/menu/audio_options.h
Normal 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
|
|
@ -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]);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ void mainMenuInit(struct MainMenu* mainMenu) {
|
|||
newGameInit(&mainMenu->newGameMenu);
|
||||
optionsMenuInit(&mainMenu->optionsMenu);
|
||||
|
||||
mainMenu->state = MainMenuStateLanding;
|
||||
mainMenu->state = MainMenuStateOptions;
|
||||
|
||||
mainMenuReadCamera(mainMenu);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
struct MenuButton {
|
||||
Gfx* outline;
|
||||
Gfx* text;
|
||||
short x, y;
|
||||
short w, h;
|
||||
};
|
||||
|
||||
enum MenuDirection {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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++);
|
||||
|
|
Loading…
Reference in a new issue