diff urogue/save.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children 096d3cfd9afd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/urogue/save.c	Tue Jan 31 19:56:04 2017 -0500
@@ -0,0 +1,135 @@
+/*
+    save.c - save and restore routines
+ 
+    UltraRogue: The Ultimate Adventure in the Dungeons of Doom
+    Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
+    All rights reserved.
+
+    Based on "Advanced Rogue"
+    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
+    All rights reserved.
+
+    Based on "Rogue: Exploring the Dungeons of Doom"
+    Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
+    All rights reserved.
+
+    See the file LICENSE.TXT for full copyright and licensing information.
+*/
+
+#define _ALL_SOURCE /* need to remove need for this AIXism */
+
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include "rogue.h"
+
+int
+save_game(void)
+{
+    FILE *savefd;
+    char    buf[2 * LINELEN];
+    char    oldfile[2*LINELEN];
+
+    /* get file name */
+
+    strcpy(oldfile,file_name);
+
+    do
+    {
+        mpos = 0;
+
+        if (oldfile[0] != '\0')
+            msg("Save file [%s]: ", file_name);
+        else
+            msg("Save file as: ");
+
+        mpos = 0;
+        buf[0] = '\0';
+
+        if (get_string(buf, cw) == QUIT)
+        {
+            msg("");
+            return(FALSE);
+        }
+
+        if ( (buf[0] == 0) && (oldfile[0] != 0) )
+            strcpy(file_name, oldfile);
+        else if (buf[0] != 0)
+            strcpy(file_name, buf);
+        else
+        {
+            msg("");
+            return(FALSE);
+        }
+
+        wclear(hw);
+        wmove(hw, LINES - 1, 0);
+        wrefresh(hw);
+
+        if ((savefd = fopen(file_name, "w")) == NULL)
+            msg(strerror(errno));    /* fake perror() */
+    }
+    while (savefd == NULL);
+
+    /* write out [compressed?] file */
+
+    save_file(savefd);
+    return(TRUE);
+}
+
+int
+restore(char *file)
+{
+    FILE *infd;
+    char    *sp;
+
+    if (strcmp(file, "-r") == 0)
+        file = file_name;
+
+    if ((infd = fopen(file, "r")) == NULL)
+    {
+        perror(file);
+        return(FALSE);
+    }
+
+    if ( restore_file(infd) == FALSE )
+        return(FALSE);
+
+    /*
+     * we do not close the file so that we will have a hold of the inode
+     * for as long as possible
+     */
+
+    if (remove(file) < 0)
+    {
+        printf("Cannot unlink file\n");
+        return(FALSE);
+    }
+
+    if ((sp = getenv("OPTIONS")) != NULL)
+        parse_opts(sp);
+
+    strcpy(file_name, file);
+
+    clearok(cw, TRUE);
+    touchwin(cw);
+    noecho();
+    nonl();
+
+    while(playing)
+    {
+        do_daemons(BEFORE);
+        do_fuses(BEFORE);
+
+        command();  /* Command execution */
+
+        if (after)
+            do_after_effects();
+    }
+
+    fatal("");
+
+    return(FALSE);
+}