WIP In-Game Exit via pause+save menus w/ Localizations

This commit is contained in:
Hyenadae 2020-05-11 06:58:33 -04:00
parent ef3b0ba52d
commit 691d6f382b
4 changed files with 90 additions and 27 deletions

View File

@ -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")
/**

View File

@ -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);

View File

@ -1,4 +1,5 @@
#include <ultra64.h>
#include <stdbool.h>
#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;
}

View File

@ -1,4 +1,5 @@
#include <ultra64.h>
#include <stdbool.h>
#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