mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-21 18:01:15 +00:00
Create backups of quick.sav.
F6 is fantastic, until you hit it by mistake after dieing when you meant to hit F9 (I've done that way too often). quick.sav is still the last file written via F6 (so F9 is unaffected), but now the previous quick.sav becomes quick1.sav. Up to 5 (currently) backups will be kept: quick1 is the newest, quick5 the oldest. A menu for accessing the backups has been added as a sub-menu of the load menu.
This commit is contained in:
parent
1406cf13de
commit
3042c2bb1a
2 changed files with 99 additions and 11 deletions
|
@ -510,13 +510,18 @@ convert_to_game_dict (script_t *script)
|
|||
return game;
|
||||
}
|
||||
|
||||
#define MAX_QUICK 5
|
||||
|
||||
static void
|
||||
Host_Savegame_f (void)
|
||||
{
|
||||
dstring_t *name;
|
||||
const char *save_name;
|
||||
char *save_text;
|
||||
QFile *f;
|
||||
int i;
|
||||
char *bup1, *bup2 = 0;
|
||||
|
||||
|
||||
if (cmd_source != src_command)
|
||||
return;
|
||||
|
@ -554,10 +559,25 @@ Host_Savegame_f (void)
|
|||
}
|
||||
}
|
||||
|
||||
save_name = Cmd_Argv (1);
|
||||
name = dstring_newstr ();
|
||||
dsprintf (name, "%s/%s", qfs_gamedir->dir.def, Cmd_Argv (1));
|
||||
if (strcmp (save_name, "quick") == 0) {
|
||||
bup2 = nva ("%s/%s%d.sav", qfs_gamedir->dir.def, save_name, MAX_QUICK);
|
||||
QFS_Remove (bup2);
|
||||
for (i = MAX_QUICK - 1; i > 0; i--) {
|
||||
bup1 = nva ("%s/%s%d.sav", qfs_gamedir->dir.def, save_name, i);
|
||||
QFS_Rename (bup1, bup2);
|
||||
free (bup2);
|
||||
bup2 = bup1;
|
||||
}
|
||||
}
|
||||
dsprintf (name, "%s/%s", qfs_gamedir->dir.def, save_name);
|
||||
QFS_DefaultExtension (name, ".sav");
|
||||
|
||||
if (bup2) {
|
||||
QFS_Rename (name->str, bup2);
|
||||
free (bup2);
|
||||
}
|
||||
Sys_Printf ("Saving game to %s...\n", name->str);
|
||||
f = QFS_WOpen (name->str, 0);
|
||||
dstring_delete (name);
|
||||
|
|
|
@ -115,6 +115,7 @@ int quit_index;
|
|||
// ********* LOAD / SAVE
|
||||
|
||||
#define MAX_SAVEGAMES 12
|
||||
#define MAX_QUICK 5
|
||||
string filenames[MAX_SAVEGAMES];
|
||||
int loadable[MAX_SAVEGAMES];
|
||||
int load_cursor;
|
||||
|
@ -130,16 +131,23 @@ string (QFile f) get_comment =
|
|||
return line;
|
||||
}
|
||||
|
||||
void () scan_saves =
|
||||
void (int quick) scan_saves =
|
||||
{
|
||||
local int i;
|
||||
local QFile f;
|
||||
local string line;
|
||||
for (i = 0; i < MAX_SAVEGAMES; i++) {
|
||||
local int max = MAX_SAVEGAMES;
|
||||
if (quick)
|
||||
max = MAX_QUICK;
|
||||
for (i = 0; i < max; i++) {
|
||||
if (!filenames[i])
|
||||
filenames[i] = str_new ();
|
||||
loadable[i] = 0;
|
||||
f = File_Open (sprintf ("s%i.sav", i), "rz");
|
||||
if (quick) {
|
||||
f = File_Open (sprintf ("quick%i.sav", i + 1), "rz");
|
||||
} else {
|
||||
f = File_Open (sprintf ("s%i.sav", i), "rz");
|
||||
}
|
||||
if (!f) {
|
||||
str_copy (filenames[i], "--- UNUSED SLOT ---");
|
||||
continue;
|
||||
|
@ -153,31 +161,46 @@ void () scan_saves =
|
|||
loadable[i] = 1;
|
||||
Qclose (f);
|
||||
}
|
||||
for (i = max; i < MAX_SAVEGAMES; i++) {
|
||||
loadable[i] = 0;
|
||||
}
|
||||
};
|
||||
|
||||
int (string text, int key) load_f =
|
||||
{
|
||||
scan_saves ();
|
||||
scan_saves (0);
|
||||
Menu_SelectMenu ("load");
|
||||
return 0;
|
||||
};
|
||||
|
||||
int (string text, int key) save_f =
|
||||
{
|
||||
scan_saves ();
|
||||
scan_saves (0);
|
||||
Menu_SelectMenu ("save");
|
||||
return 0;
|
||||
};
|
||||
|
||||
void () load_save_f =
|
||||
{
|
||||
scan_saves ();
|
||||
scan_saves (0);
|
||||
if (Cmd_Argv (0) == "menu_load")
|
||||
Menu_SelectMenu ("load");
|
||||
else
|
||||
Menu_SelectMenu ("save");
|
||||
};
|
||||
|
||||
int (int x, int y) load_quickbup_draw =
|
||||
{
|
||||
local int i;
|
||||
|
||||
Draw_CenterPic (x + 160, y + 4, Draw_CachePic ("gfx/p_load.lmp", 1));
|
||||
for (i=0 ; i< MAX_QUICK; i++)
|
||||
Draw_String (x + 16, y + 32 + 8 * i, filenames[i]);
|
||||
Draw_Character (x + 8, y + 32 + load_cursor * 8,
|
||||
12 + ((int) (time * 4) & 1));
|
||||
return 1;
|
||||
};
|
||||
|
||||
int (int x, int y) load_draw =
|
||||
{
|
||||
local int i;
|
||||
|
@ -185,6 +208,7 @@ int (int x, int y) load_draw =
|
|||
Draw_CenterPic (x + 160, y + 4, Draw_CachePic ("gfx/p_load.lmp", 1));
|
||||
for (i=0 ; i< MAX_SAVEGAMES; i++)
|
||||
Draw_String (x + 16, y + 32 + 8 * i, filenames[i]);
|
||||
Draw_String (x + 16, y + 32 + 8 * i, "Quick save backups");
|
||||
Draw_Character (x + 8, y + 32 + load_cursor * 8,
|
||||
12 + ((int) (time * 4) & 1));
|
||||
return 1;
|
||||
|
@ -202,6 +226,34 @@ int (int x, int y) save_draw =
|
|||
return 1;
|
||||
};
|
||||
|
||||
int (int key, int unicode, int down) load_quickbup_keyevent =
|
||||
{
|
||||
switch (key) {
|
||||
case QFK_DOWN:
|
||||
case QFM_WHEEL_DOWN:
|
||||
S_LocalSound ("misc/menu1.wav");
|
||||
load_cursor++;
|
||||
load_cursor %= MAX_QUICK;
|
||||
return 1;
|
||||
case QFK_UP:
|
||||
case QFM_WHEEL_UP:
|
||||
S_LocalSound ("misc/menu1.wav");
|
||||
load_cursor += MAX_QUICK - 1;
|
||||
load_cursor %= MAX_QUICK;
|
||||
return 1;
|
||||
case QFK_RETURN:
|
||||
case QFM_BUTTON1:
|
||||
if (loadable[load_cursor]) {
|
||||
S_LocalSound ("misc/menu2.wav");
|
||||
Menu_SelectMenu (nil);
|
||||
Cbuf_AddText (sprintf ("load quick%i.sav\n", load_cursor));
|
||||
load_cursor = MAX_SAVEGAMES;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
int (int key, int unicode, int down) load_keyevent =
|
||||
{
|
||||
switch (key) {
|
||||
|
@ -209,17 +261,21 @@ int (int key, int unicode, int down) load_keyevent =
|
|||
case QFM_WHEEL_DOWN:
|
||||
S_LocalSound ("misc/menu1.wav");
|
||||
load_cursor++;
|
||||
load_cursor %= MAX_SAVEGAMES;
|
||||
load_cursor %= MAX_SAVEGAMES + 1;
|
||||
return 1;
|
||||
case QFK_UP:
|
||||
case QFM_WHEEL_UP:
|
||||
S_LocalSound ("misc/menu1.wav");
|
||||
load_cursor += MAX_SAVEGAMES - 1;
|
||||
load_cursor %= MAX_SAVEGAMES;
|
||||
load_cursor += MAX_SAVEGAMES;
|
||||
load_cursor %= MAX_SAVEGAMES + 1;
|
||||
return 1;
|
||||
case QFK_RETURN:
|
||||
case QFM_BUTTON1:
|
||||
if (loadable[load_cursor]) {
|
||||
if (load_cursor == MAX_SAVEGAMES) {
|
||||
load_cursor = 0;
|
||||
scan_saves (1);
|
||||
Menu_SelectMenu ("load_quickbup");
|
||||
} else if (loadable[load_cursor]) {
|
||||
S_LocalSound ("misc/menu2.wav");
|
||||
Menu_SelectMenu (nil);
|
||||
Cbuf_AddText (sprintf ("load s%i.sav\n", load_cursor));
|
||||
|
@ -253,6 +309,17 @@ int (int key, int unicode, int down) save_keyevent =
|
|||
return 0;
|
||||
};
|
||||
|
||||
void () load_quickbup_menu =
|
||||
{
|
||||
Menu_Begin (0, 0, "load_quickbup");
|
||||
Menu_EnterHook (menu_enter_sound);
|
||||
Menu_LeaveHook (menu_leave_sound);
|
||||
Menu_FadeScreen (1);
|
||||
Menu_KeyEvent (load_quickbup_keyevent);
|
||||
Menu_Draw (load_quickbup_draw);
|
||||
Menu_End ();
|
||||
};
|
||||
|
||||
void () load_menu =
|
||||
{
|
||||
Menu_Begin (0, 0, "load");
|
||||
|
@ -574,6 +641,7 @@ void () menu_init =
|
|||
main_menu ();
|
||||
quit_menu ();
|
||||
load_menu ();
|
||||
load_quickbup_menu ();
|
||||
save_menu ();
|
||||
|
||||
Menu_TopMenu ("main");
|
||||
|
|
Loading…
Reference in a new issue