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

editor/file.c

Go to the documentation of this file.
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: // Unsupported version!
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             // Error condition! (File too short)
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 ) // Seek failed!
00190         {
00191             set_num_maps(max(ii,1));
00192             return 0;
00193         }
00194         if( load_skye_level_r2(fin, ii)==0 )
00195         {
00196             // Error condition! (Probably, file too short)
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     // Convert from kyelev format to internal format (collapse the 4-element
00239     // gap)
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     // Fields not provided by kyelev format
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 //  fseek(fout, num_maps*sizeof(unsigned short), SEEK_CUR);
00273     fwritestr(current_set_name, fout);
00274     
00275     for(ii=0; ii<num_maps; ii++)
00276     {
00277         // Write offset into table
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 

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