From 7a37be91c9fe87211749c0e0e610828210a7010b Mon Sep 17 00:00:00 2001 From: James Lambert Date: Wed, 8 Nov 2023 21:49:27 -0700 Subject: [PATCH] Translate load and save game menu --- Makefile | 5 ++- src/menu/load_game.c | 6 ++- src/menu/new_game_menu.c | 8 +--- src/menu/save_game_menu.c | 6 ++- src/menu/savefile_list.c | 47 ++++++++++++++++-------- src/menu/savefile_list.h | 7 ++-- src/menu/text_manipulation.c | 19 ++++++++++ src/menu/text_manipulation.h | 7 ++++ tools/level_scripts/subtitle_generate.py | 23 +++++++----- 9 files changed, 87 insertions(+), 41 deletions(-) create mode 100644 src/menu/text_manipulation.c create mode 100644 src/menu/text_manipulation.h diff --git a/Makefile b/Makefile index 03e4637..f8ac3c3 100644 --- a/Makefile +++ b/Makefile @@ -327,11 +327,12 @@ build/src/menu/game_menu.o: build/src/audio/clips.h build/assets/materials/ui.h build/src/menu/gameplay_options.o: build/assets/materials/ui.h build/src/audio/clips.h build/src/menu/joystick_options.o: build/assets/materials/ui.h build/src/audio/clips.h build/src/menu/landing_menu.o: build/assets/materials/ui.h build/src/audio/clips.h -build/src/menu/load_game.o: build/assets/materials/ui.h build/src/audio/clips.h +build/src/menu/load_game.o: build/assets/materials/ui.h build/src/audio/clips.h build/src/audio/subtitles.h build/src/menu/main_menu.o: build/src/audio/clips.h build/assets/materials/ui.h build/assets/materials/images.h build/assets/test_chambers/test_chamber_00/test_chamber_00.h build/src/menu/new_game_menu.o: build/src/audio/clips.h build/assets/materials/ui.h build/assets/materials/images.h build/src/audio/subtitles.h build/assets/test_chambers/test_chamber_00/test_chamber_00.h build/src/menu/options_menu.o: build/assets/materials/ui.h build/src/audio/clips.h build/src/audio/subtitles.h -build/src/menu/save_game_menu.o: build/src/audio/clips.h +build/src/menu/save_game_menu.o: build/src/audio/clips.h build/src/audio/subtitles.h +build/src/menu/text_manipulation.o: build/src/audio/subtitles.h build/src/scene/scene_animator.o: build/src/audio/clips.h build/src/menu/cheat_codes.o: build/src/audio/clips.h build/src/levels/intro.o: build/src/audio/clips.h build/assets/materials/images.h diff --git a/src/menu/load_game.c b/src/menu/load_game.c index a07fa22..f3140cf 100644 --- a/src/menu/load_game.c +++ b/src/menu/load_game.c @@ -5,8 +5,10 @@ #include "../levels/levels.h" #include "../util/memory.h" #include "../audio/soundplayer.h" +#include "./translations.h" #include "../build/src/audio/clips.h" +#include "../build/src/audio/subtitles.h" void loadGameMenuInit(struct LoadGameMenu* loadGame, struct SavefileListMenu* savefileList) { loadGame->savefileList = savefileList; @@ -21,11 +23,11 @@ void loadGamePopulate(struct LoadGameMenu* loadGame) { for (int i = 0; i < numberOfSaves; ++i) { savefileInfo[i].slotIndex = saveSlots[i].saveSlot; savefileInfo[i].testchamberIndex = saveSlots[i].testChamber; - savefileInfo[i].savefileName = saveSlots[i].saveSlot == 0 ? "AUTO" : NULL; + savefileInfo[i].savefileName = saveSlots[i].saveSlot == 0 ? translationsGet(GAMEUI_AUTOSAVE) : NULL; savefileInfo[i].screenshot = (u16*)SCREEN_SHOT_SRAM(saveSlots[i].saveSlot); } - savefileUseList(loadGame->savefileList, "LOAD GAME", savefileInfo, numberOfSaves); + savefileUseList(loadGame->savefileList, translationsGet(GAMEUI_LOADGAME), savefileInfo, numberOfSaves); } enum MenuDirection loadGameUpdate(struct LoadGameMenu* loadGame) { diff --git a/src/menu/new_game_menu.c b/src/menu/new_game_menu.c index 863b00c..ed4446d 100644 --- a/src/menu/new_game_menu.c +++ b/src/menu/new_game_menu.c @@ -11,6 +11,7 @@ #include "../util/memory.h" #include "../util/rom.h" #include "../audio/soundplayer.h" +#include "./text_manipulation.h" #include "../build/assets/materials/ui.h" #include "../build/assets/materials/images.h" @@ -76,12 +77,7 @@ void chapterMenuSetChapter(struct ChapterMenu* chapterMenu, struct Chapter* chap sprintf(chapterText, "%s %d", translationsGet(GAMEUI_CHAPTER), chapterIndex + 1); chapterMenu->chapterText = menuBuildPrerenderedText(&gDejaVuSansFont, chapterText, chapterMenu->x, chapterMenu->y, SCREEN_WD); - strcpy(chapterText, translationsGet(PORTAL_CHAPTER1_TITLE)); - int len = strlen(chapterText); - - // this is dumb, but it works - chapterText[len - 1] += chapterIndex % 10; - chapterText[len - 2] += chapterIndex / 10; + textManipTestChamberMessage(chapterText, gChapters[chapterIndex].testChamberDisplayNumber); chapterMenu->testChamberText = menuBuildPrerenderedText(&gDejaVuSansFont, chapterText, chapterMenu->x, chapterMenu->y + 14, 100); diff --git a/src/menu/save_game_menu.c b/src/menu/save_game_menu.c index b36785a..ffb270b 100644 --- a/src/menu/save_game_menu.c +++ b/src/menu/save_game_menu.c @@ -5,8 +5,10 @@ #include "../controls/controller.h" #include "../util/memory.h" #include "../audio/soundplayer.h" +#include "./translations.h" #include "../build/src/audio/clips.h" +#include "../build/src/audio/subtitles.h" void saveGameMenuInit(struct SaveGameMenu* saveGame, struct SavefileListMenu* savefileList) { saveGame->savefileList = savefileList; @@ -36,7 +38,7 @@ void saveGamePopulate(struct SaveGameMenu* saveGame, int includeNew) { if (includeNew && freeSlot != SAVEFILE_NO_SLOT) { savefileInfo[numberOfSaves].slotIndex = freeSlot; - savefileInfo[numberOfSaves].savefileName = "NEW SAVE"; + savefileInfo[numberOfSaves].savefileName = translationsGet(GAMEUI_NEWSAVEGAME); savefileInfo[numberOfSaves].testchamberIndex = levelGetChamberNumber(gCurrentLevelIndex, gScene.player.body.currentRoom); savefileInfo[numberOfSaves].screenshot = gScreenGrabBuffer; @@ -47,7 +49,7 @@ void saveGamePopulate(struct SaveGameMenu* saveGame, int includeNew) { ++numberOfSaves; } - savefileUseList(saveGame->savefileList, "SAVE GAME", savefileInfo, numberOfSaves); + savefileUseList(saveGame->savefileList, translationsGet(GAMEUI_SAVEGAME), savefileInfo, numberOfSaves); if (startSelection == -1) { saveGame->savefileList->selectedSave = numberOfSaves - 1; diff --git a/src/menu/savefile_list.c b/src/menu/savefile_list.c index 5a67763..85c2c35 100644 --- a/src/menu/savefile_list.c +++ b/src/menu/savefile_list.c @@ -5,6 +5,7 @@ #include "../util/rom.h" #include "../graphics/image.h" #include "../audio/soundplayer.h" +#include "./text_manipulation.h" #include #include "../build/assets/materials/ui.h" @@ -20,21 +21,27 @@ #define ROW_HEIGHT (BORDER_HEIGHT + 8) void savefileListSlotUseInfo(struct SavefileListSlot* savefileListSlot, struct SavefileInfo* savefileInfo, int x, int y) { - char message[16]; - sprintf(message, "Testchamber %02d", savefileInfo->testchamberIndex); - fontRender(&gDejaVuSansFont, message, x + BORDER_WIDTH + 8, y, savefileListSlot->testChamberText); + if (savefileListSlot->testChamberText) { + menuFreePrerenderedDeferred(savefileListSlot->testChamberText); + savefileListSlot->testChamberText = NULL; + } if (savefileListSlot->gameId) { - free(savefileListSlot->gameId); + menuFreePrerenderedDeferred(savefileListSlot->testChamberText); + savefileListSlot->gameId = NULL; } + char message[64]; + textManipTestChamberMessage(message, savefileInfo->testchamberIndex); + savefileListSlot->testChamberText = menuBuildPrerenderedText(&gDejaVuSansFont, message, x + BORDER_WIDTH + 8, y, 120); + if (savefileInfo->savefileName) { strcpy(message, savefileInfo->savefileName); } else { - sprintf(message, "Subject %02d", gSaveData.saveSlotMetadata[savefileInfo->slotIndex].testSubjectNumber); + textManipSubjectMessage(message, gSaveData.saveSlotMetadata[savefileInfo->slotIndex].testSubjectNumber); } - savefileListSlot->gameId = menuBuildText(&gDejaVuSansFont, message, x + BORDER_WIDTH + 8, y + 16); + savefileListSlot->gameId = menuBuildPrerenderedText(&gDejaVuSansFont, message, x + BORDER_WIDTH + 8, y + savefileListSlot->testChamberText->height + 4, 120); menuRerenderSolidBorder( x, y, @@ -51,7 +58,7 @@ void savefileListSlotUseInfo(struct SavefileListSlot* savefileListSlot, struct S } void savefileListSlotInit(struct SavefileListSlot* savefileListSlot, int x, int y) { - savefileListSlot->testChamberText = menuBuildText(&gDejaVuSansFont, "Testchamber 00", x + BORDER_WIDTH + 8, y); + savefileListSlot->testChamberText = NULL; savefileListSlot->gameId = NULL; savefileListSlot->border = menuBuildSolidBorder( x, y, BORDER_WIDTH, BORDER_HEIGHT, @@ -125,10 +132,10 @@ void savefileListMenuInit(struct SavefileListMenu* savefileList) { void savefileUseList(struct SavefileListMenu* savefileList, char* title, struct SavefileInfo* savefileInfo, int slotCount) { if (savefileList->savefileListTitleText) { - free(savefileList->savefileListTitleText); + prerenderedTextFree(savefileList->savefileListTitleText); } - savefileList->savefileListTitleText = menuBuildText(&gDejaVuSansFont, title, 48, LOAD_GAME_TOP + 4); + savefileList->savefileListTitleText = menuBuildPrerenderedText(&gDejaVuSansFont, title, 48, LOAD_GAME_TOP + 4, SCREEN_WD); for (int i = 0; i < slotCount; ++i) { savefileList->savefileInfo[i] = savefileInfo[i]; @@ -211,18 +218,22 @@ void savefileListRender(struct SavefileListMenu* savefileList, struct RenderStat } gSPDisplayList(renderState->dl++, ui_material_revert_list[SOLID_ENV_INDEX]); - gSPDisplayList(renderState->dl++, ui_material_list[DEJAVU_SANS_0_INDEX]); - gDPPipeSync(renderState->dl++); gDPSetScissor(renderState->dl++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WD, SCREEN_HT); + struct PrerenderedTextBatch* batch = prerenderedBatchStart(); + if (savefileList->savefileListTitleText) { - gSPDisplayList(renderState->dl++, savefileList->savefileListTitleText); + prerenderedBatchAdd(batch, savefileList->savefileListTitleText, NULL); } + renderState->dl = prerenderedBatchFinish(batch, gDejaVuSansImages, renderState->dl); + gDPPipeSync(renderState->dl++); gDPSetScissor(renderState->dl++, G_SC_NON_INTERLACE, CONTENT_X, CONTENT_Y, CONTENT_X + CONTENT_WIDTH, CONTENT_Y + CONTENT_HEIGHT); + batch = prerenderedBatchStart(); + for (int i = 0; i < MAX_VISIBLE_SLOTS; ++i) { struct SavefileListSlot* slot = &savefileList->slots[i]; @@ -230,13 +241,17 @@ void savefileListRender(struct SavefileListMenu* savefileList, struct RenderStat continue; } - gDPPipeSync(renderState->dl++); - menuSetRenderColor(renderState, savefileList->indexOffset + i == savefileList->selectedSave, &gSelectionOrange, &gColorWhite); + struct Coloru8* color = savefileList->indexOffset + i == savefileList->selectedSave ? &gSelectionOrange : &gColorWhite; - renderStateInlineBranch(renderState, slot->testChamberText); - renderStateInlineBranch(renderState, slot->gameId); + prerenderedBatchAdd(batch, slot->testChamberText, color); + + if (slot->gameId) { + prerenderedBatchAdd(batch, slot->gameId, color); + } } + renderState->dl = prerenderedBatchFinish(batch, gDejaVuSansImages, renderState->dl); + gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_0_INDEX]); gSPDisplayList(renderState->dl++, ui_material_list[IMAGE_COPY_INDEX]); diff --git a/src/menu/savefile_list.h b/src/menu/savefile_list.h index 6e5f7b3..676ef96 100644 --- a/src/menu/savefile_list.h +++ b/src/menu/savefile_list.h @@ -2,6 +2,7 @@ #define __MENU_SAVEFILE_LIST_H__ #include "./menu.h" +#include "../font/font.h" #include "../graphics/graphics.h" #include "../savefile/savefile.h" #include "./new_game_menu.h" @@ -14,9 +15,9 @@ struct SavefileInfo { }; struct SavefileListSlot { - Gfx* testChamberText; + struct PrerenderedText* testChamberText; Gfx* border; - Gfx* gameId; + struct PrerenderedText* gameId; short x, y; short slotIndex; void* imageData; @@ -26,7 +27,7 @@ struct SavefileListSlot { struct SavefileListMenu { Gfx* menuOutline; - Gfx* savefileListTitleText; + struct PrerenderedText* savefileListTitleText; struct SavefileInfo savefileInfo[MAX_SAVE_SLOTS]; struct SavefileListSlot slots[MAX_VISIBLE_SLOTS]; short numberOfSaves; diff --git a/src/menu/text_manipulation.c b/src/menu/text_manipulation.c new file mode 100644 index 0000000..558d462 --- /dev/null +++ b/src/menu/text_manipulation.c @@ -0,0 +1,19 @@ +#include "text_manipulation.h" + +#include "./translations.h" +#include "../build/src/audio/subtitles.h" +#include +#include + +void textManipTestChamberMessage(char* result, int testChamber) { + strcpy(result, translationsGet(PORTAL_CHAPTER1_TITLE)); + int len = strlen(result); + + // this is dumb, but it works + result[len - 1] += testChamber % 10; + result[len - 2] += testChamber / 10; +} + +void textManipSubjectMessage(char* result, int subjectIndex) { + sprintf(result, "%s %02d", translationsGet(GAMEUI_PLAYERNAME), subjectIndex); +} \ No newline at end of file diff --git a/src/menu/text_manipulation.h b/src/menu/text_manipulation.h new file mode 100644 index 0000000..5aa2959 --- /dev/null +++ b/src/menu/text_manipulation.h @@ -0,0 +1,7 @@ +#ifndef __MENU_TEXT_MANIPULATION_H__ +#define __MENU_TEXT_MANIPULATION_H__ + +void textManipTestChamberMessage(char* result, int testChamber); +void textManipSubjectMessage(char* result, int subjectIndex); + +#endif \ No newline at end of file diff --git a/tools/level_scripts/subtitle_generate.py b/tools/level_scripts/subtitle_generate.py index 5445480..2099d9e 100644 --- a/tools/level_scripts/subtitle_generate.py +++ b/tools/level_scripts/subtitle_generate.py @@ -6,20 +6,23 @@ import json from os.path import exists hl_gameui_whitelist = { - "GAMEUI_GAMEMENU_RESUMEGAME", - "GAMEUI_SAVEGAME", - "GAMEUI_LOADGAME", - "GAMEUI_NEWGAME", - "GAMEUI_OPTIONS", - "GAMEUI_GAMEMENU_QUIT", - "GAMEUI_VIDEO", "GAMEUI_AUDIO", - "GAMEUI_PORTAL", - "GAMEUI_JOYSTICK", + "GAMEUI_AUTOSAVE", "GAMEUI_CHAPTER", - "GAMEUI_SOUNDEFFECTVOLUME", + "GAMEUI_GAMEMENU_QUIT", + "GAMEUI_GAMEMENU_RESUMEGAME", + "GAMEUI_JOYSTICK", + "GAMEUI_LOADGAME", "GAMEUI_MUSICVOLUME", + "GAMEUI_NEWGAME", + "GAMEUI_NEWSAVEGAME", + "GAMEUI_OPTIONS", + "GAMEUI_PLAYERNAME", + "GAMEUI_PORTAL", + "GAMEUI_SAVEGAME", + "GAMEUI_SOUNDEFFECTVOLUME", "GAMEUI_SUBTITLESANDSOUNDEFFECTS", + "GAMEUI_VIDEO", } portal_whitelist = {