]> icculus.org git repositories - btb/d2x.git/blob - main/editor/autosave.c
more header cleanup
[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 /*
15  *
16  * Autosave system:
17  * Saves current mine to disk to prevent loss of work, and support undo.
18  *
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #include "conf.h"
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <stdarg.h>
28 #include <math.h>
29 #include <string.h>
30 #ifdef __MSDOS__
31 #include <process.h>
32 #endif
33 #include <time.h>
34
35 #include "error.h"
36 #include "inferno.h"
37 #include "editor.h"
38 #include "mono.h"
39 #include "u_mem.h"
40 #include "ui.h"
41
42
43 #define AUTOSAVE_PERIOD 5                       // Number of minutes for timed autosave
44
45 int             Autosave_count;
46 int             Autosave_numfiles;
47 int             Autosave_total;
48 int             undo_count;
49 int             original;
50
51 int             Timer_save_flag=0;
52 int             Autosave_flag;
53 int             save_second=-1;
54
55 char            undo_status[10][100];
56
57 void init_autosave(void) {
58 //    int i;
59
60     Autosave_count = 0;
61     Autosave_numfiles = 0;
62          Autosave_flag = 0;
63     undo_count = 0;
64     //MALLOC( undo_status, char *, 10 );
65     //for (i=0; i<10; i++)
66     //    MALLOC( undo_status[i], char, 100 );
67     autosave_mine(mine_filename);
68 }
69
70 void close_autosave(void) {
71     int i;
72     char *delname, *ext;
73
74     for (i=0;i<Autosave_total;i++) {
75
76         MALLOC(delname, char, PATH_MAX);
77
78         strcpy ( delname, mine_filename );
79         strupr( delname );
80         if ( !strcmp(delname, "*.MIN") ) strcpy(delname, "TEMP.MIN");
81
82         ext = strstr(delname, ".MIN");
83         sprintf( ext, ".M%d", i );
84
85         remove( delname );
86         d_free( delname );
87     }
88     //for (i = 0; i < 10; i++) d_free( undo_status[i] );
89     //d_free( undo_status );
90
91 }
92
93 void autosave_mine(char *name) {
94     char *savename, *ext;
95
96         if (Autosave_flag) {
97         
98             MALLOC(savename, char, PATH_MAX);
99
100         
101             strcpy ( savename, name );
102             strupr( savename );
103             if ( !strcmp(savename, "*.MIN") ) strcpy(savename, "TEMP.MIN");
104         
105             ext = strstr(savename, ".MIN");
106             sprintf( ext, ".M%d", Autosave_count );
107         
108             //mprintf( 0, "Autosave: %s\n", savename );
109             med_save_mine( savename );
110             Autosave_count++;
111             if (undo_count > 0) undo_count--;
112             if (Autosave_count > 9) Autosave_count -= 10;
113             if (Autosave_numfiles < 10)
114                 Autosave_numfiles++;
115             if (Autosave_total < 10)
116                 Autosave_total++;
117         
118             d_free(savename);
119
120         }
121
122 }
123
124
125 void print_clock( int seconds, char message[10] ) {
126         int w,h,aw;
127         char    *p;
128
129         //      Make colon flash
130         if (seconds & 1)
131                 if ((p = strchr(message, ':')) != NULL)
132                         *p = ' ';
133
134         gr_set_current_canvas( NULL );
135         gr_set_fontcolor( CBLACK, CGREY );
136         gr_get_string_size( message, &w, &h, &aw );
137         gr_setcolor( CGREY );
138         gr_rect( 700, 0, 799, h+1 );
139         gr_string( 700, 0, message );
140         gr_set_fontcolor( CBLACK, CWHITE );
141 }
142
143 static char the_time[14];       // changed from 10, I don't think that was long enough
144
145 void clock_message( int seconds, char *format, ... ) {
146         va_list ap;
147
148         va_start(ap, format);
149         vsprintf(the_time, format, ap);
150         va_end(ap);
151
152         print_clock(seconds, the_time);
153 }
154
155
156 struct tm Editor_time_of_day;
157
158 void set_editor_time_of_day()
159 {
160         time_t   ltime;
161
162         time( &ltime );
163         Editor_time_of_day = *localtime( &ltime );
164 }
165
166 void TimedAutosave(char *name) 
167 {
168         int              month,day,hour,minute,second;
169
170         month = (Editor_time_of_day.tm_mon) + 1;
171         day =   Editor_time_of_day.tm_mday;
172         minute = Editor_time_of_day.tm_min;
173         hour = Editor_time_of_day.tm_hour;
174         second = Editor_time_of_day.tm_sec;
175
176         if (hour > 12) hour-=12;
177
178         if (second!=save_second) {
179                 save_second = second;
180                 clock_message(second, "%d/%d %d:%02d", month, day, hour, minute);
181         }
182         
183
184 #ifndef DEMO
185         if (minute%AUTOSAVE_PERIOD != 0)
186                 Timer_save_flag = 1;
187
188         if ((minute%AUTOSAVE_PERIOD == 0) && (Timer_save_flag)) {
189                 time_t   ltime;
190
191                 autosave_mine(name);
192                 Timer_save_flag = 0;
193                 time( &ltime );
194         diagnostic_message("Mine Autosaved at %s\n", ctime(&ltime));
195         }
196 #endif
197
198 }
199
200
201 int undo( void ) {
202         Int3();
203         return 2;
204
205 //@@    char *loadname, *ext;
206 //@@    if (undo_count == 0) original = Autosave_count;
207 //@@
208 //@@     if (!Autosave_flag) 
209 //@@             return 2;
210 //@@
211 //@@    if (Autosave_numfiles > 1) {
212 //@@
213 //@@        MALLOC(loadname, char, PATH_MAX);
214 //@@
215 //@@        strcpy ( loadname, mine_filename );
216 //@@        strupr( loadname );
217 //@@        if ( !strcmp(loadname, "*.MIN") ) strcpy(loadname, "TEMP.MIN");
218 //@@
219 //@@        undo_count++;
220 //@@        Autosave_count = original - undo_count;
221 //@@        if (Autosave_count < 0) Autosave_count = Autosave_count+10;
222 //@@        Autosave_numfiles--;
223 //@@        //mprintf(0, "u=%d  a=%d  o=%d  num=%d\n", undo_count, Autosave_count, original, Autosave_numfiles);
224 //@@
225 //@@        ext = strstr(loadname, ".MIN");
226 //@@        if (Autosave_count == 0) sprintf( ext, ".M9" );
227 //@@            else sprintf( ext, ".M%d", Autosave_count-1 );
228 //@@        //mprintf( 0, "Loading: %s\n", loadname );
229 //@@        med_load_mine( loadname );
230 //@@
231 //@@        d_free(loadname);
232 //@@        return 0;
233 //@@     }
234 //@@     else return 1;
235 //@@     //diagnostic_message("Can't undo\n");
236
237 }
238