build out video options tab

This commit is contained in:
James Lambert 2023-11-11 14:07:49 -07:00
parent 438e45895a
commit dd05a3897e
8 changed files with 254 additions and 14 deletions

View file

@ -358,6 +358,7 @@ build/src/scene/switch.o: build/assets/models/props/switch001.h build/assets/mat
build/src/util/dynamic_asset_data.o: build/assets/models/dynamic_model_list_data.h
build/src/util/dynamic_asset_loader.o: build/assets/models/dynamic_model_list.h build/assets/models/dynamic_animated_model_list.h
build/src/menu/audio_options.o: build/src/audio/subtitles.h
build/src/menu/video_options.o: build/src/audio/subtitles.h
build/src/scene/scene.o: build/src/audio/subtitles.h
build/src/menu/main_menu.o: build/src/audio/subtitles.h

View file

@ -5,8 +5,6 @@
#include "../font/dejavusans.h"
#include "../audio/soundplayer.h"
#include "../build/src/audio/subtitles.h"
#include "../build/assets/materials/ui.h"
#include "../build/src/audio/clips.h"
#include "../build/src/audio/languages.h"
#include "./translations.h"
@ -73,7 +71,7 @@ struct MenuElementParams gAudioMenuParams[] = {
.params = {
.checkbox = {
.font = &gDejaVuSansFont,
.messageId = GAMEUI_SUBTITLESANDSOUNDEFFECTS,
.messageId = GAMEUI_SUBTITLES,
},
},
.selectionIndex = AudioOptionSubtitlesEnabled,
@ -85,7 +83,7 @@ struct MenuElementParams gAudioMenuParams[] = {
.params = {
.checkbox = {
.font = &gDejaVuSansFont,
.messageId = AUDIO_ALL_CAPTIONS,
.messageId = GAMEUI_SUBTITLESANDSOUNDEFFECTS,
}
},
.selectionIndex = AudioOptionAllSubtitlesEnabled,
@ -222,10 +220,6 @@ void audioOptionsActoin(void* data, int selection, struct MenuAction* action) {
}
void audioOptionsInit(struct AudioOptions* audioOptions) {
if (gSaveData.controls.subtitleLanguage < 0 || gSaveData.controls.subtitleLanguage >= NUM_SUBTITLE_LANGUAGES) {
gSaveData.controls.subtitleLanguage = 0;
}
if (gSaveData.audio.audioLanguage < 0 || gSaveData.audio.audioLanguage >= NUM_AUDIO_LANGUAGES) {
gSaveData.audio.audioLanguage = 0;
}
@ -244,11 +238,6 @@ void audioOptionsInit(struct AudioOptions* audioOptions) {
menuBuilderSetFSlider(&audioOptions->menuBuilder.elements[AUDIO_VOLUME_VALUE_INDEX], gSaveData.audio.soundVolume / (float)(0xFFFF));
menuBuilderSetFSlider(&audioOptions->menuBuilder.elements[MUSIC_VOLUME_VALUE_INDEX], gSaveData.audio.musicVolume / (float)(0xFFFF));
menuBuilderSetCheckbox(&audioOptions->menuBuilder.elements[ALL_SUBTITLES_CHECKBOX_INDEX], (gSaveData.controls.flags & ControlSaveAllSubtitlesEnabled) != 0);
menuBuilderSetCheckbox(&audioOptions->menuBuilder.elements[SUBTITLES_CHECKBOX_INDEX], (gSaveData.controls.flags & ControlSaveSubtitlesEnabled) != 0);
menuBuilderSetISlider(&audioOptions->menuBuilder.elements[TEXT_LANGUAGE_VALUE_INDEX], gSaveData.controls.subtitleLanguage);
menuBuilderSetISlider(&audioOptions->menuBuilder.elements[AUDIO_LANGUAGE_VALUE_INDEX], gSaveData.audio.audioLanguage);
}

View file

@ -55,12 +55,14 @@ void optionsMenuInit(struct OptionsMenu* options) {
controlsMenuInit(&options->controlsMenu);
joystickOptionsInit(&options->joystickOptions);
audioOptionsInit(&options->audioOptions);
videoOptionsInit(&options->videoOptions);
gameplayOptionsInit(&options->gameplayOptions);
}
void optionsMenuRebuildText(struct OptionsMenu* options) {
controlsRebuildtext(&options->controlsMenu);
audioOptionsRebuildtext(&options->audioOptions);
videoOptionsRebuildtext(&options->videoOptions);
tabsRebuildText(&options->tabs);
}
@ -75,6 +77,9 @@ enum MenuDirection optionsMenuUpdate(struct OptionsMenu* options) {
case OptionsMenuTabsAudio:
audioOptionsUpdate(&options->audioOptions);
break;
case OptionsMenuTabsVideo:
videoOptionsUpdate(&options->videoOptions);
break;
case OptionsMenuTabsGameplay:
gameplayOptionsUpdate(&options->gameplayOptions);
break;
@ -153,6 +158,9 @@ void optionsMenuRender(struct OptionsMenu* options, struct RenderState* renderSt
case OptionsMenuTabsAudio:
audioOptionsRender(&options->audioOptions, renderState, task);
break;
case OptionsMenuTabsVideo:
videoOptionsRender(&options->videoOptions, renderState, task);
break;
case OptionsMenuTabsGameplay:
gameplayOptionsRender(&options->gameplayOptions, renderState, task);
break;

View file

@ -8,6 +8,7 @@
#include "./audio_options.h"
#include "./joystick_options.h"
#include "./gameplay_options.h"
#include "./video_options.h"
enum OptionsMenuTabs {
OptionsMenuTabsControlMapping,
@ -28,6 +29,7 @@ struct OptionsMenu {
struct ControlsMenu controlsMenu;
struct JoystickOptions joystickOptions;
struct AudioOptions audioOptions;
struct VideoOptions videoOptions;
struct GameplayOptions gameplayOptions;
};

203
src/menu/video_options.c Normal file
View file

@ -0,0 +1,203 @@
#include "video_options.h"
#include "../font/dejavusans.h"
#include "./translations.h"
#include "../savefile/savefile.h"
#include "../main.h"
#include "../build/src/audio/subtitles.h"
#define MENU_Y 54
#define MENU_WIDTH 252
#define MENU_HEIGHT 124
#define MENU_X ((SCREEN_WD - MENU_WIDTH) / 2)
struct MenuElementParams gVideoMenuParams[] = {
{
.type = MenuElementTypeCheckbox,
.x = MENU_X + 8,
.y = MENU_Y + 8,
.params = {
.checkbox = {
.font = &gDejaVuSansFont,
.messageId = GAMEUI_ASPECTWIDE,
},
},
.selectionIndex = VideoOptionWidescreen,
},
{
.type = MenuElementTypeCheckbox,
.x = MENU_X + 8,
.y = MENU_Y + 28,
.params = {
.checkbox = {
.font = &gDejaVuSansFont,
.messageId = GAMEUI_INTERLACED,
},
},
.selectionIndex = VideoOptionInterlaced,
},
{
.type = MenuElementTypeText,
.x = MENU_X + 8,
.y = MENU_Y + 48,
.params = {
.checkbox = {
.font = &gDejaVuSansFont,
.messageId = GAMEUI_CAPTIONING,
},
},
.selectionIndex = -1,
},
{
.type = MenuElementTypeCheckbox,
.x = MENU_X + 8,
.y = MENU_Y + 68,
.params = {
.checkbox = {
.font = &gDejaVuSansFont,
.messageId = GAMEUI_SUBTITLES,
},
},
.selectionIndex = VideoOptionSubtitles,
},
{
.type = MenuElementTypeCheckbox,
.x = MENU_X + 8,
.y = MENU_Y + 88,
.params = {
.checkbox = {
.font = &gDejaVuSansFont,
.messageId = GAMEUI_SUBTITLESANDSOUNDEFFECTS,
}
},
.selectionIndex = VideoOptionCaptions,
},
{
.type = MenuElementTypeSlider,
.x = MENU_X + 8,
.y = MENU_Y + 124,
.params = {
.slider = {
.width = 232,
.numberOfTicks = NUM_SUBTITLE_LANGUAGES,
.discrete = 1,
},
},
.selectionIndex = VideoOptionTextLanguage,
},
{
.type = MenuElementTypeText,
.x = MENU_X + 8,
.y = MENU_Y + 108,
.params = {
.text = {
.font = &gDejaVuSansFont,
.messageId = AUDIO_TEXT_LANGUAGE,
},
},
.selectionIndex = VideoOptionTextLanguage,
},
{
.type = MenuElementTypeText,
.x = MENU_X + 125,
.y = MENU_Y + 108,
.params = {
.text = {
.font = &gDejaVuSansFont,
.message = "",
},
},
.selectionIndex = VideoOptionTextLanguage,
},
};
#define WIDESCREEN_INDEX 0
#define INTERLACED_INDEX 1
#define SUBTITLES_INDEX 3
#define CAPTIONS_INDEX 4
#define LANGUAGE_TEXT_INDEX 7
void videoOptionsAction(void* data, int selection, struct MenuAction* action) {
struct VideoOptions* videoOptions = (struct VideoOptions*)data;
switch (selection) {
case VideoOptionWidescreen:
if (action->state.checkbox.isChecked) {
gSaveData.controls.flags |= ControlSaveWideScreen;
} else {
gSaveData.controls.flags &= ~ControlSaveWideScreen;
}
break;
case VideoOptionInterlaced:
if (action->state.checkbox.isChecked) {
gSaveData.controls.flags |= ControlSaveInterlacedMode;
} else {
gSaveData.controls.flags &= ~ControlSaveInterlacedMode;
}
setViMode(1);
break;
case VideoOptionSubtitles:
if (action->state.checkbox.isChecked) {
gSaveData.controls.flags |= ControlSaveSubtitlesEnabled;
gSaveData.controls.flags &= ~ControlSaveAllSubtitlesEnabled;
menuBuilderSetCheckbox(&videoOptions->menuBuilder.elements[CAPTIONS_INDEX], 0);
} else {
gSaveData.controls.flags &= ~ControlSaveSubtitlesEnabled;
}
break;
case VideoOptionCaptions:
if (action->state.checkbox.isChecked) {
gSaveData.controls.flags |= ControlSaveAllSubtitlesEnabled;
gSaveData.controls.flags &= ~ControlSaveSubtitlesEnabled;
menuBuilderSetCheckbox(&videoOptions->menuBuilder.elements[SUBTITLES_INDEX], 0);
} else {
gSaveData.controls.flags &= ~ControlSaveAllSubtitlesEnabled;
}
break;
case VideoOptionTextLanguage:
gSaveData.controls.subtitleLanguage = action->state.iSlider.value;
gVideoMenuParams[LANGUAGE_TEXT_INDEX].params.text.message = SubtitleLanguages[gSaveData.controls.subtitleLanguage];
translationsReload(gSaveData.controls.subtitleLanguage);
break;
}
}
void videoOptionsInit(struct VideoOptions* videoOptions) {
if (gSaveData.controls.subtitleLanguage < 0 || gSaveData.controls.subtitleLanguage >= NUM_SUBTITLE_LANGUAGES) {
gSaveData.controls.subtitleLanguage = 0;
}
gVideoMenuParams[LANGUAGE_TEXT_INDEX].params.text.message = SubtitleLanguages[gSaveData.controls.subtitleLanguage];
menuBuilderInit(
&videoOptions->menuBuilder,
gVideoMenuParams,
sizeof(gVideoMenuParams) / sizeof(*gVideoMenuParams),
VideoOptionCount,
videoOptionsAction,
videoOptions
);
menuBuilderSetCheckbox(&videoOptions->menuBuilder.elements[WIDESCREEN_INDEX], (gSaveData.controls.flags & ControlSaveWideScreen) != 0);
menuBuilderSetCheckbox(&videoOptions->menuBuilder.elements[INTERLACED_INDEX], (gSaveData.controls.flags & ControlSaveInterlacedMode) != 0);
menuBuilderSetCheckbox(&videoOptions->menuBuilder.elements[CAPTIONS_INDEX], (gSaveData.controls.flags & ControlSaveAllSubtitlesEnabled) != 0);
menuBuilderSetCheckbox(&videoOptions->menuBuilder.elements[SUBTITLES_INDEX], (gSaveData.controls.flags & ControlSaveSubtitlesEnabled) != 0);
menuBuilderSetISlider(&videoOptions->menuBuilder.elements[LANGUAGE_TEXT_INDEX], gSaveData.controls.subtitleLanguage);
}
void videoOptionsRebuildtext(struct VideoOptions* videoOptions) {
menuBuilderRebuildText(&videoOptions->menuBuilder);
}
enum MenuDirection videoOptionsUpdate(struct VideoOptions* videoOptions) {
return menuBuilderUpdate(&videoOptions->menuBuilder);
}
void videoOptionsRender(struct VideoOptions* videoOptions, struct RenderState* renderState, struct GraphicsTask* task) {
menuBuilderRender(&videoOptions->menuBuilder, renderState);
}

27
src/menu/video_options.h Normal file
View file

@ -0,0 +1,27 @@
#ifndef __OPTIONS_VIDEO_OPTIONS_H__
#define __OPTIONS_VIDEO_OPTIONS_H__
#include "./menu.h"
#include "./menu_builder.h"
#include "../graphics/graphics.h"
enum VideoOption {
VideoOptionWidescreen,
VideoOptionInterlaced,
VideoOptionSubtitles,
VideoOptionCaptions,
VideoOptionTextLanguage,
VideoOptionCount,
};
struct VideoOptions {
struct MenuBuilder menuBuilder;
};
void videoOptionsInit(struct VideoOptions* videoOptions);
void videoOptionsRebuildtext(struct VideoOptions* videoOptions);
enum MenuDirection videoOptionsUpdate(struct VideoOptions* videoOptions);
void videoOptionsRender(struct VideoOptions* videoOptions, struct RenderState* renderState, struct GraphicsTask* task);
#endif

View file

@ -8,6 +8,7 @@ from os.path import exists
hl_gameui_whitelist = {
"GAMEUI_AUDIO",
"GAMEUI_AUTOSAVE",
"GAMEUI_CAPTIONING",
"GAMEUI_CHAPTER",
"GAMEUI_GAMEMENU_QUIT",
"GAMEUI_GAMEMENU_RESUMEGAME",
@ -21,9 +22,11 @@ hl_gameui_whitelist = {
"GAMEUI_PORTAL",
"GAMEUI_SAVEGAME",
"GAMEUI_SOUNDEFFECTVOLUME",
"GAMEUI_SUBTITLES",
"GAMEUI_SUBTITLESANDSOUNDEFFECTS",
"GAMEUI_USEDEFAULTS",
"GAMEUI_VIDEO",
"GAMEUI_ASPECTWIDE",
}
portal_whitelist = {
@ -116,10 +119,17 @@ def get_caption_keys_values_language(lines):
keyval= line.split('" "')
if len(keyval) != 2:
continue
if "[$WIN32]" in keyval[1]:
continue
if "[english]" in keyval[0] or 'commentary' in keyval[0]:
continue
if "[$X360]" in keyval[1]:
keyval[1] = keyval[1].replace("[$X360]", "")
key = keyval[0].replace('"', "").replace(".", "_").replace("-", "_").replace('\\', "_").replace('#', "").upper()
val = keyval[1].replace('"', "").replace("\n", "").replace("\\", "")
val = keyval[1].replace('"', "").replace("\n", "").replace("\\", "").strip()
val = re.sub(r'\<clr.+\>','',val)
val = re.sub(r'\<norepeat.+\>','',val)
val = val.replace("<sfx>", "")