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