home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / gamemine.c < prev    next >
Text File  |  1998-06-08  |  28KB  |  831 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/rcs/gamemine.c $
  15.  * $Revision: 2.2 $
  16.  * $Author: john $
  17.  * $Date: 1995/03/06 15:23:14 $
  18.  * 
  19.  * Functions for loading mines in the game
  20.  * 
  21.  * $Log: gamemine.c $
  22.  * Revision 2.2  1995/03/06  15:23:14  john
  23.  * New screen techniques.
  24.  * 
  25.  * Revision 2.1  1995/02/27  13:13:37  john
  26.  * Removed floating point.
  27.  * 
  28.  * Revision 2.0  1995/02/27  11:27:45  john
  29.  * New version 2.0, which has no anonymous unions, builds with
  30.  * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
  31.  * 
  32.  * Revision 1.70  1995/02/13  20:35:09  john
  33.  * Lintized
  34.  * 
  35.  * Revision 1.69  1995/02/07  17:12:03  rob
  36.  * Added ifdef's for Editor.
  37.  * 
  38.  * Revision 1.68  1995/02/07  16:51:48  mike
  39.  * fix gray rock josh problem.
  40.  * 
  41.  * Revision 1.67  1995/02/01  15:46:26  yuan
  42.  * Fixed matcen_nums.
  43.  * 
  44.  * Revision 1.66  1995/01/19  15:19:28  mike
  45.  * new super-compressed registered file format.
  46.  * 
  47.  * Revision 1.65  1994/12/10  16:44:59  matt
  48.  * Added debugging code to track down door that turns into rock
  49.  * 
  50.  * Revision 1.64  1994/12/10  14:58:24  yuan
  51.  * *** empty log message ***
  52.  * 
  53.  * Revision 1.63  1994/12/08  17:19:10  yuan
  54.  * Cfiling stuff.
  55.  * 
  56.  * Revision 1.62  1994/12/07  14:05:33  yuan
  57.  * Fixed wall assert problem... Bashed highest_segment
  58.  * _index before WALL_IS_DOORWAY check.
  59.  * 
  60.  * Revision 1.61  1994/11/27  23:14:52  matt
  61.  * Made changes for new mprintf calling convention
  62.  * 
  63.  * Revision 1.60  1994/11/27  18:05:20  matt
  64.  * Compile out LVL reader when editor compiled out
  65.  * 
  66.  * Revision 1.59  1994/11/26  22:51:45  matt
  67.  * Removed editor-only fields from segment structure when editor is compiled
  68.  * out, and padded segment structure to even multiple of 4 bytes.
  69.  * 
  70.  * Revision 1.58  1994/11/26  21:48:02  matt
  71.  * Fixed saturation in short light value 
  72.  * 
  73.  * Revision 1.57  1994/11/20  22:11:49  mike
  74.  * comment out an apparently unnecessary call to fuelcen_reset().
  75.  * 
  76.  * Revision 1.56  1994/11/18  21:56:42  john
  77.  * Added a better, leaner pig format.
  78.  * 
  79.  * Revision 1.55  1994/11/17  20:09:18  john
  80.  * Added new compiled level format.
  81.  * 
  82.  * Revision 1.54  1994/11/17  15:40:17  mike
  83.  * Comment out mprintf which was causing important information to scroll away.
  84.  * 
  85.  * Revision 1.53  1994/11/17  14:56:37  mike
  86.  * moved segment validation functions from editor to main.
  87.  * 
  88.  * Revision 1.52  1994/11/17  11:39:35  matt
  89.  * Ripped out code to load old mines
  90.  * 
  91.  * Revision 1.51  1994/11/14  20:47:53  john
  92.  * Attempted to strip out all the code in the game 
  93.  * directory that uses any ui code.
  94.  * 
  95.  * Revision 1.50  1994/11/14  16:05:38  matt
  96.  * Fixed, maybe, again, errors when can't find texture during remap
  97.  * 
  98.  * Revision 1.49  1994/11/14  14:34:03  matt
  99.  * Fixed up handling when textures can't be found during remap
  100.  * 
  101.  * Revision 1.48  1994/11/14  13:01:55  matt
  102.  * Added Int3() when can't find texture
  103.  * 
  104.  * Revision 1.47  1994/10/30  14:12:21  mike
  105.  * rip out local segments stuff.
  106.  * 
  107.  * Revision 1.46  1994/10/27  19:43:07  john
  108.  * Disable the piglet option.
  109.  * 
  110.  * Revision 1.45  1994/10/27  18:51:42  john
  111.  * Added -piglet option that only loads needed textures for a 
  112.  * mine.  Only saved ~1MB, and code still doesn't free textures
  113.  * before you load a new mine.
  114.  * 
  115.  * Revision 1.44  1994/10/20  12:47:22  matt
  116.  * Replace old save files (MIN/SAV/HOT) with new LVL files
  117.  * 
  118.  * Revision 1.43  1994/10/19  16:46:40  matt
  119.  * Made tmap overrides for robots remap texture numbers
  120.  * 
  121.  * Revision 1.42  1994/10/03  23:37:01  mike
  122.  * Adapt to changed fuelcen_activate parameters.
  123.  * 
  124.  * Revision 1.41  1994/09/23  22:14:49  matt
  125.  * Took out obsolete structure fields
  126.  * 
  127.  * Revision 1.40  1994/08/01  11:04:11  yuan
  128.  * New materialization centers.
  129.  * 
  130.  * Revision 1.39  1994/07/21  19:01:47  mike
  131.  * Call Lsegment stuff.
  132.  * 
  133.  * 
  134.  */
  135.  
  136. #pragma off (unreferenced)
  137. static char rcsid[] = "$Id: gamemine.c 2.2 1995/03/06 15:23:14 john Exp $";
  138. #pragma on (unreferenced)
  139.  
  140. #include <stdio.h>
  141. #include <stdlib.h>
  142. #include <math.h>
  143. #include <string.h>
  144.  
  145. #include "mono.h"
  146.  
  147. #include "inferno.h"
  148. #include "segment.h"
  149. #include "textures.h"
  150. #include "wall.h"
  151. #include "object.h"
  152. #include "gamemine.h"
  153. #include "error.h"
  154. #include "gameseg.h"
  155. #include "switch.h"
  156.  
  157. #include "game.h"
  158. #include "newmenu.h"
  159.  
  160. #ifdef EDITOR
  161. #include "editor\editor.h"
  162. #endif
  163.  
  164. #include "cfile.h"        
  165. #include "fuelcen.h"
  166.  
  167. #include "hash.h"
  168. #include "key.h"
  169. #include "piggy.h"
  170.  
  171. #define REMOVE_EXT(s)  (*(strchr( (s), '.' ))='\0')
  172.  
  173. struct mtfi mine_top_fileinfo;    // Should be same as first two fields below...
  174. struct mfi mine_fileinfo;
  175. struct mh mine_header;
  176. struct me mine_editor;
  177.  
  178. int CreateDefaultNewSegment();
  179.  
  180. #ifdef EDITOR
  181.  
  182. static char old_tmap_list[MAX_TEXTURES][13];
  183. short tmap_xlate_table[MAX_TEXTURES];
  184. static short tmap_times_used[MAX_TEXTURES];
  185.  
  186. // -----------------------------------------------------------------------------
  187. //loads from an already-open file
  188. // returns 0=everything ok, 1=old version, -1=error
  189. int load_mine_data(CFILE *LoadFile)
  190. {
  191.     int   i, j;
  192.     short tmap_xlate;
  193.     int     translate;
  194.     char     *temptr;
  195.     int    mine_start = cftell(LoadFile);
  196.  
  197.     fuelcen_reset();
  198.  
  199.     for (i=0; i<MAX_TEXTURES; i++ )
  200.         tmap_times_used[i] = 0;
  201.     
  202.     #ifdef EDITOR
  203.     // Create a new mine to initialize things.
  204.     //texpage_goto_first();
  205.     create_new_mine();
  206.     #endif
  207.  
  208.     //===================== READ FILE INFO ========================
  209.  
  210.     // These are the default values... version and fileinfo_sizeof
  211.     // don't have defaults.
  212.     mine_fileinfo.header_offset     =   -1;
  213.     mine_fileinfo.header_size       =   sizeof(mine_header);
  214.     mine_fileinfo.editor_offset     =   -1;
  215.     mine_fileinfo.editor_size       =   sizeof(mine_editor);
  216.     mine_fileinfo.vertex_offset     =   -1;
  217.     mine_fileinfo.vertex_howmany    =   0;
  218.     mine_fileinfo.vertex_sizeof     =   sizeof(vms_vector);
  219.     mine_fileinfo.segment_offset    =   -1;
  220.     mine_fileinfo.segment_howmany   =   0;
  221.     mine_fileinfo.segment_sizeof    =   sizeof(segment);
  222.     mine_fileinfo.newseg_verts_offset     =   -1;
  223.     mine_fileinfo.newseg_verts_howmany    =   0;
  224.     mine_fileinfo.newseg_verts_sizeof     =   sizeof(vms_vector);
  225.     mine_fileinfo.group_offset          =    -1;
  226.     mine_fileinfo.group_howmany      =    0;
  227.     mine_fileinfo.group_sizeof          =    sizeof(group);
  228.     mine_fileinfo.texture_offset    =   -1;
  229.     mine_fileinfo.texture_howmany   =   0;
  230.     mine_fileinfo.texture_sizeof    =   13;  // num characters in a name
  231.      mine_fileinfo.walls_offset          =    -1;
  232.     mine_fileinfo.walls_howmany      =    0;
  233.     mine_fileinfo.walls_sizeof          =    sizeof(wall);  
  234.      mine_fileinfo.triggers_offset      =    -1;
  235.     mine_fileinfo.triggers_howmany  =    0;
  236.     mine_fileinfo.triggers_sizeof      =    sizeof(trigger);  
  237.     mine_fileinfo.object_offset        =    -1;
  238.     mine_fileinfo.object_howmany        =    1;
  239.     mine_fileinfo.object_sizeof        =    sizeof(object);  
  240.  
  241.     // Read in mine_top_fileinfo to get size of saved fileinfo.
  242.     
  243.     memset( &mine_top_fileinfo, 0, sizeof(mine_top_fileinfo) );
  244.  
  245.     if (cfseek( LoadFile, mine_start, SEEK_SET ))
  246.         Error( "Error moving to top of file in gamemine.c" );
  247.  
  248.     if (cfread( &mine_top_fileinfo, sizeof(mine_top_fileinfo), 1, LoadFile )!=1)
  249.         Error( "Error reading mine_top_fileinfo in gamemine.c" );
  250.  
  251.     if (mine_top_fileinfo.fileinfo_signature != 0x2884)
  252.         return -1;
  253.  
  254.     // Check version number
  255.     if (mine_top_fileinfo.fileinfo_version < COMPATIBLE_VERSION )
  256.         return -1;
  257.  
  258.     // Now, Read in the fileinfo
  259.     if (cfseek( LoadFile, mine_start, SEEK_SET ))
  260.         Error( "Error seeking to top of file in gamemine.c" );
  261.  
  262.     if (cfread( &mine_fileinfo, mine_top_fileinfo.fileinfo_sizeof, 1, LoadFile )!=1)
  263.         Error( "Error reading mine_fileinfo in gamemine.c" );
  264.  
  265.     //===================== READ HEADER INFO ========================
  266.  
  267.     // Set default values.
  268.     mine_header.num_vertices        =   0;
  269.     mine_header.num_segments        =   0;
  270.  
  271.     if (mine_fileinfo.header_offset > -1 )
  272.     {
  273.         if (cfseek( LoadFile, mine_fileinfo.header_offset, SEEK_SET ))
  274.             Error( "Error seeking to header_offset in gamemine.c" );
  275.     
  276.         if (cfread( &mine_header, mine_fileinfo.header_size, 1, LoadFile )!=1)
  277.             Error( "Error reading mine_header in gamemine.c" );
  278.     }
  279.  
  280.     //===================== READ EDITOR INFO ==========================
  281.  
  282.     // Set default values
  283.     mine_editor.current_seg         =   0;
  284.     mine_editor.newsegment_offset   =   -1; // To be written
  285.     mine_editor.newsegment_size     =   sizeof(segment);
  286.     mine_editor.Curside             =   0;
  287.     mine_editor.Markedsegp          =   -1;
  288.     mine_editor.Markedside          =   0;
  289.  
  290.     if (mine_fileinfo.editor_offset > -1 )
  291.     {
  292.         if (cfseek( LoadFile, mine_fileinfo.editor_offset, SEEK_SET ))
  293.             Error( "Error seeking to editor_offset in gamemine.c" );
  294.     
  295.         if (cfread( &mine_editor, mine_fileinfo.editor_size, 1, LoadFile )!=1)
  296.             Error( "Error reading mine_editor in gamemine.c" );
  297.     }
  298.  
  299.     //===================== READ TEXTURE INFO ==========================
  300.  
  301.     if ( (mine_fileinfo.texture_offset > -1) && (mine_fileinfo.texture_howmany > 0))
  302.     {
  303.         if (cfseek( LoadFile, mine_fileinfo.texture_offset, SEEK_SET ))
  304.             Error( "Error seeking to texture_offset in gamemine.c" );
  305.  
  306.         for (i=0; i< mine_fileinfo.texture_howmany; i++ )
  307.         {
  308.             if (cfread( &old_tmap_list[i], mine_fileinfo.texture_sizeof, 1, LoadFile )!=1)
  309.                 Error( "Error reading old_tmap_list[i] in gamemine.c" );
  310.         }
  311.     }
  312.  
  313.     //=============== GENERATE TEXTURE TRANSLATION TABLE ===============
  314.  
  315.     translate = 0;
  316.     
  317.     Assert (NumTextures < MAX_TEXTURES);
  318.  
  319.     {
  320.         hashtable ht;
  321.     
  322.         hashtable_init( &ht, NumTextures );
  323.     
  324.         // Remove all the file extensions in the textures list
  325.     
  326.         for (i=0;i<NumTextures;i++)    {
  327.             temptr = strchr(TmapInfo[i].filename, '.');
  328.             if (temptr) *temptr = '\0';
  329.             hashtable_insert( &ht, TmapInfo[i].filename, i );
  330.         }
  331.     
  332.         // For every texture, search through the texture list
  333.         // to find a matching name.
  334.         for (j=0;j<mine_fileinfo.texture_howmany;j++)     {
  335.             // Remove this texture name's extension
  336.             temptr = strchr(old_tmap_list[j], '.');
  337.             if (temptr) *temptr = '\0';
  338.     
  339.             tmap_xlate_table[j] = hashtable_search( &ht,old_tmap_list[j]);
  340.             if (tmap_xlate_table[j]    < 0 )    {
  341.                 //tmap_xlate_table[j] = 0;
  342.                 // mprintf( (0, "Couldn't find texture '%s'\n", old_tmap_list[j] ));
  343.                 ;
  344.             }
  345.             if (tmap_xlate_table[j] != j ) translate = 1;
  346.             if (tmap_xlate_table[j] >= 0)
  347.                 tmap_times_used[tmap_xlate_table[j]]++;
  348.         }
  349.     
  350.         {
  351.             int count = 0;
  352.             for (i=0; i<MAX_TEXTURES; i++ )
  353.                 if (tmap_times_used[i])
  354.                     count++;
  355.             mprintf( (0, "This mine has %d unique textures in it (~%d KB)\n", count, (count*4096) /1024 ));
  356.         }
  357.     
  358.         mprintf( (0, "Translate=%d\n", translate ));
  359.     
  360.         hashtable_free( &ht );
  361.     }
  362.  
  363.     //====================== READ VERTEX INFO ==========================
  364.  
  365.     // New check added to make sure we don't read in too many vertices.
  366.     if ( mine_fileinfo.vertex_howmany > MAX_VERTICES )
  367.         {
  368.         mprintf((0, "Num vertices exceeds maximum.  Loading MAX %d vertices\n", MAX_VERTICES));
  369.         mine_fileinfo.vertex_howmany = MAX_VERTICES;
  370.         }
  371.  
  372.     if ( (mine_fileinfo.vertex_offset > -1) && (mine_fileinfo.vertex_howmany > 0))
  373.     {
  374.         if (cfseek( LoadFile, mine_fileinfo.vertex_offset, SEEK_SET ))
  375.             Error( "Error seeking to vertex_offset in gamemine.c" );
  376.  
  377.         for (i=0; i< mine_fileinfo.vertex_howmany; i++ )
  378.         {
  379.             // Set the default values for this vertex
  380.             Vertices[i].x = 1;
  381.             Vertices[i].y = 1;
  382.             Vertices[i].z = 1;
  383.  
  384.             if (cfread( &Vertices[i], mine_fileinfo.vertex_sizeof, 1, LoadFile )!=1)
  385.                 Error( "Error reading Vertices[i] in gamemine.c" );
  386.         }
  387.     }
  388.  
  389.     //==================== READ SEGMENT INFO ===========================
  390.  
  391.     // New check added to make sure we don't read in too many segments.
  392.     if ( mine_fileinfo.segment_howmany > MAX_SEGMENTS ) {
  393.         mprintf((0, "Num segments exceeds maximum.  Loading MAX %d segments\n", MAX_SEGMENTS));
  394.         mine_fileinfo.segment_howmany = MAX_SEGMENTS;
  395.     }
  396.  
  397.     // [commented out by mk on 11/20/94 (weren't we supposed to hit final in October?) because it looks redundant.  I think I'll test it now...]  fuelcen_reset();
  398.  
  399.     if ( (mine_fileinfo.segment_offset > -1) && (mine_fileinfo.segment_howmany > 0))    {
  400.  
  401.         if (cfseek( LoadFile, mine_fileinfo.segment_offset,SEEK_SET ))
  402.  
  403.             Error( "Error seeking to segment_offset in gamemine.c" );
  404.  
  405.         Highest_segment_index = mine_fileinfo.segment_howmany-1;
  406.  
  407.         for (i=0; i< mine_fileinfo.segment_howmany; i++ ) {
  408.             segment v16_seg;
  409.  
  410.             // Set the default values for this segment (clear to zero )
  411.             //memset( &Segments[i], 0, sizeof(segment) );
  412.  
  413.             if (mine_top_fileinfo.fileinfo_version >= 16) {
  414.  
  415.                 Assert(mine_fileinfo.segment_sizeof == sizeof(v16_seg));
  416.  
  417.                 if (cfread( &v16_seg, mine_fileinfo.segment_sizeof, 1, LoadFile )!=1)
  418.                     Error( "Error reading segments in gamemine.c" );
  419.  
  420.             }                
  421.             else 
  422.                 Error("Invalid mine version");
  423.  
  424.             Segments[i] = v16_seg;
  425.  
  426.             Segments[i].objects = -1;
  427.             #ifdef EDITOR
  428.             Segments[i].group = -1;
  429.             #endif
  430.  
  431.             if (mine_top_fileinfo.fileinfo_version < 15) {    //used old uvl ranges
  432.                 int sn,uvln;
  433.  
  434.                 for (sn=0;sn<MAX_SIDES_PER_SEGMENT;sn++)
  435.                     for (uvln=0;uvln<4;uvln++) {
  436.                         Segments[i].sides[sn].uvls[uvln].u /= 64;
  437.                         Segments[i].sides[sn].uvls[uvln].v /= 64;
  438.                         Segments[i].sides[sn].uvls[uvln].l /= 32;
  439.                     }
  440.             }
  441.  
  442.             fuelcen_activate( &Segments[i], Segments[i].special );
  443.  
  444.             if (translate == 1)
  445.                 for (j=0;j<MAX_SIDES_PER_SEGMENT;j++) {
  446.                     unsigned short orient;
  447.                     tmap_xlate = Segments[i].sides[j].tmap_num;
  448.                     Segments[i].sides[j].tmap_num = tmap_xlate_table[tmap_xlate];
  449.                     if ((WALL_IS_DOORWAY(&Segments[i],j) & WID_RENDER_FLAG))
  450.                         if (Segments[i].sides[j].tmap_num < 0)    {
  451.                             mprintf( (0, "Couldn't find texture '%s' for Segment %d, side %d\n", old_tmap_list[tmap_xlate],i,j));
  452.                             Int3();
  453.                             Segments[i].sides[j].tmap_num = 0;
  454.                         }
  455.                     tmap_xlate = Segments[i].sides[j].tmap_num2 & 0x3FFF;
  456.                     orient = Segments[i].sides[j].tmap_num2 & (~0x3FFF);
  457.                     if (tmap_xlate != 0) {
  458.                         int xlated_tmap = tmap_xlate_table[tmap_xlate];
  459.  
  460.                         if ((WALL_IS_DOORWAY(&Segments[i],j) & WID_RENDER_FLAG))
  461.                             if (xlated_tmap <= 0)    {
  462.                                 mprintf( (0, "Couldn't find texture '%s' for Segment %d, side %d\n", old_tmap_list[tmap_xlate],i,j));
  463.                                 Int3();
  464.                                 Segments[i].sides[j].tmap_num2 = 0;
  465.                             }
  466.                         Segments[i].sides[j].tmap_num2 = xlated_tmap | orient;
  467.                     }
  468.                 }
  469.         }
  470.     }
  471.  
  472.     //===================== READ NEWSEGMENT INFO =====================
  473.  
  474.     #ifdef EDITOR
  475.  
  476.     {        // Default segment created.
  477.         vms_vector    sizevec;
  478.         med_create_new_segment(vm_vec_make(&sizevec,DEFAULT_X_SIZE,DEFAULT_Y_SIZE,DEFAULT_Z_SIZE));        // New_segment = Segments[0];
  479.         //memset( &New_segment, 0, sizeof(segment) );
  480.     }
  481.  
  482.     if (mine_editor.newsegment_offset > -1)
  483.     {
  484.         if (cfseek( LoadFile, mine_editor.newsegment_offset,SEEK_SET ))
  485.             Error( "Error seeking to newsegment_offset in gamemine.c" );
  486.         if (cfread( &New_segment, mine_editor.newsegment_size,1,LoadFile )!=1)
  487.             Error( "Error reading new_segment in gamemine.c" );
  488.     }
  489.  
  490.     if ( (mine_fileinfo.newseg_verts_offset > -1) && (mine_fileinfo.newseg_verts_howmany > 0))
  491.     {
  492.         if (cfseek( LoadFile, mine_fileinfo.newseg_verts_offset, SEEK_SET ))
  493.             Error( "Error seeking to newseg_verts_offset in gamemine.c" );
  494.         for (i=0; i< mine_fileinfo.newseg_verts_howmany; i++ )
  495.         {
  496.             // Set the default values for this vertex
  497.             Vertices[NEW_SEGMENT_VERTICES+i].x = 1;
  498.             Vertices[NEW_SEGMENT_VERTICES+i].y = 1;
  499.             Vertices[NEW_SEGMENT_VERTICES+i].z = 1;
  500.             
  501.             if (cfread( &Vertices[NEW_SEGMENT_VERTICES+i], mine_fileinfo.newseg_verts_sizeof,1,LoadFile )!=1)
  502.                 Error( "Error reading Vertices[NEW_SEGMENT_VERTICES+i] in gamemine.c" );
  503.  
  504.             New_segment.verts[i] = NEW_SEGMENT_VERTICES+i;
  505.         }
  506.     }
  507.  
  508.     #endif
  509.                                                             
  510.     //========================= UPDATE VARIABLES ======================
  511.  
  512.     #ifdef EDITOR
  513.  
  514.     // Setting to Markedsegp to NULL ignores Curside and Markedside, which
  515.     // we want to do when reading in an old file.
  516.     
  517.      Markedside = mine_editor.Markedside;
  518.     Curside = mine_editor.Curside;
  519.     for (i=0;i<10;i++)
  520.         Groupside[i] = mine_editor.Groupside[i];
  521.  
  522.     if ( mine_editor.current_seg != -1 )
  523.         Cursegp = mine_editor.current_seg + Segments;
  524.     else
  525.          Cursegp = NULL;
  526.  
  527.     if (mine_editor.Markedsegp != -1 ) 
  528.         Markedsegp = mine_editor.Markedsegp + Segments;
  529.     else
  530.         Markedsegp = NULL;
  531.  
  532.     num_groups = 0;
  533.     current_group = -1;
  534.  
  535.     #endif
  536.  
  537.     Num_vertices = mine_fileinfo.vertex_howmany;
  538.     Num_segments = mine_fileinfo.segment_howmany;
  539.     Highest_vertex_index = Num_vertices-1;
  540.     Highest_segment_index = Num_segments-1;
  541.  
  542.     reset_objects(1);        //one object, the player
  543.  
  544.     #ifdef EDITOR
  545.     Highest_vertex_index = MAX_SEGMENT_VERTICES-1;
  546.     Highest_segment_index = MAX_SEGMENTS-1;
  547.     set_vertex_counts();
  548.     Highest_vertex_index = Num_vertices-1;
  549.     Highest_segment_index = Num_segments-1;
  550.  
  551.     warn_if_concave_segments();
  552.     #endif
  553.  
  554.     #ifdef EDITOR
  555.         validate_segment_all();
  556.     #endif
  557.  
  558.     //create_local_segment_data();
  559.  
  560.     //gamemine_find_textures();
  561.  
  562.     if (mine_top_fileinfo.fileinfo_version < MINE_VERSION )
  563.         return 1;        //old version
  564.     else
  565.         return 0;
  566.  
  567. }
  568. #endif
  569.  
  570. #define COMPILED_MINE_VERSION 0
  571.  
  572. int    New_file_format_load = 1;
  573.  
  574. int load_mine_data_compiled(CFILE *LoadFile)
  575. {
  576.     int i,segnum,sidenum;
  577.     ubyte version;
  578.     short temp_short;
  579.     ushort temp_ushort;
  580.  
  581. #ifndef SHAREWARE
  582.     if (New_file_format_load)
  583.         return load_mine_data_compiled_new(LoadFile);
  584. #endif
  585.  
  586.     //    For compiled levels, textures map to themselves, prevent tmap_override always being gray,
  587.     //    bug which Matt and John refused to acknowledge, so here is Mike, fixing it.
  588.     // 
  589.     // Although in a cloud of arrogant glee, he forgot to ifdef it on EDITOR!
  590.     // (Matt told me to write that!)
  591. #ifdef EDITOR
  592.     for (i=0; i<MAX_TEXTURES; i++)
  593.         tmap_xlate_table[i] = i;
  594. #endif
  595. //    memset( Segments, 0, sizeof(segment)*MAX_SEGMENTS );
  596.     fuelcen_reset();
  597.  
  598.     //=============================== Reading part ==============================
  599.     cfread( &version, sizeof(ubyte), 1, LoadFile );                        // 1 byte = compiled version
  600.     Assert( version==COMPILED_MINE_VERSION );
  601.     cfread( &Num_vertices, sizeof(int), 1, LoadFile );                    // 4 bytes = Num_vertices
  602.     Assert( Num_vertices <= MAX_VERTICES );
  603.     cfread( &Num_segments, sizeof(int), 1, LoadFile );                    // 4 bytes = Num_segments
  604.     Assert( Num_segments <= MAX_SEGMENTS );
  605.     cfread( Vertices, sizeof(vms_vector), Num_vertices, LoadFile );
  606.  
  607.     for (segnum=0; segnum<Num_segments; segnum++ )    {
  608.         #ifdef EDITOR
  609.         Segments[segnum].segnum = segnum;
  610.         Segments[segnum].group = 0;
  611.         #endif
  612.  
  613.         // Read short Segments[segnum].children[MAX_SIDES_PER_SEGMENT]
  614.          cfread( Segments[segnum].children, sizeof(short), MAX_SIDES_PER_SEGMENT, LoadFile );
  615.         // Read short Segments[segnum].verts[MAX_VERTICES_PER_SEGMENT]
  616.         cfread( Segments[segnum].verts, sizeof(short), MAX_VERTICES_PER_SEGMENT, LoadFile );
  617.         Segments[segnum].objects = -1;
  618.  
  619.         // Read ubyte    Segments[segnum].special
  620.         cfread( &Segments[segnum].special, sizeof(ubyte), 1, LoadFile );
  621.         // Read byte    Segments[segnum].matcen_num
  622.         cfread( &Segments[segnum].matcen_num, sizeof(ubyte), 1, LoadFile );
  623.         // Read short    Segments[segnum].value
  624.         cfread( &Segments[segnum].value, sizeof(short), 1, LoadFile );
  625.  
  626.         // Read fix    Segments[segnum].static_light (shift down 5 bits, write as short)
  627.         cfread( &temp_ushort, sizeof(temp_ushort), 1, LoadFile );
  628.         Segments[segnum].static_light    = ((fix)temp_ushort) << 4;
  629.         //cfread( &Segments[segnum].static_light, sizeof(fix), 1, LoadFile );
  630.     
  631.         // Read the walls as a 6 byte array
  632.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  633.             ubyte byte_wallnum;
  634.             Segments[segnum].sides[sidenum].pad = 0;
  635.             cfread( &byte_wallnum, sizeof(ubyte), 1, LoadFile );
  636.             if ( byte_wallnum == 255 )            
  637.                 Segments[segnum].sides[sidenum].wall_num = -1;
  638.             else        
  639.                 Segments[segnum].sides[sidenum].wall_num = byte_wallnum;
  640.         }
  641.  
  642.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  643.  
  644.             if ( (Segments[segnum].children[sidenum]==-1) || (Segments[segnum].sides[sidenum].wall_num!=-1) )    {
  645.                 // Read short Segments[segnum].sides[sidenum].tmap_num;
  646.                 cfread( &Segments[segnum].sides[sidenum].tmap_num, sizeof(short), 1, LoadFile );
  647.                 // Read short Segments[segnum].sides[sidenum].tmap_num2;
  648.                 cfread( &Segments[segnum].sides[sidenum].tmap_num2, sizeof(short), 1, LoadFile );
  649.                 // Read uvl Segments[segnum].sides[sidenum].uvls[4] (u,v>>5, write as short, l>>1 write as short)
  650.                 for (i=0; i<4; i++ )    {
  651.                     cfread( &temp_short, sizeof(short), 1, LoadFile );
  652.                     Segments[segnum].sides[sidenum].uvls[i].u = ((fix)temp_short) << 5;
  653.                     cfread( &temp_short, sizeof(short), 1, LoadFile );
  654.                     Segments[segnum].sides[sidenum].uvls[i].v = ((fix)temp_short) << 5;
  655.                     cfread( &temp_ushort, sizeof(temp_ushort), 1, LoadFile );
  656.                     Segments[segnum].sides[sidenum].uvls[i].l = ((fix)temp_ushort) << 1;
  657.                     //cfread( &Segments[segnum].sides[sidenum].uvls[i].l, sizeof(fix), 1, LoadFile );
  658.                 }    
  659.             } else {
  660.                 Segments[segnum].sides[sidenum].tmap_num = 0;
  661.                 Segments[segnum].sides[sidenum].tmap_num2 = 0;
  662.                 for (i=0; i<4; i++ )    {
  663.                     Segments[segnum].sides[sidenum].uvls[i].u = 0;
  664.                     Segments[segnum].sides[sidenum].uvls[i].v = 0;
  665.                     Segments[segnum].sides[sidenum].uvls[i].l = 0;
  666.                 }    
  667.             }
  668.         }
  669.     }
  670.  
  671.     Highest_vertex_index = Num_vertices-1;
  672.     Highest_segment_index = Num_segments-1;
  673.  
  674.     validate_segment_all();            // Fill in side type and normals.
  675.  
  676.     // Activate fuelcentes
  677.     for (i=0; i< Num_segments; i++ ) {
  678.         fuelcen_activate( &Segments[i], Segments[i].special );
  679.     }
  680.  
  681.     reset_objects(1);        //one object, the player
  682.  
  683.     return 0;
  684. }
  685.  
  686. #ifndef SHAREWARE
  687. int load_mine_data_compiled_new(CFILE *LoadFile)
  688. {
  689.     int        i,segnum,sidenum;
  690.     ubyte        version;
  691.     short        temp_short;
  692.     ushort    temp_ushort;
  693.     ubyte        bit_mask;
  694.  
  695.     //    For compiled levels, textures map to themselves, prevent tmap_override always being gray,
  696.     //    bug which Matt and John refused to acknowledge, so here is Mike, fixing it.
  697. #ifdef EDITOR
  698.     for (i=0; i<MAX_TEXTURES; i++)
  699.         tmap_xlate_table[i] = i;
  700. #endif
  701.  
  702. //    memset( Segments, 0, sizeof(segment)*MAX_SEGMENTS );
  703.     fuelcen_reset();
  704.  
  705.     //=============================== Reading part ==============================
  706.     cfread( &version, sizeof(ubyte), 1, LoadFile );                        // 1 byte = compiled version
  707.     Assert( version==COMPILED_MINE_VERSION );
  708.  
  709.     cfread( &temp_ushort, sizeof(ushort), 1, LoadFile );                    // 2 bytes = Num_vertices
  710.     Num_vertices = temp_ushort;
  711.     Assert( Num_vertices <= MAX_VERTICES );
  712.  
  713.     cfread( &temp_ushort, sizeof(ushort), 1, LoadFile );                    // 2 bytes = Num_segments
  714.     Num_segments = temp_ushort;
  715.     Assert( Num_segments <= MAX_SEGMENTS );
  716.  
  717.     cfread( Vertices, sizeof(vms_vector), Num_vertices, LoadFile );
  718.  
  719.     for (segnum=0; segnum<Num_segments; segnum++ )    {
  720.         int    bit;
  721.  
  722.         #ifdef EDITOR
  723.         Segments[segnum].segnum = segnum;
  724.         Segments[segnum].group = 0;
  725.         #endif
  726.  
  727.          cfread( &bit_mask, sizeof(ubyte), 1, LoadFile );
  728.  
  729.         for (bit=0; bit<MAX_SIDES_PER_SEGMENT; bit++) {
  730.             if (bit_mask & (1 << bit))
  731.                  cfread( &Segments[segnum].children[bit], sizeof(short), 1, LoadFile );
  732.             else
  733.                 Segments[segnum].children[bit] = -1;
  734.         }
  735.  
  736.         // Read short Segments[segnum].verts[MAX_VERTICES_PER_SEGMENT]
  737.         cfread( Segments[segnum].verts, sizeof(short), MAX_VERTICES_PER_SEGMENT, LoadFile );
  738.         Segments[segnum].objects = -1;
  739.  
  740.         if (bit_mask & (1 << MAX_SIDES_PER_SEGMENT)) {
  741.             // Read ubyte    Segments[segnum].special
  742.             cfread( &Segments[segnum].special, sizeof(ubyte), 1, LoadFile );
  743.             // Read byte    Segments[segnum].matcen_num
  744.             cfread( &Segments[segnum].matcen_num, sizeof(ubyte), 1, LoadFile );
  745.             // Read short    Segments[segnum].value
  746.             cfread( &Segments[segnum].value, sizeof(short), 1, LoadFile );
  747.         } else {
  748.             Segments[segnum].special = 0;
  749.             Segments[segnum].matcen_num = -1;
  750.             Segments[segnum].value = 0;
  751.         }
  752.  
  753.         // Read fix    Segments[segnum].static_light (shift down 5 bits, write as short)
  754.         cfread( &temp_ushort, sizeof(temp_ushort), 1, LoadFile );
  755.         Segments[segnum].static_light    = ((fix)temp_ushort) << 4;
  756.         //cfread( &Segments[segnum].static_light, sizeof(fix), 1, LoadFile );
  757.     
  758.         // Read the walls as a 6 byte array
  759.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  760.             Segments[segnum].sides[sidenum].pad = 0;
  761.         }
  762.  
  763.          cfread( &bit_mask, sizeof(ubyte), 1, LoadFile );
  764.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++) {
  765.             ubyte byte_wallnum;
  766.  
  767.             if (bit_mask & (1 << sidenum)) {
  768.                 cfread( &byte_wallnum, sizeof(ubyte), 1, LoadFile );
  769.                 if ( byte_wallnum == 255 )            
  770.                     Segments[segnum].sides[sidenum].wall_num = -1;
  771.                 else        
  772.                     Segments[segnum].sides[sidenum].wall_num = byte_wallnum;
  773.             } else
  774.                     Segments[segnum].sides[sidenum].wall_num = -1;
  775.         }
  776.  
  777.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  778.  
  779.             if ( (Segments[segnum].children[sidenum]==-1) || (Segments[segnum].sides[sidenum].wall_num!=-1) )    {
  780.                 // Read short Segments[segnum].sides[sidenum].tmap_num;
  781.                 cfread( &temp_ushort, sizeof(ushort), 1, LoadFile );
  782.  
  783.                 Segments[segnum].sides[sidenum].tmap_num = temp_ushort & 0x7fff;
  784.  
  785.                 if (!(temp_ushort & 0x8000))
  786.                     Segments[segnum].sides[sidenum].tmap_num2 = 0;
  787.                 else {
  788.                     // Read short Segments[segnum].sides[sidenum].tmap_num2;
  789.                     cfread( &Segments[segnum].sides[sidenum].tmap_num2, sizeof(short), 1, LoadFile );
  790.                 }
  791.  
  792.                 // Read uvl Segments[segnum].sides[sidenum].uvls[4] (u,v>>5, write as short, l>>1 write as short)
  793.                 for (i=0; i<4; i++ )    {
  794.                     cfread( &temp_short, sizeof(short), 1, LoadFile );
  795.                     Segments[segnum].sides[sidenum].uvls[i].u = ((fix)temp_short) << 5;
  796.                     cfread( &temp_short, sizeof(short), 1, LoadFile );
  797.                     Segments[segnum].sides[sidenum].uvls[i].v = ((fix)temp_short) << 5;
  798.                     cfread( &temp_ushort, sizeof(temp_ushort), 1, LoadFile );
  799.                     Segments[segnum].sides[sidenum].uvls[i].l = ((fix)temp_ushort) << 1;
  800.                     //cfread( &Segments[segnum].sides[sidenum].uvls[i].l, sizeof(fix), 1, LoadFile );
  801.                 }    
  802.             } else {
  803.                 Segments[segnum].sides[sidenum].tmap_num = 0;
  804.                 Segments[segnum].sides[sidenum].tmap_num2 = 0;
  805.                 for (i=0; i<4; i++ )    {
  806.                     Segments[segnum].sides[sidenum].uvls[i].u = 0;
  807.                     Segments[segnum].sides[sidenum].uvls[i].v = 0;
  808.                     Segments[segnum].sides[sidenum].uvls[i].l = 0;
  809.                 }    
  810.             }
  811.         }
  812.     }
  813.  
  814.     Highest_vertex_index = Num_vertices-1;
  815.     Highest_segment_index = Num_segments-1;
  816.  
  817.     validate_segment_all();            // Fill in side type and normals.
  818.  
  819.     // Activate fuelcentes
  820.     for (i=0; i< Num_segments; i++ ) {
  821.         fuelcen_activate( &Segments[i], Segments[i].special );
  822.     }
  823.  
  824.     reset_objects(1);        //one object, the player
  825.  
  826.     return 0;
  827. }
  828.  
  829. #endif
  830. 
  831.