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

engine/load.c

Go to the documentation of this file.
00001 #include "engine.h"
00002 
00003 #define SET_MENU_LEFT  98
00004 #define SET_MENU_WIDTH 60
00005 
00006 //{{{
00007 int pick_set(void)
00008 {
00009     SYM_ENTRY *SymPtr;
00010     int num_files = 0;
00011     int num_files_alloced = 8;
00012     int retval = 1;
00013     char temp_filename[32]; // Temporary storage for filenames whilst malloc
00014                             // is unsafe
00015     int top, height, ii, selection, input;
00016     char **ftab = (char**)malloc_throw(num_files_alloced * sizeof(char**));
00017     static int is_first_time = 1;
00018     
00019     FolderOp(SYMSTR("\x7F") , FOP_LOCK);
00020     
00021     // Build list of SKye files
00022 //  SymPtr = FFindFirst(FO_RECURSE, "SKye", NULL);
00023     SymPtr = SymFindFirst(SYMSTR(""), FO_RECURSE);
00024     
00025     while(SymPtr)
00026     {
00027         strcpy(temp_filename, SymFindFolderName());
00028         strcat(temp_filename, "\\");
00029         strcat(temp_filename, SymPtr->name);
00030         if(match_extension(temp_filename, "SKye"))
00031         {
00032             if(num_files+1 >= num_files_alloced) {
00033                 num_files_alloced += 8;
00034                 ftab = (char**)realloc_throw(ftab,
00035                                           num_files_alloced * sizeof(char**));
00036             }
00037             ftab[num_files] = (char*)alloca( strlen(temp_filename)+1 );
00038             strcpy(ftab[num_files], temp_filename);
00039             num_files++;
00040         }
00041 //      SymPtr = FFindNext();
00042         SymPtr = SymFindNext();
00043     }
00044     
00045     FolderOp(SYMSTR("\x7F") , FOP_UNLOCK);
00046     
00047     clear_screen();
00048     
00049     if(num_files==0) {
00050         draw_string("No levels found!", 20, 40, F_6x8);
00051         read_char();
00052         retval = 0;
00053         goto ret;
00054     }
00055     if(num_files==1) {
00056         strcpy(active_set, ftab[0]);
00057         retval = is_first_time; // If there's one level set, this menu
00058                                 // shouldn't be revisited
00059         goto ret;
00060     }
00061     
00062     // Show splash info left of menu
00063     draw_string("SKye", 25, 15, F_8x10);
00064     draw_string(VERSION_STRING, 32, 26, F_4x6);
00065     draw_string("By Jim Babcock", 13, 35, F_4x6);
00066     draw_string("Based on Kye by Dillon", 5, 47, F_4x6);
00067     draw_string("Collins and on Kye by", 5, 54, F_4x6);
00068     draw_string("Colin Garbutt.", 5, 61, F_4x6);
00069     
00070     
00071     // Show menu
00072     height = num_files*6 + 2;
00073     top = 50-(height/2);
00074     draw_rect(SET_MENU_LEFT, top, SET_MENU_WIDTH, height);
00075     for(ii=0; ii<num_files; ii++)
00076         draw_string(ftab[ii], SET_MENU_LEFT+2, top + 1 + ii*6, F_4x6);
00077     selection = 0;
00078     
00079     xor_rect(SET_MENU_LEFT+1, top+1+selection*6,
00080              SET_MENU_WIDTH-2, 6);
00081     do
00082     {
00083         input = read_char();
00084         xor_rect(SET_MENU_LEFT+1, top+1+selection*6,
00085                  SET_MENU_WIDTH-2, 6);
00086         
00087         if       (input == KEY_DOWN) {
00088             selection++;
00089             selection %= num_files;
00090         } else if(input == KEY_UP) {
00091             if(selection==0) selection = num_files-1;
00092             else selection--;
00093         } else if(input == KEY_ENTER) {
00094             strcpy(active_set, ftab[selection]);
00095             goto ret;
00096         } else if(input == KEY_ESC) {
00097             strcpy(active_set, ftab[selection]);
00098             retval = 0;
00099             goto ret;
00100         }
00101         
00102         xor_rect(SET_MENU_LEFT+1, top+1+selection*6,
00103                  SET_MENU_WIDTH-2, 6);
00104     } while(1);
00105     
00106 ret:
00107     if(ftab) free(ftab);
00108     is_first_time = 0;
00109     return retval;
00110 }
00111 //}}}
00112 
00113 //{{{
00114 int match_extension(const char *filename, const char *typename)
00115 {
00116     FILE *fin = fopen(filename, "rb");
00117     unsigned char ftype;
00118     int len;
00119     char type[8];
00120     int ret = 0;
00121     
00122     if(!fin) return 0;
00123     
00124     len = strlen(typename);
00125     if(len>=8) len = 7;
00126     
00127     fseek(fin, -1, SEEK_END);
00128     ftype = fgetc(fin);
00129     
00130     if(ftype == OTH_TAG) {
00131         fseek(fin, -(strlen(typename)+2), SEEK_CUR);
00132         fread(type, strlen(typename)+1, 1, fin);
00133         if(!strcmp(type, typename))
00134             ret = 1;
00135     }
00136     
00137     fclose(fin);
00138     return ret;
00139 }
00140 //}}}

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