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
00020
00021 goto error_return;
00022 }
00023
00024 if(header.revision != 2) {
00025
00026
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
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
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