version 1.6 | | version 1.7 |
---|
| | |
* Functions to save/restore game state. | | * Functions to save/restore game state. |
* | | * |
* $Log$ | | * $Log$ |
| | * Revision 1.7 2002/03/27 00:30:35 donut |
| | * show savegame thumbnail in save mode too (and refactor savegame chooser code) (patch from Steven Mueller) |
| | * |
* Revision 1.6 2002/03/26 05:33:14 donut | | * Revision 1.6 2002/03/26 05:33:14 donut |
* fix savegame thumbnail saving in OGL | | * fix savegame thumbnail saving in OGL |
* | | * |
| | |
// if ( sc_last_item != citem ) { | | // if ( sc_last_item != citem ) { |
// sc_last_item = citem; | | // sc_last_item = citem; |
if ( citem > 0 ) { | | if ( citem > 0 ) { |
| | int w=SWIDTH * THUMBNAIL_W / 320; |
| | int h=SHEIGHT * THUMBNAIL_H / 200; |
if ( sc_bmp[citem-1] ) { | | if ( sc_bmp[citem-1] ) { |
// gr_set_current_canvas( NULL ); | | // gr_set_current_canvas( NULL ); |
if (SWIDTH>320 || SHEIGHT>200){ | | if (SWIDTH>320 || SHEIGHT>200){ |
grs_canvas *tmp,*old; | | grs_canvas *tmp,*old; |
int w; | | |
old=grd_curcanv; | | old=grd_curcanv; |
w=SWIDTH/(320.0/THUMBNAIL_W); | | |
tmp=gr_create_sub_canvas(grd_curcanv, (grd_curcanv->cv_bitmap.bm_w-w)/2, | | tmp=gr_create_sub_canvas(grd_curcanv, (grd_curcanv->cv_bitmap.bm_w-w)/2, |
items[0].y-5, w, SHEIGHT/(200.0/sc_bmp[citem-1]->bm_h)); | | items[0].y-5, w, h); |
gr_set_current_canvas(tmp); | | gr_set_current_canvas(tmp); |
show_fullscr( sc_bmp[citem-1] ); | | show_fullscr( sc_bmp[citem-1] ); |
// gr_set_current_canvas(NULL); | | // gr_set_current_canvas(NULL); |
| | |
gr_free_sub_canvas(tmp); | | gr_free_sub_canvas(tmp); |
}else | | }else |
gr_bitmap( (grd_curcanv->cv_bitmap.bm_w-THUMBNAIL_W)/2,items[0].y-5, sc_bmp[citem-1] ); | | gr_bitmap( (grd_curcanv->cv_bitmap.bm_w-THUMBNAIL_W)/2,items[0].y-5, sc_bmp[citem-1] ); |
| | } else { |
| | gr_setcolor( BM_XRGB( 0, 0, 0 ) ); |
| | gr_rect( (grd_curcanv->cv_bitmap.bm_w - w) / 2, items[0].y - 5, |
| | (grd_curcanv->cv_bitmap.bm_w + w) / 2 - 1, items[0].y - 5 + SHEIGHT/(200.0/THUMBNAIL_H) - 1); |
} | | } |
} | | } |
// } | | // } |
| | |
*string = 0; // NULL terminate | | *string = 0; // NULL terminate |
} | | } |
| | |
int state_get_save_file(char * fname, char * dsc, int multi ) | | /* Present a menu for selection of a savegame filename. |
{ | | * For saving, dsc should be a pre-allocated buffer into which the new |
FILE * fp; | | * savegame description will be stored. |
int i, choice, version; | | * For restoring, dsc should be NULL, in which case empty slots will not be |
newmenu_item m[NUM_SAVES+1]; | | * selectable and savagames descriptions will not be editable. |
char filename[NUM_SAVES][20]; | | */ |
char desc[NUM_SAVES][DESC_LENGTH+16]; | | int state_get_savegame_filename(char * fname, char * dsc, int multi, char * caption ) |
char id[5]; | | |
int valid=0; | | |
| | |
for (i=0;i<NUM_SAVES; i++ ) { | | |
sc_bmp[i] = NULL; | | |
if ( !multi ) | | |
sprintf( filename[i], "%s.sg%d", Players[Player_num].callsign, i ); | | |
else | | |
sprintf( filename[i], "%s.mg%d", Players[Player_num].callsign, i ); | | |
//added on 9/30/98 by Matt Mueller to fix savegames in linux | | |
strlwr(filename[i]); | | |
//end addition -MM | | |
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 ); | | |
// Read thumbnail | | |
//sc_bmp[i] = gr_create_bitmap(THUMBNAIL_W,THUMBNAIL_H ); | | |
//fread( sc_bmp[i]->bm_data, THUMBNAIL_W * THUMBNAIL_H, 1, fp ); | | |
valid = 1; | | |
} | | |
} | | |
fclose(fp); | | |
} | | |
if (!valid) { | | |
strcpy( desc[i], TXT_EMPTY ); | | |
//rpad_string( desc[i], DESC_LENGTH-1 ); | | |
} | | |
m[i].type = NM_TYPE_INPUT_MENU; m[i].text = desc[i]; m[i].text_len = DESC_LENGTH-1; | | |
} | | |
| | |
sc_last_item = -1; | | |
choice = newmenu_do1( NULL, "Save Game", NUM_SAVES, m, NULL, state_default_item ); | | |
| | |
for (i=0; i<NUM_SAVES; i++ ) { | | |
if ( sc_bmp[i] ) | | |
gr_free_bitmap( sc_bmp[i] ); | | |
} | | |
| | |
if (choice > -1) { | | |
strcpy( fname, filename[choice] ); | | |
strcpy( dsc, desc[choice] ); | | |
state_default_item = choice; | | |
return choice+1; | | |
} | | |
return 0; | | |
} | | |
| | |
int state_get_restore_file(char * fname, int multi ) | | |
{ | | { |
FILE * fp; | | FILE * fp; |
int i, choice, version, nsaves; | | int i, choice, version, nsaves; |
| | |
// Read description | | // Read description |
fread( desc[i], sizeof(char)*DESC_LENGTH, 1, fp ); | | fread( desc[i], sizeof(char)*DESC_LENGTH, 1, fp ); |
//rpad_string( desc[i], DESC_LENGTH-1 ); | | //rpad_string( desc[i], DESC_LENGTH-1 ); |
m[i+1].type = NM_TYPE_MENU; m[i+1].text = desc[i];; | | if (dsc == NULL) m[i+1].type = NM_TYPE_MENU; |
// Read thumbnail | | // Read thumbnail |
sc_bmp[i] = gr_create_bitmap(THUMBNAIL_W,THUMBNAIL_H ); | | sc_bmp[i] = gr_create_bitmap(THUMBNAIL_W,THUMBNAIL_H ); |
fread( sc_bmp[i]->bm_data, THUMBNAIL_W * THUMBNAIL_H, 1, fp ); | | fread( sc_bmp[i]->bm_data, THUMBNAIL_W * THUMBNAIL_H, 1, fp ); |
| | |
if (!valid) { | | if (!valid) { |
strcpy( desc[i], TXT_EMPTY ); | | strcpy( desc[i], TXT_EMPTY ); |
//rpad_string( desc[i], DESC_LENGTH-1 ); | | //rpad_string( desc[i], DESC_LENGTH-1 ); |
m[i+1].type = NM_TYPE_TEXT; m[i+1].text = desc[i]; | | if (dsc == NULL) m[i+1].type = NM_TYPE_TEXT; |
| | } |
| | if (dsc != NULL) { |
| | m[i+1].type = NM_TYPE_INPUT_MENU; |
} | | } |
| | m[i+1].text_len = DESC_LENGTH-1; |
| | m[i+1].text = desc[i]; |
} | | } |
| | |
if ( nsaves < 1 ) { | | if ( dsc == NULL && nsaves < 1 ) { |
nm_messagebox( NULL, 1, "Ok", "No saved games were found!" ); | | nm_messagebox( NULL, 1, "Ok", "No saved games were found!" ); |
return 0; | | return 0; |
} | | } |
| | |
sc_last_item = -1; | | 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 ); | | choice = newmenu_do3( NULL, caption, NUM_SAVES+1, m, state_callback, state_default_item+1, NULL, -1, -1 ); |
| | |
for (i=0; i<NUM_SAVES; i++ ) { | | for (i=0; i<NUM_SAVES; i++ ) { |
if ( sc_bmp[i] ) | | if ( sc_bmp[i] ) |
| | |
| | |
if (choice > 0) { | | if (choice > 0) { |
strcpy( fname, filename[choice-1] ); | | strcpy( fname, filename[choice-1] ); |
| | if ( dsc != NULL ) strcpy( dsc, desc[choice-1] ); |
state_default_item = choice - 1; | | state_default_item = choice - 1; |
return choice; | | return choice; |
} | | } |
return 0; | | return 0; |
| | } |
| | |
| | int state_get_save_file(char * fname, char * dsc, int multi ) |
| | { |
| | return state_get_savegame_filename(fname, dsc, multi, "Save Game"); |
| | } |
| | |
| | int state_get_restore_file(char * fname, int multi ) |
| | { |
| | return state_get_savegame_filename(fname, NULL, multi, "Select Game to Restore"); |
} | | } |
| | |
int state_save_old_game(int slotnum, char * sg_name, player * sg_player, | | int state_save_old_game(int slotnum, char * sg_name, player * sg_player, |