]> icculus.org git repositories - btb/d2x.git/blob - main/editor/kmine.c
s/128/PATH_MAX
[btb/d2x.git] / main / editor / kmine.c
1 /* $Id: kmine.c,v 1.6 2005-01-25 20:46:55 schaffner 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  * Functions to change entire mines.
18  *
19  */
20
21 #ifdef RCS
22 static char rcsid[] = "$Id: kmine.c,v 1.6 2005-01-25 20:46:55 schaffner Exp $";
23 #endif
24
25 #ifdef HAVE_CONFIG_H
26 #include "conf.h"
27 #endif
28
29 #include <string.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32
33 #include "error.h"
34 #include "strutil.h"
35
36 #include "nocfile.h"
37
38 #include "inferno.h"
39 #include "editor.h"
40 #include "ui.h"
41 #include "texpage.h"            // For texpage_goto_first
42 #include "segment.h"
43 #include "mono.h"
44 #include "kdefs.h"
45 #include "info.h"
46 #include "game.h"
47 #include "gameseq.h"
48
49 #include "object.h"
50
51 #define MINESAVE_CRIPPLED       0
52
53 char mine_filename[PATH_MAX] = "*.MIN";
54 char sit_filename[PATH_MAX] = "*.SIT";
55
56 #define MAX_NAME_LENGTH PATH_MAX
57
58 //      See if filename f contains an extent.  If not, add extent ext.
59 void checkforext( char * f, char *ext )
60 {
61         int i;
62
63         for (i=1; i<MAX_NAME_LENGTH; i++ ) {
64                 if (f[i]=='.')
65                         return;
66
67                 if ((f[i] == ' ') || (f[i]==0) ) {
68                         f[i] = '.';
69                         f[i+1] = ext[0];
70                         f[i+2] = ext[1];
71                         f[i+3] = ext[2];
72                         f[i+4] = 0;
73                         return;
74                 }
75         }
76
77         if (i < 123) {
78                 f[i] = '.';
79                 f[i+1] = ext[0];
80                 f[i+2] = ext[1];
81                 f[i+3] = ext[2];
82                 f[i+4] = 0;
83                 return;
84         }
85 }
86
87 //      See if filename f contains an extent.  If not, add extent ext.
88 void set_extension( char * f, char *ext )
89 {
90         int i;
91
92         for (i=1; i<MAX_NAME_LENGTH-4; i++ ) {
93                 if ((f[i]=='.') || (f[i] == ' ') || (f[i]==0) ) {
94                         f[i] = '.';
95                         f[i+1] = ext[0];
96                         f[i+2] = ext[1];
97                         f[i+3] = ext[2];
98                         f[i+4] = 0;
99                         return;
100                 }
101         }
102 }
103
104 #if MINESAVE_CRIPPLED
105 int SaveMine()
106 {
107         char  ErrorMessage[200];
108
109         sprintf( ErrorMessage, "Save Mine not available in demo version.\n");
110         MessageBox( -2, -2, 1, ErrorMessage, "Ok" );
111         return 1;
112 }
113 #endif
114
115 #if !MINESAVE_CRIPPLED
116 int SaveMine()
117 {
118         // Save mine
119 //      med_save_mine("TEMP.MIN");
120     if (ui_get_filename( mine_filename, "*.MIN", "SAVE MINE" ))
121         {
122         checkforext(mine_filename, "MIN");
123         if (med_save_mine(mine_filename))
124                         return 0;
125                 mine_changed = 0;
126         }
127         
128         return 1;
129 }
130 #endif
131
132 int CreateNewMine()
133 {
134         if (SafetyCheck())  {
135                 texpage_goto_first();
136                 create_new_mine();
137                 LargeView.ev_matrix = vmd_identity_matrix;      //FrontView.ev_matrix;
138                 set_view_target_from_segment(Cursegp);
139                 vm_vec_make(&Seg_scale,DEFAULT_X_SIZE,DEFAULT_Y_SIZE,DEFAULT_Z_SIZE);
140                 Update_flags = UF_WORLD_CHANGED;
141                 SetPlayerFromCurseg();
142                 SetPlayerPosition();            //say default is permanant position
143                 mine_changed = 0;
144                 N_found_segs = 0;
145                 N_selected_segs = 0;
146                 med_compress_mine();
147                 gamestate_not_restored = 0;
148                 init_info = 1;
149                 ResetFilename();
150                 Game_mode = GM_UNKNOWN;
151                 Current_level_num = 0;          //0 means not a real game
152         }
153         return 1;
154 }
155
156 int MineMenu()
157 {
158         int x;
159         char * MenuItems[] = { "New mine",
160                                            "Load mine",
161                                            "Save mine",
162                                            "Print mine",
163                                            "Redraw mine" };
164
165         x = MenuX( -1, -1, 5, MenuItems );
166
167         switch( x )
168         {
169         case 1:     // New
170                 CreateNewMine();
171                 break;
172         case 2:     // Load
173                 //@@LoadMine();
174                 break;
175         case 3:     // Save
176                 SaveMine();
177                 break;
178         case 4:     // Print
179                 break;
180         case 5:     // Redraw
181                 Update_flags = UF_ALL;
182                 break;
183         }
184         return 1;
185 }
186
187 // -----------------------------------------------------------------------------
188 // returns 1 if error, else 0
189 int med_load_situation(char * filename)
190 {
191         if (filename[0] == 97)
192                 Int3();
193         Int3();
194
195         return 1;
196 //@@    CFILE * LoadFile;
197 //@@    char    mine_name[MAX_NAME_LENGTH];
198 //@@    char    dir_name[_MAX_DIR];
199 //@@    char    mine_path[MAX_NAME_LENGTH];
200 //@@    vms_vector      pos;
201 //@@    fix     mat[9];
202 //@@
203 //@@    LoadFile = cfopen( filename, "rt" );
204 //@@    if (!LoadFile)  {
205 //@@            char  ErrorMessage[200];
206 //@@
207 //@@            sprintf( ErrorMessage, "ERROR: Unable to open %s\n", filename );
208 //@@            MessageBox( -2, -2, 1, ErrorMessage, "Ok" );
209 //@@            return 1;
210 //@@    }
211 //@@
212 //@@    fscanf(LoadFile, "%s", &mine_name);
213 //@@    mprintf((0, "Mine name = [%s]\n", mine_name));
214 //@@
215 //@@    _splitpath(filename,mine_path,dir_name,NULL,NULL);
216 //@@    strcat(mine_path,dir_name);
217 //@@    strcat(mine_path,mine_name);
218 //@@
219 //@@    mprintf((0, "Mine path = [%s]\n", mine_path));
220 //@@
221 //@@    med_load_mine(mine_path);
222 //@@
223 //@@    fscanf(LoadFile, "%x %x %x", &pos.x, &pos.y, &pos.z);
224 //@@    mprintf((0, "Load Position = %8x %8x %8x\n", pos.x, pos.y, pos.z));
225 //@@    mprintf((0, "\n"));
226 //@@
227 //@@    fscanf(LoadFile, "%x %x %x", &mat[0], &mat[1], &mat[2]);
228 //@@    mprintf((0, "%8x %8x %8x\n", mat[0], mat[1], mat[2]));
229 //@@
230 //@@    fscanf(LoadFile, "%x %x %x", &mat[3], &mat[4], &mat[5]);
231 //@@    mprintf((0, "%8x %8x %8x\n", mat[3], mat[4], mat[5]));
232 //@@
233 //@@    fscanf(LoadFile, "%x %x %x", &mat[6], &mat[7], &mat[8]);
234 //@@    mprintf((0, "%8x %8x %8x\n", mat[6], mat[7], mat[8]));
235 //@@    mprintf((0, "\n"));
236 //@@
237 //@@    fscanf(LoadFile, "%i\n", &ConsoleObject->segnum);
238 //@@
239 //@@    cfclose( LoadFile );
240 //@@
241 //@@    ConsoleObject->pos = pos;
242 //@@    ConsoleObject->orient.m1 = mat[0];      ConsoleObject->orient.m2 = mat[1];      ConsoleObject->orient.m3 = mat[2];
243 //@@    ConsoleObject->orient.m4 = mat[3];      ConsoleObject->orient.m5 = mat[4];      ConsoleObject->orient.m6 = mat[5];
244 //@@    ConsoleObject->orient.m7 = mat[6];      ConsoleObject->orient.m8 = mat[7];      ConsoleObject->orient.m9 = mat[8];
245 //@@
246 //@@    return 0;
247 }
248
249 //      -----------------------------------------------------------------------------
250 int med_save_situation(char * filename)
251 {
252         CFILE * SaveFile;
253         char    mine_name[MAX_NAME_LENGTH];
254
255         SaveFile = cfopen( filename, "wt" );
256         if (!SaveFile)  {
257                 char  ErrorMessage[200];
258
259                 sprintf( ErrorMessage, "ERROR: Unable to open %s\n", filename );
260                 MessageBox( -2, -2, 1, ErrorMessage, "Ok" );
261                 return 1;
262         }
263
264         //      Write mine name.
265 //      strcpy(mine_name, filename);
266         _splitpath(filename, NULL, NULL, mine_name, NULL);
267         set_extension(mine_name, "min");
268         fprintf(SaveFile, "%s\n", mine_name);
269
270         //      Write player position.
271         fprintf(SaveFile, "%x %x %x\n",(unsigned int) ConsoleObject->pos.x,(unsigned int) ConsoleObject->pos.y,(unsigned int) ConsoleObject->pos.z);
272
273         //      Write player orientation.
274         fprintf(SaveFile, "%8x %8x %8x\n",(unsigned int) ConsoleObject->orient.rvec.x,(unsigned int) ConsoleObject->orient.rvec.y,(unsigned int) ConsoleObject->orient.rvec.z);
275         fprintf(SaveFile, "%8x %8x %8x\n",(unsigned int) ConsoleObject->orient.uvec.x,(unsigned int) ConsoleObject->orient.uvec.y,(unsigned int) ConsoleObject->orient.uvec.z);                       
276         fprintf(SaveFile, "%8x %8x %8x\n",(unsigned int) ConsoleObject->orient.fvec.x,(unsigned int) ConsoleObject->orient.fvec.y,(unsigned int) ConsoleObject->orient.fvec.z);
277         fprintf(SaveFile, "%i\n", ConsoleObject->segnum);
278
279         mprintf((0, "Save Position = %8x %8x %8x\n", ConsoleObject->pos.x, ConsoleObject->pos.y, ConsoleObject->pos.z));
280         mprintf((0, "\n"));
281
282         mprintf((0, "%8x %8x %8x\n", ConsoleObject->orient.rvec.x, ConsoleObject->orient.rvec.y, ConsoleObject->orient.rvec.z));
283         mprintf((0, "%8x %8x %8x\n", ConsoleObject->orient.uvec.x, ConsoleObject->orient.uvec.y, ConsoleObject->orient.uvec.z));
284         mprintf((0, "%8x %8x %8x\n", ConsoleObject->orient.fvec.x, ConsoleObject->orient.fvec.y, ConsoleObject->orient.fvec.z));
285         mprintf((0, "\n"));
286
287         cfclose( SaveFile);
288
289         return 1;
290 }
291
292 //      -----------------------------------------------------------------------------
293 int SaveSituation(void)
294 {
295         if (ui_get_filename( sit_filename, "*.SIT", "Save Situation" )) {
296                 set_extension(sit_filename, "MIN");
297                 if (med_save_mine(sit_filename)) {
298                         mprintf((0, "Unable to save mine in SaveSituation.\n"));
299                         return 0;
300                 }
301
302                 set_extension(sit_filename, "SIT");
303                 if (med_save_situation(sit_filename))
304                         return 0;
305         }
306         
307         return 1;
308 }
309
310 //      -----------------------------------------------------------------------------
311 //      Load a situation file which consists of x,y,z, orientation matrix, mine name.
312 int LoadSituation(void)
313 {
314         if (SafetyCheck())  {
315                 if (ui_get_filename( sit_filename, "*.sit", "Load Situation" )) {
316          checkforext(sit_filename, "SIT");
317          if (med_load_situation(sit_filename))
318                                 return 0;
319                         // set_view_target_from_segment(Cursegp);
320                         Update_flags = UF_WORLD_CHANGED;
321                         // SetPlayerFromCurseg();
322                         med_compress_mine();
323                         init_info = 1;
324                         mine_changed = 0;
325                 }
326         }
327
328         return 1;
329 }
330