diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 528d79f3b..dd9ced6c4 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -719,6 +719,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_crosshair2); CV_RegisterVar(&cv_alwaysfreelook); CV_RegisterVar(&cv_alwaysfreelook2); + CV_RegisterVar(&cv_postfirsttime); // g_input.c CV_RegisterVar(&cv_sideaxis); diff --git a/src/g_game.h b/src/g_game.h index d6b41830e..00298c623 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -55,6 +55,7 @@ extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard di extern INT16 rw_maximums[NUM_WEAPONS]; // used in game menu +extern consvar_t cv_postfirsttime; extern consvar_t cv_crosshair, cv_crosshair2; extern consvar_t cv_invertmouse, cv_alwaysfreelook, cv_mousemove; extern consvar_t cv_invertmouse2, cv_alwaysfreelook2, cv_mousemove2; diff --git a/src/m_menu.c b/src/m_menu.c index 38ff3f998..b61c6396a 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -441,6 +441,9 @@ static CV_PossibleValue_t serversort_cons_t[] = { }; consvar_t cv_serversort = {"serversort", "Ping", CV_HIDEN | CV_CALL, serversort_cons_t, M_SortServerList, 0, NULL, NULL, 0, 0, NULL}; +// first time memory +consvar_t cv_postfirsttime = {"postfirsttime", "No", CV_HIDEN | CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; + // autorecord demos for time attack static consvar_t cv_autorecord = {"autorecord", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -6141,6 +6144,8 @@ static void M_StartTutorial(INT32 choice) if (!tutorialmap) return; // no map to go to, don't bother + CV_SetValue(&cv_postfirsttime, 1); + tutorialmode = true; // turn on tutorial mode emeralds = 0; @@ -6757,6 +6762,20 @@ static void M_HandleLoadSave(INT32 choice) } } +static void M_TutorialResponse(INT32 ch) +{ + CV_SetValue(&cv_postfirsttime, 1); + if (ch != 'y' && ch != KEY_ENTER) + { + return; + // copypasta from M_LoadGame + M_ReadSaveStrings(); + M_SetupNextMenu(&SP_LoadDef); + } + else + M_StartTutorial(0); +} + // // Selected from SRB2 menu // @@ -6764,6 +6783,12 @@ static void M_LoadGame(INT32 choice) { (void)choice; + if (tutorialmap && !cv_postfirsttime.value) + { + M_StartMessage("Do you want to play a brief Tutorial?\n(Press 'Y' to go, or 'N' to skip)", M_TutorialResponse, MM_YESNO); + return; + } + M_ReadSaveStrings(); M_SetupNextMenu(&SP_LoadDef); }