From dd05a3897e8d66c456e2b11e335566a6dab9a0ca Mon Sep 17 00:00:00 2001 From: James Lambert Date: Sat, 11 Nov 2023 14:07:49 -0700 Subject: [PATCH] build out video options tab --- Makefile | 1 + assets/translations/extra_english.txt | Bin 610 -> 616 bytes src/menu/audio_options.c | 15 +- src/menu/options_menu.c | 8 + src/menu/options_menu.h | 2 + src/menu/video_options.c | 203 +++++++++++++++++++++++ src/menu/video_options.h | 27 +++ tools/level_scripts/subtitle_generate.py | 12 +- 8 files changed, 254 insertions(+), 14 deletions(-) create mode 100644 src/menu/video_options.c create mode 100644 src/menu/video_options.h diff --git a/Makefile b/Makefile index 32213aa..0df2c83 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/assets/translations/extra_english.txt b/assets/translations/extra_english.txt index bde2ce5499fce92651ae47ed98818d37187c8a6d..518e00790b1de846d7a071e8b12d8d16e2b493fd 100644 GIT binary patch delta 95 zcmaFF@`7c;q>Z= 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); } diff --git a/src/menu/options_menu.c b/src/menu/options_menu.c index 40eb7bd..bb7ef65 100644 --- a/src/menu/options_menu.c +++ b/src/menu/options_menu.c @@ -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; diff --git a/src/menu/options_menu.h b/src/menu/options_menu.h index 22f9f2e..d3b5adf 100644 --- a/src/menu/options_menu.h +++ b/src/menu/options_menu.h @@ -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; }; diff --git a/src/menu/video_options.c b/src/menu/video_options.c new file mode 100644 index 0000000..cfc2699 --- /dev/null +++ b/src/menu/video_options.c @@ -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); +} + diff --git a/src/menu/video_options.h b/src/menu/video_options.h new file mode 100644 index 0000000..adb206d --- /dev/null +++ b/src/menu/video_options.h @@ -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 \ No newline at end of file diff --git a/tools/level_scripts/subtitle_generate.py b/tools/level_scripts/subtitle_generate.py index e1bdcb4..2896b07 100644 --- a/tools/level_scripts/subtitle_generate.py +++ b/tools/level_scripts/subtitle_generate.py @@ -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'\','',val) val = re.sub(r'\','',val) val = val.replace("", "")