Main Page | Alphabetical List | Class List | File List | Class Members | File Members

engine/files.c

Go to the documentation of this file.
00001 #include "engine.h"
00002 
00003 char active_set[32];
00004 
00005 //{{{
00006 int load_kyelib(int levelnum)
00007 {
00008     FILE *fin = NULL;
00009     unsigned short offset;
00010     file_header header;
00011     
00012     fin = fopen(active_set, "rb");
00013     if(!fin) goto error_return;
00014     
00015     if( fread_fast(&header, sizeof(file_header), 1, fin) < 1 )
00016         goto error_return;
00017     
00018     if( memcmp(header.magic_bytes, "SKye", 4) ) {
00019         // Nope, not going to support DC-Kye levels, since it's so easy to
00020         // convert them.
00021         goto error_return;
00022     }
00023     
00024     if(header.revision != 2) {
00025         // Only the most recent version of the SKye level spec is supported
00026         // by the game engine
00027         goto error_return;
00028     }
00029     
00030     if(levelnum > header.num_levels)
00031         goto error_return;
00032     
00033     if( fseek_fast(fin, sizeof(unsigned short)*levelnum+sizeof(file_header),
00034         SEEK_SET) != 0 )
00035         goto error_return;
00036     if( fread_fast(&offset, sizeof(unsigned short), 1, fin) < 1 )
00037         goto error_return;
00038     if( fseek_fast(fin, offset, SEEK_SET) != 0 )
00039         goto error_return;
00040     
00041     if(!load_skye_level(fin))
00042         goto error_return;
00043     
00044     fclose(fin);
00045     return 1;
00046     
00047 error_return:
00048     if(fin) fclose(fin);
00049     return 0;
00050 }
00051 //}}}
00052 
00053 //{{{
00054 int load_skye_level(FILE *fin)
00055 {
00056     int ii, jj;
00057     map_r2 loaded_level;
00058     if( fread_fast(&loaded_level, sizeof(loaded_level), 1, fin) < 1 ) return 0;
00059     set_level_size(loaded_level.width, loaded_level.height);
00060 //  current_map.gamerules = loaded_level.gamerules;
00061     current_map.gamerules = RULESET_KYE92;
00062     freadstr(current_map.name,    32, fin);
00063     freadstr(current_map.author,  32, fin);
00064     freadstr(current_map.hint,    64, fin);
00065     freadstr(current_map.congrat, 64, fin);
00066     for(ii=0; ii<current_map.height; ii++)
00067     {
00068         memset(current_map.t[ii], 0,
00069                sizeof(engine_map_square)*current_map.width);
00070         for(jj=0; jj<current_map.width; jj++)
00071             current_map.t[ii][jj].v = fgetc(fin);
00072     }
00073     return 1;
00074 }
00075 //}}}
00076 //{{{
00077 void set_level_size(int width, int height)
00078 {
00079     engine_map_square **pos, *alloc_pos;
00080     size_t size = sizeof(engine_map_square*)*height +
00081                   sizeof(engine_map_square)*width*height;
00082     int ii;
00083     
00084     if(current_map.width == width && current_map.height == height)
00085         return;
00086     
00087     if(current_map.t) {
00088         free(current_map.t);
00089         current_map.t = NULL;
00090     }
00091     
00092     // Pool allocation of all the rows together
00093     current_map.t = pos = (engine_map_square**)malloc_throw(size);
00094     memset(pos, 0, size);
00095     alloc_pos = (engine_map_square*)(pos + height);
00096     
00097     for(ii=0; ii<height; ii++)
00098     {
00099         *pos = alloc_pos;
00100         pos++;
00101         alloc_pos += width;
00102     }
00103     
00104     current_map.width = width;
00105     current_map.height = height;
00106 }
00107 //}}}

Generated on Thu Apr 22 14:06:32 2004 for SKye by doxygen 1.3.6