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