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