int state_get_restore_file(char * fname, int multi) { PHYSFS_file *fp; int i, choice, version, nsaves; newmenu_item m[NUM_SAVES+2]; char filename[NUM_SAVES+1][30]; char desc[NUM_SAVES+1][DESC_LENGTH + 16]; char id[5]; int valid; nsaves=0; m[0].type = NM_TYPE_TEXT; m[0].text = "\n\n\n\n"; for (i=0;i<NUM_SAVES+1; i++ ) { sc_bmp[i] = NULL; if (!multi) sprintf( filename[i], PLAYER_DIR "%s.sg%x", Players[Player_num].callsign, i ); else sprintf( filename[i], PLAYER_DIR "%s.mg%x", Players[Player_num].callsign, i ); valid = 0; fp = PHYSFSX_openReadBuffered(filename[i]); if ( fp ) { //Read id //FIXME: check for swapped file, react accordingly... PHYSFS_read(fp, id, sizeof(char) * 4, 1); if ( !memcmp( id, dgss_id, 4 )) { //Read version PHYSFS_read(fp, &version, sizeof(int), 1); if (version >= STATE_COMPATIBLE_VERSION) { // Read description PHYSFS_read(fp, desc[i], sizeof(char) * DESC_LENGTH, 1); //rpad_string( desc[i], DESC_LENGTH-1 ); m[i+1].type = NM_TYPE_MENU; m[i+1].text = desc[i]; // Read thumbnail sc_bmp[i] = gr_create_bitmap(THUMBNAIL_W,THUMBNAIL_H ); PHYSFS_read(fp, sc_bmp[i]->bm_data, THUMBNAIL_W * THUMBNAIL_H, 1); if (version >= 9) { ubyte pal[256*3]; PHYSFS_read(fp, pal, 3, 256); gr_remap_bitmap_good( sc_bmp[i], pal, -1, -1 ); } nsaves++; valid = 1; } } PHYSFS_close(fp); } if (!valid) { strcpy( desc[i], TXT_EMPTY ); //rpad_string( desc[i], DESC_LENGTH-1 ); m[i+1].type = NM_TYPE_TEXT; m[i+1].text = desc[i]; } } if ( nsaves < 1 ) { nm_messagebox( NULL, 1, "Ok", "No saved games were found!" ); return 0; } if (Current_display_mode == SM(640,400)) //restore menu won't fit on 640x400 VR_screen_flags ^= VRF_COMPATIBLE_MENUS; sc_last_item = -1; #ifdef NEWMENU_MOUSE Hack_DblClick_MenuMode = 1; #endif RestoringMenu=1; choice = newmenu_do3( NULL, "Select Game to Restore", NUM_SAVES+2, m, state_callback, state_default_item+1, NULL, 190, -1 ); RestoringMenu=0; #ifdef NEWMENU_MOUSE Hack_DblClick_MenuMode = 0; #endif if (Current_display_mode == SM(640,400)) //set flag back VR_screen_flags ^= VRF_COMPATIBLE_MENUS; for (i=0; i<NUM_SAVES+1; i++ ) { if ( sc_bmp[i] ) gr_free_bitmap( sc_bmp[i] ); } if (choice > 0) { strcpy( fname, filename[choice-1] ); if (choice != NUM_SAVES+1) //no new default when restore from autosave state_default_item = choice - 1; return choice; } return 0; }
int state_get_restore_file(char * fname, int multi ) { FILE * fp; int i, choice, version, nsaves; newmenu_item m[NUM_SAVES+1]; char filename[NUM_SAVES][FILENAME_MAX]; char desc[NUM_SAVES][DESC_LENGTH + 16]; char id[5]; int valid; nsaves=0; m[0].type = NM_TYPE_TEXT; m[0].text = "\n\n\n\n"; for (i=0;i<NUM_SAVES; i++ ) { sc_bmp[i] = NULL; if ( !multi ) sprintf( filename[i], "%s/%s.sg%d", Document_path, Players[Player_num].callsign, i ); else sprintf( filename[i], "%s/%s.mg%d", Document_path, Players[Player_num].callsign, i ); valid = 0; fp = fopen( filename[i], "rb" ); if ( fp ) { //Read id fread( id, sizeof(char)*4, 1, fp ); if ( !memcmp( id, dgss_id, 4 )) { //Read version fread( &version, sizeof(int), 1, fp ); if (version >= STATE_COMPATIBLE_VERSION) { // Read description fread( desc[i], sizeof(char)*DESC_LENGTH, 1, fp ); //rpad_string( desc[i], DESC_LENGTH-1 ); m[i+1].type = NM_TYPE_MENU; m[i+1].text = desc[i];; // Read thumbnail sc_bmp[i] = gr_create_bitmap(THUMBNAIL_W,THUMBNAIL_H ); fread( sc_bmp[i]->bm_data, THUMBNAIL_W * THUMBNAIL_H, 1, fp ); nsaves++; valid = 1; } } fclose(fp); } if (!valid) { strcpy( desc[i], TXT_EMPTY ); //rpad_string( desc[i], DESC_LENGTH-1 ); m[i+1].type = NM_TYPE_TEXT; m[i+1].text = desc[i]; } } if ( nsaves < 1 ) { nm_messagebox( NULL, 1, "Ok", "No saved games were found!" ); return 0; } sc_last_item = -1; choice = newmenu_do3( NULL, "Select Game to Restore", NUM_SAVES+1, m, state_callback, state_default_item+1, NULL, 190, -1 ); for (i=0; i<NUM_SAVES; i++ ) { if ( sc_bmp[i] ) gr_free_bitmap( sc_bmp[i] ); } if (choice > 0) { strcpy( fname, filename[choice-1] ); state_default_item = choice - 1; return choice; } return 0; }