diff --git a/Makefile b/Makefile index 853dc1d..9431591 100644 --- a/Makefile +++ b/Makefile @@ -497,12 +497,12 @@ build/src/decor/decor_object_list.o: build/src/audio/clips.h ## Subtitles #################### -SUBTITLE_LANGUAGES = brazilian \ +SUBTITLE_LANGUAGES = english \ + brazilian \ bulgarian \ czech \ danish \ german \ - english \ spanish \ greek \ french \ @@ -523,7 +523,7 @@ SUBTITLE_LANGUAGES = brazilian \ SUBTITLE_SOURCES = $(SUBTITLE_LANGUAGES:%=build/src/audio/subtitles_%.c) SUBTITLE_OBJECTS = $(SUBTITLE_LANGUAGES:%=build/src/audio/subtitles_%.o) -build/src/audio/subtitles.h build/src/audio/subtitles.c build/subtitles.ld $(SUBTITLE_SOURCES): vpk/Portal/portal/resource/closecaption_english.txt vpk/Portal/hl2/resource/gameui_english.txt tools/level_scripts/subtitle_generate.py +build/src/audio/subtitles.h build/src/audio/subtitles.c build/subtitles.ld $(SUBTITLE_SOURCES): vpk/Portal/portal/resource/closecaption_english.txt vpk/Portal/hl2/resource/gameui_english.txt tools/level_scripts/subtitle_generate.py assets/translations/extra_english.txt python3 tools/level_scripts/subtitle_generate.py $(SUBTITLE_LANGUAGES) #################### diff --git a/assets/translations/extra_english.txt b/assets/translations/extra_english.txt index 92523ad..c1f9dac 100644 Binary files a/assets/translations/extra_english.txt and b/assets/translations/extra_english.txt differ diff --git a/src/menu/audio_options.c b/src/menu/audio_options.c index 8076d4b..8beaa78 100644 --- a/src/menu/audio_options.c +++ b/src/menu/audio_options.c @@ -15,93 +15,6 @@ #define GAMEPLAY_HEIGHT 124 #define GAMEPLAY_X ((SCREEN_WD - GAMEPLAY_WIDTH) / 2) -#define SCROLL_TICKS_VOLUME 9 -#define SCROLL_INTERVALS_VOLUME (int)maxf((SCROLL_TICKS_VOLUME-1), 1) -#define SCROLL_CHUNK_SIZE_VOLUME (0x10000 / SCROLL_INTERVALS_VOLUME) - -#define SCROLL_TICKS_SUBTITLES (int)maxf(NUM_SUBTITLE_LANGUAGES, 1) -#define SCROLL_INTERVALS_SUBTITLES (int)maxf((SCROLL_TICKS_SUBTITLES - 1), 1) -#define SCROLL_CHUNK_SIZE_SUBTITLES (0x10000 / SCROLL_INTERVALS_SUBTITLES) - -#define SCROLL_TICKS_LANGUAGE (int)maxf(NUM_AUDIO_LANGUAGES, 1) -#define SCROLL_INTERVALS_LANGUAGE (int)maxf((SCROLL_TICKS_LANGUAGE - 1), 1) -#define SCROLL_CHUNK_SIZE_LANGUAGE (0x10000 / SCROLL_INTERVALS_LANGUAGE) - -#define FULL_SCROLL_TIME 2.0f -#define SCROLL_MULTIPLIER (int)(0x10000 * FIXED_DELTA_TIME / (80 * FULL_SCROLL_TIME)) - -void audioOptionsHandleSlider(short selectedItem, unsigned short* settingValue, float* sliderValue) { - - unsigned int chunk_size = 0; - - switch (selectedItem) { - default: - case AudioOptionGameVolume: - case AudioOptionMusicVolume: - chunk_size = SCROLL_CHUNK_SIZE_VOLUME; - break; - case AudioOptionSubtitlesLanguage: - chunk_size = SCROLL_CHUNK_SIZE_SUBTITLES; - break; - case AudioOptionAudioLanguage: - chunk_size = SCROLL_CHUNK_SIZE_LANGUAGE; - break; - } - - OSContPad* pad = controllersGetControllerData(0); - - int newValue = (int)*settingValue + pad->stick_x * SCROLL_MULTIPLIER; - - if (controllerGetButtonDown(0, A_BUTTON | R_JPAD)) { - if (newValue >= 0xFFFF && controllerGetButtonDown(0, A_BUTTON)) { - newValue = 0; - } else { - newValue = newValue + chunk_size; - if ((0x10000 - newValue) > 0 && (0x10000 - newValue) < chunk_size && controllerGetButtonDown(0, A_BUTTON)) - newValue = 0x10000; - else - newValue = newValue - (newValue % chunk_size); - } - soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll); - } - - if (controllerGetButtonDown(0, L_JPAD)) { - newValue = newValue - 1; - newValue = newValue - (newValue % chunk_size); - soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll); - } - - if (newValue < 0) { - newValue = 0; - } - - if (newValue > 0xFFFF) { - newValue = 0xFFFF; - } - - *settingValue = newValue; - *sliderValue = (float)newValue / 0xFFFF; -} - -void audioOptionsRenderText(struct AudioOptions* audioOptions) { - audioOptions->subtitlesEnabled.prerenderedText = menuBuildPrerenderedText( - &gDejaVuSansFont, - translationsGet(GAMEUI_SUBTITLESANDSOUNDEFFECTS), - audioOptions->subtitlesEnabled.x + CHECKBOX_SIZE + 6, - audioOptions->subtitlesEnabled.y - ); - audioOptions->allSubtitlesEnabled.prerenderedText = menuBuildPrerenderedText( - &gDejaVuSansFont, - "All Captions", - audioOptions->allSubtitlesEnabled.x + CHECKBOX_SIZE + 6, - audioOptions->allSubtitlesEnabled.y - ); - audioOptions->subtitlesLanguageText = menuBuildPrerenderedText(&gDejaVuSansFont, "Captions Language: ", GAMEPLAY_X + 8, GAMEPLAY_Y + 88); - audioOptions->subtitlesLanguageDynamicText = menuBuildPrerenderedText(&gDejaVuSansFont, SubtitleLanguages[gSaveData.controls.subtitleLanguage], GAMEPLAY_X + 125, GAMEPLAY_Y + 88); - audioOptions->audioLanguageText = menuBuildPrerenderedText(&gDejaVuSansFont, "Audio Language: ", GAMEPLAY_X + 8, GAMEPLAY_Y + 124); - audioOptions->audioLanguageDynamicText = menuBuildPrerenderedText(&gDejaVuSansFont, AudioLanguages[gSaveData.audio.audioLanguage], GAMEPLAY_X + 125, GAMEPLAY_Y + 124); -} - struct MenuElementParams gAudioMenuParams[] = { { .type = MenuElementTypeText, @@ -153,9 +66,120 @@ struct MenuElementParams gAudioMenuParams[] = { }, .selectionIndex = AudioOptionMusicVolume, }, + { + .type = MenuElementTypeCheckbox, + .x = GAMEPLAY_X + 8, + .y = GAMEPLAY_Y + 48, + .params = { + .checkbox = { + .font = &gDejaVuSansFont, + .messageId = GAMEUI_SUBTITLESANDSOUNDEFFECTS, + }, + }, + .selectionIndex = AudioOptionSubtitlesEnabled, + }, + { + .type = MenuElementTypeCheckbox, + .x = GAMEPLAY_X + 8, + .y = GAMEPLAY_Y + 68, + .params = { + .checkbox = { + .font = &gDejaVuSansFont, + .messageId = AUDIO_ALL_CAPTIONS, + } + }, + .selectionIndex = AudioOptionAllSubtitlesEnabled, + }, + { + .type = MenuElementTypeSlider, + .x = GAMEPLAY_X + 8, + .y = GAMEPLAY_Y + 104, + .params = { + .slider = { + .width = 232, + .numberOfTicks = NUM_SUBTITLE_LANGUAGES, + .discrete = 1, + }, + }, + .selectionIndex = AudioOptionSubtitlesLanguage, + }, + { + .type = MenuElementTypeText, + .x = GAMEPLAY_X + 8, + .y = GAMEPLAY_Y + 88, + .params = { + .text = { + .font = &gDejaVuSansFont, + .messageId = AUDIO_TEXT_LANGUAGE, + }, + }, + .selectionIndex = AudioOptionSubtitlesLanguage, + }, + { + .type = MenuElementTypeText, + .x = GAMEPLAY_X + 125, + .y = GAMEPLAY_Y + 88, + .params = { + .text = { + .font = &gDejaVuSansFont, + .message = "", + }, + }, + .selectionIndex = AudioOptionSubtitlesLanguage, + }, + { + .type = MenuElementTypeSlider, + .x = GAMEPLAY_X + 8, + .y = GAMEPLAY_Y + 140, + .params = { + .slider = { + .width = 232, + .numberOfTicks = NUM_AUDIO_LANGUAGES, + .discrete = 1, + }, + }, + .selectionIndex = AudioOptionAudioLanguage, + }, + { + .type = MenuElementTypeText, + .x = GAMEPLAY_X + 8, + .y = GAMEPLAY_Y + 124, + .params = { + .text = { + .font = &gDejaVuSansFont, + .messageId = AUDIO_TEXT_LANGUAGE, + }, + }, + .selectionIndex = AudioOptionAudioLanguage, + }, + { + .type = MenuElementTypeText, + .x = GAMEPLAY_X + 125, + .y = GAMEPLAY_Y + 124, + .params = { + .text = { + .font = &gDejaVuSansFont, + .message = "", + }, + }, + .selectionIndex = AudioOptionAudioLanguage, + }, }; +#define AUDIO_VOLUME_VALUE_INDEX 1 +#define MUSIC_VOLUME_VALUE_INDEX 3 + +#define SUBTITLES_CHECKBOX_INDEX 4 +#define ALL_SUBTITLES_CHECKBOX_INDEX 5 + +#define TEXT_LANGUAGE_VALUE_INDEX 6 +#define TEXT_LANGUAGE_TEXT_INDEX 8 +#define AUDIO_LANGUAGE_VALUE_INDEX 9 +#define AUDIO_LANGUAGE_TEXT_INDEX 11 + void audioOptionsActoin(void* data, int selection, struct MenuAction* action) { + struct AudioOptions* audioOptions = (struct AudioOptions*)data; + switch (selection) { case AudioOptionGameVolume: gSaveData.audio.soundVolume = (int)(0xFFFF * action->state.fSlider.value); @@ -165,10 +189,50 @@ void audioOptionsActoin(void* data, int selection, struct MenuAction* action) { gSaveData.audio.musicVolume = (int)(0xFFFF * action->state.fSlider.value); soundPlayerGameVolumeUpdate(); break; + case AudioOptionSubtitlesEnabled: + if (action->state.checkbox.isChecked) { + gSaveData.controls.flags |= ControlSaveSubtitlesEnabled; + gSaveData.controls.flags &= ~ControlSaveAllSubtitlesEnabled; + struct MenuCheckbox* allSubtitles = (struct MenuCheckbox*)audioOptions->menuBuilder.elements[ALL_SUBTITLES_CHECKBOX_INDEX].data; + allSubtitles->checked = 0; + } else { + gSaveData.controls.flags &= ~ControlSaveSubtitlesEnabled; + } + break; + case AudioOptionAllSubtitlesEnabled: + if (action->state.checkbox.isChecked) { + gSaveData.controls.flags |= ControlSaveAllSubtitlesEnabled; + gSaveData.controls.flags &= ~ControlSaveSubtitlesEnabled; + struct MenuCheckbox* subtitles = (struct MenuCheckbox*)audioOptions->menuBuilder.elements[SUBTITLES_CHECKBOX_INDEX].data; + subtitles->checked = 0; + } else { + gSaveData.controls.flags &= ~ControlSaveAllSubtitlesEnabled; + } + break; + case AudioOptionSubtitlesLanguage: + gSaveData.controls.subtitleLanguage = action->state.iSlider.value; + gAudioMenuParams[TEXT_LANGUAGE_TEXT_INDEX].params.text.message = SubtitleLanguages[gSaveData.controls.subtitleLanguage]; + translationsReload(gSaveData.controls.subtitleLanguage); + break; + case AudioOptionAudioLanguage: + gSaveData.audio.audioLanguage = action->state.iSlider.value; + audioOptions->menuBuilder.elements[AUDIO_LANGUAGE_TEXT_INDEX].data = menuBuildPrerenderedText(&gDejaVuSansFont, AudioLanguages[gSaveData.audio.audioLanguage], GAMEPLAY_X + 125, GAMEPLAY_Y + 124); + break; } } 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; + } + + gAudioMenuParams[TEXT_LANGUAGE_TEXT_INDEX].params.text.message = SubtitleLanguages[gSaveData.controls.subtitleLanguage]; + gAudioMenuParams[AUDIO_LANGUAGE_TEXT_INDEX].params.text.message = AudioLanguages[gSaveData.audio.audioLanguage]; + menuBuilderInit( &audioOptions->menuBuilder, gAudioMenuParams, @@ -178,171 +242,24 @@ void audioOptionsInit(struct AudioOptions* audioOptions) { audioOptions ); - audioOptions->selectedItem = AudioOptionGameVolume; - int temp; + 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)); - audioOptions->subtitlesEnabled = menuBuildCheckbox(&gDejaVuSansFont, translationsGet(GAMEUI_SUBTITLESANDSOUNDEFFECTS), GAMEPLAY_X + 8, GAMEPLAY_Y + 48, 1); - audioOptions->subtitlesEnabled.checked = (gSaveData.controls.flags & ControlSaveSubtitlesEnabled) != 0; + 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); - audioOptions->allSubtitlesEnabled = menuBuildCheckbox(&gDejaVuSansFont, "All Captions", GAMEPLAY_X + 8, GAMEPLAY_Y + 68, 1); - audioOptions->allSubtitlesEnabled.checked = (gSaveData.controls.flags & ControlSaveAllSubtitlesEnabled) != 0; - - audioOptions->subtitlesLanguage= menuBuildSlider(GAMEPLAY_X + 8, GAMEPLAY_Y + 104, 232, NUM_SUBTITLE_LANGUAGES); - temp = (int)(maxf(NUM_SUBTITLE_LANGUAGES-1, 1)); - audioOptions->subtitles_language_temp = (0xFFFF/temp)* gSaveData.controls.subtitleLanguage; - if ((0xFFFF - audioOptions->subtitles_language_temp) > 0 && (0xFFFF - audioOptions->subtitles_language_temp) < (0xFFFF/temp)) - audioOptions->subtitles_language_temp = 0xFFFF; - audioOptions->subtitlesLanguage.value = (float)(audioOptions->subtitles_language_temp)/0xFFFF; - - - audioOptions->audioLanguage= menuBuildSlider(GAMEPLAY_X + 8, GAMEPLAY_Y + 140, 232, NUM_AUDIO_LANGUAGES); - temp = (int)(maxf(NUM_AUDIO_LANGUAGES-1, 1)); - audioOptions->audio_language_temp = (int)((0xFFFF/temp) * gSaveData.audio.audioLanguage); - if ((0xFFFF - audioOptions->audio_language_temp) > 0 && (0xFFFF - audioOptions->audio_language_temp) < (0xFFFF/temp)) - audioOptions->audio_language_temp = 0xFFFF; - audioOptions->audioLanguage.value = (float)(audioOptions->audio_language_temp)/0xFFFF; - - audioOptionsRenderText(audioOptions); + menuBuilderSetISlider(&audioOptions->menuBuilder.elements[TEXT_LANGUAGE_VALUE_INDEX], gSaveData.controls.subtitleLanguage); + menuBuilderSetISlider(&audioOptions->menuBuilder.elements[AUDIO_LANGUAGE_VALUE_INDEX], gSaveData.audio.audioLanguage); } void audioOptionsRebuildtext(struct AudioOptions* audioOptions) { - prerenderedTextFree(audioOptions->subtitlesEnabled.prerenderedText); - prerenderedTextFree(audioOptions->allSubtitlesEnabled.prerenderedText); - prerenderedTextFree(audioOptions->subtitlesLanguageText); - prerenderedTextFree(audioOptions->subtitlesLanguageDynamicText); - prerenderedTextFree(audioOptions->audioLanguageText); - prerenderedTextFree(audioOptions->audioLanguageDynamicText); - - audioOptionsRenderText(audioOptions); - menuBuilderRebuildText(&audioOptions->menuBuilder); } enum MenuDirection audioOptionsUpdate(struct AudioOptions* audioOptions) { - int controllerDir = controllerGetDirectionDown(0); - - if (controllerGetButtonDown(0, B_BUTTON)) { - return MenuDirectionUp; - } - - if (controllerDir & ControllerDirectionDown) { - ++audioOptions->selectedItem; - - if (audioOptions->selectedItem == AudioOptionCount) { - audioOptions->selectedItem = 0; - } - soundPlayerPlay(SOUNDS_BUTTONROLLOVER, 1.0f, 0.5f, NULL, NULL, SoundTypeAll); - } - - if (controllerDir & ControllerDirectionUp) { - if (audioOptions->selectedItem == 0) { - audioOptions->selectedItem = AudioOptionCount - 1; - } else { - --audioOptions->selectedItem; - } - soundPlayerPlay(SOUNDS_BUTTONROLLOVER, 1.0f, 0.5f, NULL, NULL, SoundTypeAll); - } - - switch (audioOptions->selectedItem) { - case AudioOptionSubtitlesEnabled: - if (controllerGetButtonDown(0, A_BUTTON)) { - audioOptions->subtitlesEnabled.checked = !audioOptions->subtitlesEnabled.checked; - soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll); - - if (audioOptions->subtitlesEnabled.checked) { - gSaveData.controls.flags |= ControlSaveSubtitlesEnabled; - gSaveData.controls.flags &= ~ControlSaveAllSubtitlesEnabled; - audioOptions->allSubtitlesEnabled.checked = 0; - } else { - gSaveData.controls.flags &= ~ControlSaveSubtitlesEnabled; - } - } - break; - case AudioOptionAllSubtitlesEnabled: - if (controllerGetButtonDown(0, A_BUTTON)) { - audioOptions->allSubtitlesEnabled.checked = !audioOptions->allSubtitlesEnabled.checked; - soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll); - - if (audioOptions->allSubtitlesEnabled.checked) { - gSaveData.controls.flags |= ControlSaveAllSubtitlesEnabled; - gSaveData.controls.flags &= ~ControlSaveSubtitlesEnabled; - audioOptions->subtitlesEnabled.checked = 0; - } else { - gSaveData.controls.flags &= ~ControlSaveAllSubtitlesEnabled; - } - } - break; - case AudioOptionSubtitlesLanguage: - audioOptionsHandleSlider(audioOptions->selectedItem, &audioOptions->subtitles_language_temp, &audioOptions->subtitlesLanguage.value); - int temp = (int)((audioOptions->subtitles_language_temp * (1.0f/0xFFFF) * NUM_SUBTITLE_LANGUAGES)); - temp = (int)minf(maxf(0.0, temp), NUM_SUBTITLE_LANGUAGES-1); - gSaveData.controls.subtitleLanguage = temp; - translationsReload(temp); - break; - case AudioOptionAudioLanguage: - audioOptionsHandleSlider(audioOptions->selectedItem, &audioOptions->audio_language_temp, &audioOptions->audioLanguage.value); - int tempAudio = (int)((audioOptions->audio_language_temp * (1.0f/0xFFFF) * NUM_AUDIO_LANGUAGES)); - tempAudio = (int)minf(maxf(0.0f, tempAudio), NUM_AUDIO_LANGUAGES-1); - gSaveData.audio.audioLanguage = tempAudio; - audioOptions->audioLanguageDynamicText = menuBuildPrerenderedText(&gDejaVuSansFont, AudioLanguages[gSaveData.audio.audioLanguage], GAMEPLAY_X + 125, GAMEPLAY_Y + 124); - break; - - } - - - if (audioOptions->selectedItem == AudioOptionSubtitlesLanguage || - audioOptions->selectedItem == AudioOptionGameVolume || - audioOptions->selectedItem == AudioOptionMusicVolume || - audioOptions->selectedItem == AudioOptionAudioLanguage){ - - if ((controllerGetButtonDown(0, L_TRIG) || controllerGetButtonDown(0, Z_TRIG))) { - return MenuDirectionLeft; - } - if ((controllerGetButtonDown(0, R_TRIG))) { - return MenuDirectionRight; - } - } - else{ - if (controllerDir & ControllerDirectionLeft || controllerGetButtonDown(0, L_TRIG) || controllerGetButtonDown(0, Z_TRIG)) { - return MenuDirectionLeft; - } - if (controllerDir & ControllerDirectionRight || controllerGetButtonDown(0, R_TRIG)) { - return MenuDirectionRight; - } - } - - return MenuDirectionStay; + return menuBuilderUpdate(&audioOptions->menuBuilder); } void audioOptionsRender(struct AudioOptions* audioOptions, struct RenderState* renderState, struct GraphicsTask* task) { - gSPDisplayList(renderState->dl++, ui_material_list[SOLID_ENV_INDEX]); - - gSPDisplayList(renderState->dl++, audioOptions->subtitlesEnabled.outline); - renderState->dl = menuCheckboxRender(&audioOptions->subtitlesEnabled, renderState->dl); - - gSPDisplayList(renderState->dl++, audioOptions->allSubtitlesEnabled.outline); - renderState->dl = menuCheckboxRender(&audioOptions->allSubtitlesEnabled, renderState->dl); - - gSPDisplayList(renderState->dl++, audioOptions->subtitlesLanguage.back); - renderState->dl = menuSliderRender(&audioOptions->subtitlesLanguage, renderState->dl); - - gSPDisplayList(renderState->dl++, audioOptions->audioLanguage.back); - renderState->dl = menuSliderRender(&audioOptions->audioLanguage, renderState->dl); - - gSPDisplayList(renderState->dl++, ui_material_revert_list[SOLID_ENV_INDEX]); - - struct PrerenderedTextBatch* batch = prerenderedBatchStart(); - - prerenderedBatchAdd(batch, audioOptions->subtitlesEnabled.prerenderedText, audioOptions->selectedItem == AudioOptionSubtitlesEnabled ? &gSelectionGray : &gColorWhite); - prerenderedBatchAdd(batch, audioOptions->allSubtitlesEnabled.prerenderedText, audioOptions->selectedItem == AudioOptionAllSubtitlesEnabled ? &gSelectionGray : &gColorWhite); - prerenderedBatchAdd(batch, audioOptions->subtitlesLanguageText, audioOptions->selectedItem == AudioOptionSubtitlesLanguage ? &gSelectionGray : &gColorWhite); - prerenderedBatchAdd(batch, audioOptions->subtitlesLanguageDynamicText, audioOptions->selectedItem == AudioOptionSubtitlesLanguage ? &gSelectionGray : &gColorWhite); - prerenderedBatchAdd(batch, audioOptions->audioLanguageText, audioOptions->selectedItem == AudioOptionAudioLanguage ? &gSelectionGray : &gColorWhite); - prerenderedBatchAdd(batch, audioOptions->audioLanguageDynamicText, audioOptions->selectedItem == AudioOptionAudioLanguage ? &gSelectionGray : &gColorWhite); - - renderState->dl = prerenderedBatchFinish(batch, gDejaVuSansImages, renderState->dl); - - gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_0_INDEX]); - menuBuilderRender(&audioOptions->menuBuilder, renderState); } diff --git a/src/menu/audio_options.h b/src/menu/audio_options.h index 8c4a6bb..3138c97 100644 --- a/src/menu/audio_options.h +++ b/src/menu/audio_options.h @@ -17,18 +17,6 @@ enum AudioOption { struct AudioOptions { struct MenuBuilder menuBuilder; - - struct MenuCheckbox subtitlesEnabled; - struct MenuCheckbox allSubtitlesEnabled; - struct MenuSlider subtitlesLanguage; - struct PrerenderedText* subtitlesLanguageText; - struct PrerenderedText* subtitlesLanguageDynamicText; - unsigned short subtitles_language_temp; - struct MenuSlider audioLanguage; - struct PrerenderedText* audioLanguageText; - struct PrerenderedText* audioLanguageDynamicText; - unsigned short audio_language_temp; - short selectedItem; }; void audioOptionsInit(struct AudioOptions* audioOptions); diff --git a/src/menu/menu_builder.c b/src/menu/menu_builder.c index 532dd51..38db631 100644 --- a/src/menu/menu_builder.c +++ b/src/menu/menu_builder.c @@ -12,9 +12,15 @@ #include "../build/src/audio/clips.h" void textMenuItemInit(struct MenuBuilderElement* element) { + char* message = element->params->params.text.message; + + if (!message) { + message = translationsGet(element->params->params.text.messageId); + } + element->data = menuBuildPrerenderedText( element->params->params.text.font, - translationsGet(element->params->params.text.messageId), + message, element->params->x, element->params->y ); @@ -53,6 +59,7 @@ enum MenuDirection checkboxMenuItemUpdate(struct MenuBuilderElement* element, Me action.type = MenuElementTypeCheckbox; action.state.checkbox.isChecked = checkbox->checked; actionCallback(data, element->selectionIndex, &action); + soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll); } return MenuDirectionStay; @@ -109,13 +116,13 @@ enum MenuDirection sliderMenuItemUpdate(struct MenuBuilderElement* element, Menu int controllerDir = controllerGetDirectionDown(0); int numTicks = element->params->params.slider.numberOfTicks; - int currentValue = (int)floorf(slider->value * numTicks); + int currentValue = (int)floorf(slider->value * (numTicks - 1)); int newValue = currentValue; if (controllerDir & ControllerDirectionRight) { - ++numTicks; + ++newValue; } else if (controllerDir & ControllerDirectionLeft) { - --numTicks; + --newValue; } if (newValue < 0) { @@ -132,7 +139,11 @@ enum MenuDirection sliderMenuItemUpdate(struct MenuBuilderElement* element, Menu slider->value = newValue; } - slider->value = (float)newValue / (float)numTicks; + if (numTicks > 1) { + slider->value = (float)newValue / (float)(numTicks - 1); + } else { + slider->value = 0.0f; + } } else { OSContPad* pad = controllersGetControllerData(0); float newValue = slider->value + pad->stick_x * SCROLL_MULTIPLIER; @@ -260,4 +271,33 @@ void menuBuilderRender(struct MenuBuilder* menuBuilder, struct RenderState* rend } renderState->dl = prerenderedBatchFinish(batch, gDejaVuSansImages, renderState->dl); gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_0_INDEX]); +} + +void menuBuilderSetCheckbox(struct MenuBuilderElement* element, int value) { + if (element->params->type != MenuElementTypeCheckbox) { + return; + } + + struct MenuCheckbox* checkbox = (struct MenuCheckbox*)element->data; + checkbox->checked = value; +} + +void menuBuilderSetFSlider(struct MenuBuilderElement* element, float value) { + if (element->params->type != MenuElementTypeSlider || element->params->params.slider.discrete) { + return; + } + + struct MenuSlider* slider = (struct MenuSlider*)element->data; + slider->value = value; +} + +void menuBuilderSetISlider(struct MenuBuilderElement* element, int value) { + if (element->params->type != MenuElementTypeSlider || + !element->params->params.slider.discrete || + element->params->params.slider.numberOfTicks <= 1) { + return; + } + + struct MenuSlider* slider = (struct MenuSlider*)element->data; + slider->value = (float)value / (float)(element->params->params.slider.numberOfTicks - 1); } \ No newline at end of file diff --git a/src/menu/menu_builder.h b/src/menu/menu_builder.h index b3fd818..23ff0b2 100644 --- a/src/menu/menu_builder.h +++ b/src/menu/menu_builder.h @@ -55,6 +55,7 @@ struct MenuElementParams { struct { struct Font* font; short messageId; + char* message; } text; struct { struct Font* font; @@ -99,4 +100,8 @@ enum MenuDirection menuBuilderUpdate(struct MenuBuilder* menuBuilder); void menuBuilderRebuildText(struct MenuBuilder* menuBuilder); void menuBuilderRender(struct MenuBuilder* menuBuilder, struct RenderState* renderState); +void menuBuilderSetCheckbox(struct MenuBuilderElement* element, int value); +void menuBuilderSetFSlider(struct MenuBuilderElement* element, float value); +void menuBuilderSetISlider(struct MenuBuilderElement* element, int value); + #endif \ No newline at end of file