Annotation of early-roguelike/urogue/save.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: save.c - save and restore routines
3:
4: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6: All rights reserved.
7:
8: Based on "Advanced Rogue"
9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
10: All rights reserved.
11:
12: Based on "Rogue: Exploring the Dungeons of Doom"
13: Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14: All rights reserved.
15:
16: See the file LICENSE.TXT for full copyright and licensing information.
17: */
18:
19: #define _ALL_SOURCE /* need to remove need for this AIXism */
20:
21: #include <time.h>
22: #include <stdlib.h>
23: #include <string.h>
24: #include <ctype.h>
25: #include <errno.h>
26: #include "rogue.h"
27:
28: int save_savedir_game(void);
29:
30: int
31: save_game(void)
32: {
33: FILE *savefd;
34: char buf[2 * LINELEN];
35: char oldfile[2*LINELEN];
36:
37: if (use_savedir)
38: return save_savedir_game();
39:
40: /* get file name */
41:
42: strcpy(oldfile,file_name);
43:
44: do
45: {
46: mpos = 0;
47:
48: if (oldfile[0] != '\0')
49: msg("Save file [%s]: ", file_name);
50: else
51: msg("Save file as: ");
52:
53: mpos = 0;
54: buf[0] = '\0';
55:
56: if (get_string(buf, cw) == QUIT)
57: {
58: msg("");
59: return(FALSE);
60: }
61:
62: if ( (buf[0] == 0) && (oldfile[0] != 0) )
63: strcpy(file_name, oldfile);
64: else if (buf[0] != 0)
65: strcpy(file_name, buf);
66: else
67: {
68: msg("");
69: return(FALSE);
70: }
71:
72: wclear(hw);
73: wmove(hw, LINES - 1, 0);
74: wrefresh(hw);
75:
76: if ((savefd = fopen(file_name, "w")) == NULL)
77: msg(strerror(errno)); /* fake perror() */
78: }
79: while (savefd == NULL);
80:
81: /* write out [compressed?] file */
82:
83: save_file(savefd);
84: return(TRUE);
85: }
86:
87: /*
88: * save_savedir_game()
89: * Simplified save function for when system savefiles are used.
90: */
91: int
92: save_savedir_game(void)
93: {
94: FILE *savef;
95: char c;
96:
97: mpos = 0;
98: msg("Save game? ");
99: c = readcharw(cw);
100: if (c == 'y' || c == 'Y')
101: {
102: if ((savef = fopen(file_name, "w")) == NULL)
103: {
104: msg(strerror(errno));
105: return(FALSE);
106: }
107: msg("");
108: save_file(savef);
109: return(TRUE);
110: }
111: else
112: {
113: msg("");
114: return(FALSE);
115: }
116: }
117:
118: void
119: auto_save(int sig)
120: {
121: FILE *savef;
122:
123: md_ignore_signals();
124: if (file_name[0] && (savef = fopen(file_name, "w"))) {
125: save_file(savef);
126: }
127: exit(0);
128: }
129:
130: int
131: restore(char *file)
132: {
133: FILE *infd;
134: char *sp;
135:
136: if (strcmp(file, "-r") == 0)
137: file = file_name;
138:
139: if ((infd = fopen(file, "r")) == NULL)
140: {
141: if (use_savedir && errno == ENOENT)
142: return TRUE;
143: perror(file);
144: return(FALSE);
145: }
146:
147: if ( restore_file(infd) == FALSE )
148: return(FALSE);
149:
150: /*
151: * we do not close the file so that we will have a hold of the inode
152: * for as long as possible
153: */
154:
155: if (remove(file) < 0)
156: {
157: printf("Cannot unlink file\n");
158: return(FALSE);
159: }
160:
161: if ((sp = getenv("OPTIONS")) != NULL)
162: parse_opts(sp);
163:
164: strcpy(file_name, file);
165:
166: clearok(cw, TRUE);
167: touchwin(cw);
168: noecho();
169: nonl();
170:
171: while(playing)
172: {
173: do_daemons(BEFORE);
174: do_fuses(BEFORE);
175:
176: command(); /* Command execution */
177:
178: if (after)
179: do_after_effects();
180: }
181:
182: fatal("");
183:
184: return(FALSE);
185: }
CVSweb