int get_save_spot() { int i = MAX_SAVE_GAMES, last_free = 0; for (; i > 0;) { char name[20]; sprintf(name, "%ssave%04d.spe", get_save_filename_prefix(), i); FILE *fp = open_FILE(name, "rb"); if (fp) i = 0; else { last_free = i; i--; } fclose(fp); } if (last_free) return last_free; // if there are any slots not created yet... int w = cache.img(save_buts[0])->Size().x; int mx = last_demo_mx - w / 2; if (mx + w + 10 > xres) mx = xres - w - 10; if (mx < 0) mx = 0; Jwindow *l_win = create_num_window(mx, MAX_SAVE_GAMES, MAX_SAVE_LINES, NULL); event ev; int got_level = 0; int quit = 0; do { wm->flush_screen(); wm->get_event(ev); if (ev.type == EV_MESSAGE && ev.message.id >= ID_LOAD_GAME_NUMBER && ev.message.id < ID_LOAD_GAME_PREVIEW) got_level = ev.message.id - ID_LOAD_GAME_NUMBER + 1; if (ev.type == EV_CLOSE_WINDOW && ev.window == l_win) quit = 1; } while (!got_level && !quit); wm->close_window(l_win); the_game->reset_keymap(); return got_level; }
int load_game(int show_all, char *title) // return 0 if the player escapes, else return the number of the game to load { int *save_buts=xres>320 ? big_save_buts : small_save_buts; int total_saved=0; int no_more=0; image *thumb_nails[MAX_SAVE_GAMES]; int start_num=0; int max_w=160,max_h=100; memset(thumb_nails,0,sizeof(thumb_nails)); image *first=NULL; for (start_num=0;start_num<MAX_SAVE_GAMES;start_num++) { char name[50]; sprintf(name,"save%04d.spe",start_num+1); int fail=0; bFILE *fp=open_file(name,"rb"); if (fp->open_failure()) fail=1; else { spec_directory sd(fp); spec_entry *se=sd.find("thumb nail"); if (se && se->type==SPEC_IMAGE) { thumb_nails[start_num]=new image(se,fp); if (thumb_nails[start_num]->width()>max_w) max_w=thumb_nails[start_num]->width(); if (thumb_nails[start_num]->height()>max_h) max_h=thumb_nails[start_num]->height(); if (!first) first=thumb_nails[start_num]; total_saved++; } else fail=1; } if (fail && show_all) { thumb_nails[start_num]=new image(160,100); thumb_nails[start_num]->clear(); console_font->put_string(thumb_nails[start_num],0,0,symbol_str("no_saved")); total_saved++; if (!first) first=thumb_nails[start_num]; } delete fp; } if (!total_saved) return 0; if (total_saved>MAX_SAVE_GAMES) total_saved=MAX_SAVE_GAMES; int i,ih=cash.img(save_buts[0])->height(); /* ico_button *buts[MAX_SAVE_GAMES]; int y=WINDOW_FRAME_TOP; for (i=0;i<total_saved;i++,y+=ih) { buts[i]=new ico_button(WINDOW_FRAME_LEFT,y,ID_LOAD_GAME_NUMBER+i, save_buts[i*3+1],save_buts[i*3+1],save_buts[i*3+0],save_buts[i*3+2],NULL); buts[i]->set_act_id(ID_LOAD_GAME_PREVIEW+i); } for (i=0;i<total_saved-1;i++) buts[i]->next=buts[i+1]; */ jwindow *l_win=create_num_window(0,total_saved,thumb_nails); int py=xres>320 ? l_win->y+l_win->h/2-135/2 : l_win->y; jwindow *preview=eh->new_window(l_win->x+l_win->l+5,py,max_w,max_h,NULL,title); first->put_image(preview->screen,preview->x1(),preview->y1()); event ev; int got_level=0; int quit=0; do { eh->flush_screen(); eh->get_event(ev); if (ev.type==EV_MESSAGE && ev.message.id>=ID_LOAD_GAME_NUMBER && ev.message.id<ID_LOAD_GAME_PREVIEW) got_level=ev.message.id-ID_LOAD_GAME_NUMBER+1; if (ev.type==EV_MESSAGE && ev.message.id>=ID_LOAD_GAME_PREVIEW && ev.message.id<ID_LOAD_PLAYER_GAME) { int draw_num=ev.message.id-ID_LOAD_GAME_PREVIEW; preview->clear(); thumb_nails[draw_num]->put_image(preview->screen,preview->x1(),preview->y1()); } if ((ev.type==EV_CLOSE_WINDOW) || (ev.type==EV_KEY && ev.key==JK_ESC)) quit=1; } while (!got_level && !quit); eh->close_window(l_win); eh->close_window(preview); for (i=0;i<total_saved;i++) if (thumb_nails[i]) delete thumb_nails[i]; return got_level; }
int load_game(int show_all, char const *title) // return 0 if the player escapes, else return the number of the game to load { int total_saved = 0; image *thumb_nails[MAX_SAVE_GAMES]; int start_num = 0; int max_w = 160, max_h = 100; memset(thumb_nails, 0, sizeof(thumb_nails)); image *first = NULL; for (start_num = 0; start_num < MAX_SAVE_GAMES; start_num++) { char name[255]; int fail = 0; sprintf(name, "%ssave%04d.spe", get_save_filename_prefix(), start_num + 1); bFILE *fp = open_file(name, "rb"); if (fp->open_failure()) { fail = 1; } else { spec_directory sd(fp); spec_entry *se = sd.find("thumb nail"); if (se && se->type == SPEC_IMAGE) { thumb_nails[start_num] = new image(fp, se); if (thumb_nails[start_num]->Size().x > max_w) max_w = thumb_nails[start_num]->Size().x; if (thumb_nails[start_num]->Size().y > max_h) max_h = thumb_nails[start_num]->Size().y; if (!first) first = thumb_nails[start_num]; total_saved++; } else fail = 1; } if (fail && show_all) { thumb_nails[start_num] = new image(vec2i(160, 100)); thumb_nails[start_num]->clear(); console_font->put_string(thumb_nails[start_num], 0, 0, symbol_str("no_saved")); total_saved++; if (!first) first = thumb_nails[start_num]; } delete fp; } if (!total_saved) return 0; if (total_saved > MAX_SAVE_GAMES) total_saved = MAX_SAVE_GAMES; int i; /* int ih=cache.img(save_buts[0])->Size().y; ico_button *buts[MAX_SAVE_GAMES]; int y=0; for (i=0; i<total_saved; i++,y+=ih) { buts[i]=new ico_button(0,y,ID_LOAD_GAME_NUMBER+i, save_buts[i*3+1],save_buts[i*3+1],save_buts[i*3+0],save_buts[i*3+2],NULL); buts[i]->set_act_id(ID_LOAD_GAME_PREVIEW+i); } for (i=0; i<total_saved-1; i++) buts[i]->next=buts[i+1]; */ Jwindow *l_win = create_num_window(0, total_saved, MAX_SAVE_LINES, thumb_nails); Jwindow *preview = wm->new_window(l_win->x + l_win->l + 5, l_win->y, max_w, max_h, NULL, title); first->put_image(preview->screen, preview->x1(), preview->y1()); event ev; int got_level = 0; int quit = 0; do { wm->flush_screen(); wm->get_event(ev); if (ev.type == EV_MESSAGE && ev.message.id >= ID_LOAD_GAME_NUMBER && ev.message.id < ID_LOAD_GAME_PREVIEW) { got_level = ev.message.id - ID_LOAD_GAME_NUMBER + 1; } else if (ev.type == EV_MESSAGE && ev.message.id >= ID_LOAD_GAME_PREVIEW && ev.message.id < ID_LOAD_PLAYER_GAME) { int draw_num = ev.message.id - ID_LOAD_GAME_PREVIEW; preview->clear(); thumb_nails[draw_num]->put_image(preview->screen, preview->x1(), preview->y1()); } else if ((ev.type == EV_CLOSE_WINDOW) || (ev.type == EV_KEY && ev.key == JK_ALT_L)) { quit = 1; } else { l_win->inm->handle_event(ev, l_win); } } while (!got_level && !quit); wm->close_window(l_win); wm->close_window(preview); for (i = 0; i < total_saved; i++) if (thumb_nails[i]) delete thumb_nails[i]; return got_level; }