Skip to content
13 changes: 13 additions & 0 deletions include/text_options_strings.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#define TEXT_OPT_CONTROLS _("CONTROLS")
#define TEXT_OPT_VIDEO _("DISPLAY")
#define TEXT_OPT_AUDIO _("SOUND")
#define TEXT_OPT_OTHER _("OTHER")
#define TEXT_OPT_CHEATS _("CHEATS")

// Markers
Expand Down Expand Up @@ -52,6 +53,12 @@
#define TEXT_RESET_WINDOW _("RESET WINDOW")
#define TEXT_OPT_HUD _("HUD")

#define TEXT_OPT_AUTOSAVE _("AUTOSAVE")
#define TEXT_OPT_AUTOSAVE1 _("OFF")
#define TEXT_OPT_AUTOSAVE2 _("MID-LEVEL ONLY")
#define TEXT_OPT_AUTOSAVE3 _("END OF LEVEL ONLY")
#define TEXT_OPT_AUTOSAVE4 _("ON")

#define TEXT_BIND_A _("A BUTTON")
#define TEXT_BIND_B _("B BUTTON")
#define TEXT_BIND_START _("START BUTTON")
Expand Down Expand Up @@ -108,6 +115,12 @@
#define TEXT_RESET_WINDOW _("Reset Window")
#define TEXT_OPT_HUD _("HUD")

#define TEXT_OPT_AUTOSAVE _("Autosave")
#define TEXT_OPT_AUTOSAVE1 _("Off")
#define TEXT_OPT_AUTOSAVE2 _("Mid-Level Only")
#define TEXT_OPT_AUTOSAVE3 _("End of Level Only")
#define TEXT_OPT_AUTOSAVE4 _("On")

#define TEXT_BIND_A _("A Button")
#define TEXT_BIND_B _("B Button")
#define TEXT_BIND_START _("Start Button")
Expand Down
2 changes: 1 addition & 1 deletion include/text_strings.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -484,4 +484,4 @@
#define TEXT_MENU_STARS_DE _(" GEHEIME STERNE")
#endif

#endif
#endif
14 changes: 14 additions & 0 deletions src/game/ingame_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ s8 gRedCoinsCollected;
extern u8 gLastCompletedCourseNum;
extern u8 gLastCompletedStarNum;

extern u16 configAutosave;

enum DialogBoxState {
DIALOG_STATE_OPENING,
DIALOG_STATE_VERTICAL,
Expand Down Expand Up @@ -3034,6 +3036,18 @@ s16 render_course_complete_screen(void) {

switch (gDialogBoxState) {
case DIALOG_STATE_OPENING:
if (configAutosave == 2 || configAutosave == 3) {
level_set_transition(0, 0);
gDialogBoxState = DIALOG_STATE_OPENING;
gMenuMode = -1;
num = gDialogLineNum;
gCourseDoneMenuTimer = 0;
gCourseCompleteCoins = 0;
gCourseCompleteCoinsEqual = 0;
gHudFlash = 0;

return num;
}
render_course_complete_lvl_info_and_hud_str();
if (gCourseDoneMenuTimer > 100 && gCourseCompleteCoinsEqual == 1) {
gDialogBoxState = DIALOG_STATE_VERTICAL;
Expand Down
18 changes: 16 additions & 2 deletions src/game/mario_actions_cutscene.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
#include "../../include/libc/stdlib.h"
#include "../pc/pc_main.h"

extern u16 configAutosave;

// TODO: put this elsewhere
enum SaveOption { SAVE_OPT_SAVE_AND_CONTINUE = 1, SAVE_OPT_SAVE_AND_QUIT, SAVE_OPT_SAVE_EXIT_GAME, SAVE_OPT_CONTINUE_DONT_SAVE };

Expand Down Expand Up @@ -254,6 +256,9 @@ void handle_save_menu(struct MarioState *m) {
s32 dialogID;
// wait for the menu to show up
// mario_finished_animation(m) ? (not my file, not my problem)
if (configAutosave == 2 || configAutosave == 3) {
gSaveOptSelectIndex = SAVE_OPT_SAVE_AND_CONTINUE;
}
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_EXIT_GAME || gSaveOptSelectIndex == SAVE_OPT_SAVE_AND_QUIT) {
Expand Down Expand Up @@ -625,8 +630,12 @@ void general_star_dance_handler(struct MarioState *m, s32 isInWater) {
if ((m->actionArg & 1) == 0) {
level_trigger_warp(m, WARP_OP_STAR_EXIT);
} else {
enable_time_stop();
create_dialog_box_with_response(gLastCompletedStarNum == 7 ? DIALOG_013 : DIALOG_014);
if (configAutosave == 1 || configAutosave == 3) {
gDialogResponse = 1;
} else {
enable_time_stop();
create_dialog_box_with_response(gLastCompletedStarNum == 7 ? DIALOG_013 : DIALOG_014);
}
m->actionState = 1;
}
break;
Expand Down Expand Up @@ -1096,6 +1105,11 @@ s32 act_exit_land_save_dialog(struct MarioState *m) {
set_mario_animation(m, m->actionArg == 0 ? MARIO_ANIM_GENERAL_LAND
: MARIO_ANIM_LAND_FROM_SINGLE_JUMP);
if (is_anim_past_end(m)) {
if (configAutosave == 2 || configAutosave == 3) {
handle_save_menu(m);
cutscene_exit_painting_end(m->area->camera);
break;
}
if (gLastCompletedCourseNum != COURSE_BITDW
&& gLastCompletedCourseNum != COURSE_BITFS) {
enable_time_stop();
Expand Down
28 changes: 25 additions & 3 deletions src/game/options_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ static const u8 menuStr[][32] = {
{ TEXT_OPT_CONTROLS },
{ TEXT_OPT_VIDEO },
{ TEXT_OPT_AUDIO },
{ TEXT_OPT_OTHER },
{ TEXT_EXIT_GAME },
{ TEXT_OPT_CHEATS },

Expand Down Expand Up @@ -86,6 +87,14 @@ static const u8 optsAudioStr[][32] = {
{ TEXT_OPT_MVOLUME },
};

static const u8 optsAutosaveStr[][32] = {
{ TEXT_OPT_AUTOSAVE },
{ TEXT_OPT_AUTOSAVE1 },
{ TEXT_OPT_AUTOSAVE2 },
{ TEXT_OPT_AUTOSAVE3 },
{ TEXT_OPT_AUTOSAVE4 },
};

static const u8 optsCheatsStr[][64] = {
{ TEXT_OPT_CHEAT1 },
{ TEXT_OPT_CHEAT2 },
Expand Down Expand Up @@ -128,6 +137,13 @@ static const u8 *vsyncChoices[] = {
optsVideoStr[6],
};

static const u8 *autosaveChoices[] = {
optsAutosaveStr[1],
optsAutosaveStr[2],
optsAutosaveStr[3],
optsAutosaveStr[4],
};

enum OptType {
OPT_INVALID = 0,
OPT_TOGGLE,
Expand Down Expand Up @@ -247,6 +263,10 @@ static struct Option optsAudio[] = {
DEF_OPT_SCROLL( optsAudioStr[0], &configMasterVolume, 0, MAX_VOLUME, 1 ),
};

static struct Option optsOther[] = {
DEF_OPT_CHOICE( optsAutosaveStr[0], &configAutosave, autosaveChoices ),
};

static struct Option optsCheats[] = {
DEF_OPT_TOGGLE( optsCheatsStr[0], &Cheats.EnableCheats ),
DEF_OPT_TOGGLE( optsCheatsStr[1], &Cheats.MoonJump ),
Expand All @@ -268,7 +288,8 @@ static struct SubMenu menuCamera = DEF_SUBMENU( menuStr[4], optsCamera );
static struct SubMenu menuControls = DEF_SUBMENU( menuStr[5], optsControls );
static struct SubMenu menuVideo = DEF_SUBMENU( menuStr[6], optsVideo );
static struct SubMenu menuAudio = DEF_SUBMENU( menuStr[7], optsAudio );
static struct SubMenu menuCheats = DEF_SUBMENU( menuStr[9], optsCheats );
static struct SubMenu menuOther = DEF_SUBMENU( menuStr[8], optsOther );
static struct SubMenu menuCheats = DEF_SUBMENU( menuStr[10], optsCheats );

/* main options menu definition */

Expand All @@ -279,9 +300,10 @@ static struct Option optsMain[] = {
DEF_OPT_SUBMENU( menuStr[5], &menuControls ),
DEF_OPT_SUBMENU( menuStr[6], &menuVideo ),
DEF_OPT_SUBMENU( menuStr[7], &menuAudio ),
DEF_OPT_BUTTON ( menuStr[8], optmenu_act_exit ),
DEF_OPT_SUBMENU( menuStr[8], &menuOther ),
DEF_OPT_BUTTON ( menuStr[9], optmenu_act_exit ),
// NOTE: always keep cheats the last option here because of the half-assed way I toggle them
DEF_OPT_SUBMENU( menuStr[9], &menuCheats )
DEF_OPT_SUBMENU( menuStr[10], &menuCheats )
};

static struct SubMenu menuMain = DEF_SUBMENU( menuStr[3], optsMain );
Expand Down
2 changes: 2 additions & 0 deletions src/pc/configfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ bool configCameraMouse = false;
#endif
unsigned int configSkipIntro = 0;
bool configHUD = true;
unsigned int configAutosave = 0; // 0=off, 1=mid-level only, 2=end of level only, 3=on

static const struct ConfigOption options[] = {
{.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen},
Expand Down Expand Up @@ -122,6 +123,7 @@ static const struct ConfigOption options[] = {
{.name = "bettercam_degrade", .type = CONFIG_TYPE_UINT, .uintValue = &configCameraDegrade},
#endif
{.name = "skip_intro", .type = CONFIG_TYPE_UINT, .uintValue = &configSkipIntro}, // Add this back!
{.name = "autosave", .type = CONFIG_TYPE_UINT, .uintValue = &configAutosave},
};

// Reads an entire line from a file (excluding the newline character) and returns an allocated string
Expand Down
1 change: 1 addition & 0 deletions src/pc/configfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ extern bool configEnableCamera;
extern bool configCameraMouse;
#endif
extern bool configHUD;
extern unsigned int configAutosave;

void configfile_load(const char *filename);
void configfile_save(const char *filename);
Expand Down