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