home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / editor / kmine.c < prev    next >
Text File  |  1998-06-08  |  13KB  |  460 lines

  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.  * $Source: f:/miner/source/main/editor/rcs/kmine.c $
  15.  * $Revision: 2.0 $
  16.  * $Author: john $
  17.  * $Date: 1995/02/27 11:34:22 $
  18.  *
  19.  * Functions to change entire mines.
  20.  *
  21.  * $Log: kmine.c $
  22.  * Revision 2.0  1995/02/27  11:34:22  john
  23.  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
  24.  * for bitmaps.tbl.
  25.  * 
  26.  * Revision 1.53  1995/02/22  15:04:52  allender
  27.  * remove anonymous unions from vecmat stuff
  28.  * 
  29.  * Revision 1.52  1994/11/27  23:17:13  matt
  30.  * Made changes for new mprintf calling convention
  31.  * 
  32.  * Revision 1.51  1994/11/17  14:48:05  mike
  33.  * validation functions moved from editor to game.
  34.  * 
  35.  * Revision 1.50  1994/11/17  11:38:49  matt
  36.  * Ripped out code to load old mines
  37.  * 
  38.  * Revision 1.49  1994/10/08  17:10:22  matt
  39.  * Correctly set current_level_num when loading/creating mine in editor
  40.  * 
  41.  * Revision 1.48  1994/10/03  11:30:45  matt
  42.  * Fixed problem with permanant player position when creating a new mine
  43.  * 
  44.  * Revision 1.47  1994/09/29  17:42:19  matt
  45.  * Cleaned up game_mode a little
  46.  * 
  47.  * Revision 1.46  1994/08/18  10:48:21  john
  48.  * Cleaned up game sequencing.
  49.  * 
  50.  * Revision 1.45  1994/08/09  16:05:36  john
  51.  * Added the ability to place players.  Made old
  52.  * Player variable be ConsoleObject.
  53.  * 
  54.  * Revision 1.44  1994/07/22  12:37:06  matt
  55.  * Cleaned up editor/game interactions some more.
  56.  * 
  57.  * Revision 1.43  1994/07/21  17:26:50  matt
  58.  * When new mine created, the default save filename is now reset
  59.  * 
  60.  * Revision 1.42  1994/06/08  14:29:25  matt
  61.  * Took out support for old mine versions
  62.  * 
  63.  * Revision 1.41  1994/06/03  12:28:04  yuan
  64.  * Fixed game restore state.
  65.  * 
  66.  * Revision 1.40  1994/05/19  12:10:29  matt
  67.  * Use new vecmat macros and globals
  68.  * 
  69.  * Revision 1.39  1994/05/14  17:17:56  matt
  70.  * Got rid of externs in source (non-header) files
  71.  * 
  72.  * Revision 1.38  1994/05/12  14:47:47  mike
  73.  * New previous mine structure and object structure.
  74.  * 
  75.  * Revision 1.37  1994/05/06  12:52:12  yuan
  76.  * Adding some gamesave checks...
  77.  * 
  78.  * Revision 1.36  1994/05/05  20:37:02  yuan
  79.  * Added gamesave checks when entering and leaving the game.
  80.  * 
  81.  * Removed Load Game Save Game functions...
  82.  * Now there is only Load/Save Mine... (equivalent to old Load/Save Game)
  83.  * 
  84.  * Revision 1.35  1994/04/27  22:57:54  matt
  85.  * Made sit mine load from path of sit file
  86.  * 
  87.  * Revision 1.34  1994/04/21  18:29:55  matt
  88.  * Don't use same variable for mine filename & sit filename
  89.  * 
  90.  * Revision 1.33  1994/04/21  18:21:43  matt
  91.  * Strip path from mine filename in sit file
  92.  * 
  93.  * Revision 1.32  1994/04/18  10:54:35  mike
  94.  * Add situation save/load
  95.  * 
  96.  * Revision 1.31  1994/02/16  16:47:54  yuan
  97.  * Removed temp.min.
  98.  * 
  99.  * Revision 1.30  1994/02/16  15:22:51  yuan
  100.  * Checking in for editor make.
  101.  * 
  102.  * Revision 1.29  1994/02/09  15:04:23  yuan
  103.  * brought back save ability
  104.  * 
  105.  * Revision 1.28  1994/02/08  12:42:45  yuan
  106.  * fixed log.
  107.  * 
  108.  * Revision 1.27  1994/02/08  12:41:47  yuan
  109.  *    Crippled save mine function from demo version.
  110.  * 
  111.  * Revision 1.26  1994/01/13  13:26:05  yuan
  112.  * Added med_compress_mine when creating new mine or
  113.  * when loading mine
  114.  * 
  115.  * Revision 1.25  1994/01/11  12:03:23  yuan
  116.  * Fixed so that when old mine implementation not in,
  117.  * message is displayed when you try to load an old mine
  118.  * 
  119.  * Revision 1.24  1994/01/11  11:47:57  yuan
  120.  * *** empty log message ***
  121.  * 
  122.  * Revision 1.23  1994/01/05  09:59:56  yuan
  123.  * Added load old mine funciton
  124.  * 
  125.  * Revision 1.22  1993/12/16  15:58:08  john
  126.  * moved texture selection page to texpage.c
  127.  * ,
  128.  * 
  129.  * Revision 1.21  1993/12/10  14:48:55  mike
  130.  * Kill orthogonal views.
  131.  * 
  132.  * Revision 1.20  1993/12/03  16:44:06  yuan
  133.  * Changed some 0.0 return values to 0
  134.  * 
  135.  * 
  136.  * Revision 1.19  1993/12/02  12:39:34  matt
  137.  * Removed extra includes
  138.  * 
  139.  * Revision 1.18  1993/11/17  13:14:48  yuan
  140.  * Moved Save Group to group.c
  141.  * 
  142.  * Revision 1.17  1993/11/16  17:25:48  yuan
  143.  * Unworking group function added... 
  144.  * 
  145.  * Revision 1.16  1993/11/15  14:46:25  john
  146.  * Changed Menu to MenuX
  147.  * 
  148.  * Revision 1.15  1993/11/08  19:13:45  yuan
  149.  * Added Undo command (not working yet)
  150.  * 
  151.  */
  152.  
  153. #pragma off (unreferenced)
  154. static char rcsid[] = "$Id: kmine.c 2.0 1995/02/27 11:34:22 john Exp $";
  155. #pragma on (unreferenced)
  156.  
  157. #include <string.h>
  158. #include <stdio.h>
  159. #include <stdlib.h>
  160.  
  161. #include "error.h"
  162.  
  163. #include "inferno.h"
  164. #include "editor.h"
  165. #include "ui.h"
  166. #include "texpage.h"        // For texpage_goto_first
  167. #include "segment.h"
  168. #include "mono.h"
  169. #include "kdefs.h"
  170. #include "info.h"
  171. #include "game.h"
  172. #include "gameseq.h"
  173.  
  174. #include "dcflib.h"
  175. #include "nocfile.h"
  176.  
  177. #include "object.h"
  178.  
  179. #define MINESAVE_CRIPPLED    0
  180.  
  181. char mine_filename[128] = "*.MIN";
  182. char sit_filename[128] = "*.SIT";
  183.  
  184. #define MAX_NAME_LENGTH 128
  185.  
  186. //    See if filename f contains an extent.  If not, add extent ext.
  187. void checkforext( char * f, char *ext )
  188. {
  189.     int i;
  190.  
  191.     for (i=1; i<MAX_NAME_LENGTH; i++ ) {
  192.         if (f[i]=='.')
  193.             return;
  194.  
  195.         if ((f[i] == ' ') || (f[i]==0) ) {
  196.             f[i] = '.';
  197.             f[i+1] = ext[0];
  198.             f[i+2] = ext[1];
  199.             f[i+3] = ext[2];
  200.             f[i+4] = 0;
  201.             return;
  202.         }
  203.     }
  204.  
  205.     if (i < 123) {
  206.         f[i] = '.';
  207.         f[i+1] = ext[0];
  208.         f[i+2] = ext[1];
  209.         f[i+3] = ext[2];
  210.         f[i+4] = 0;
  211.         return;
  212.     }
  213. }
  214.  
  215. //    See if filename f contains an extent.  If not, add extent ext.
  216. void set_extension( char * f, char *ext )
  217. {
  218.     int i;
  219.  
  220.     for (i=1; i<MAX_NAME_LENGTH-4; i++ ) {
  221.         if ((f[i]=='.') || (f[i] == ' ') || (f[i]==0) ) {
  222.             f[i] = '.';
  223.             f[i+1] = ext[0];
  224.             f[i+2] = ext[1];
  225.             f[i+3] = ext[2];
  226.             f[i+4] = 0;
  227.             return;
  228.         }
  229.     }
  230. }
  231.  
  232. #if MINESAVE_CRIPPLED
  233. int SaveMine()
  234. {
  235.     char  ErrorMessage[200];
  236.  
  237.     sprintf( ErrorMessage, "Save Mine not available in demo version.\n");
  238.     MessageBox( -2, -2, 1, ErrorMessage, "Ok" );
  239.     return 1;
  240. }
  241. #endif
  242.  
  243. #if !MINESAVE_CRIPPLED
  244. int SaveMine()
  245. {
  246.     // Save mine
  247. //    med_save_mine("TEMP.MIN");
  248.     if (ui_get_filename( mine_filename, "*.MIN", "SAVE MINE" ))
  249.     {
  250.         checkforext(mine_filename, "MIN");
  251.         if (med_save_mine(mine_filename))
  252.             return 0;
  253.         mine_changed = 0;
  254.     }
  255.     
  256.     return 1;
  257. }
  258. #endif
  259.  
  260. int CreateNewMine()
  261. {
  262.     if (SafetyCheck())  {
  263.         texpage_goto_first();
  264.         create_new_mine();
  265.         LargeView.ev_matrix = vmd_identity_matrix;    //FrontView.ev_matrix;
  266.         set_view_target_from_segment(Cursegp);
  267.         vm_vec_make(&Seg_scale,DEFAULT_X_SIZE,DEFAULT_Y_SIZE,DEFAULT_Z_SIZE);
  268.         Update_flags = UF_WORLD_CHANGED;
  269.         SetPlayerFromCurseg();
  270.         SetPlayerPosition();        //say default is permanant position
  271.         mine_changed = 0;
  272.         N_found_segs = 0;
  273.         N_selected_segs = 0;
  274.         med_compress_mine();
  275.         gamestate_not_restored = 0;
  276.         init_info = 1;
  277.         ResetFilename();
  278.         Game_mode = GM_UNKNOWN;
  279.         Current_level_num = 0;        //0 means not a real game
  280.     }
  281.     return 1;
  282. }
  283.  
  284. int MineMenu()
  285. {
  286.     int x;
  287.     char * MenuItems[] = { "New mine",
  288.                        "Load mine",
  289.                        "Save mine",
  290.                        "Print mine",
  291.                        "Redraw mine" };
  292.  
  293.     x = MenuX( -1, -1, 5, MenuItems );
  294.  
  295.     switch( x )
  296.     {
  297.     case 1:     // New
  298.         CreateNewMine();
  299.         break;
  300.     case 2:     // Load
  301.         //@@LoadMine();
  302.         break;
  303.     case 3:     // Save
  304.         SaveMine();
  305.         break;
  306.     case 4:     // Print
  307.         break;
  308.     case 5:     // Redraw
  309.         Update_flags = UF_ALL;
  310.         break;
  311.     }
  312.     return 1;
  313. }
  314.  
  315. // -----------------------------------------------------------------------------
  316. // returns 1 if error, else 0
  317. int med_load_situation(char * filename)
  318. {
  319.     if (filename[0] == 97)
  320.         Int3();
  321.     Int3();
  322.  
  323.     return 1;
  324. //@@    CFILE * LoadFile;
  325. //@@    char    mine_name[MAX_NAME_LENGTH];
  326. //@@    char    dir_name[_MAX_DIR];
  327. //@@    char    mine_path[MAX_NAME_LENGTH];
  328. //@@    vms_vector    pos;
  329. //@@    fix    mat[9];
  330. //@@
  331. //@@    LoadFile = cfopen( filename, "rt" );
  332. //@@    if (!LoadFile)    {
  333. //@@        char  ErrorMessage[200];
  334. //@@
  335. //@@        sprintf( ErrorMessage, "ERROR: Unable to open %s\n", filename );
  336. //@@        MessageBox( -2, -2, 1, ErrorMessage, "Ok" );
  337. //@@        return 1;
  338. //@@    }
  339. //@@
  340. //@@    fscanf(LoadFile, "%s", &mine_name);
  341. //@@    mprintf((0, "Mine name = [%s]\n", mine_name));
  342. //@@
  343. //@@    _splitpath(filename,mine_path,dir_name,NULL,NULL);
  344. //@@    strcat(mine_path,dir_name);
  345. //@@    strcat(mine_path,mine_name);
  346. //@@
  347. //@@    mprintf((0, "Mine path = [%s]\n", mine_path));
  348. //@@
  349. //@@    med_load_mine(mine_path);
  350. //@@
  351. //@@    fscanf(LoadFile, "%x %x %x", &pos.x, &pos.y, &pos.z);
  352. //@@    mprintf((0, "Load Position = %8x %8x %8x\n", pos.x, pos.y, pos.z));
  353. //@@    mprintf((0, "\n"));
  354. //@@
  355. //@@    fscanf(LoadFile, "%x %x %x", &mat[0], &mat[1], &mat[2]);
  356. //@@    mprintf((0, "%8x %8x %8x\n", mat[0], mat[1], mat[2]));
  357. //@@
  358. //@@    fscanf(LoadFile, "%x %x %x", &mat[3], &mat[4], &mat[5]);
  359. //@@    mprintf((0, "%8x %8x %8x\n", mat[3], mat[4], mat[5]));
  360. //@@
  361. //@@    fscanf(LoadFile, "%x %x %x", &mat[6], &mat[7], &mat[8]);
  362. //@@    mprintf((0, "%8x %8x %8x\n", mat[6], mat[7], mat[8]));
  363. //@@    mprintf((0, "\n"));
  364. //@@
  365. //@@    fscanf(LoadFile, "%i\n", &ConsoleObject->segnum);
  366. //@@
  367. //@@    cfclose( LoadFile );
  368. //@@
  369. //@@    ConsoleObject->pos = pos;
  370. //@@    ConsoleObject->orient.m1 = mat[0];    ConsoleObject->orient.m2 = mat[1];    ConsoleObject->orient.m3 = mat[2];
  371. //@@    ConsoleObject->orient.m4 = mat[3];    ConsoleObject->orient.m5 = mat[4];    ConsoleObject->orient.m6 = mat[5];
  372. //@@    ConsoleObject->orient.m7 = mat[6];    ConsoleObject->orient.m8 = mat[7];    ConsoleObject->orient.m9 = mat[8];
  373. //@@
  374. //@@    return 0;
  375. }
  376.  
  377. //    -----------------------------------------------------------------------------
  378. int med_save_situation(char * filename)
  379. {
  380.     CFILE * SaveFile;
  381.     char    mine_name[MAX_NAME_LENGTH];
  382.  
  383.     SaveFile = cfopen( filename, "wt" );
  384.     if (!SaveFile)    {
  385.         char  ErrorMessage[200];
  386.  
  387.         sprintf( ErrorMessage, "ERROR: Unable to open %s\n", filename );
  388.         MessageBox( -2, -2, 1, ErrorMessage, "Ok" );
  389.         return 1;
  390.     }
  391.  
  392.     //    Write mine name.
  393. //    strcpy(mine_name, filename);
  394. _splitpath(filename,NULL,NULL,mine_name,NULL);
  395.     set_extension(mine_name, "min");
  396.     fprintf(SaveFile, "%s\n", mine_name);
  397.  
  398.     //    Write player position.
  399.     fprintf(SaveFile, "%x %x %x\n", ConsoleObject->pos.x, ConsoleObject->pos.y, ConsoleObject->pos.z);
  400.  
  401.     //    Write player orientation.
  402.     fprintf(SaveFile, "%x %x %x\n", ConsoleObject->orient.rvec.x, ConsoleObject->orient.rvec.y, ConsoleObject->orient.rvec.z);
  403.     fprintf(SaveFile, "%x %x %x\n", ConsoleObject->orient.uvec.x, ConsoleObject->orient.uvec.y, ConsoleObject->orient.uvec.z);             
  404.     fprintf(SaveFile, "%x %x %x\n", ConsoleObject->orient.fvec.x, ConsoleObject->orient.fvec.y, ConsoleObject->orient.fvec.z);
  405.     fprintf(SaveFile, "%i\n", ConsoleObject->segnum);
  406.  
  407.     mprintf((0, "Save Position = %8x %8x %8x\n", ConsoleObject->pos.x, ConsoleObject->pos.y, ConsoleObject->pos.z));
  408.     mprintf((0, "\n"));
  409.  
  410.     mprintf((0, "%8x %8x %8x\n", ConsoleObject->orient.rvec.x, ConsoleObject->orient.rvec.y, ConsoleObject->orient.rvec.z));
  411.     mprintf((0, "%8x %8x %8x\n", ConsoleObject->orient.uvec.x, ConsoleObject->orient.uvec.y, ConsoleObject->orient.uvec.z));
  412.     mprintf((0, "%8x %8x %8x\n", ConsoleObject->orient.fvec.x, ConsoleObject->orient.fvec.y, ConsoleObject->orient.fvec.z));
  413.     mprintf((0, "\n"));
  414.  
  415.     cfclose( SaveFile);
  416.  
  417.     return 1;
  418. }
  419.  
  420. //    -----------------------------------------------------------------------------
  421. int SaveSituation(void)
  422. {
  423.     if (ui_get_filename( sit_filename, "*.SIT", "Save Situation" )) {
  424.         set_extension(sit_filename, "MIN");
  425.         if (med_save_mine(sit_filename)) {
  426.             mprintf((0, "Unable to save mine in SaveSituation.\n"));
  427.             return 0;
  428.         }
  429.  
  430.         set_extension(sit_filename, "SIT");
  431.         if (med_save_situation(sit_filename))
  432.             return 0;
  433.     }
  434.     
  435.     return 1;
  436. }
  437.  
  438. //    -----------------------------------------------------------------------------
  439. //    Load a situation file which consists of x,y,z, orientation matrix, mine name.
  440. int LoadSituation(void)
  441. {
  442.     if (SafetyCheck())  {
  443.         if (ui_get_filename( sit_filename, "*.sit", "Load Situation" ))    {
  444.          checkforext(sit_filename, "SIT");
  445.          if (med_load_situation(sit_filename))
  446.                  return 0;
  447.             // set_view_target_from_segment(Cursegp);
  448.             Update_flags = UF_WORLD_CHANGED;
  449.             // SetPlayerFromCurseg();
  450.             med_compress_mine();
  451.             init_info = 1;
  452.             mine_changed = 0;
  453.         }
  454.     }
  455.  
  456.     return 1;
  457. }
  458.  
  459. 
  460.