]> icculus.org git repositories - btb/d2x.git/blob - main/editor/autosave.c
9fcee9d5b87e19fde40054258840cab1d4473170
[btb/d2x.git] / main / editor / autosave.c
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13 /*
14  * $Source: /cvs/cvsroot/d2x/main/editor/autosave.c,v $
15  * $Revision: 1.1 $
16  * $Author: btb $
17  * $Date: 2004-12-19 13:54:27 $
18  * 
19  * Autosave system: 
20  * Saves current mine to disk to prevent loss of work, and support undo.
21  * 
22  * $Log: not supported by cvs2svn $
23  * Revision 1.1.1.1  1999/06/14 22:02:47  donut
24  * Import of d1x 1.37 source.
25  *
26  * Revision 2.0  1995/02/27  11:34:53  john
27  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
28  * for bitmaps.tbl.
29  * 
30  * Revision 1.25  1994/11/19  00:04:40  john
31  * Changed some shorts to ints.
32  * 
33  * Revision 1.24  1994/11/17  11:38:59  matt
34  * Ripped out code to load old mines
35  * 
36  * Revision 1.23  1994/07/28  17:00:01  mike
37  * fix diagnostic_message erasing.
38  * 
39  * Revision 1.22  1994/07/21  12:48:28  mike
40  * Make time of day a global, fix clock so it doesn't show 10:2 instead of 10:02
41  * 
42  * Revision 1.21  1994/05/14  17:17:58  matt
43  * Got rid of externs in source (non-header) files
44  * 
45  * Revision 1.20  1994/05/02  18:04:14  yuan
46  * Fixed warning.
47  * 
48  * Revision 1.19  1994/05/02  17:59:04  yuan
49  * Changed undo_status into an array rather than malloced pointers.
50  * 
51  * Revision 1.18  1994/03/16  09:55:48  mike
52  * Flashing : in time.
53  * 
54  * Revision 1.17  1994/02/11  10:27:36  matt
55  * Changed 'if !DEMO' to 'ifndef DEMO'
56  * 
57  * Revision 1.16  1994/02/08  12:43:18  yuan
58  * Crippled save game function from demo version
59  * 
60  * Revision 1.15  1994/02/01  13:27:26  yuan
61  * autosave default off.
62  * 
63  * Revision 1.14  1994/01/05  09:57:37  yuan
64  * Fixed calendar/clock problem.
65  * 
66  * Revision 1.13  1993/12/17  16:09:59  yuan
67  * Changed clock font from Red to Black.
68  * 
69  * Revision 1.12  1993/12/15  13:08:38  yuan
70  * Fixed :0x times, so that the 0 shows up.
71  * 
72  * Revision 1.11  1993/12/15  11:19:52  yuan
73  * Added code to display clock in upper right.
74  * 
75  * Revision 1.10  1993/12/14  21:18:51  yuan
76  * Added diagnostic message to display
77  * 
78  * Revision 1.9  1993/12/14  18:32:59  yuan
79  * Added timed autosave code
80  * 
81  * Revision 1.8  1993/12/13  17:23:25  yuan
82  * Fixed bugs with undo.
83  * They were caused by badly changed extensions.
84  * 
85  * Revision 1.7  1993/12/09  16:42:32  yuan
86  * Changed extension of temp mines from .mi? -> .mn? 
87  * and now to .m? (So it doesn't interfere with .mnu)
88  * 
89  * Revision 1.6  1993/12/09  16:27:06  yuan
90  * Added toggle for autosave
91  * 
92  * Revision 1.5  1993/11/29  19:46:32  matt
93  * Changed includes
94  * 
95  * Revision 1.4  1993/11/11  15:54:11  yuan
96  * Added display message for Undo...
97  * Eg. Attach Segment UNDONE.
98  * 
99  * Revision 1.3  1993/11/09  18:53:11  yuan
100  * Autosave/Undo works up to 10 moves.
101  * 
102  * Revision 1.2  1993/11/08  19:14:03  yuan
103  * Added Undo command (not working yet)
104  * 
105  * Revision 1.1  1993/11/08  16:57:59  yuan
106  * Initial revision
107  * 
108  * 
109  */
110
111
112 #ifdef RCS
113 static char rcsid[] = "$Id: autosave.c,v 1.1 2004-12-19 13:54:27 btb Exp $";
114 #endif
115
116 #include <stdio.h>
117 #include <stdlib.h>
118 #include <stdarg.h>
119 #include <math.h>
120 #include <string.h>
121 #ifndef __LINUX__
122 #include <process.h>
123 #endif
124 #include <time.h>
125
126 #include "error.h"
127
128 #include "inferno.h"
129 #include "editor.h"
130 #include "mono.h"
131 #include "u_mem.h"
132 #include "ui.h"
133
134 #define AUTOSAVE_PERIOD 5                       // Number of minutes for timed autosave
135
136 int             Autosave_count;
137 int             Autosave_numfiles;
138 int             Autosave_total;
139 int             undo_count;
140 int             original;
141
142 int             Timer_save_flag=0;
143 int             Autosave_flag;
144 int             save_second=-1;
145
146 char            undo_status[10][100];
147
148 void init_autosave(void) {
149 //    int i;
150
151     Autosave_count = 0;
152     Autosave_numfiles = 0;
153          Autosave_flag = 0;
154     undo_count = 0;
155     //MALLOC( undo_status, char *, 10 );
156     //for (i=0; i<10; i++)
157     //    MALLOC( undo_status[i], char, 100 );
158     autosave_mine(mine_filename);
159 }
160
161 void close_autosave(void) {
162     int i;
163     char *delname, *ext;
164
165     for (i=0;i<Autosave_total;i++) {
166
167         MALLOC(delname, char, 128);
168
169         strcpy ( delname, mine_filename );
170         strupr( delname );
171         if ( !strcmp(delname, "*.MIN") ) strcpy(delname, "TEMP.MIN");
172
173         ext = strstr(delname, ".MIN");
174         sprintf( ext, ".M%d", i );
175
176         remove( delname );
177         free( delname );
178     }
179     //for (i=0;i<10;i++) free( undo_status[i] );
180     //free( undo_status );
181
182 }
183
184 void autosave_mine(char *name) {
185     char *savename, *ext;
186
187         if (Autosave_flag) {
188         
189             MALLOC(savename, char, 128);
190
191         
192             strcpy ( savename, name );
193             strupr( savename );
194             if ( !strcmp(savename, "*.MIN") ) strcpy(savename, "TEMP.MIN");
195         
196             ext = strstr(savename, ".MIN");
197             sprintf( ext, ".M%d", Autosave_count );
198         
199             //mprintf( 0, "Autosave: %s\n", savename );
200             med_save_mine( savename );
201             Autosave_count++;
202             if (undo_count > 0) undo_count--;
203             if (Autosave_count > 9) Autosave_count -= 10;
204             if (Autosave_numfiles < 10)
205                 Autosave_numfiles++;
206             if (Autosave_total < 10)
207                 Autosave_total++;
208         
209             free(savename);
210
211         }
212
213 }
214
215
216 void print_clock( int seconds, char message[10] ) {
217         int w,h,aw;
218         char    *p;
219
220         //      Make colon flash
221         if (seconds & 1)
222                 if ((p = strchr(message, ':')) != NULL)
223                         *p = ' ';
224
225         gr_set_current_canvas( NULL );
226         gr_set_fontcolor( CBLACK, CGREY );
227         gr_get_string_size( message, &w, &h, &aw );
228         gr_setcolor( CGREY );
229         gr_rect( 700, 0, 799, h+1 );
230         gr_string( 700, 0, message );
231         gr_set_fontcolor( CBLACK, CWHITE );
232 }
233
234 static char the_time[14];       // changed from 10, I don't think that was long enough
235
236 void clock_message( int seconds, char *format, ... ) {
237         va_list ap;
238
239         va_start(ap, format);
240         vsprintf(the_time, format, ap);
241         va_end(ap);
242
243         print_clock(seconds, the_time);
244 }
245
246
247 struct tm Editor_time_of_day;
248
249 void set_editor_time_of_day()
250 {
251         time_t   ltime;
252
253         time( &ltime );
254         Editor_time_of_day = *localtime( &ltime );
255 }
256
257 void TimedAutosave(char *name) 
258 {
259         int              month,day,hour,minute,second;
260
261         month = (Editor_time_of_day.tm_mon) + 1;
262         day =   Editor_time_of_day.tm_mday;
263         minute = Editor_time_of_day.tm_min;
264         hour = Editor_time_of_day.tm_hour;
265         second = Editor_time_of_day.tm_sec;
266
267         if (hour > 12) hour-=12;
268
269         if (second!=save_second) {
270                 save_second = second;
271                 clock_message(second, "%d/%d %d:%02d", month, day, hour, minute);
272         }
273         
274
275 #ifndef DEMO
276         if (minute%AUTOSAVE_PERIOD != 0)
277                 Timer_save_flag = 1;
278
279         if ((minute%AUTOSAVE_PERIOD == 0) && (Timer_save_flag)) {
280                 time_t   ltime;
281
282                 autosave_mine(name);
283                 Timer_save_flag = 0;
284                 time( &ltime );
285         diagnostic_message("Mine Autosaved at %s\n", ctime(&ltime));
286         }
287 #endif
288
289 }
290
291
292 int undo( void ) {
293         Int3();
294         return 2;
295
296 //@@    char *loadname, *ext;
297 //@@    if (undo_count == 0) original = Autosave_count;
298 //@@
299 //@@     if (!Autosave_flag) 
300 //@@             return 2;
301 //@@
302 //@@    if (Autosave_numfiles > 1) {
303 //@@
304 //@@        MALLOC(loadname, char, 128);
305 //@@
306 //@@        strcpy ( loadname, mine_filename );
307 //@@        strupr( loadname );
308 //@@        if ( !strcmp(loadname, "*.MIN") ) strcpy(loadname, "TEMP.MIN");
309 //@@
310 //@@        undo_count++;
311 //@@        Autosave_count = original - undo_count;
312 //@@        if (Autosave_count < 0) Autosave_count = Autosave_count+10;
313 //@@        Autosave_numfiles--;
314 //@@        //mprintf(0, "u=%d  a=%d  o=%d  num=%d\n", undo_count, Autosave_count, original, Autosave_numfiles);
315 //@@
316 //@@        ext = strstr(loadname, ".MIN");
317 //@@        if (Autosave_count == 0) sprintf( ext, ".M9" );
318 //@@            else sprintf( ext, ".M%d", Autosave_count-1 );
319 //@@        //mprintf( 0, "Loading: %s\n", loadname );
320 //@@        med_load_mine( loadname );
321 //@@
322 //@@        free(loadname);
323 //@@        return 0;
324 //@@     }
325 //@@     else return 1;
326 //@@     //diagnostic_message("Can't undo\n");
327
328 }
329