00001 #include "editor.h"
00002
00003 #define SET_NAME_MAXLEN 64
00004
00005 static char current_filename[64]="";
00006 static char current_set_name[SET_NAME_MAXLEN]="Unnamed";
00007
00008
00009 void file_new(void)
00010 {
00011 set_current_map(0);
00012 set_num_maps(1);
00013 default_map();
00014 }
00015
00016
00017 void file_open(void)
00018 {
00019 char filename[64];
00020 dialog_read_string("Import what library?", filename, 30, 25, 100, 40);
00021 if(!load_kyelib(filename))
00022 {
00023 draw_current_map();
00024 show_dialog("File not found.", 25, 25, 70, 30);
00025 }
00026 strcpy(current_filename, filename);
00027 }
00028
00029
00030 void file_save(void)
00031 {
00032 if(current_filename[0] == '\0')
00033 file_save_as();
00034 if(!save_skyelib_r2(current_filename))
00035 {
00036 draw_current_map();
00037 show_dialog("Error opening file.", 25, 25, 70, 30);
00038 }
00039 }
00040
00041
00042 void file_save_as(void)
00043 {
00044 static char filename[64];
00045 unsigned short scratch;
00046 dialog_read_string("Save to what file?", filename, 30, 25, 100, 40);
00047
00048 if(strlen(filename)<=0 ||
00049 ValidateSymName(filename)==FALSE ||
00050 CheckSysFunc(filename, &scratch))
00051 {
00052 draw_current_map();
00053 show_dialog("Invalid name!", 25, 25, 75, 20);
00054 return;
00055 }
00056
00057 if(!save_skyelib_r2(filename))
00058 {
00059 draw_current_map();
00060 show_dialog("Error opening file.", 25, 25, 75, 20);
00061 }
00062 strcpy(current_filename, filename);
00063 }
00064
00065
00066 void file_exit(void)
00067 {
00068 exit(0);
00069 }
00070
00071
00072
00073 int load_kyelib(const char *filename)
00074 {
00075 FILE *fin;
00076 int ret;
00077 file_header header;
00078
00079 fin = fopen(filename, "rb");
00080 if(!fin) return 0;
00081
00082 if(fread(&header, sizeof(file_header), 1, fin) < 1) {
00083 fclose(fin);
00084 return 0;
00085 }
00086 if( strncmp(header.magic_bytes, "SKye", 4) ) {
00087 fseek(fin, 0, SEEK_SET);
00088 ret = load_dckye_lib(fin);
00089 } else {
00090 ret = load_skye_lib(fin, &header);
00091 }
00092 fclose(fin);
00093 return ret;
00094 }
00095
00096
00097
00098 int load_dckye_lib(FILE *fin)
00099 {
00100 int ii=0;
00101
00102 set_num_maps(1);
00103 set_current_map(0);
00104
00105 do {
00106 if(load_dckye_level(fin, ii++))
00107 set_num_maps(num_maps + 1);
00108 else
00109 break;
00110 } while(1);
00111
00112 set_num_maps(num_maps-1);
00113 return 1;
00114 }
00115
00116
00117 int load_skye_lib(FILE *fin, file_header *header)
00118 {
00119 switch(header->revision) {
00120 case 1:
00121 return load_skye_lib_r1(fin, header);
00122 case 2:
00123 return load_skye_lib_r2(fin, header);
00124 default:
00125 return 0;
00126 }
00127 }
00128
00129
00130 int load_skye_lib_r1(FILE *fin, file_header *header)
00131 {
00132 int ii;
00133
00134 set_num_maps(header->num_levels);
00135 set_current_map(0);
00136
00137 for(ii=0; ii<header->num_levels; ii++)
00138 {
00139 if( load_skye_level_r1(fin, ii)==0 )
00140 {
00141
00142 set_num_maps(max(ii,1));
00143 return 0;
00144 }
00145 }
00146 return 1;
00147 }
00148
00149
00150 int load_skye_level_r1(FILE *fin, int level)
00151 {
00152 int ret;
00153 int xi, yi;
00154 map_r1 loaded_map;
00155
00156 ret=fread(&loaded_map, sizeof(loaded_map), 1, fin);
00157 if(ret < 1)
00158 return 0;
00159
00160 set_level_size(level, 20, 11);
00161 maps[level].gamerules = RULESET_DCKYE;
00162 strcpy(maps[level].name, loaded_map.name);
00163 strcpy(maps[level].author, loaded_map.author);
00164 strcpy(maps[level].hint, "");
00165 strcpy(maps[level].congrat, "");
00166
00167 for(yi=0; yi<11; yi++)
00168 for(xi=0; xi<20; xi++)
00169 maps[level].t[yi][xi] = loaded_map.t[yi][xi];
00170
00171 return 1;
00172 }
00173
00174
00175 int load_skye_lib_r2(FILE *fin, file_header *header)
00176 {
00177 unsigned short *map_offsets;
00178 int ii;
00179
00180 map_offsets = alloca(header->num_levels * sizeof(*map_offsets));
00181 set_num_maps(header->num_levels);
00182 set_current_map(0);
00183
00184 fread(map_offsets, sizeof(*map_offsets), header->num_levels, fin);
00185 freadstr(current_set_name, SET_NAME_MAXLEN, fin);
00186
00187 for(ii=0; ii<header->num_levels; ii++)
00188 {
00189 if( fseek(fin, map_offsets[ii], SEEK_SET) != 0 )
00190 {
00191 set_num_maps(max(ii,1));
00192 return 0;
00193 }
00194 if( load_skye_level_r2(fin, ii)==0 )
00195 {
00196
00197 set_num_maps(max(ii,1));
00198 return 0;
00199 }
00200 }
00201 return 1;
00202 }
00203
00204
00205 int load_skye_level_r2(FILE *fin, int level)
00206 {
00207 int ret;
00208 int ii;
00209 map_r2 loaded_map;
00210
00211 ret=fread(&loaded_map, sizeof(loaded_map), 1, fin);
00212 if(ret < 1)
00213 return 0;
00214
00215 set_level_size(level, loaded_map.width, loaded_map.height);
00216 freadstr(maps[level].name, 64, fin);
00217 freadstr(maps[level].author, 64, fin);
00218 freadstr(maps[level].hint, 64, fin);
00219 freadstr(maps[level].congrat, 64, fin);
00220 maps[level].gamerules = loaded_map.gamerules;
00221 for(ii=0; ii<loaded_map.height; ii++) {
00222 fread( maps[level].t[ii], sizeof(map_square), loaded_map.width, fin);
00223 }
00224 return 1;
00225 }
00226
00227
00228 static const char file_extension[] = { 0, 'S', 'K', 'y', 'e', 0, 0xF8 };
00229
00230 int load_dckye_level(FILE *fin, int level)
00231 {
00232 int xi, yi;
00233 int ret;
00234 ret=fread(maps[level].t, sizeof(map_square), FIELD_WIDTH*FIELD_HEIGHT, fin);
00235 if(ret < FIELD_WIDTH*FIELD_HEIGHT)
00236 return 0;
00237
00238
00239
00240 for(yi=0; yi<FIELD_HEIGHT; yi++)
00241 for(xi=0; xi<FIELD_WIDTH; xi++)
00242 {
00243 if(maps[level].t[yi][xi] >= TILE_UNUSED)
00244 maps[level].t[yi][xi] -= 4;
00245 }
00246
00247
00248 strcpy(maps[level].name, "kyelev");
00249 strcpy(maps[level].author, "");
00250 return 1;
00251 }
00252
00253
00254
00255 int save_skyelib_r2(const char *filename)
00256 {
00257 FILE *fout;
00258 int ii;
00259 unsigned short offset;
00260 file_header header;
00261
00262 memcpy(header.magic_bytes, "SKye", 4);
00263 header.revision = 2;
00264 header.num_levels = num_maps;
00265
00266 fout = fopen(filename, "wb");
00267 if(!fout) return 0;
00268
00269 fwrite(&header, sizeof(file_header), 1, fout);
00270 for(ii=0; ii<num_maps*sizeof(unsigned short); ii++)
00271 fputc(0, fout);
00272
00273 fwritestr(current_set_name, fout);
00274
00275 for(ii=0; ii<num_maps; ii++)
00276 {
00277
00278 offset = ftell(fout);
00279 fseek(fout, sizeof(file_header)+ii*sizeof(unsigned short), SEEK_SET);
00280 fwrite(&offset, sizeof(offset), 1, fout);
00281 fseek(fout, offset, SEEK_SET);
00282 write_skye_level_r2(fout, ii);
00283 }
00284
00285 fseek(fout, 0, SEEK_END);
00286 fwrite(file_extension, 7, 1, fout);
00287 fclose(fout);
00288 return 1;
00289 }
00290
00291
00292 void write_skye_level_r2(FILE *fout, int level)
00293 {
00294 int ii;
00295 map_r2 out;
00296 out.width = maps[level].width;
00297 out.height = maps[level].height;
00298 out.gamerules = maps[level].gamerules;
00299 memset(out.unused, 0, 5*sizeof(short));
00300
00301 fwrite(&out, sizeof(out), 1, fout);
00302 fwritestr(maps[level].name, fout);
00303 fwritestr(maps[level].author, fout);
00304 fwritestr(maps[level].hint, fout);
00305 fwritestr(maps[level].congrat, fout);
00306
00307 for(ii=0; ii<out.height; ii++)
00308 fwrite(maps[level].t[ii], sizeof(map_square), out.width, fout);
00309 }
00310
00311