From cf1d8dadc622a9943cc5b3c0ea190290ce3a0178 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Wed, 4 Oct 2023 21:46:31 -0600 Subject: [PATCH] Added external text loading --- CMakeLists.txt | 21 -- levels/menu/leveldata.c | 3 - libultraship | 2 +- src/game/ingame_menu.c | 180 +++------ src/game/save_file.c | 4 +- src/menu/file_select.c | 463 ++++++++++++------------ src/menu/star_select.c | 5 +- src/port/Engine.cpp | 22 ++ src/port/Engine.h | 3 + src/port/importer/DictionaryFactory.cpp | 40 ++ src/port/importer/DictionaryFactory.h | 16 + src/port/importer/types/Dictionary.cpp | 11 + src/port/importer/types/Dictionary.h | 22 ++ 13 files changed, 399 insertions(+), 393 deletions(-) create mode 100644 src/port/importer/DictionaryFactory.cpp create mode 100644 src/port/importer/DictionaryFactory.h create mode 100644 src/port/importer/types/Dictionary.cpp create mode 100644 src/port/importer/types/Dictionary.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 55e0c81d..852cc81d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,27 +120,6 @@ list(FILTER ALL_FILES EXCLUDE REGEX "bin/eu/.*.c") list(FILTER ALL_FILES EXCLUDE REGEX "src/game/main.c") list(FILTER ALL_FILES EXCLUDE REGEX "src/pc/dlmalloc.c") - -#==============================================================================# -# Generated Source Code Files # -#==============================================================================# - -add_custom_command( - OUTPUT include/text_strings.h - COMMAND $ charmap.txt ${CMAKE_CURRENT_SOURCE_DIR}/include/text_strings.h.in ${CMAKE_CURRENT_BINARY_DIR}/include/text_strings.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS textconv -) -list(APPEND ALL_FILES ${CMAKE_CURRENT_BINARY_DIR}/include/text_strings.h) - -add_custom_command( - OUTPUT include/text_menu_strings.h - COMMAND $ charmap_menu.txt ${CMAKE_CURRENT_SOURCE_DIR}/include/text_menu_strings.h.in ${CMAKE_CURRENT_BINARY_DIR}/include/text_menu_strings.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS textconv -) -list(APPEND ALL_FILES ${CMAKE_CURRENT_BINARY_DIR}/include/text_menu_strings.h) - add_executable(${PROJECT_NAME} ${ALL_FILES} ${GENERATED_SOURCES}) ################################################################################ diff --git a/levels/menu/leveldata.c b/levels/menu/leveldata.c index 53368cd0..f2d7375d 100644 --- a/levels/menu/leveldata.c +++ b/levels/menu/leveldata.c @@ -5,9 +5,6 @@ #include "surface_terrains.h" #include "types.h" -#ifdef VERSION_EU -#include "text_strings.h" -#endif #include "make_const_nonconst.h" // 0x07000000 - 0x07000018 diff --git a/libultraship b/libultraship index 55135a5e..15ded73b 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 55135a5e78acf09f95b39becc2474ab493fade71 +Subproject commit 15ded73b5be257e06f5588271cf1774b83797f15 diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index c27b8ded..335f6cf9 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -20,7 +20,6 @@ #include "segment7.h" #include "seq_ids.h" #include "sm64.h" -#include "text_strings.h" #include "types.h" #ifdef VERSION_EU @@ -28,6 +27,9 @@ #define LANGUAGE_FUNCTION gInGameLanguage #endif +static unsigned char textPause[] = { 0x19,0x0A,0x1E,0x1C,0x0E,0xFF }; +static unsigned char textHudCongratulations[] = { 0x0C,0x18,0x17,0x10,0x1B,0x0A,0x1D,0x1E,0x15,0x0A,0x1D,0x12,0x18,0x17,0x1C,0xFF }; + u16 gDialogColorFadeTimer; s8 gLastDialogLineNum; s32 gDialogVariable; @@ -1575,31 +1577,21 @@ void handle_special_dialog_text(s16 dialogID) { // dialog ID tables, in order s16 gMenuMode = MENU_MODE_NONE; -u8 gEndCutsceneStrEn0[] = { TEXT_FILE_MARIO_EXCLAMATION }; -u8 gEndCutsceneStrEn1[] = { TEXT_POWER_STARS_RESTORED }; -u8 gEndCutsceneStrEn2[] = { TEXT_THANKS_TO_YOU }; -u8 gEndCutsceneStrEn3[] = { TEXT_THANK_YOU_MARIO }; -u8 gEndCutsceneStrEn4[] = { TEXT_SOMETHING_SPECIAL }; -u8 gEndCutsceneStrEn5[] = { TEXT_LISTEN_EVERYBODY }; -u8 gEndCutsceneStrEn6[] = { TEXT_LETS_HAVE_CAKE }; -u8 gEndCutsceneStrEn7[] = { TEXT_FOR_MARIO }; -u8 gEndCutsceneStrEn8[] = { TEXT_FILE_MARIO_QUESTION }; - -u8 *gEndCutsceneStringsEn[] = { - gEndCutsceneStrEn0, - gEndCutsceneStrEn1, - gEndCutsceneStrEn2, - gEndCutsceneStrEn3, - gEndCutsceneStrEn4, - gEndCutsceneStrEn5, - gEndCutsceneStrEn6, - gEndCutsceneStrEn7, +char *gEndCutsceneStringsEn[] = { + "TEXT_FILE_MARIO_EXCLAMATION", + "TEXT_POWER_STARS_RESTORED", + "TEXT_THANKS_TO_YOU", + "TEXT_THANK_YOU_MARIO", + "TEXT_SOMETHING_SPECIAL", + "TEXT_LISTEN_EVERYBODY", + "TEXT_LETS_HAVE_CAKE", + "TEXT_FOR_MARIO", // This [8] string is actually unused. In the cutscene handler, the developers do not // set the 8th one, but use the first string again at the very end, so Peach ends up // saying "Mario!" twice. It is likely that she was originally meant to say "Mario?" at // the end but the developers changed their mind, possibly because the line recorded // sounded more like an exclamation than a question. - gEndCutsceneStrEn8, + "TEXT_FILE_MARIO_QUESTION", NULL }; @@ -1945,8 +1937,9 @@ void do_cutscene_handler(void) { } #else // get the x coordinate of where the cutscene string starts. - x = get_str_x_pos_from_center(gCutsceneMsgXOffset, gEndCutsceneStringsEn[gCutsceneMsgIndex], 10.0f); - print_generic_string(x, 240 - gCutsceneMsgYOffset, gEndCutsceneStringsEn[gCutsceneMsgIndex]); + uint8_t* line = GameEngine_LoadTranslation(gEndCutsceneStringsEn[gCutsceneMsgIndex]); + x = get_str_x_pos_from_center(gCutsceneMsgXOffset, line, 10.0f); + print_generic_string(x, 240 - gCutsceneMsgYOffset, line); #endif gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -2165,7 +2158,7 @@ u8 gTextCourse[][7] = { #elif defined(VERSION_US) #define CRS_NUM_X1 100 #elif defined(VERSION_EU) -#define CRS_NUM_X1 get_string_width(LANGUAGE_ARRAY(textCourse)) + 51 +#define CRS_NUM_X1 get_string_width(GameEngine_LoadTranslation(textCourse)) + 51 #endif #ifdef VERSION_EU @@ -2185,18 +2178,10 @@ u8 gTextCourse[][7] = { #endif void render_pause_my_score_coins(void) { -#ifdef VERSION_EU - u8 textMyScore[][10] = { - { TEXT_MY_SCORE }, - { TEXT_MY_SCORE_FR }, - { TEXT_MY_SCORE_DE } - }; -#else - u8 textCourse[] = { TEXT_COURSE }; - u8 textMyScore[] = { TEXT_MY_SCORE }; -#endif - u8 textStar[] = { TEXT_STAR }; - u8 textUnfilledStar[] = { TEXT_UNFILLED_STAR }; +// u8* textCourse = GameEngine_LoadTranslation(""); +// u8* textMyScore = GameEngine_LoadTranslation("TEXT_MY_SCORE"); +// u8* textStar = GameEngine_LoadTranslation("TEXT_STAR"); +// u8* textUnfilledStar = GameEngine_LoadTranslation("TEXT_UNFILLED_STAR"); u8 strCourseNum[4]; u8 *courseName; @@ -2239,22 +2224,22 @@ void render_pause_my_score_coins(void) { if (courseIndex <= COURSE_NUM_TO_INDEX(COURSE_STAGES_MAX) && save_file_get_course_star_count(gCurrSaveFileNum - 1, courseIndex) != 0) { - print_generic_string(MYSCORE_X, 121, LANGUAGE_ARRAY(textMyScore)); + print_generic_string(MYSCORE_X, 121, GameEngine_LoadTranslation("TEXT_MY_SCORE")); } courseName = GameEngine_LoadLevelName(courseIndex); if (courseIndex <= COURSE_NUM_TO_INDEX(COURSE_STAGES_MAX)) { - print_generic_string(TXT_COURSE_X, 157, LANGUAGE_ARRAY(textCourse)); + print_generic_string(TXT_COURSE_X, 157, GameEngine_LoadTranslation("TEXT_COURSE")); int_to_str(gCurrCourseNum, strCourseNum); print_generic_string(CRS_NUM_X1, 157, strCourseNum); actName = GameEngine_LoadActName(COURSE_NUM_TO_INDEX(gCurrCourseNum) * 6 + gDialogCourseActNum - 1); if (starFlags & (1 << (gDialogCourseActNum - 1))) { - print_generic_string(TXT_STAR_X, 140, textStar); + print_generic_string(TXT_STAR_X, 140, GameEngine_LoadTranslation("TEXT_STAR")); } else { - print_generic_string(TXT_STAR_X, 140, textUnfilledStar); + print_generic_string(TXT_STAR_X, 140, GameEngine_LoadTranslation("TEXT_UNFILLED_STAR")); } print_generic_string(ACT_NAME_X, 140, actName); @@ -2283,33 +2268,15 @@ void render_pause_my_score_coins(void) { #endif void render_pause_camera_options(s16 x, s16 y, s8 *index, s16 xIndex) { - u8 textLakituMario[] = { TEXT_LAKITU_MARIO }; - u8 textLakituStop[] = { TEXT_LAKITU_STOP }; -#ifdef VERSION_EU - u8 textNormalUpClose[][20] = { - { TEXT_NORMAL_UPCLOSE }, - { TEXT_NORMAL_UPCLOSE_FR }, - { TEXT_NORMAL_UPCLOSE_DE } - }; - u8 textNormalFixed[][17] = { - { TEXT_NORMAL_FIXED }, - { TEXT_NORMAL_FIXED_FR }, - { TEXT_NORMAL_FIXED_DE }, - }; -#else - u8 textNormalUpClose[] = { TEXT_NORMAL_UPCLOSE }; - u8 textNormalFixed[] = { TEXT_NORMAL_FIXED }; -#endif - handle_menu_scrolling(MENU_SCROLL_HORIZONTAL, index, 1, 2); gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(x + 14, y + 2, textLakituMario); - print_generic_string(x + TXT1_X, y - 13, LANGUAGE_ARRAY(textNormalUpClose)); - print_generic_string(x + 124, y + 2, textLakituStop); - print_generic_string(x + TXT2_X, y - 13, LANGUAGE_ARRAY(textNormalFixed)); + print_generic_string(x + 14, y + 2, GameEngine_LoadTranslation("TEXT_LAKITU_MARIO")); + print_generic_string(x + TXT1_X, y - 13, GameEngine_LoadTranslation("TEXT_NORMAL_UPCLOSE")); + print_generic_string(x + 124, y + 2, GameEngine_LoadTranslation("TEXT_LAKITU_STOP")); + print_generic_string(x + TXT2_X, y - 13, GameEngine_LoadTranslation("TEXT_NORMAL_FIXED")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); create_dl_translation_matrix(MENU_MTX_PUSH, ((*index - 1) * xIndex) + x, y + Y_VAL7, 0); @@ -2336,38 +2303,17 @@ void render_pause_camera_options(s16 x, s16 y, s8 *index, s16 xIndex) { #endif void render_pause_course_options(s16 x, s16 y, s8 *index, s16 yIndex) { -#ifdef VERSION_EU - u8 textContinue[][10] = { - { TEXT_CONTINUE }, - { TEXT_CONTINUE_FR }, - { TEXT_CONTINUE_DE } - }; - u8 textExitCourse[][15] = { - { TEXT_EXIT_COURSE }, - { TEXT_EXIT_COURSE_FR }, - { TEXT_EXIT_COURSE_DE } - }; - u8 textCameraAngleR[][24] = { - { TEXT_CAMERA_ANGLE_R }, - { TEXT_CAMERA_ANGLE_R_FR }, - { TEXT_CAMERA_ANGLE_R_DE } - }; -#else - u8 textContinue[] = { TEXT_CONTINUE }; - u8 textExitCourse[] = { TEXT_EXIT_COURSE }; - u8 textCameraAngleR[] = { TEXT_CAMERA_ANGLE_R }; -#endif handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 3); gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(x + 10, y - 2, LANGUAGE_ARRAY(textContinue)); - print_generic_string(x + 10, y - 17, LANGUAGE_ARRAY(textExitCourse)); + print_generic_string(x + 10, y - 2, GameEngine_LoadTranslation("TEXT_CONTINUE")); + print_generic_string(x + 10, y - 17, GameEngine_LoadTranslation("TEXT_EXIT_COURSE")); if (*index != MENU_OPT_CAMERA_ANGLE_R) { - print_generic_string(x + 10, y - 33, LANGUAGE_ARRAY(textCameraAngleR)); + print_generic_string(x + 10, y - 33, GameEngine_LoadTranslation("TEXT_CAMERA_ANGLE_R")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); create_dl_translation_matrix(MENU_MTX_PUSH, x - X_VAL8, (y - ((*index - 1) * yIndex)) - Y_VAL8, 0); @@ -2424,8 +2370,6 @@ void highlight_last_course_complete_stars(void) { #endif void print_hud_pause_colorful_str(void) { - u8 textPause[] = { TEXT_PAUSE }; - gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); @@ -2438,9 +2382,6 @@ void render_pause_castle_course_stars(s16 x, s16 y, s16 fileIndex, s16 courseInd s16 hasStar = 0; u8 str[COURSE_STAGES_COUNT * 2]; - - u8 textStar[] = { TEXT_STAR }; - u8 starFlags = save_file_get_star_flags(fileIndex, courseIndex); u16 starCount = save_file_get_course_star_count(fileIndex, courseIndex); @@ -2448,7 +2389,7 @@ void render_pause_castle_course_stars(s16 x, s16 y, s16 fileIndex, s16 courseInd if (starFlags & (1 << 6)) { starCount--; - print_generic_string(x + 89, y - 5, textStar); + print_generic_string(x + 89, y - 5, GameEngine_LoadTranslation("TEXT_STAR")); } while (hasStar != starCount) { @@ -2483,7 +2424,6 @@ void render_pause_castle_main_strings(s16 x, s16 y) { u8 textCoin[] = { TEXT_COIN }; u8 textX[] = { TEXT_VARIABLE_X }; #else - u8 textCoin[] = { TEXT_COIN_X }; #endif void *courseName; @@ -2540,7 +2480,7 @@ void render_pause_castle_main_strings(s16 x, s16 y) { if (gDialogLineNum <= COURSE_NUM_TO_INDEX(COURSE_STAGES_MAX)) { // Main courses courseName = GameEngine_LoadLevelName(gDialogLineNum); render_pause_castle_course_stars(x, y, gCurrSaveFileNum - 1, gDialogLineNum); - print_generic_string(x + 34, y - 5, textCoin); + print_generic_string(x + 34, y - 5, GameEngine_LoadTranslation("TEXT_COIN_X")); #ifdef VERSION_EU print_generic_string(x + 44, y - 5, textX); #endif @@ -2550,9 +2490,8 @@ void render_pause_castle_main_strings(s16 x, s16 y) { print_generic_string(x - 17, y + 30, courseName); #endif } else { // Castle secret stars - u8 textStarX[] = { TEXT_STAR_X }; courseName = GameEngine_LoadLevelName(COURSE_MAX); - print_generic_string(x + 40, y + 13, textStarX); + print_generic_string(x + 40, y + 13, GameEngine_LoadTranslation("TEXT_STAR_X")); int_to_str(save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_BONUS_STAGES - 1, COURSE_MAX - 1), strVal); print_generic_string(x + 60, y + 13, strVal); #ifdef VERSION_EU @@ -2665,9 +2604,9 @@ s16 render_pause_courses_and_castle(void) { #define TXT_HISCORE_Y 36 #define TXT_CONGRATS_X 70 #elif defined(VERSION_EU) -#define TXT_HISCORE_X get_str_x_pos_from_center_scale(160, LANGUAGE_ARRAY(textHiScore), 12.0f) +#define TXT_HISCORE_X get_str_x_pos_from_center_scale(160, GameEngine_LoadTranslation(textHiScore), 12.0f) #define TXT_HISCORE_Y 36 - #define TXT_CONGRATS_X get_str_x_pos_from_center_scale(160, LANGUAGE_ARRAY(textCongratulations), 12.0f) + #define TXT_CONGRATS_X get_str_x_pos_from_center_scale(160, GameEngine_LoadTranslation(textCongratulations), 12.0f) #elif defined(VERSION_SH) #define TXT_HISCORE_X 118 #define TXT_HISCORE_Y 48 @@ -2678,31 +2617,15 @@ s16 render_pause_courses_and_castle(void) { #define HUD_PRINT_CONGRATULATIONS 1 void print_hud_course_complete_string(s8 str) { -#ifdef VERSION_EU - u8 textHiScore[][15] = { - { TEXT_HUD_HI_SCORE }, - { TEXT_HUD_HI_SCORE_FR }, - { TEXT_HUD_HI_SCORE_DE } - }; - u8 textCongratulations[][16] = { - { TEXT_HUD_CONGRATULATIONS }, - { TEXT_HUD_CONGRATULATIONS_FR }, - { TEXT_HUD_CONGRATULATIONS_DE } - }; -#else - u8 textHiScore[] = { TEXT_HUD_HI_SCORE }; - u8 textCongratulations[] = { TEXT_HUD_CONGRATULATIONS }; -#endif - u8 colorFade = sins(gDialogColorFadeTimer) * 50.0f + 200.0f; gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, colorFade, colorFade, colorFade, 255); if (str == HUD_PRINT_HISCORE) { - print_hud_lut_string(HUD_LUT_GLOBAL, TXT_HISCORE_X, TXT_HISCORE_Y, LANGUAGE_ARRAY(textHiScore)); + print_hud_lut_string(HUD_LUT_GLOBAL, TXT_HISCORE_X, TXT_HISCORE_Y, GameEngine_LoadTranslation("TEXT_HUD_HI_SCORE")); } else { // HUD_PRINT_CONGRATULATIONS - print_hud_lut_string(HUD_LUT_GLOBAL, TXT_CONGRATS_X, 67, LANGUAGE_ARRAY(textCongratulations)); + print_hud_lut_string(HUD_LUT_GLOBAL, TXT_CONGRATS_X, 67, textHudCongratulations); } gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); @@ -2785,9 +2708,8 @@ void render_course_complete_lvl_info_and_hud_str(void) { UNUSED u8 textCatch[] = { TEXT_CATCH }; // unused in EU u8 textSymStar[] = { GLYPH_STAR, GLYPH_SPACE }; #else - u8 textCourse[] = { TEXT_COURSE }; - UNUSED u8 textCatch[] = { TEXT_CATCH }; // unused in US - UNUSED u8 textClear[] = { TEXT_CLEAR }; +// UNUSED u8 textCatch[] = { }; // unused in US +// UNUSED u8 textClear[] = { TEXT_CLEAR }; u8 textSymStar[] = { GLYPH_STAR, GLYPH_SPACE }; #endif u8 *name; @@ -2828,11 +2750,11 @@ void render_course_complete_lvl_info_and_hud_str(void) { int_to_str(gLastCompletedCourseNum, strCourseNum); gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, gDialogTextAlpha); - print_generic_string(65, 165, LANGUAGE_ARRAY(textCourse)); + print_generic_string(65, 165, GameEngine_LoadTranslation("TEXT_COURSE")); print_generic_string(CRS_NUM_X2, 165, strCourseNum); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(63, 167, LANGUAGE_ARRAY(textCourse)); + print_generic_string(63, 167, GameEngine_LoadTranslation("TEXT_COURSE")); print_generic_string(CRS_NUM_X3, 167, strCourseNum); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -2848,13 +2770,13 @@ void render_course_complete_lvl_info_and_hud_str(void) { #endif print_generic_string(TXT_NAME_X1, 130, name); #ifndef VERSION_EU - print_generic_string(TXT_CLEAR_X1, 130, textClear); + print_generic_string(TXT_CLEAR_X1, 130, GameEngine_LoadTranslation("TEXT_CLEAR")); #endif gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); print_generic_string(TXT_NAME_X2, 132, name); #ifndef VERSION_EU - print_generic_string(TXT_CLEAR_X2, 132, textClear); + print_generic_string(TXT_CLEAR_X2, 132, GameEngine_LoadTranslation("TEXT_CLEAR")); #endif gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -2938,11 +2860,7 @@ void render_save_confirmation(s16 x, s16 y, s8 *index, s16 sp6e) { TEXT_CONTINUE_WITHOUT_SAVING_FR }, { TEXT_CONTINUE_WITHOUT_SAVING_DE } }; - s16 xOffset = get_str_x_pos_from_center(160, LANGUAGE_ARRAY(textContinueWithoutSave), 12.0f); -#else - u8 textSaveAndContinue[] = { TEXT_SAVE_AND_CONTINUE }; - u8 textSaveAndQuit[] = { TEXT_SAVE_AND_QUIT }; - u8 textContinueWithoutSave[] = { TEXT_CONTINUE_WITHOUT_SAVING }; + s16 xOffset = get_str_x_pos_from_center(160, GameEngine_LoadTranslation(textContinueWithoutSave), 12.0f); #endif handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 3); @@ -2950,9 +2868,9 @@ void render_save_confirmation(s16 x, s16 y, s8 *index, s16 sp6e) gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); - print_generic_string(TXT_SAVEOPTIONS_X, y + TXT_SAVECONT_Y, LANGUAGE_ARRAY(textSaveAndContinue)); - print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_SAVEQUIT_Y, LANGUAGE_ARRAY(textSaveAndQuit)); - print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_CONTNOSAVE_Y, LANGUAGE_ARRAY(textContinueWithoutSave)); + print_generic_string(TXT_SAVEOPTIONS_X, y + TXT_SAVECONT_Y, GameEngine_LoadTranslation("TEXT_SAVE_AND_CONTINUE")); + print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_SAVEQUIT_Y, GameEngine_LoadTranslation("TEXT_SAVE_AND_QUIT")); + print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_CONTNOSAVE_Y, GameEngine_LoadTranslation("TEXT_CONTINUE_WITHOUT_SAVING")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); diff --git a/src/game/save_file.c b/src/game/save_file.c index ea0ea52b..732f756e 100644 --- a/src/game/save_file.c +++ b/src/game/save_file.c @@ -461,9 +461,7 @@ s32 save_file_get_total_star_count(s32 fileIndex, s32 minCourse, s32 maxCourse) } // Add castle secret star count. - // return save_file_get_course_star_count(fileIndex, COURSE_NUM_TO_INDEX(COURSE_NONE)) + count; - // TODO: Implement this - return 255; + return save_file_get_course_star_count(fileIndex, COURSE_NUM_TO_INDEX(COURSE_NONE)) + count; } void save_file_set_flags(u32 flags) { diff --git a/src/menu/file_select.c b/src/menu/file_select.c index b480eee6..e6bd8e6b 100644 --- a/src/menu/file_select.c +++ b/src/menu/file_select.c @@ -20,7 +20,6 @@ #include "game/spawn_object.h" #include "game/rumble_init.h" #include "sm64.h" -#include "text_strings.h" #include "eu_translation.h" #ifdef VERSION_EU @@ -118,165 +117,165 @@ static s8 sScoreFileCoinScoreMode = 0; static s8 sOpenLangSettings = FALSE; #endif -#ifndef VERSION_EU -static unsigned char textReturn[] = { TEXT_RETURN }; -#else -static unsigned char textReturn[][8] = {{ TEXT_RETURN }, { TEXT_RETURN_FR }, { TEXT_RETURN_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textViewScore[] = { TEXT_CHECK_SCORE }; -#else -static unsigned char textViewScore[][12] = {{ TEXT_CHECK_SCORE }, {TEXT_CHECK_SCORE_FR}, {TEXT_CHECK_SCORE_DE}}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyFileButton[] = { TEXT_COPY_FILE_BUTTON }; -#else -static unsigned char textCopyFileButton[][15] = {{ TEXT_COPY_FILE }, { TEXT_COPY_FILE_FR }, { TEXT_COPY_FILE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textEraseFileButton[] = { TEXT_ERASE_FILE_BUTTON }; -#else -static unsigned char textEraseFileButton[][16] = { {TEXT_ERASE_FILE}, {TEXT_ERASE_FILE_FR}, {TEXT_ERASE_FILE_DE} }; -#endif - -#ifndef VERSION_EU -static unsigned char textSoundModes[][8] = { { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET } }; -#endif - -static unsigned char textMarioA[] = { TEXT_FILE_MARIO_A }; -static unsigned char textMarioB[] = { TEXT_FILE_MARIO_B }; -static unsigned char textMarioC[] = { TEXT_FILE_MARIO_C }; -static unsigned char textMarioD[] = { TEXT_FILE_MARIO_D }; - -#ifndef VERSION_EU -static unsigned char textNew[] = { TEXT_NEW }; +//#ifndef VERSION_EU +//static unsigned char textReturn[] = { TEXT_RETURN }; +//#else +//static unsigned char textReturn[][8] = {{ TEXT_RETURN }, { TEXT_RETURN_FR }, { TEXT_RETURN_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textViewScore[] = { TEXT_CHECK_SCORE }; +//#else +//static unsigned char textViewScore[][12] = {{ TEXT_CHECK_SCORE }, {TEXT_CHECK_SCORE_FR}, {TEXT_CHECK_SCORE_DE}}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyFileButton[] = { TEXT_COPY_FILE_BUTTON }; +//#else +//static unsigned char textCopyFileButton[][15] = {{ TEXT_COPY_FILE }, { TEXT_COPY_FILE_FR }, { TEXT_COPY_FILE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textEraseFileButton[] = { TEXT_ERASE_FILE_BUTTON }; +//#else +//static unsigned char textEraseFileButton[][16] = { {TEXT_ERASE_FILE}, {TEXT_ERASE_FILE_FR}, {TEXT_ERASE_FILE_DE} }; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textSoundModes[][8] = { { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET } }; +//#endif +// +//static unsigned char textMarioA[] = { TEXT_FILE_MARIO_A }; +//static unsigned char textMarioB[] = { TEXT_FILE_MARIO_B }; +//static unsigned char textMarioC[] = { TEXT_FILE_MARIO_C }; +//static unsigned char textMarioD[] = { TEXT_FILE_MARIO_D }; +// +//#ifndef VERSION_EU +//static unsigned char textNew[] = { TEXT_NEW }; static unsigned char starIcon[] = { GLYPH_STAR, GLYPH_SPACE }; static unsigned char xIcon[] = { GLYPH_MULTIPLY, GLYPH_SPACE }; -#endif - -#ifndef VERSION_EU -static unsigned char textSelectFile[] = { TEXT_SELECT_FILE }; -#else -static unsigned char textSelectFile[][17] = {{ TEXT_SELECT_FILE }, { TEXT_SELECT_FILE_FR }, { TEXT_SELECT_FILE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textScore[] = { TEXT_SCORE }; -#else -static unsigned char textScore[][9] = {{ TEXT_SCORE }, { TEXT_SCORE_FR }, { TEXT_SCORE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopy[] = { TEXT_COPY }; -#else -static unsigned char textCopy[][9] = {{ TEXT_COPY }, { TEXT_COPY_FR }, { TEXT_COPY_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textErase[] = { TEXT_ERASE }; -#else -static unsigned char textErase[][8] = {{ TEXT_ERASE }, { TEXT_ERASE_FR }, { TEXT_ERASE_DE }}; -#endif - -#ifdef VERSION_EU -static unsigned char textOption[][9] = {{ TEXT_OPTION }, { TEXT_OPTION_FR }, { TEXT_OPTION_DE } }; -#endif - -#ifndef VERSION_EU -static unsigned char textCheckFile[] = { TEXT_CHECK_FILE }; -#else -static unsigned char textCheckFile[][18] = {{ TEXT_CHECK_FILE }, { TEXT_CHECK_FILE_FR }, { TEXT_CHECK_FILE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNoSavedDataExists[] = { TEXT_NO_SAVED_DATA_EXISTS }; -#else -static unsigned char textNoSavedDataExists[][30] = {{ TEXT_NO_SAVED_DATA_EXISTS }, { TEXT_NO_SAVED_DATA_EXISTS_FR }, { TEXT_NO_SAVED_DATA_EXISTS_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyFile[] = { TEXT_COPY_FILE }; -#else -static unsigned char textCopyFile[][16] = {{ TEXT_COPY_FILE_BUTTON }, { TEXT_COPY_FILE_BUTTON_FR }, { TEXT_COPY_FILE_BUTTON_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyItToWhere[] = { TEXT_COPY_IT_TO_WHERE }; -#else -static unsigned char textCopyItToWhere[][18] = {{ TEXT_COPY_IT_TO_WHERE }, { TEXT_COPY_IT_TO_WHERE_FR }, { TEXT_COPY_IT_TO_WHERE_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNoSavedDataExistsCopy[] = { TEXT_NO_SAVED_DATA_EXISTS }; -#endif - -#ifndef VERSION_EU -static unsigned char textCopyCompleted[] = { TEXT_COPYING_COMPLETED }; -#else -static unsigned char textCopyCompleted[][18] = {{ TEXT_COPYING_COMPLETED }, { TEXT_COPYING_COMPLETED_FR }, { TEXT_COPYING_COMPLETED_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textSavedDataExists[] = { TEXT_SAVED_DATA_EXISTS }; -#else -static unsigned char textSavedDataExists[][20] = {{ TEXT_SAVED_DATA_EXISTS }, { TEXT_SAVED_DATA_EXISTS_FR }, { TEXT_SAVED_DATA_EXISTS_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNoFileToCopyFrom[] = { TEXT_NO_FILE_TO_COPY_FROM }; -#else -static unsigned char textNoFileToCopyFrom[][21] = {{ TEXT_NO_FILE_TO_COPY_FROM }, { TEXT_NO_FILE_TO_COPY_FROM_FR }, { TEXT_NO_FILE_TO_COPY_FROM_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textYes[] = { TEXT_YES }; -#else -static unsigned char textYes[][4] = {{ TEXT_YES }, { TEXT_YES_FR }, { TEXT_YES_DE }}; -#endif - -#ifndef VERSION_EU -static unsigned char textNo[] = { TEXT_NO }; -#else -static unsigned char textNo[][5] = {{ TEXT_NO }, { TEXT_NO_FR }, { TEXT_NO_DE }}; -#endif - -#ifdef VERSION_EU -// In EU, Erase File and Sound Select strings are outside it's print string function -static unsigned char textEraseFile[][17] = { - { TEXT_ERASE_FILE_BUTTON }, { TEXT_ERASE_FILE_BUTTON_FR }, { TEXT_ERASE_FILE_BUTTON_DE } -}; -static unsigned char textSure[][8] = {{ TEXT_SURE }, { TEXT_SURE_FR }, { TEXT_SURE_DE }}; -static unsigned char textMarioAJustErased[][20] = { - { TEXT_FILE_MARIO_A_JUST_ERASED }, { TEXT_FILE_MARIO_A_JUST_ERASED_FR }, { TEXT_FILE_MARIO_A_JUST_ERASED_DE } -}; - -static unsigned char textSoundSelect[][13] = { - { TEXT_SOUND_SELECT }, { TEXT_SOUND_SELECT_FR }, { TEXT_SOUND_SELECT_DE } -}; - -static unsigned char textLanguageSelect[][17] = { - { TEXT_LANGUAGE_SELECT }, { TEXT_LANGUAGE_SELECT_FR }, { TEXT_LANGUAGE_SELECT_DE } -}; - -static unsigned char textSoundModes[][10] = { - { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET }, - { TEXT_STEREO_FR }, { TEXT_MONO_FR }, { TEXT_HEADSET_FR }, - { TEXT_STEREO_DE }, { TEXT_MONO_DE }, { TEXT_HEADSET_DE } -}; - -static unsigned char textLanguage[][9] = {{ TEXT_ENGLISH }, { TEXT_FRENCH }, { TEXT_GERMAN }}; - -static unsigned char textMario[] = { TEXT_MARIO }; -static unsigned char textHiScore[][15] = {{ TEXT_HI_SCORE }, { TEXT_HI_SCORE_FR }, { TEXT_HI_SCORE_DE }}; -static unsigned char textMyScore[][10] = {{ TEXT_MY_SCORE }, { TEXT_MY_SCORE_FR }, { TEXT_MY_SCORE_DE }}; - -static unsigned char textNew[][5] = {{ TEXT_NEW }, { TEXT_NEW_FR }, { TEXT_NEW_DE }}; -static unsigned char starIcon[] = { GLYPH_STAR, GLYPH_SPACE }; -static unsigned char xIcon[] = { GLYPH_MULTIPLY, GLYPH_SPACE }; -#endif +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textSelectFile[] = { TEXT_SELECT_FILE }; +//#else +//static unsigned char textSelectFile[][17] = {{ TEXT_SELECT_FILE }, { TEXT_SELECT_FILE_FR }, { TEXT_SELECT_FILE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textScore[] = { TEXT_SCORE }; +//#else +//static unsigned char textScore[][9] = {{ TEXT_SCORE }, { TEXT_SCORE_FR }, { TEXT_SCORE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopy[] = { TEXT_COPY }; +//#else +//static unsigned char textCopy[][9] = {{ TEXT_COPY }, { TEXT_COPY_FR }, { TEXT_COPY_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textErase[] = { TEXT_ERASE }; +//#else +//static unsigned char textErase[][8] = {{ TEXT_ERASE }, { TEXT_ERASE_FR }, { TEXT_ERASE_DE }}; +//#endif +// +//#ifdef VERSION_EU +//static unsigned char textOption[][9] = {{ TEXT_OPTION }, { TEXT_OPTION_FR }, { TEXT_OPTION_DE } }; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCheckFile[] = { TEXT_CHECK_FILE }; +//#else +//static unsigned char textCheckFile[][18] = {{ TEXT_CHECK_FILE }, { TEXT_CHECK_FILE_FR }, { TEXT_CHECK_FILE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNoSavedDataExists[] = { TEXT_NO_SAVED_DATA_EXISTS }; +//#else +//static unsigned char textNoSavedDataExists[][30] = {{ TEXT_NO_SAVED_DATA_EXISTS }, { TEXT_NO_SAVED_DATA_EXISTS_FR }, { TEXT_NO_SAVED_DATA_EXISTS_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyFile[] = { TEXT_COPY_FILE }; +//#else +//static unsigned char textCopyFile[][16] = {{ TEXT_COPY_FILE_BUTTON }, { TEXT_COPY_FILE_BUTTON_FR }, { TEXT_COPY_FILE_BUTTON_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyItToWhere[] = { TEXT_COPY_IT_TO_WHERE }; +//#else +//static unsigned char textCopyItToWhere[][18] = {{ TEXT_COPY_IT_TO_WHERE }, { TEXT_COPY_IT_TO_WHERE_FR }, { TEXT_COPY_IT_TO_WHERE_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNoSavedDataExistsCopy[] = { TEXT_NO_SAVED_DATA_EXISTS }; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textCopyCompleted[] = { TEXT_COPYING_COMPLETED }; +//#else +//static unsigned char textCopyCompleted[][18] = {{ TEXT_COPYING_COMPLETED }, { TEXT_COPYING_COMPLETED_FR }, { TEXT_COPYING_COMPLETED_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textSavedDataExists[] = { TEXT_SAVED_DATA_EXISTS }; +//#else +//static unsigned char textSavedDataExists[][20] = {{ TEXT_SAVED_DATA_EXISTS }, { TEXT_SAVED_DATA_EXISTS_FR }, { TEXT_SAVED_DATA_EXISTS_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNoFileToCopyFrom[] = { TEXT_NO_FILE_TO_COPY_FROM }; +//#else +//static unsigned char textNoFileToCopyFrom[][21] = {{ TEXT_NO_FILE_TO_COPY_FROM }, { TEXT_NO_FILE_TO_COPY_FROM_FR }, { TEXT_NO_FILE_TO_COPY_FROM_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textYes[] = { TEXT_YES }; +//#else +//static unsigned char textYes[][4] = {{ TEXT_YES }, { TEXT_YES_FR }, { TEXT_YES_DE }}; +//#endif +// +//#ifndef VERSION_EU +//static unsigned char textNo[] = { TEXT_NO }; +//#else +//static unsigned char textNo[][5] = {{ TEXT_NO }, { TEXT_NO_FR }, { TEXT_NO_DE }}; +//#endif +// +//#ifdef VERSION_EU +//// In EU, Erase File and Sound Select strings are outside it's print string function +//static unsigned char textEraseFile[][17] = { +// { TEXT_ERASE_FILE_BUTTON }, { TEXT_ERASE_FILE_BUTTON_FR }, { TEXT_ERASE_FILE_BUTTON_DE } +//}; +//static unsigned char textSure[][8] = {{ TEXT_SURE }, { TEXT_SURE_FR }, { TEXT_SURE_DE }}; +//static unsigned char textMarioAJustErased[][20] = { +// { TEXT_FILE_MARIO_A_JUST_ERASED }, { TEXT_FILE_MARIO_A_JUST_ERASED_FR }, { TEXT_FILE_MARIO_A_JUST_ERASED_DE } +//}; +// +//static unsigned char textSoundSelect[][13] = { +// { TEXT_SOUND_SELECT }, { TEXT_SOUND_SELECT_FR }, { TEXT_SOUND_SELECT_DE } +//}; +// +//static unsigned char textLanguageSelect[][17] = { +// { TEXT_LANGUAGE_SELECT }, { TEXT_LANGUAGE_SELECT_FR }, { TEXT_LANGUAGE_SELECT_DE } +//}; +// +//static unsigned char textSoundModes[][10] = { +// { TEXT_STEREO }, { TEXT_MONO }, { TEXT_HEADSET }, +// { TEXT_STEREO_FR }, { TEXT_MONO_FR }, { TEXT_HEADSET_FR }, +// { TEXT_STEREO_DE }, { TEXT_MONO_DE }, { TEXT_HEADSET_DE } +//}; +// +//static unsigned char textLanguage[][9] = {{ TEXT_ENGLISH }, { TEXT_FRENCH }, { TEXT_GERMAN }}; +// +//static unsigned char textMario[] = { TEXT_MARIO }; +//static unsigned char textHiScore[][15] = {{ TEXT_HI_SCORE }, { TEXT_HI_SCORE_FR }, { TEXT_HI_SCORE_DE }}; +//static unsigned char textMyScore[][10] = {{ TEXT_MY_SCORE }, { TEXT_MY_SCORE_FR }, { TEXT_MY_SCORE_DE }}; +// +//static unsigned char textNew[][5] = {{ TEXT_NEW }, { TEXT_NEW_FR }, { TEXT_NEW_DE }}; +//static unsigned char starIcon[] = { GLYPH_STAR, GLYPH_SPACE }; +//static unsigned char xIcon[] = { GLYPH_MULTIPLY, GLYPH_SPACE }; +//#endif /** * Yellow Background Menu Initial Action @@ -1764,7 +1763,7 @@ void print_save_file_star_count(s8 fileIndex, s16 x, s16 y) { print_hud_lut_string(HUD_LUT_GLOBAL, x + offset + 16, y, starCountText); } else { // Print "new" text - print_hud_lut_string(HUD_LUT_GLOBAL, x, y, LANGUAGE_ARRAY(textNew)); + print_hud_lut_string(HUD_LUT_GLOBAL, x, y, GameEngine_LoadTranslation("TEXT_NEW")); } } @@ -1815,7 +1814,7 @@ void print_main_menu_strings(void) { gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); #ifndef VERSION_EU - print_hud_lut_string(HUD_LUT_DIFF, SELECT_FILE_X, 35, textSelectFile); + print_hud_lut_string(HUD_LUT_DIFF, SELECT_FILE_X, 35, GameEngine_LoadTranslation("TEXT_SELECT_FILE")); #endif // Print file star counts print_save_file_star_count(SAVE_FILE_A, SAVEFILE_X1, 78); @@ -1827,10 +1826,15 @@ void print_main_menu_strings(void) { // Print menu names gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_generic_string(SCORE_X, 39, textScore); - print_generic_string(COPY_X, 39, textCopy); - print_generic_string(ERASE_X, 39, textErase); + print_generic_string(SCORE_X, 39, GameEngine_LoadTranslation("TEXT_SCORE")); + print_generic_string(COPY_X, 39, GameEngine_LoadTranslation("TEXT_COPY")); + print_generic_string(ERASE_X, 39, GameEngine_LoadTranslation("TEXT_ERASE")); #ifndef VERSION_JP + unsigned char* textSoundModes[] = { + GameEngine_LoadTranslation("TEXT_STEREO"), + GameEngine_LoadTranslation("TEXT_MONO"), + GameEngine_LoadTranslation("TEXT_HEADSET") + }; sSoundTextX = get_str_x_pos_from_center(254, textSoundModes[sSoundMode], 10.0f); #endif print_generic_string(SOUNDMODE_X1, 39, textSoundModes[sSoundMode]); @@ -1839,10 +1843,10 @@ void print_main_menu_strings(void) { // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(MARIOTEXT_X1, 65, textMarioA); - print_menu_generic_string(MARIOTEXT_X2, 65, textMarioB); - print_menu_generic_string(MARIOTEXT_X1, 105, textMarioC); - print_menu_generic_string(MARIOTEXT_X2, 105, textMarioD); + print_menu_generic_string(MARIOTEXT_X1, 65, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(MARIOTEXT_X2, 65, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(MARIOTEXT_X1, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(MARIOTEXT_X2, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); } @@ -1901,15 +1905,15 @@ void score_menu_display_message(s8 messageID) { switch (messageID) { case SCORE_MSG_CHECK_FILE: #ifdef VERSION_EU - checkFileX = get_str_x_pos_from_center_scale(160, LANGUAGE_ARRAY(textCheckFile), 12.0f); + checkFileX = get_str_x_pos_from_center_scale(160, GameEngine_LoadTranslation(textCheckFile), 12.0f); #endif - print_hud_lut_string_fade(HUD_LUT_DIFF, CHECK_FILE_X, 35, LANGUAGE_ARRAY(textCheckFile)); + print_hud_lut_string_fade(HUD_LUT_DIFF, CHECK_FILE_X, 35, GameEngine_LoadTranslation("TEXT_CHECK_FILE")); break; case SCORE_MSG_NOSAVE_DATA: #ifdef VERSION_EU - noSaveDataX = get_str_x_pos_from_center(160, LANGUAGE_ARRAY(textNoSavedDataExists), 10.0f); + noSaveDataX = get_str_x_pos_from_center(160, GameEngine_LoadTranslation(textNoSavedDataExists), 10.0f); #endif - print_generic_string_fade(NOSAVE_DATA_X1, 190, LANGUAGE_ARRAY(textNoSavedDataExists)); + print_generic_string_fade(NOSAVE_DATA_X1, 190, GameEngine_LoadTranslation("TEXT_NO_SAVED_DATA_EXISTS")); break; } } @@ -1973,15 +1977,15 @@ void print_score_menu_strings(void) { #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(69, textReturn[sLanguageMode], 10.0f); #endif - print_generic_string(RETURN_X, 35, LANGUAGE_ARRAY(textReturn)); + print_generic_string(RETURN_X, 35, GameEngine_LoadTranslation("TEXT_RETURN")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(159, textCopyFileButton[sLanguageMode], 10.0f); #endif - print_generic_string(COPYFILE_X1, 35, LANGUAGE_ARRAY(textCopyFileButton)); + print_generic_string(COPYFILE_X1, 35, GameEngine_LoadTranslation("TEXT_COPY_FILE_BUTTON")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(249, textEraseFileButton[sLanguageMode], 10.0f); #endif - print_generic_string(ERASEFILE_X1, 35, LANGUAGE_ARRAY(textEraseFileButton)); + print_generic_string(ERASEFILE_X1, 35, GameEngine_LoadTranslation("TEXT_ERASE_FILE_BUTTON")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); #ifdef VERSION_EU @@ -1990,10 +1994,10 @@ void print_score_menu_strings(void) { // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(89, 62, textMarioA); - print_menu_generic_string(211, 62, textMarioB); - print_menu_generic_string(89, 105, textMarioC); - print_menu_generic_string(211, 105, textMarioD); + print_menu_generic_string(89, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(211, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(89, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(211, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); #endif } @@ -2035,39 +2039,39 @@ void copy_menu_display_message(s8 messageID) { #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textNoFileToCopyFrom[sLanguageMode], 10.0f); #endif - print_generic_string_fade(NOFILE_COPY_X, 190, LANGUAGE_ARRAY(textNoFileToCopyFrom)); + print_generic_string_fade(NOFILE_COPY_X, 190, GameEngine_LoadTranslation("TEXT_NO_FILE_TO_COPY_FROM")); } else { #ifdef VERSION_EU centeredX = get_str_x_pos_from_center_scale(160, textCopyFile[sLanguageMode], 12.0f); #endif - print_hud_lut_string_fade(HUD_LUT_DIFF, COPY_FILE_X, 35, LANGUAGE_ARRAY(textCopyFile)); + print_hud_lut_string_fade(HUD_LUT_DIFF, COPY_FILE_X, 35, GameEngine_LoadTranslation("TEXT_COPY_FILE")); } break; case COPY_MSG_COPY_WHERE: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textCopyItToWhere[sLanguageMode], 10.0f); #endif - print_generic_string_fade(COPYIT_WHERE_X, 190, LANGUAGE_ARRAY(textCopyItToWhere)); + print_generic_string_fade(COPYIT_WHERE_X, 190, GameEngine_LoadTranslation("TEXT_COPY_IT_TO_WHERE")); break; case COPY_MSG_NOSAVE_EXISTS: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textNoSavedDataExists[sLanguageMode], 10.0f); print_generic_string_fade(NOSAVE_DATA_X2, 190, textNoSavedDataExists[sLanguageMode]); #else - print_generic_string_fade(NOSAVE_DATA_X2, 190, textNoSavedDataExistsCopy); + print_generic_string_fade(NOSAVE_DATA_X2, 190, GameEngine_LoadTranslation("TEXT_NO_SAVED_DATA_EXISTS")); #endif break; case COPY_MSG_COPY_COMPLETE: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textCopyCompleted[sLanguageMode], 10.0f); #endif - print_generic_string_fade(COPYCOMPLETE_X, 190, LANGUAGE_ARRAY(textCopyCompleted)); + print_generic_string_fade(COPYCOMPLETE_X, 190, GameEngine_LoadTranslation("TEXT_COPY_COMPLETED")); break; case COPY_MSG_SAVE_EXISTS: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textSavedDataExists[sLanguageMode], 10.0f); #endif - print_generic_string_fade(SAVE_EXISTS_X1, 190, LANGUAGE_ARRAY(textSavedDataExists)); + print_generic_string_fade(SAVE_EXISTS_X1, 190, GameEngine_LoadTranslation("TEXT_SAVED_DATA_EXISTS")); break; } } @@ -2159,15 +2163,15 @@ void print_copy_menu_strings(void) { #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(69, textReturn[sLanguageMode], 10.0f); #endif - print_generic_string(RETURN_X, 35, LANGUAGE_ARRAY(textReturn)); + print_generic_string(RETURN_X, 35, GameEngine_LoadTranslation("TEXT_RETURN")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(159, textViewScore[sLanguageMode], 10.0f); #endif - print_generic_string(VIEWSCORE_X1, 35, LANGUAGE_ARRAY(textViewScore)); + print_generic_string(VIEWSCORE_X1, 35, GameEngine_LoadTranslation("TEXT_CHECK_SCORE")); #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(249, textEraseFileButton[sLanguageMode], 10.0f); #endif - print_generic_string(ERASEFILE_X2, 35, LANGUAGE_ARRAY(textEraseFileButton)); + print_generic_string(ERASEFILE_X2, 35, GameEngine_LoadTranslation("TEXT_ERASE_FILE_BUTTON")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); #ifdef VERSION_EU print_main_menu_strings(); @@ -2175,10 +2179,10 @@ void print_copy_menu_strings(void) { // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(89, 62, textMarioA); - print_menu_generic_string(211, 62, textMarioB); - print_menu_generic_string(89, 105, textMarioC); - print_menu_generic_string(211, 105, textMarioD); + print_menu_generic_string(89, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(211, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(89, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(211, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); #endif } @@ -2269,9 +2273,9 @@ void print_erase_menu_prompt(s16 x, s16 y) { // Print "YES NO" strings gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, sYesNoColor[0], sYesNoColor[0], sYesNoColor[0], sTextBaseAlpha); - print_generic_string(x + 56, y, LANGUAGE_ARRAY(textYes)); + print_generic_string(x + 56, y, GameEngine_LoadTranslation("TEXT_YES")); gDPSetEnvColor(gDisplayListHead++, sYesNoColor[1], sYesNoColor[1], sYesNoColor[1], sTextBaseAlpha); - print_generic_string(x + 98, y, LANGUAGE_ARRAY(textNo)); + print_generic_string(x + 98, y, GameEngine_LoadTranslation("TEXT_NO")); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } @@ -2312,42 +2316,39 @@ void erase_menu_display_message(s8 messageID) { #endif #ifndef VERSION_EU - unsigned char textEraseFile[] = { TEXT_ERASE_FILE }; - unsigned char textSure[] = { TEXT_SURE }; - unsigned char textNoSavedDataExists[] = { TEXT_NO_SAVED_DATA_EXISTS }; - unsigned char textMarioAJustErased[] = { TEXT_FILE_MARIO_A_JUST_ERASED }; - unsigned char textSavedDataExists[] = { TEXT_SAVED_DATA_EXISTS }; -#endif +#endif + uint8_t* erasedText; switch (messageID) { case ERASE_MSG_MAIN_TEXT: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center_scale(160, textEraseFile[sLanguageMode], 12.0f); #endif - print_hud_lut_string_fade(HUD_LUT_DIFF, ERASE_FILE_X, 35, LANGUAGE_ARRAY(textEraseFile)); + print_hud_lut_string_fade(HUD_LUT_DIFF, ERASE_FILE_X, 35, GameEngine_LoadTranslation("TEXT_ERASE_FILE")); break; case ERASE_MSG_PROMPT: - print_generic_string_fade(90, 190, LANGUAGE_ARRAY(textSure)); + print_generic_string_fade(90, 190, GameEngine_LoadTranslation("TEXT_SURE")); print_erase_menu_prompt(90, 190); // YES NO, has functions for it too break; case ERASE_MSG_NOSAVE_EXISTS: #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textNoSavedDataExists[sLanguageMode], 10.0f); #endif - print_generic_string_fade(NOSAVE_DATA_X3, 190, LANGUAGE_ARRAY(textNoSavedDataExists)); + print_generic_string_fade(NOSAVE_DATA_X3, 190, GameEngine_LoadTranslation("TEXT_NO_SAVED_DATA_EXISTS")); break; case ERASE_MSG_MARIO_ERASED: - LANGUAGE_ARRAY(textMarioAJustErased)[MARIO_ERASED_VAR] = sSelectedFileIndex + 10; + erasedText = GameEngine_LoadTranslation("TEXT_FILE_MARIO_A_JUST_ERASED"); + erasedText[MARIO_ERASED_VAR] = sSelectedFileIndex + 10; #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textMarioAJustErased[sLanguageMode], 10.0f); #endif - print_generic_string_fade(MARIO_ERASED_X, 190, LANGUAGE_ARRAY(textMarioAJustErased)); + print_generic_string_fade(MARIO_ERASED_X, 190, erasedText); break; case ERASE_MSG_SAVE_EXISTS: // unused #ifdef VERSION_EU centeredX = get_str_x_pos_from_center(160, textSavedDataExists[sLanguageMode], 10.0f); #endif - print_generic_string_fade(SAVE_EXISTS_X2, 190, LANGUAGE_ARRAY(textSavedDataExists)); + print_generic_string_fade(SAVE_EXISTS_X2, 190, GameEngine_LoadTranslation("TEXT_SAVED_DATA_EXISTS")); break; } } @@ -2439,9 +2440,9 @@ void print_erase_menu_strings(void) { centeredX = get_str_x_pos_from_center(249, textCopyFileButton[sLanguageMode], 10.0f); print_generic_string(centeredX, 35, textCopyFileButton[sLanguageMode]); #else - print_generic_string(RETURN_X, 35, textReturn); - print_generic_string(VIEWSCORE_X2, 35, textViewScore); - print_generic_string(COPYFILE_X2, 35, textCopyFileButton); + print_generic_string(RETURN_X, 35, GameEngine_LoadTranslation("TEXT_RETURN")); + print_generic_string(VIEWSCORE_X2, 35, GameEngine_LoadTranslation("TEXT_CHECK_SCORE")); + print_generic_string(COPYFILE_X2, 35, GameEngine_LoadTranslation("TEXT_COPY_FILE_BUTTON")); #endif gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -2451,10 +2452,10 @@ void print_erase_menu_strings(void) { // Print file names gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); - print_menu_generic_string(89, 62, textMarioA); - print_menu_generic_string(211, 62, textMarioB); - print_menu_generic_string(89, 105, textMarioC); - print_menu_generic_string(211, 105, textMarioD); + print_menu_generic_string(89, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_A")); + print_menu_generic_string(211, 62, GameEngine_LoadTranslation("TEXT_FILE_MARIO_B")); + print_menu_generic_string(89, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_C")); + print_menu_generic_string(211, 105, GameEngine_LoadTranslation("TEXT_FILE_MARIO_D")); gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); #endif } @@ -2479,10 +2480,6 @@ void print_sound_mode_menu_strings(void) { s32 textX; #endif -#ifndef VERSION_EU - unsigned char textSoundSelect[] = { TEXT_SOUND_SELECT }; -#endif - // Print "SOUND SELECT" text gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); @@ -2491,7 +2488,7 @@ void print_sound_mode_menu_strings(void) { print_hud_lut_string(HUD_LUT_DIFF, 47, 32, textSoundSelect[sLanguageMode]); print_hud_lut_string(HUD_LUT_DIFF, 47, 101, textLanguageSelect[sLanguageMode]); #else - print_hud_lut_string(HUD_LUT_DIFF, SOUND_HUD_X, 35, textSoundSelect); + print_hud_lut_string(HUD_LUT_DIFF, SOUND_HUD_X, 35, GameEngine_LoadTranslation("TEXT_SOUND_SELECT")); #endif gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); @@ -2523,6 +2520,11 @@ void print_sound_mode_menu_strings(void) { 72, textLanguage[mode]); } #else + unsigned char* textSoundModes[] = { + GameEngine_LoadTranslation("TEXT_STEREO"), + GameEngine_LoadTranslation("TEXT_MONO"), + GameEngine_LoadTranslation("TEXT_HEADSET") + }; // Print sound mode names for (mode = 0; mode < 3; mode++) { if (mode == sSoundMode) { @@ -2548,15 +2550,13 @@ void print_sound_mode_menu_strings(void) { gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } -unsigned char textStarX[] = { TEXT_STAR_X }; - /** * Prints castle secret stars collected in a score menu save file. */ void print_score_file_castle_secret_stars(s8 fileIndex, s16 x, s16 y) { unsigned char secretStarsText[20]; // Print "[star] x" - print_menu_generic_string(x, y, textStarX); + print_menu_generic_string(x, y, GameEngine_LoadTranslation("TEXT_STAR_X")); // Print number of castle secret stars int_to_str(save_file_get_total_star_count(fileIndex, COURSE_BONUS_STAGES - 1, COURSE_MAX - 1), secretStarsText); @@ -2583,16 +2583,17 @@ void print_score_file_castle_secret_stars(s8 fileIndex, s16 x, s16 y) { void print_score_file_course_coin_score(s8 fileIndex, s16 courseIndex, s16 x, s16 y) { unsigned char coinScoreText[20]; u8 stars = save_file_get_star_flags(fileIndex, courseIndex); - unsigned char textCoinX[] = { TEXT_COIN_X }; - unsigned char textStar[] = { TEXT_STAR }; + unsigned char* textCoinX = GameEngine_LoadTranslation("TEXT_COIN_X"); + unsigned char* textStar = GameEngine_LoadTranslation("TEXT_STAR"); #if defined(VERSION_JP) || defined(VERSION_SH) #define LENGTH 5 #else #define LENGTH 8 #endif - unsigned char fileNames[][LENGTH] = { - { TEXT_4DASHES }, // huh? - { TEXT_SCORE_MARIO_A }, { TEXT_SCORE_MARIO_B }, { TEXT_SCORE_MARIO_C }, { TEXT_SCORE_MARIO_D }, + unsigned char* fileNames[] = { + GameEngine_LoadTranslation("TEXT_4DASHES"), + GameEngine_LoadTranslation("TEXT_FILE_MARIO_A"), GameEngine_LoadTranslation("TEXT_FILE_MARIO_B"), + GameEngine_LoadTranslation("TEXT_FILE_MARIO_C"), GameEngine_LoadTranslation("TEXT_FILE_MARIO_D") }; #undef LENGTH // MYSCORE @@ -2680,10 +2681,10 @@ void print_score_file_star_score(s8 fileIndex, s16 courseIndex, s16 x, s16 y) { */ void print_save_file_scores(s8 fileIndex) { #ifndef VERSION_EU - unsigned char textMario[] = { TEXT_MARIO }; - unsigned char textFileLetter[] = { TEXT_ZERO }; - unsigned char textHiScore[] = { TEXT_HI_SCORE }; - unsigned char textMyScore[] = { TEXT_MY_SCORE }; + unsigned char* textMario = GameEngine_LoadTranslation("TEXT_MARIO"); + unsigned char* textFileLetter = GameEngine_LoadTranslation("TEXT_ZERO"); + unsigned char* textHiScore = GameEngine_LoadTranslation("TEXT_HI_SCORE"); + unsigned char* textMyScore = GameEngine_LoadTranslation("TEXT_MY_SCORE"); #else unsigned char textFileLetter[] = { TEXT_ZERO }; void **levelNameTable; @@ -2749,9 +2750,9 @@ void print_save_file_scores(s8 fileIndex) { // Print current coin score mode if (sScoreFileCoinScoreMode == 0) { - print_menu_generic_string(MYSCORE_X, 24, LANGUAGE_ARRAY(textMyScore)); + print_menu_generic_string(MYSCORE_X, 24, GameEngine_LoadTranslation(textMyScore)); } else { - print_menu_generic_string(HISCORE_X, 24, LANGUAGE_ARRAY(textHiScore)); + print_menu_generic_string(HISCORE_X, 24, GameEngine_LoadTranslation(textHiScore)); } gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_end); diff --git a/src/menu/star_select.c b/src/menu/star_select.c index 225d99a9..97dcac14 100644 --- a/src/menu/star_select.c +++ b/src/menu/star_select.c @@ -19,7 +19,6 @@ #include "game/rumble_init.h" #include "sm64.h" #include "star_select.h" -#include "text_strings.h" /** * @file star_select.c @@ -261,9 +260,9 @@ void print_act_selector_strings(void) { #ifdef VERSION_EU unsigned char myScore[][10] = { {TEXT_MYSCORE}, {TEXT_MY_SCORE_FR}, {TEXT_MY_SCORE_DE} }; #else - unsigned char myScore[] = { TEXT_MYSCORE }; + unsigned char* myScore = GameEngine_LoadTranslation("TEXT_MYSCORE"); #endif - unsigned char starNumbers[] = { TEXT_ZERO }; + unsigned char* starNumbers = GameEngine_LoadTranslation("TEXT_ZERO"); #ifdef VERSION_EU u8 **levelNameTbl; diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index 56937228..45e364a5 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -10,9 +10,12 @@ #include "ZAPDUtils/Utils/StringHelper.h" #include "texts_table.h" #include "port/importer/DialogFactory.h" +#include "port/importer/DictionaryFactory.h" #include #include +#include + extern "C" { #include "audio/external.h" #include "audio/internal.h" @@ -49,6 +52,7 @@ GameEngine::GameEngine(){ this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Sample, "Sample", std::make_shared()); this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Sequence, "Sequence", std::make_shared()); this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SDialog, "Dialog", std::make_shared()); + this->context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::Dictionary, "Dictionary", std::make_shared()); GameEngine::AudioInit(); } @@ -163,6 +167,11 @@ void GameEngine::AudioExit() { audio.thread.join(); } +void GameEngine::LoadDictionary() { + this->dictionary = static_cast> *>(ResourceGetDataByName("__OTR__texts/strings/global")); + int bp = 0; +} + extern "C" uint32_t GameEngine_GetSampleRate() { auto player = LUS::Context::GetInstance()->GetAudio()->GetAudioPlayer(); if (player == nullptr) { @@ -253,4 +262,17 @@ extern "C" uint8_t* GameEngine_LoadLevelName(uint32_t courseId){ extern "C" DialogEntry* GameEngine_LoadDialog(uint32_t dialogId){ auto dialog = (DialogEntry*) ResourceGetDataByName(StringHelper::Sprintf(gDialogRoot, dialogId).c_str()); return dialog; +} + +extern "C" uint8_t* GameEngine_LoadTranslation(const char* key) { + auto engine = GameEngine::Instance; + auto dictionary = engine->dictionary; + + if (dictionary == nullptr) { + engine->LoadDictionary(); + } + + assert(engine->dictionary != nullptr); + assert(engine->dictionary->contains(key)); + return engine->dictionary->at(key).data(); } \ No newline at end of file diff --git a/src/port/Engine.h b/src/port/Engine.h index 0ac61d2f..01f0c952 100644 --- a/src/port/Engine.h +++ b/src/port/Engine.h @@ -21,6 +21,7 @@ class GameEngine { std::shared_ptr context; std::unordered_map banks; std::unordered_map sequences; + std::unordered_map>* dictionary; GameEngine(); static void Create(); @@ -32,6 +33,7 @@ class GameEngine { static void EndAudioFrame(); static void AudioInit(); static void AudioExit(); + void LoadDictionary(); void Destroy(); }; @@ -50,4 +52,5 @@ uint32_t GameEngine_GetGameVersion(); uint8_t* GameEngine_LoadActName(uint32_t actId); uint8_t* GameEngine_LoadLevelName(uint32_t levelId); struct DialogEntry* GameEngine_LoadDialog(uint32_t dialogId); +uint8_t* GameEngine_LoadTranslation(const char* key); #endif \ No newline at end of file diff --git a/src/port/importer/DictionaryFactory.cpp b/src/port/importer/DictionaryFactory.cpp new file mode 100644 index 00000000..56e9f0ca --- /dev/null +++ b/src/port/importer/DictionaryFactory.cpp @@ -0,0 +1,40 @@ +#include "DictionaryFactory.h" +#include "port/importer/types/Dictionary.h" +#include "spdlog/spdlog.h" + +std::shared_ptr CubeOS::DictionaryFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto resource = std::make_shared(initData); + std::shared_ptr factory = nullptr; + + switch (resource->GetInitData()->ResourceVersion) { + case 0: + factory = std::make_shared(); + break; + } + + if (factory == nullptr) { + SPDLOG_ERROR("Failed to load Dialog with version {}", resource->GetInitData()->ResourceVersion); + return nullptr; + } + + factory->ParseFileBinary(reader, resource); + + return resource; +} + +void CubeOS::DictionaryFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { + std::shared_ptr dictionary = std::static_pointer_cast(resource); + + ResourceVersionFactory::ParseFileBinary(reader, dictionary); + + size_t numEntries = reader->ReadUInt32(); + for(size_t i = 0; i < numEntries; i++){ + std::string key = reader->ReadString(); + size_t valueSize = reader->ReadUInt32(); + std::vector value; + for(size_t j = 0; j < valueSize; j++){ + value.push_back(reader->ReadUByte()); + } + dictionary->mData[key] = value; + } +} \ No newline at end of file diff --git a/src/port/importer/DictionaryFactory.h b/src/port/importer/DictionaryFactory.h new file mode 100644 index 00000000..d2466bc0 --- /dev/null +++ b/src/port/importer/DictionaryFactory.h @@ -0,0 +1,16 @@ +#pragma once + +#include "ResourceFactory.h" + +namespace CubeOS{ +class DictionaryFactory : public LUS::ResourceFactory { + public: + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; +}; + +class DictionaryFactoryV0 : public LUS::ResourceVersionFactory { + public: + void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; +}; +} diff --git a/src/port/importer/types/Dictionary.cpp b/src/port/importer/types/Dictionary.cpp new file mode 100644 index 00000000..41540064 --- /dev/null +++ b/src/port/importer/types/Dictionary.cpp @@ -0,0 +1,11 @@ +#include "Dictionary.h" + +namespace CubeOS { +GameDictionary* Dictionary::GetPointer() { + return &mData; +} + +size_t Dictionary::GetPointerSize() { + return sizeof(mData); +} +} \ No newline at end of file diff --git a/src/port/importer/types/Dictionary.h b/src/port/importer/types/Dictionary.h new file mode 100644 index 00000000..317f06fa --- /dev/null +++ b/src/port/importer/types/Dictionary.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include + +namespace CubeOS { + +typedef std::unordered_map> GameDictionary; + +class Dictionary : public LUS::Resource { + public: + using Resource::Resource; + + Dictionary() : Resource(std::shared_ptr()) {} + + GameDictionary* GetPointer(); + size_t GetPointerSize(); + + GameDictionary mData; +}; +} \ No newline at end of file