diff --git a/include/text_strings.h.in b/include/text_strings.h.in index 63a8e77e..030f3959 100644 --- a/include/text_strings.h.in +++ b/include/text_strings.h.in @@ -10,11 +10,11 @@ #define NC_CAMC _("Camera Centre Aggression") #define NC_CAMP _("Camera Pan Level") #define NC_ENABLED _("Enabled") -#define NC_DISABLED _("Disabled") +#define NC_DISABLED _("Disabled") #define NC_BUTTON _("[R]: Options") #define NC_BUTTON2 _("[R]: Return") #define NC_OPTION _("OPTIONS") -#define NC_HIGHLIGHT _("O") +#define NC_HIGHLIGHT _("O") #define NC_ANALOGUE _("Analogue Camera") #define NC_MOUSE _("Mouse Look") @@ -105,6 +105,7 @@ #define TEXT_COURSE _("コース") #define TEXT_MYSCORE _("マイスコア") #define TEXT_CONTINUE _("つづけて マリオする?") +#define TEXT_EXIT_GAME _("ゲームをしゅうりょうする?") #define TEXT_EXIT_COURSE _("コースからでる?") #define TEXT_CAMERA_ANGLE_R _("Rボタンのカメラきりかえ") @@ -122,6 +123,7 @@ // Save Options #define TEXT_SAVE_AND_CONTINUE _("セーブしてつづける?") #define TEXT_SAVE_AND_QUIT _("セーブしておわる?") +#define TEXT_SAVE_EXIT_GAME _("ゲームをやめる?") #define TEXT_CONTINUE_WITHOUT_SAVING _("セーブしないでつづける?") /** @@ -204,6 +206,7 @@ #define TEXT_MYSCORE _("MYSCORE") #define TEXT_CONTINUE _("CONTINUE") #define TEXT_EXIT_COURSE _("EXIT COURSE") +#define TEXT_EXIT_GAME _("EXIT GAME") #ifndef VERSION_EU // "R" text is different in EU #define TEXT_CAMERA_ANGLE_R _("SET CAMERA ANGLE WITH R") #endif @@ -222,6 +225,7 @@ // Save Options #define TEXT_SAVE_AND_CONTINUE _("SAVE & CONTINUE") #define TEXT_SAVE_AND_QUIT _("SAVE & QUIT") +#define TEXT_SAVE_EXIT_GAME _("SAVE & EXIT GAME") #define TEXT_CONTINUE_WITHOUT_SAVING _("CONTINUE, DON'T SAVE") /** @@ -348,12 +352,14 @@ #define TEXT_MY_SCORE_FR _("MON SCORE") #define TEXT_CONTINUE_FR _("CONTINUER") #define TEXT_EXIT_COURSE_FR _("QUITTER NIVEAU") +#define TEXT_EXIT_GAME_FR _("QUITTER JEU") #define TEXT_CAMERA_ANGLE_R_FR _("RÉGLAGE CAMÉRA AVEC [R]") // German #define TEXT_COURSE_DE _("KURS") #define TEXT_MY_SCORE_DE _("LEISTUNG") #define TEXT_CONTINUE_DE _("WEITER") #define TEXT_EXIT_COURSE_DE _("KURS VERLASSEN") +#define TEXT_EXIT_GAME_DE _("SPIEL VERLASSEN") #define TEXT_CAMERA_ANGLE_R_DE _("KAMERA MIT [R] VERSTELLEN") // Camera Options @@ -376,10 +382,12 @@ // French #define TEXT_SAVE_AND_CONTINUE_FR _("SAUVEGARDER & CONTINUER") #define TEXT_SAVE_AND_QUIT_FR _("SAUVEGARDER & QUITTER") +#define TEXT_SAVE_EXIT_GAME_FR _("SAUVEGARDER & QUITTER JEU") #define TEXT_CONTINUE_WITHOUT_SAVING_FR _("CONTINUER SANS SAUVEGARDER") // German #define TEXT_SAVE_AND_CONTINUE_DE _("SPEICHERN & WEITER") #define TEXT_SAVE_AND_QUIT_DE _("SPEICHERN & ENDE") +#define TEXT_SAVE_EXIT_GAME_DE _("SPEICHERN & SPIEL VERLASSEN") #define TEXT_CONTINUE_WITHOUT_SAVING_DE _("WEITER OHNE ZU SPEICHERN") /** diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index 227062c1..bfcbf42b 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -2387,6 +2387,13 @@ void render_pause_course_options(s16 x, s16 y, s8 *index, s16 yIndex) { { TEXT_EXIT_COURSE_FR }, { TEXT_EXIT_COURSE_DE } }; + + u8 textExitGame[][22] ={ + { TEXT_EXIT_GAME }, + { TEXT_EXIT_GAME_FR }, + { TEXT_EXIT_GAME_DE } + }; + u8 textCameraAngleR[][24] = { { TEXT_CAMERA_ANGLE_R }, { TEXT_CAMERA_ANGLE_R_FR }, @@ -2394,23 +2401,27 @@ void render_pause_course_options(s16 x, s16 y, s8 *index, s16 yIndex) { }; #define textContinue textContinue[gInGameLanguage] #define textExitCourse textExitCourse[gInGameLanguage] +#define textExitGame textExitGame[gInGameLanguage] #define textCameraAngleR textCameraAngleR[gInGameLanguage] #else u8 textContinue[] = { TEXT_CONTINUE }; u8 textExitCourse[] = { TEXT_EXIT_COURSE }; + u8 textExitGame[] = { TEXT_EXIT_GAME }; u8 textCameraAngleR[] = { TEXT_CAMERA_ANGLE_R }; #endif - handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 3); + handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 4); // Index max raised to 4 from 3 gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); print_generic_string(x + 10, y - 2, textContinue); print_generic_string(x + 10, y - 17, textExitCourse); + print_generic_string(x + 10, y - 33, textExitGame); - if (index[0] != 3) { - print_generic_string(x + 10, y - 33, textCameraAngleR); + + if (index[0] != 4) { + print_generic_string(x + 10, y - 48, textCameraAngleR); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); create_dl_translation_matrix(MENU_MTX_PUSH, x - X_VAL8, (y - ((index[0] - 1) * yIndex)) - Y_VAL8, 0); @@ -2420,8 +2431,8 @@ void render_pause_course_options(s16 x, s16 y, s8 *index, s16 yIndex) { gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); } - if (index[0] == 3) { - render_pause_camera_options(x - 42, y - 42, &gDialogCameraAngleIndex, 110); + if (index[0] == 4) { + render_pause_camera_options(x - 42, y - 57, &gDialogCameraAngleIndex, 110); } } @@ -2662,7 +2673,7 @@ s16 render_pause_courses_and_castle(void) { gDialogBoxState = DIALOG_STATE_OPENING; gMenuMode = -1; - if (gDialogLineNum == 2) { + if (gDialogLineNum == 2 || gDialogLineNum == 3) { num = gDialogLineNum; } else { num = 1; @@ -2949,11 +2960,13 @@ void render_course_complete_lvl_info_and_hud_str(void) { #if defined(VERSION_JP) || defined(VERSION_SH) #define TXT_SAVECONT_Y 2 #define TXT_SAVEQUIT_Y 18 -#define TXT_CONTNOSAVE_Y 38 +#define TXT_SAVE_EXIT_GAME_Y 38 +#define TXT_CONTNOSAVE_Y 54 #else #define TXT_SAVECONT_Y 0 #define TXT_SAVEQUIT_Y 20 -#define TXT_CONTNOSAVE_Y 40 +#define TXT_SAVE_EXIT_GAME_Y 40 +#define TXT_CONTNOSAVE_Y 60 #endif #ifdef VERSION_EU @@ -2975,28 +2988,39 @@ void render_save_confirmation(s16 x, s16 y, s8 *index, s16 sp6e) { TEXT_SAVE_AND_QUIT_FR }, { TEXT_SAVE_AND_QUIT_DE } }; + + u8 textSaveExitGame[][26] = { // New function to exit game + { TEXT_SAVE_EXIT_GAME }, + { TEXT_SAVE_EXIT_GAME_FR }, + { TEXT_SAVE_EXIT_GAME_DE } + }; + u8 textContinueWithoutSaveArr[][27] = { { TEXT_CONTINUE_WITHOUT_SAVING }, { TEXT_CONTINUE_WITHOUT_SAVING_FR }, { TEXT_CONTINUE_WITHOUT_SAVING_DE } }; + #define textSaveAndContinue textSaveAndContinueArr[gInGameLanguage] #define textSaveAndQuit textSaveAndQuitArr[gInGameLanguage] +#define textSaveExitGame textSaveExitGame[gInGameLanguage] #define textContinueWithoutSave textContinueWithoutSaveArr[gInGameLanguage] s16 xOffset = get_str_x_pos_from_center(160, textContinueWithoutSaveArr[gInGameLanguage], 12.0f); #else u8 textSaveAndContinue[] = { TEXT_SAVE_AND_CONTINUE }; u8 textSaveAndQuit[] = { TEXT_SAVE_AND_QUIT }; + u8 textSaveExitGame[] = { TEXT_SAVE_EXIT_GAME }; u8 textContinueWithoutSave[] = { TEXT_CONTINUE_WITHOUT_SAVING }; #endif - handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 3); + handle_menu_scrolling(MENU_SCROLL_VERTICAL, index, 1, 4); // Increased to '4' to handle Exit Game gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha); print_generic_string(TXT_SAVEOPTIONS_X, y + TXT_SAVECONT_Y, textSaveAndContinue); print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_SAVEQUIT_Y, textSaveAndQuit); + print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_SAVE_EXIT_GAME_Y, textSaveExitGame); print_generic_string(TXT_SAVEOPTIONS_X, y - TXT_CONTNOSAVE_Y, textContinueWithoutSave); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); diff --git a/src/game/level_update.c b/src/game/level_update.c index f278811e..b2450c0b 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1,4 +1,5 @@ #include +#include #include "sm64.h" #include "seq_ids.h" @@ -27,6 +28,9 @@ #include "level_table.h" #include "course_table.h" #include "thread6.h" +#include "../../include/libc/stdlib.h" +#include "../pc/configfile.h" +#define CONFIG_FILE "sm64config.txt" #define PLAY_MODE_NORMAL 0 #define PLAY_MODE_PAUSED 2 @@ -1013,23 +1017,36 @@ s32 play_mode_normal(void) { s32 play_mode_paused(void) { if (gPauseScreenMode == 0) { set_menu_mode(RENDER_PAUSE_SCREEN); - } else if (gPauseScreenMode == 1) { + } else if (gPauseScreenMode == 1) { raise_background_noise(1); gCameraMovementFlags &= ~CAM_MOVE_PAUSE_SCREEN; set_play_mode(PLAY_MODE_NORMAL); - } else { - // Exit level - - if (gDebugLevelSelect) { - fade_into_special_warp(-9, 1); - } else { - initiate_warp(LEVEL_CASTLE, 1, 0x1F, 0); - fade_into_special_warp(0, 0); - gSavedCourseNum = COURSE_NONE; - } - - gCameraMovementFlags &= ~CAM_MOVE_PAUSE_SCREEN; } + // Exit level + else if (gPauseScreenMode == 2) { + + if (gDebugLevelSelect) { + fade_into_special_warp(-9, 1); + } + + else { + initiate_warp(LEVEL_CASTLE, 1, 0x1F, 0); + fade_into_special_warp(0, 0); + gSavedCourseNum = COURSE_NONE; + } + + } // end of gPauseScreenMode == 2 for "EXIT COURSE" option + + if (gPauseScreenMode == 3) { // We should only be getting "int 3" to here + initiate_warp(LEVEL_CASTLE, 1, 0x1F, 0); + fade_into_special_warp(0, 0); + + //configfile_save(CONFIG_FILE); + exit(0); // Appears to automatically save config on exit! + } + + gCameraMovementFlags &= ~CAM_MOVE_PAUSE_SCREEN; + // } return 0; } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 97ae8e1d..cf623f91 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -1,4 +1,5 @@ #include +#include #include "prevent_bss_reordering.h" #include "sm64.h" #include "gfx_dimensions.h" @@ -27,9 +28,12 @@ #include "level_table.h" #include "dialog_ids.h" #include "thread6.h" +#include "../../include/libc/stdlib.h" +#include "../pc/configfile.h" +#define CONFIG_FILE "sm64config.txt" // TODO: put this elsewhere -enum SaveOption { SAVE_OPT_SAVE_AND_CONTINUE = 1, SAVE_OPT_SAVE_AND_QUIT, SAVE_OPT_CONTINUE_DONT_SAVE }; +enum SaveOption { SAVE_OPT_SAVE_AND_CONTINUE = 1, SAVE_OPT_SAVE_AND_QUIT, SAVE_OPT_SAVE_EXIT_GAME, SAVE_OPT_CONTINUE_DONT_SAVE }; static struct Object *sIntroWarpPipeObj; static struct Object *sEndPeachObj; @@ -254,16 +258,26 @@ void handle_save_menu(struct MarioState *m) { // mario_finished_animation(m) ? (not my file, not my problem) if (is_anim_past_end(m) && gSaveOptSelectIndex != 0) { // save and continue / save and quit - if (gSaveOptSelectIndex == SAVE_OPT_SAVE_AND_CONTINUE || gSaveOptSelectIndex == SAVE_OPT_SAVE_AND_QUIT) { + if (gSaveOptSelectIndex == SAVE_OPT_SAVE_AND_CONTINUE || gSaveOptSelectIndex == SAVE_OPT_SAVE_EXIT_GAME || gSaveOptSelectIndex == SAVE_OPT_SAVE_AND_QUIT) { save_file_do_save(gCurrSaveFileNum - 1); if (gSaveOptSelectIndex == SAVE_OPT_SAVE_AND_QUIT) { fade_into_special_warp(-2, 0); // reset game } + + if (gSaveOptSelectIndex == SAVE_OPT_SAVE_EXIT_GAME) { + //configfile_save(CONFIG_FILE); //Redundant, save_file implies save_config? Save config file before fully exiting + //initiate_warp(LEVEL_CASTLE, 1, 0x1F, 0); + fade_into_special_warp(0, 0); + + //fade_into_special_warp(-2, 0); // do the reset game thing + exit(0); // exit after saving game + } + } // not quitting - if (gSaveOptSelectIndex != SAVE_OPT_SAVE_AND_QUIT) { + if (gSaveOptSelectIndex != SAVE_OPT_SAVE_EXIT_GAME) { disable_time_stop(); m->faceAngle[1] += 0x8000; // figure out what dialog to show, if we should