FILEWLD.CPP
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:7k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "ray.h"
  2. #include "globals.h"
  3. #include "rayfile.h"
  4. #include "blockbsp.h"
  5. #include "SortSeg.h"
  6. #include "genbsp.h"
  7. #include "blockmap.h"
  8. #include "fixed.h"
  9. #include "scrmes.h"
  10. inline sector * Get_Sec_From_SSec(ssector * cur_ss)
  11. {
  12.    seg * cur_seg=Seg_List+cur_ss->seg_start;
  13.    return (cur_seg->ld->s[(short)cur_seg->left_sidedef]->sec);
  14. }
  15. void F_Clear_World()
  16. {
  17.    DelPtr(Vector_List);
  18.    DelPtr(Sd_List);
  19.    DelPtr(Ld_List);
  20.    DelPtr(Seg_List);
  21.    DelPtr(SS_List);
  22.    for (short sec_index=0; sec_index<Number_Of_Sectors; sec_index++) {
  23.       if (Sector_List[sec_index].extra_data!=NULL) {
  24.          DelPtr(Sector_List[sec_index].extra_data);
  25.       }
  26.    }
  27.    DelPtr(Sector_List);
  28.    DelPtr(bsp_tree);
  29.    Clear_Block_Map();
  30.    Clear_BSP_Block();
  31. }
  32.  void F_Load_World()
  33. {
  34.    if (world_loaded)
  35.       F_Clear_World();
  36.    Screen_Message("Loading sectors!");
  37.    F_Get_Sectors();               
  38.    Screen_Message("Loading vectors!");
  39.    F_Get_Vectors();
  40.    Screen_Message("Loading sidedefs!");
  41.    F_Get_SDs();
  42.    Screen_Message("Loading linedefs!");
  43.    F_Get_LDs();
  44.    Screen_Message("Loading segs!");
  45.    F_Get_Segs();
  46.    Screen_Message("Loading sub sectors!");
  47.    F_Get_SSectors();
  48.    Screen_Message("Loading the bsp!");
  49.    F_Get_BSP();
  50.    world_loaded=TRUE;
  51. }
  52.  void F_Get_Vectors()
  53. {
  54.   short dir_index=F_Find_And_Setup("VECTORS ", (void **)&Vector_List, sizeof(vector2));
  55.    if (dir_index==-1)
  56.       return;
  57.    Number_Of_Vectors=directory[dir_index].length;
  58.    vector2 * cur_vec;
  59.    short counter;
  60.    for (counter=0; counter< Number_Of_Vectors; counter++) {
  61.       cur_vec=Vector_List+counter;    
  62.       F_Get_Long(cur_vec->x);
  63.       F_Get_Long(cur_vec->y);
  64.    }
  65.    
  66. }
  67.  void F_Get_SDs()
  68. {
  69.    short dir_index=F_Find_And_Setup("SIDEDEFS", (void **)&Sd_List, sizeof(sidedef));
  70.     if (dir_index==-1)
  71.       return;
  72.    Number_Of_Sidedefs=directory[dir_index].length;
  73.    short counter;
  74.    short temp_short;
  75.    sidedef * cur_sd;
  76.    for (counter=0; counter < Number_Of_Sidedefs; counter++) {
  77.      cur_sd=Sd_List+counter;
  78.      F_Get_UShort(cur_sd->attributes);
  79.      F_Get_Short(cur_sd->x_offset);
  80.      F_Get_Short(cur_sd->y_offset);
  81.      F_Get_Short(cur_sd->texture_normal);
  82.      F_Get_Short(cur_sd->texture_low);
  83.      F_Get_Short(cur_sd->texture_high);
  84.      F_Get_Short(temp_short);
  85.      if (temp_short==-1) {
  86.         cur_sd->sec=NULL;
  87.      } else {
  88.         cur_sd->sec=(Sector_List+temp_short);
  89.      } /* endif */
  90.      }
  91. }
  92.  void F_Get_LDs()
  93. {
  94.    short dir_index=F_Find_And_Setup("LINEDEFS", (void **)&Ld_List, sizeof(linedef));
  95.    if (dir_index==-1)
  96.       return;
  97.    Number_Of_Linedefs=directory[dir_index].length;
  98.    short counter;
  99.    short temp_short;
  100.    long x1,y1,x2,y2;
  101.    linedef * cur_ld;
  102.    for (counter=0; counter < Number_Of_Linedefs; counter++) {
  103.      cur_ld=Ld_List+counter;
  104.      F_Get_Short(temp_short);
  105.      cur_ld->v[0]=temp_short;
  106.      F_Get_Short(temp_short);
  107.      cur_ld->v[1]=temp_short;
  108.      F_Get_Short(temp_short);
  109.      if (temp_short >=0)
  110.         cur_ld->s[0]=(Sd_List+temp_short);
  111.      else cur_ld->s[0]=NULL;
  112.      F_Get_Short(temp_short);
  113.      if (temp_short >=0)
  114.         cur_ld->s[1]=(Sd_List+temp_short);
  115.      else cur_ld->s[1]=NULL;
  116.      F_Get_UShort(cur_ld->tag);
  117.      F_Get_UShort(cur_ld->tag_type);
  118.      F_Get_UShort(cur_ld->attributes);
  119.      x1=Vector_List[cur_ld->v[0]].x;
  120.      y1=Vector_List[cur_ld->v[0]].y;
  121.      x2=Vector_List[cur_ld->v[1]].x;
  122.      y2=Vector_List[cur_ld->v[1]].y;
  123.      cur_ld->distance=longsqrtHP((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  124.    }
  125.    Generate_Block_Map();
  126. }
  127.  void F_Get_Segs()
  128. {
  129.    short dir_index=F_Find_And_Setup("SEGS    ", (void **)&Seg_List, sizeof(seg));
  130.    if (dir_index==-1)
  131.       return;
  132.    Number_Of_Segs=directory[dir_index].length;       
  133.    short counter;
  134.    short temp_short;
  135.    Byte temp_byte;
  136.    seg * cur_seg;
  137.    for (counter=0; counter< Number_Of_Segs; counter++) {
  138.      cur_seg=Seg_List+counter;
  139.      F_Get_Short(temp_short);  
  140.      cur_seg->v[0]=temp_short;
  141.      F_Get_Short(temp_short);
  142.      cur_seg->v[1]=temp_short;
  143.      F_Get_Long(cur_seg->angle);
  144.      F_Get_Short(temp_short);
  145.      cur_seg->ld=Ld_List+temp_short;
  146.      F_Get_Byte(temp_byte);
  147.      cur_seg->left_sidedef=(BOOL)temp_byte;
  148.      F_Get_Long(cur_seg->linedef_offset);
  149.      }
  150. }
  151.  void F_Get_SSectors()
  152. {
  153.    short dir_index=F_Find_And_Setup("SSECTORS", (void **)&SS_List, sizeof(ssector));
  154.    if (dir_index==-1)
  155.       return;
  156.    Number_Of_SSectors=directory[dir_index].length;   
  157.    short counter;
  158.    ssector * cur_ssec;
  159.    for (counter=0; counter< Number_Of_SSectors; counter++) {
  160.      cur_ssec=SS_List+counter;
  161.      F_Get_Short(cur_ssec->seg_start);
  162.      F_Get_Short(cur_ssec->seg_end);
  163.      cur_ssec->num_objects=0;
  164.      cur_ssec->objects=NULL;
  165.      cur_ssec->flags=Get_Sec_From_SSec(cur_ssec)->flags;
  166.      }
  167. }
  168.  void F_Get_Sectors()
  169. {
  170.    long cur_pos, extra_data_offset;
  171.    short dir_index=F_Find_And_Setup("SECTORS ", (void **)&Sector_List, sizeof(sector));
  172.    if (dir_index==-1)
  173.       return;
  174.    Number_Of_Sectors=directory[dir_index].length;     
  175.    short counter;
  176.    sector * cur_sec;
  177.    for (counter=0; counter < Number_Of_Sectors; counter++) {
  178.      cur_sec=Sector_List+counter;
  179.      F_Get_UShort(cur_sec->tag);
  180.      F_Get_Short(cur_sec->floor_height);
  181.      F_Get_Short(cur_sec->ceil_height);
  182.      F_Get_Short(cur_sec->floor_tex);
  183.      F_Get_Short(cur_sec->ceil_tex);
  184.      F_Get_Byte(cur_sec->light);
  185.      F_Get_UShort(cur_sec->flags);
  186.      if (cur_sec->flags & VOXEL_SECTOR) {
  187.         F_Get_Long(extra_data_offset);
  188.         cur_pos=F_Abs_Pos();
  189.         Load_Vox_Map((PUCHAR &)cur_sec->extra_data, extra_data_offset);
  190.         F_Seek_Abs(cur_pos);
  191.         } else cur_sec->extra_data=NULL;
  192.      }
  193. }
  194.  void F_Get_BSP()
  195. {
  196.    short dir_index=F_Find_And_Setup("NODES   ", (void **)&bsp_tree, sizeof(bsp_node));
  197.    if (dir_index==-1) {
  198.       Generate_BSP();
  199.       Generate_BSP_Block();
  200.       return;
  201.    }
  202.    Number_Of_Nodes=directory[dir_index].length;
  203.    bsp_start_node=0;
  204.    short counter;
  205.    bsp_node * cur_node;
  206.    prectl cur_rect;
  207.    for (counter=0; counter < Number_Of_Nodes; counter++) {
  208.      cur_node=bsp_tree+counter;
  209.      F_Get_Long(cur_node->x1);
  210.      F_Get_Long(cur_node->y1);
  211.      F_Get_Long(cur_node->x2);
  212.      F_Get_Long(cur_node->y2);
  213.      cur_rect=&(cur_node->left_bound);
  214.      F_Get_Long(cur_rect->top);
  215.      F_Get_Long(cur_rect->left);
  216.      F_Get_Long(cur_rect->bottom);
  217.      F_Get_Long(cur_rect->right);
  218.      cur_rect=&(cur_node->right_bound);
  219.      F_Get_Long(cur_rect->top);
  220.      F_Get_Long(cur_rect->left);
  221.      F_Get_Long(cur_rect->bottom);
  222.      F_Get_Long(cur_rect->right);
  223.      F_Get_UShort(cur_node->left_child);
  224.      F_Get_UShort(cur_node->right_child);
  225.    }
  226.    Generate_BSP_Block();
  227. }