home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / mine.c < prev    next >
C/C++ Source or Header  |  1998-06-08  |  19KB  |  531 lines

  1. /*
  2.  * $Source: f:/miner/source/main/editor/rcs/mine.c $
  3.  * $Revision: 2.0 $
  4.  * $Author: john $
  5.  * $Date: 1995/02/27 11:34:38 $
  6.  * 
  7.  * Mine specific editing functions, such as load_mine, save_mine
  8.  * 
  9.  * $Log: mine.c $
  10.  * Revision 2.0  1995/02/27  11:34:38  john
  11.  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
  12.  * for bitmaps.tbl.
  13.  * 
  14.  * Revision 1.82  1995/01/19  15:19:42  mike
  15.  * New super-compressed registered file format.
  16.  * 
  17.  * Revision 1.81  1994/12/15  16:51:39  mike
  18.  * fix error message.
  19.  * 
  20.  * Revision 1.80  1994/12/09  22:52:27  yuan
  21.  * *** empty log message ***
  22.  * 
  23.  * Revision 1.79  1994/11/27  23:17:14  matt
  24.  * Made changes for new mprintf calling convention
  25.  * 
  26.  * Revision 1.78  1994/11/26  21:48:24  matt
  27.  * Fixed saturation in short light value
  28.  * 
  29.  * Revision 1.77  1994/11/18  09:43:22  mike
  30.  * mprintf and clean up instead of Assert on values which don't fit in a short.
  31.  * 
  32.  * Revision 1.76  1994/11/17  20:37:37  john
  33.  * Added comment to get mike or john.
  34.  * 
  35.  * Revision 1.75  1994/11/17  20:08:51  john
  36.  * Added new compiled level format.
  37.  * 
  38.  * Revision 1.74  1994/11/17  11:39:00  matt
  39.  * Ripped out code to load old mines
  40.  * 
  41.  * Revision 1.73  1994/10/20  12:47:47  matt
  42.  * Replaced old save files (MIN/SAV/HOT) with new LVL files
  43.  * 
  44.  * Revision 1.72  1994/09/23  22:13:58  matt
  45.  * Tooks out references to obsolete structure fields
  46.  * 
  47.  * Revision 1.71  1994/09/22  18:39:40  john
  48.  * *** empty log message ***
  49.  * 
  50.  * Revision 1.70  1994/09/22  18:38:09  john
  51.  * Added better help for locked files.
  52.  * 
  53.  * Revision 1.69  1994/08/01  11:04:44  yuan
  54.  * New materialization centers.
  55.  * 
  56.  * Revision 1.68  1994/06/08  14:29:35  matt
  57.  * Took out support for old mine versions
  58.  * 
  59.  * Revision 1.67  1994/05/27  10:34:37  yuan
  60.  * Added new Dialog boxes for Walls and Triggers.
  61.  * 
  62.  * Revision 1.66  1994/05/23  14:48:08  mike
  63.  * make current segment be add segment.
  64.  * 
  65.  * Revision 1.65  1994/05/17  10:34:52  matt
  66.  * New parm to reset_objects; Num_objects no longer global
  67.  * 
  68.  * Revision 1.64  1994/05/12  14:46:46  mike
  69.  * Load previous mine type.
  70.  * 
  71.  * Revision 1.63  1994/05/06  12:52:13  yuan
  72.  * Adding some gamesave checks...
  73.  * 
  74.  * Revision 1.62  1994/05/05  12:56:32  yuan
  75.  * Fixed a bunch of group bugs.
  76.  * 
  77.  * Revision 1.61  1994/05/03  11:36:55  yuan
  78.  * Fixing mine save.
  79.  * 
  80.  * Revision 1.60  1994/03/19  17:22:14  yuan
  81.  * Wall system implemented until specific features need to be added...
  82.  * (Needs to be hammered on though.)
  83.  * 
  84.  * Revision 1.59  1994/03/17  18:08:32  yuan
  85.  * New wall stuff... Cut out switches....
  86.  * 
  87.  * Revision 1.58  1994/03/15  16:34:15  yuan
  88.  * Fixed bm loader (might have some changes in walls and switches)
  89.  * 
  90.  * Revision 1.57  1994/03/01  18:14:09  yuan
  91.  * Added new walls, switches, and triggers.
  92.  * 
  93.  */
  94.  
  95.  
  96. #pragma off (unreferenced)
  97. static char rcsid[] = "$Id: mine.c 2.0 1995/02/27 11:34:38 john Exp $";
  98. #pragma on (unreferenced)
  99.  
  100. #include <stdio.h>
  101. #include <stdlib.h>
  102. #include <math.h>
  103. #include <string.h>
  104.  
  105. #include "mono.h"
  106. #include "key.h"
  107. #include "gr.h"
  108.  
  109. #include "bm.h"            // for MAX_TEXTURES
  110.  
  111. #include "inferno.h"
  112. #include "segment.h"
  113. #include "editor.h"
  114. #include "error.h"
  115. #include "textures.h"
  116. #include "object.h"
  117.  
  118. #include "gamemine.h"
  119. #include "gameseg.h"
  120.  
  121. #include "ui.h"            // Because texpage.h need UI_WINDOW type
  122. #include "texpage.h"        // For texpage_goto_first
  123.              
  124. #include "medwall.h"
  125. #include "switch.h"
  126.  
  127. #include "dcflib.h"
  128. #include "nocfile.h"
  129. #include "fuelcen.h"
  130.  
  131. #define REMOVE_EXT(s)  (*(strchr( (s), '.' ))='\0')
  132.  
  133. int CreateDefaultNewSegment();
  134.  
  135. static char     current_tmap_list[MAX_TEXTURES][13];
  136.  
  137. // -----------------------------------------------------------------------------
  138. // Save mine will:
  139. // 1. Write file info, header info, editor info, vertex data, segment data,
  140. //    and new_segment in that order, marking their file offset.
  141. // 2. Go through all the fields and fill in the offset, size, and sizeof
  142. //    values in the headers.
  143.  
  144. int med_save_mine(char * filename)
  145. {
  146.     FILE * SaveFile;
  147.     char ErrorMessage[256];
  148.  
  149.     SaveFile = cfopen( filename, CF_WRITE_MODE );
  150.     if (!SaveFile)
  151.     {
  152.         char fname[20];
  153.         _splitpath( filename, NULL, NULL, fname, NULL );
  154.  
  155.         sprintf( ErrorMessage, \
  156.             "ERROR: Cannot write to '%s'.\nYou probably need to check out a locked\nversion of the file. You should save\nthis under a different filename, and then\ncheck out a locked copy by typing\n\'co -l %s.lvl'\nat the DOS prompt.\n" 
  157.             , filename, fname, fname );
  158.         sprintf( ErrorMessage, "ERROR: Unable to open %s\n", filename );
  159.         MessageBox( -2, -2, 1, ErrorMessage, "Ok" );
  160.         return 1;
  161.     }
  162.  
  163.     save_mine_data(SaveFile);
  164.     
  165.     //==================== CLOSE THE FILE =============================
  166.     cfclose(SaveFile);
  167.  
  168.     return 0;
  169.  
  170. }
  171.  
  172. // -----------------------------------------------------------------------------
  173. // saves to an already-open file
  174. int save_mine_data(CFILE * SaveFile)
  175. {
  176.     int  header_offset, editor_offset, vertex_offset, segment_offset, doors_offset, texture_offset, walls_offset, triggers_offset; //, links_offset;
  177.     int  newseg_verts_offset;
  178.     int  newsegment_offset;
  179.     int  i;
  180.  
  181.     med_compress_mine();
  182.     warn_if_concave_segments();
  183.     
  184.     for (i=0;i<NumTextures;i++)
  185.         strncpy(current_tmap_list[i], TmapInfo[i].filename, 13);
  186.  
  187.     //=================== Calculate offsets into file ==================
  188.  
  189.     header_offset = cftell(SaveFile) + sizeof(mine_fileinfo);
  190.     editor_offset = header_offset + sizeof(mine_header);
  191.     texture_offset = editor_offset + sizeof(mine_editor);
  192.     vertex_offset  = texture_offset + (13*NumTextures);
  193.     segment_offset = vertex_offset + (sizeof(vms_vector)*Num_vertices);
  194.     newsegment_offset = segment_offset + (sizeof(segment)*Num_segments);
  195.     newseg_verts_offset = newsegment_offset + sizeof(segment);
  196.     walls_offset = newseg_verts_offset + (sizeof(vms_vector)*8);
  197.     triggers_offset =    walls_offset + (sizeof(wall)*Num_walls);
  198.     doors_offset = triggers_offset + (sizeof(trigger)*Num_triggers);
  199.  
  200.     //===================== SAVE FILE INFO ========================
  201.  
  202.     mine_fileinfo.fileinfo_signature=    0x2884;
  203.     mine_fileinfo.fileinfo_version  =   MINE_VERSION;
  204.     mine_fileinfo.fileinfo_sizeof   =   sizeof(mine_fileinfo);
  205.     mine_fileinfo.header_offset     =   header_offset;
  206.     mine_fileinfo.header_size       =   sizeof(mine_header);
  207.     mine_fileinfo.editor_offset     =   editor_offset;
  208.     mine_fileinfo.editor_size       =   sizeof(mine_editor);
  209.     mine_fileinfo.vertex_offset     =   vertex_offset;
  210.     mine_fileinfo.vertex_howmany    =   Num_vertices;
  211.     mine_fileinfo.vertex_sizeof     =   sizeof(vms_vector);
  212.     mine_fileinfo.segment_offset    =   segment_offset;
  213.     mine_fileinfo.segment_howmany   =   Num_segments;
  214.     mine_fileinfo.segment_sizeof    =   sizeof(segment);
  215.     mine_fileinfo.newseg_verts_offset     =   newseg_verts_offset;
  216.     mine_fileinfo.newseg_verts_howmany    =   8;
  217.     mine_fileinfo.newseg_verts_sizeof     =   sizeof(vms_vector);
  218.     mine_fileinfo.texture_offset    =   texture_offset;
  219.     mine_fileinfo.texture_howmany   =   NumTextures;
  220.     mine_fileinfo.texture_sizeof    =   13;  // num characters in a name
  221.     mine_fileinfo.walls_offset          =    walls_offset;
  222.     mine_fileinfo.walls_howmany      =    Num_walls;
  223.     mine_fileinfo.walls_sizeof          =    sizeof(wall);  
  224.     mine_fileinfo.triggers_offset      =    triggers_offset;
  225.     mine_fileinfo.triggers_howmany  =    Num_triggers;
  226.     mine_fileinfo.triggers_sizeof      =    sizeof(trigger);  
  227.  
  228.     // Write the fileinfo
  229.     cfwrite( &mine_fileinfo, sizeof(mine_fileinfo), 1, SaveFile );
  230.  
  231.     //===================== SAVE HEADER INFO ========================
  232.  
  233.     mine_header.num_vertices        =   Num_vertices;
  234.     mine_header.num_segments        =   Num_segments;
  235.  
  236.     // Write the editor info
  237.     if (header_offset != cftell(SaveFile))
  238.         Error( "OFFSETS WRONG IN MINE.C!" );
  239.  
  240.     cfwrite( &mine_header, sizeof(mine_header), 1, SaveFile );
  241.  
  242.     //===================== SAVE EDITOR INFO ==========================
  243.     mine_editor.current_seg         =   Cursegp - Segments;
  244.     mine_editor.newsegment_offset   =   newsegment_offset; 
  245.     mine_editor.newsegment_size     =   sizeof(segment);
  246.  
  247.     // Next 3 vars added 10/07 by JAS
  248.     mine_editor.Curside             =   Curside;
  249.     if (Markedsegp)
  250.         mine_editor.Markedsegp       =   Markedsegp - Segments;
  251.     else                                      
  252.         mine_editor.Markedsegp       =   -1;
  253.     mine_editor.Markedside          =   Markedside;
  254.     for (i=0;i<10;i++)
  255.         mine_editor.Groupsegp[i]      =    Groupsegp[i] - Segments;
  256.     for (i=0;i<10;i++)
  257.         mine_editor.Groupside[i]     =    Groupside[i];
  258.  
  259.     if (editor_offset != cftell(SaveFile))
  260.         Error( "OFFSETS WRONG IN MINE.C!" );
  261.     cfwrite( &mine_editor, sizeof(mine_editor), 1, SaveFile );
  262.  
  263.     //===================== SAVE TEXTURE INFO ==========================
  264.  
  265.     if (texture_offset != cftell(SaveFile))
  266.         Error( "OFFSETS WRONG IN MINE.C!" );
  267.     cfwrite( current_tmap_list, 13, NumTextures, SaveFile );
  268.     
  269.     //===================== SAVE VERTEX INFO ==========================
  270.  
  271.     if (vertex_offset != cftell(SaveFile))
  272.         Error( "OFFSETS WRONG IN MINE.C!" );
  273.     cfwrite( Vertices, sizeof(vms_vector), Num_vertices, SaveFile );
  274.  
  275.     //===================== SAVE SEGMENT INFO =========================
  276.  
  277.     if (segment_offset != cftell(SaveFile))
  278.         Error( "OFFSETS WRONG IN MINE.C!" );
  279.     cfwrite( Segments, sizeof(segment), Num_segments, SaveFile );
  280.  
  281.     //===================== SAVE NEWSEGMENT INFO ======================
  282.  
  283.     if (newsegment_offset != cftell(SaveFile))
  284.         Error( "OFFSETS WRONG IN MINE.C!" );
  285.     cfwrite( &New_segment, sizeof(segment), 1, SaveFile );
  286.  
  287.     if (newseg_verts_offset != cftell(SaveFile))
  288.         Error( "OFFSETS WRONG IN MINE.C!" );
  289.     cfwrite( &Vertices[New_segment.verts[0]], sizeof(vms_vector), 8, SaveFile );
  290.  
  291.     //==================== CLOSE THE FILE =============================
  292.  
  293.     return 0;
  294.  
  295. }
  296.  
  297.  
  298.  
  299. #define COMPILED_MINE_VERSION 0
  300.  
  301. void dump_fix_as_short( fix value, int nbits, CFILE * SaveFile )
  302. {
  303.     int int_value = (int)(value>>nbits);
  304.     short short_value;
  305.  
  306.     if( int_value > 0x7fff ) {
  307.         short_value = 0x7fff;
  308.         mprintf((1, "Warning: Fix (%8x) won't fit in short.  Saturating to %8x.\n", int_value, short_value<<nbits));
  309.     }
  310.     else if( int_value < -0x7fff ) {
  311.         short_value = -0x7fff;
  312.         mprintf((1, "Warning: Fix (%8x) won't fit in short.  Saturating to %8x.\n", int_value, short_value<<nbits));
  313.     }
  314.     else
  315.         short_value = (short)int_value;
  316.  
  317.     cfwrite( &short_value, sizeof(short_value), 1, SaveFile );
  318. }
  319.  
  320. //version of dump for unsigned values
  321. void dump_fix_as_ushort( fix value, int nbits, CFILE * SaveFile )
  322. {
  323.     uint int_value;
  324.     ushort short_value;
  325.  
  326.     if (value < 0) {
  327.         mprintf((1, "Warning: fix (%8x) is signed...setting to zero.\n", value));
  328.         Int3();        //hey---show this to Matt
  329.         value = 0;
  330.     }
  331.     else
  332.         int_value = value >> nbits;
  333.  
  334.     if( int_value > 0xffff ) {
  335.         short_value = 0xffff;
  336.         mprintf((1, "Warning: Fix (%8x) won't fit in unsigned short.  Saturating to %8x.\n", int_value, short_value<<nbits));
  337.     }
  338.     else
  339.         short_value = int_value;
  340.  
  341.     cfwrite( &short_value, sizeof(short_value), 1, SaveFile );
  342. }
  343.  
  344. int    New_file_format_save = 1;
  345.  
  346. // -----------------------------------------------------------------------------
  347. // saves compiled mine data to an already-open file...
  348. int save_mine_data_compiled(FILE * SaveFile)
  349. {
  350.     short i,segnum,sidenum;
  351.     ubyte version = COMPILED_MINE_VERSION;
  352.  
  353. #ifndef SHAREWARE
  354.     if (New_file_format_save)
  355.         return save_mine_data_compiled_new(SaveFile);
  356. #endif
  357.  
  358.     med_compress_mine();
  359.     warn_if_concave_segments();
  360.  
  361.     if (Highest_segment_index >= MAX_GAME_SEGMENTS) {
  362.         char    message[128];
  363.         sprintf(message, "Error: Too many segments (%i > %i) for game (not editor)", Highest_segment_index+1, MAX_GAME_SEGMENTS);
  364.         MessageBox( -2, -2, 1, message, "Ok" );
  365.     }
  366.  
  367.     if (Highest_vertex_index >= MAX_GAME_VERTICES) {
  368.         char    message[128];
  369.         sprintf(message, "Error: Too many vertices (%i > %i) for game (not editor)", Highest_vertex_index+1, MAX_GAME_VERTICES);
  370.         MessageBox( -2, -2, 1, message, "Ok" );
  371.     }
  372.  
  373.     //=============================== Writing part ==============================
  374.     cfwrite( &version, sizeof(ubyte), 1, SaveFile );                        // 1 byte = compiled version
  375.     cfwrite( &Num_vertices, sizeof(int), 1, SaveFile );                    // 4 bytes = Num_vertices
  376.     cfwrite( &Num_segments, sizeof(int), 1, SaveFile );                        // 4 bytes = Num_segments
  377.     cfwrite( Vertices, sizeof(vms_vector), Num_vertices, SaveFile );
  378.  
  379.     for (segnum=0; segnum<Num_segments; segnum++ )    {
  380.         // Write short Segments[segnum].children[MAX_SIDES_PER_SEGMENT]
  381.          cfwrite( &Segments[segnum].children, sizeof(short), MAX_SIDES_PER_SEGMENT, SaveFile );
  382.         // Write short Segments[segnum].verts[MAX_VERTICES_PER_SEGMENT]
  383.         cfwrite( &Segments[segnum].verts, sizeof(short), MAX_VERTICES_PER_SEGMENT, SaveFile );
  384.         // Write ubyte    Segments[segnum].special
  385.         cfwrite( &Segments[segnum].special, sizeof(ubyte), 1, SaveFile );
  386.         // Write byte    Segments[segnum].matcen_num
  387.         cfwrite( &Segments[segnum].matcen_num, sizeof(ubyte), 1, SaveFile );
  388.         // Write short    Segments[segnum].value
  389.         cfwrite( &Segments[segnum].value, sizeof(short), 1, SaveFile );
  390.         // Write fix    Segments[segnum].static_light (shift down 5 bits, write as short)
  391.         dump_fix_as_ushort( Segments[segnum].static_light, 4, SaveFile );
  392.         //cfwrite( &Segments[segnum].static_light , sizeof(fix), 1, SaveFile );
  393.     
  394.         // Write the walls as a 6 byte array
  395.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  396.             uint wallnum;
  397.             ubyte byte_wallnum;
  398.             if (Segments[segnum].sides[sidenum].wall_num<0)
  399.                 wallnum = 255;        // Use 255 to mark no walls
  400.             else {
  401.                 wallnum = Segments[segnum].sides[sidenum].wall_num;
  402.                 Assert( wallnum < 255 );        // Get John or Mike.. can only store up to 255 walls!!! 
  403.             }
  404.             byte_wallnum = (ubyte)wallnum;
  405.             cfwrite( &byte_wallnum, sizeof(ubyte), 1, SaveFile );
  406.         }
  407.  
  408.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  409.             if ( (Segments[segnum].children[sidenum]==-1) || (Segments[segnum].sides[sidenum].wall_num!=-1) )    {
  410.                 // Write short Segments[segnum].sides[sidenum].tmap_num;
  411.                 cfwrite( &Segments[segnum].sides[sidenum].tmap_num, sizeof(short), 1, SaveFile );
  412.                 // Write short Segments[segnum].sides[sidenum].tmap_num2;
  413.                 cfwrite( &Segments[segnum].sides[sidenum].tmap_num2, sizeof(short), 1, SaveFile );
  414.                 // Write uvl Segments[segnum].sides[sidenum].uvls[4] (u,v>>5, write as short, l>>1 write as short)
  415.                 for (i=0; i<4; i++ )    {
  416.                     dump_fix_as_short( Segments[segnum].sides[sidenum].uvls[i].u, 5, SaveFile );
  417.                     dump_fix_as_short( Segments[segnum].sides[sidenum].uvls[i].v, 5, SaveFile );
  418.                     dump_fix_as_ushort( Segments[segnum].sides[sidenum].uvls[i].l, 1, SaveFile );
  419.                     //cfwrite( &Segments[segnum].sides[sidenum].uvls[i].l, sizeof(fix), 1, SaveFile );
  420.                 }    
  421.             }
  422.         }
  423.  
  424.     }
  425.  
  426.     return 0;
  427. }
  428.  
  429. // -----------------------------------------------------------------------------
  430. // saves compiled mine data to an already-open file...
  431. int save_mine_data_compiled_new(FILE * SaveFile)
  432. {
  433.     short        i, segnum, sidenum, temp_short;
  434.     ubyte     version = COMPILED_MINE_VERSION;
  435.     ubyte        bit_mask = 0;
  436.  
  437.     med_compress_mine();
  438.     warn_if_concave_segments();
  439.  
  440.     if (Highest_segment_index >= MAX_GAME_SEGMENTS) {
  441.         char    message[128];
  442.         sprintf(message, "Error: Too many segments (%i > %i) for game (not editor)", Highest_segment_index+1, MAX_GAME_SEGMENTS);
  443.         MessageBox( -2, -2, 1, message, "Ok" );
  444.     }
  445.  
  446.     if (Highest_vertex_index >= MAX_GAME_VERTICES) {
  447.         char    message[128];
  448.         sprintf(message, "Error: Too many vertices (%i > %i) for game (not editor)", Highest_vertex_index+1, MAX_GAME_VERTICES);
  449.         MessageBox( -2, -2, 1, message, "Ok" );
  450.     }
  451.  
  452.     //=============================== Writing part ==============================
  453.     cfwrite( &version, sizeof(ubyte), 1, SaveFile );                        // 1 byte = compiled version
  454.     temp_short = Num_vertices;
  455.     cfwrite( &temp_short, sizeof(short), 1, SaveFile );                    // 2 bytes = Num_vertices
  456.     temp_short = Num_segments;
  457.     cfwrite( &temp_short, sizeof(short), 1, SaveFile );                    // 2 bytes = Num_segments
  458.     cfwrite( Vertices, sizeof(vms_vector), Num_vertices, SaveFile );
  459.  
  460.     for (segnum=0; segnum<Num_segments; segnum++ )    {
  461.  
  462.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++) {
  463.              if (Segments[segnum].children[sidenum] != -1)
  464.                 bit_mask |= (1 << sidenum);
  465.         }
  466.  
  467.         if ((Segments[segnum].special != 0) || (Segments[segnum].matcen_num != 0) || (Segments[segnum].value != 0))
  468.             bit_mask |= (1 << MAX_SIDES_PER_SEGMENT);
  469.  
  470.          cfwrite( &bit_mask, sizeof(ubyte), 1, SaveFile );
  471.  
  472.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++) {
  473.              if (bit_mask & (1 << sidenum))
  474.                  cfwrite( &Segments[segnum].children[sidenum], sizeof(short), 1, SaveFile );
  475.         }
  476.  
  477.         cfwrite( &Segments[segnum].verts, sizeof(short), MAX_VERTICES_PER_SEGMENT, SaveFile );
  478.  
  479.         if (bit_mask & (1 << MAX_SIDES_PER_SEGMENT)) {
  480.             cfwrite( &Segments[segnum].special, sizeof(ubyte), 1, SaveFile );
  481.             cfwrite( &Segments[segnum].matcen_num, sizeof(ubyte), 1, SaveFile );
  482.             cfwrite( &Segments[segnum].value, sizeof(short), 1, SaveFile );
  483.         }
  484.  
  485.         dump_fix_as_ushort( Segments[segnum].static_light, 4, SaveFile );
  486.     
  487.         // Write the walls as a 6 byte array
  488.         bit_mask = 0;
  489.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  490.             uint wallnum;
  491.             if (Segments[segnum].sides[sidenum].wall_num >= 0) {
  492.                 bit_mask |= (1 << sidenum);
  493.                 wallnum = Segments[segnum].sides[sidenum].wall_num;
  494.                 Assert( wallnum < 255 );        // Get John or Mike.. can only store up to 255 walls!!! 
  495.             }
  496.         }
  497.         cfwrite( &bit_mask, sizeof(ubyte), 1, SaveFile );
  498.  
  499.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  500.             if (bit_mask & (1 << sidenum))
  501.                 cfwrite( &Segments[segnum].sides[sidenum].wall_num, sizeof(ubyte), 1, SaveFile );
  502.         }
  503.  
  504.         for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ )    {
  505.             if ( (Segments[segnum].children[sidenum]==-1) || (Segments[segnum].sides[sidenum].wall_num!=-1) )    {
  506.                 ushort    tmap_num, tmap_num2;
  507.  
  508.                 tmap_num = Segments[segnum].sides[sidenum].tmap_num;
  509.                 tmap_num2 = Segments[segnum].sides[sidenum].tmap_num2;
  510.                 if (tmap_num2 != 0)
  511.                     tmap_num |= 0x8000;
  512.  
  513.                 cfwrite( &tmap_num, sizeof(ushort), 1, SaveFile );
  514.                 if (tmap_num2 != 0)
  515.                     cfwrite( &tmap_num2, sizeof(ushort), 1, SaveFile );
  516.  
  517.                 for (i=0; i<4; i++ )    {
  518.                     dump_fix_as_short( Segments[segnum].sides[sidenum].uvls[i].u, 5, SaveFile );
  519.                     dump_fix_as_short( Segments[segnum].sides[sidenum].uvls[i].v, 5, SaveFile );
  520.                     dump_fix_as_ushort( Segments[segnum].sides[sidenum].uvls[i].l, 1, SaveFile );
  521.                 }    
  522.             }
  523.         }
  524.  
  525.     }
  526.  
  527.     return 0;
  528. }
  529.  
  530.  
  531.