TbBool load_game(long slot_num) { TbFileHandle fh; long file_len; struct PlayerInfo *player; struct Dungeon *dungeon; struct CatalogueEntry *centry; // unsigned char buf[14]; // char cmpgn_fname[CAMPAIGN_FNAME_LEN]; SYNCDBG(6,"Starting"); reset_eye_lenses(); { // Use fname only here - it is overwritten by next use of prepare_file_fmtpath() char *fname; fname = prepare_file_fmtpath(FGrp_Save,saved_game_filename,slot_num); if (!wait_for_cd_to_be_available()) return false; fh = LbFileOpen(fname,Lb_FILE_MODE_READ_ONLY); if (fh == -1) { WARNMSG("Cannot open saved game file \"%s\".",fname); save_catalogue_slot_disable(slot_num); return false; } } file_len = LbFileLengthHandle(fh); if (is_primitive_save_version(file_len)) { //if (LbFileRead(handle, buf, sizeof(buf)) != sizeof(buf)) { LbFileClose(fh); save_catalogue_slot_disable(slot_num); return false; } /*LbFileSeek(fh, (char *)&game.campaign_fname[0] - (char *)&game, Lb_FILE_SEEK_BEGINNING); LbFileRead(fh, cmpgn_fname, CAMPAIGN_FNAME_LEN); cmpgn_fname[CAMPAIGN_FNAME_LEN-1] = '\0'; if (!change_campaign(cmpgn_fname)) { ERRORLOG("Unable to load campaign associated with saved game"); } LbFileClose(fh); WARNMSG("Saved game file \"%s\" has incompatible version; restarting level.",fname); player = get_my_player(); player->field_7 = 0; my_player_number = default_loc_player; player = get_my_player(); game.flagfield_14EA4A = 2; set_flag_byte(&game.system_flags,GSF_NetworkActive,false); player->field_2C = 1; set_selected_level_number(((struct Game *)buf)->load_restart_level); set_continue_level_number(((struct Game *)buf)->continue_level_number); startup_network_game(); return true;*/ } centry = &save_game_catalogue[slot_num]; LbFileSeek(fh, 0, Lb_FILE_SEEK_BEGINNING); // Here is the actual loading if (load_game_chunks(fh,centry) != GLoad_SavedGame) { LbFileClose(fh); WARNMSG("Couldn't correctly load saved game in slot %d.",(int)slot_num); init_lookups(); return false; } LbFileClose(fh); LbStringCopy(game.campaign_fname,campaign.fname,sizeof(game.campaign_fname)); reinit_level_after_load(); output_message(SMsg_GameLoaded, 0, true); pannel_map_update(0, 0, map_subtiles_x+1, map_subtiles_y+1); calculate_moon_phase(false,false); update_extra_levels_visibility(); player = get_my_player(); set_flag_byte(&player->field_3,0x08,false); set_flag_byte(&player->field_3,0x04,false); player->field_4C1 = 0; player->field_4C5 = 0; player->field_7 = 0; PaletteSetPlayerPalette(player, engine_palette); reinitialise_eye_lens(game.numfield_1B); // Update the lights system state light_import_system_state(&gameadd.lightst); // Victory state if (player->victory_state != VicS_Undecided) { frontstats_initialise(); dungeon = get_players_dungeon(player); dungeon->lvstats.player_score = 0; dungeon->lvstats.allow_save_score = 1; } game.loaded_swipe_idx = -1; return true; }
TbBool setup_screen_mode(unsigned short nmode) { TbScreenModeInfo *mdinfo; unsigned int flg_mem; long lens_mem; short was_minimal_res; SYNCDBG(4,"Setting up mode %d",(int)nmode); if (!force_video_mode_reset) { if ((nmode == lbDisplay.ScreenMode) && (!MinimalResolutionSetup)) { SYNCDBG(6,"Mode %d already active, no changes.",(int)nmode); return true; } } lens_mem = game.numfield_1B; flg_mem = lbDisplay.DrawFlags; was_minimal_res = (MinimalResolutionSetup || force_video_mode_reset); set_pointer_graphic_none(); if (LbGraphicsScreenHeight() < 200) { WARNLOG("Unhandled previous Screen Mode %d, Reset skipped",(int)lbDisplay.ScreenMode); } else if (LbGraphicsScreenHeight() < 400) { if (MinimalResolutionSetup) { if (lbDisplay.ScreenMode != nmode) LbScreenReset(); LbDataFreeAll(mcga_load_files_minimal); ERRORLOG("MCGA Minimal not allowed (Reset)"); MinimalResolutionSetup = 0; } else { reset_eye_lenses(); reset_heap_manager(); reset_heap_memory(); set_pointer_graphic_none(); unload_pointer_file(0); if (lbDisplay.ScreenMode != nmode) LbScreenReset(); LbDataFreeAll(mcga_load_files); } } else // so (LbGraphicsScreenHeight() >= 400) { if (MinimalResolutionSetup) { if ((lbDisplay.ScreenMode != nmode) || (MinimalResolutionSetup)) LbScreenReset(); LbDataFreeAll(vres256_load_files_minimal); MinimalResolutionSetup = 0; } else { reset_eye_lenses(); reset_heap_manager(); reset_heap_memory(); set_pointer_graphic_none(); unload_pointer_file(1); if ((lbDisplay.ScreenMode != nmode) || (MinimalResolutionSetup)) LbScreenReset(); LbDataFreeAll(vres256_load_files); } } mdinfo = LbScreenGetModeInfo(nmode); if (mdinfo->Height < 200) { ERRORLOG("Unhandled Screen Mode %d, setup failed",(int)nmode); force_video_mode_reset = true; return false; } else if (mdinfo->Height < 400) { SYNCDBG(6,"Entering low-res mode %d, resolution %dx%d.",(int)nmode,(int)mdinfo->Width,(int)mdinfo->Height); if (!LoadMcgaData()) { ERRORLOG("Loading Mcga files failed"); force_video_mode_reset = true; return false; } if ((lbDisplay.ScreenMode != nmode) || (was_minimal_res)) { if (LbScreenSetup((TbScreenMode)nmode, mdinfo->Width, mdinfo->Height, engine_palette, 2, 0) != 1) { ERRORLOG("Unable to setup screen resolution %s (mode %d)", mdinfo->Desc,(int)nmode); force_video_mode_reset = true; return false; } } load_pointer_file(0); } else // so (mdinfo->Height >= 400) { SYNCDBG(6,"Entering hi-res mode %d, resolution %dx%d.",(int)nmode,(int)mdinfo->Width,(int)mdinfo->Height); if (!LoadVRes256Data((long)mdinfo->Width*(long)mdinfo->Height)) { ERRORLOG("Unable to load VRes256 data files"); force_video_mode_reset = true; return false; } if ((lbDisplay.ScreenMode != nmode) || (was_minimal_res)) { if (LbScreenSetup((TbScreenMode)nmode, mdinfo->Width, mdinfo->Height, engine_palette, 1, 0) != 1) { ERRORLOG("Unable to setup screen resolution %s (mode %d)", mdinfo->Desc,(int)nmode); force_video_mode_reset = true; return false; } } load_pointer_file(1); } LbScreenClear(0); LbScreenSwap(); update_screen_mode_data(mdinfo->Width, mdinfo->Height); if (parchment_loaded) reload_parchment_file(mdinfo->Width >= 640); reinitialise_eye_lens(lens_mem); LbMouseSetPosition((MyScreenWidth/pixel_size) >> 1, (MyScreenHeight/pixel_size) >> 1); lbDisplay.DrawFlags = flg_mem; if (!setup_heap_memory()) { force_video_mode_reset = true; return false; } setup_heap_manager(); game.numfield_C &= ~0x0004; force_video_mode_reset = false; SYNCDBG(8,"Finished"); return true; }