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; }
/** * Reveals the whole map for specific player. */ void reveal_whole_map(struct PlayerInfo *player) { clear_dig_for_map_rect(player->id_number,0,map_tiles_x,0,map_tiles_y); reveal_map_rect(player->id_number,1,map_subtiles_x,1,map_subtiles_y); pannel_map_update(0, 0, map_subtiles_x+1, map_subtiles_y+1); }
void make_safe(struct PlayerInfo *player) { //_DK_make_safe(player); unsigned char *areamap; areamap = (unsigned char *)scratch; MapSlabCoord slb_x, slb_y; // Prepare the array to remember which slabs were already taken care of for (slb_y=0; slb_y < map_tiles_y; slb_y++) { for (slb_x=0; slb_x < map_tiles_x; slb_x++) { SlabCodedCoords slb_num; struct SlabMap *slb; slb_num = get_slab_number(slb_x, slb_y); slb = get_slabmap_direct(slb_num); struct SlabAttr *slbattr; slbattr = get_slab_attrs(slb); if ((slbattr->block_flags & (SlbAtFlg_Filled|SlbAtFlg_Digable|SlbAtFlg_Valuable)) != 0) areamap[slb_num] = 0x01; else areamap[slb_num] = 0x00; } } { const struct Coord3d *center_pos; center_pos = dungeon_get_essential_pos(player->id_number); slb_x = subtile_slab_fast(center_pos->x.stl.num); slb_y = subtile_slab_fast(center_pos->y.stl.num); SlabCodedCoords slb_num; slb_num = get_slab_number(slb_x, slb_y); areamap[slb_num] |= 0x02; } unsigned int list_cur, list_len; PlayerNumber plyr_idx; plyr_idx = player->id_number; SlabCodedCoords *slblist; slblist = (SlabCodedCoords *)(scratch + map_tiles_x*map_tiles_y); list_len = 0; list_cur = 0; while (list_cur <= list_len) { SlabCodedCoords slb_num; if (slb_x > 0) { slb_num = get_slab_number(slb_x-1, slb_y); if ((areamap[slb_num] & 0x01) != 0) { areamap[slb_num] |= 0x02; struct SlabMap *slb; slb = get_slabmap_direct(slb_num); struct SlabAttr *slbattr; slbattr = get_slab_attrs(slb); if ((slbattr->category == SlbAtCtg_FriableDirt) && slab_by_players_land(plyr_idx, slb_x-1, slb_y)) { unsigned char pretty_type; pretty_type = choose_pretty_type(plyr_idx, slb_x-1, slb_y); place_slab_type_on_map(pretty_type, slab_subtile(slb_x-1,0), slab_subtile(slb_y,0), plyr_idx, 1); do_slab_efficiency_alteration(slb_x-1, slb_y); fill_in_reinforced_corners(plyr_idx, slb_x-1, slb_y); } } else if ((areamap[slb_num] & 0x02) == 0) { areamap[slb_num] |= 0x02; slblist[list_len] = slb_num; list_len++; } } if (slb_x < map_tiles_x-1) { slb_num = get_slab_number(slb_x+1, slb_y); if ((areamap[slb_num] & 0x01) != 0) { areamap[slb_num] |= 0x02; struct SlabMap *slb; slb = get_slabmap_direct(slb_num); struct SlabAttr *slbattr; slbattr = get_slab_attrs(slb); if ((slbattr->category == SlbAtCtg_FriableDirt) && slab_by_players_land(plyr_idx, slb_x+1, slb_y)) { unsigned char pretty_type; pretty_type = choose_pretty_type(plyr_idx, slb_x+1, slb_y); place_slab_type_on_map(pretty_type, slab_subtile(slb_x+1,0), slab_subtile(slb_y,0), plyr_idx, 1u); do_slab_efficiency_alteration(slb_x+1, slb_y); fill_in_reinforced_corners(plyr_idx, slb_x+1, slb_y); } } else if ((areamap[slb_num] & 0x02) == 0) { areamap[slb_num] |= 0x02; slblist[list_len] = slb_num; list_len++; } } if (slb_y > 0) { slb_num = get_slab_number(slb_x, slb_y-1); if ((areamap[slb_num] & 0x01) != 0) { areamap[slb_num] |= 0x02; struct SlabMap *slb; slb = get_slabmap_direct(slb_num); struct SlabAttr *slbattr; slbattr = get_slab_attrs(slb); if ((slbattr->category == SlbAtCtg_FriableDirt) && slab_by_players_land(plyr_idx, slb_x, slb_y-1)) { unsigned char pretty_type; pretty_type = choose_pretty_type(plyr_idx, slb_x, slb_y-1); place_slab_type_on_map(pretty_type, slab_subtile(slb_x,0), slab_subtile(slb_y-1,0), plyr_idx, 1u); do_slab_efficiency_alteration(slb_x, slb_y-1); fill_in_reinforced_corners(plyr_idx, slb_x, slb_y-1); } } else if ((areamap[slb_num] & 0x02) == 0) { areamap[slb_num] |= 0x02; slblist[list_len] = slb_num; list_len++; } } if (slb_y < map_tiles_y-1) { slb_num = get_slab_number(slb_x, slb_y+1); if ((areamap[slb_num] & 0x01) != 0) { areamap[slb_num] |= 0x02; struct SlabMap *slb; slb = get_slabmap_direct(slb_num); struct SlabAttr *slbattr; slbattr = get_slab_attrs(slb); if ((slbattr->category == SlbAtCtg_FriableDirt) && slab_by_players_land(plyr_idx, slb_x, slb_y+1)) { unsigned char pretty_type; pretty_type = choose_pretty_type(plyr_idx, slb_x, slb_y+1); place_slab_type_on_map(pretty_type, slab_subtile(slb_x,0), slab_subtile(slb_y+1,0), plyr_idx, 1u); do_slab_efficiency_alteration(slb_x, slb_y+1); fill_in_reinforced_corners(plyr_idx, slb_x, slb_y+1); } } else if ((areamap[slb_num] & 0x02) == 0) { areamap[slb_num] |= 0x02; slblist[list_len] = slb_num; list_len++; } } slb_x = slb_num_decode_x(slblist[list_cur]); slb_y = slb_num_decode_y(slblist[list_cur]); list_cur++; } pannel_map_update(0, 0, map_subtiles_x+1, map_subtiles_y+1); }