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