short save_continue_game(LevelNumber lvnum) { char *fname; long fsize; // Update continue level number if (is_singleplayer_like_level(lvnum)) set_continue_level_number(lvnum); SYNCDBG(6,"Continue set to level %d (loaded is %d)",(int)get_continue_level_number(),(int)get_loaded_level_number()); fname = prepare_file_path(FGrp_Save,continue_game_filename); fsize = LbFileSaveAt(fname, &game, sizeof(struct Game)); return (fsize == sizeof(struct Game)); }
/** * Indicates whether continue game option is available. * @return */ TbBool continue_game_available(void) { unsigned char buf[14]; char cmpgn_fname[CAMPAIGN_FNAME_LEN]; long lvnum; long i; SYNCDBG(6,"Starting"); { if (!read_continue_game_part(buf,0,sizeof(buf))) { return false; } i = (char *)&game.campaign_fname[0] - (char *)&game; read_continue_game_part((unsigned char *)cmpgn_fname,i,CAMPAIGN_FNAME_LEN); cmpgn_fname[CAMPAIGN_FNAME_LEN-1] = '\0'; lvnum = ((struct Game *)buf)->continue_level_number; if (!change_campaign(cmpgn_fname)) { ERRORLOG("Unable to load campaign"); return false; } if (is_singleplayer_like_level(lvnum)) { set_continue_level_number(lvnum); } } lvnum = get_continue_level_number(); if (is_singleplayer_like_level(lvnum)) { SYNCDBG(7,"Continue to level %d is available",(int)lvnum); return true; } else { SYNCDBG(7,"Level %d from continue file is not single player",(int)lvnum); return false; } }
short load_continue_game(void) { unsigned char buf[14]; unsigned char bonus[20]; char cmpgn_fname[CAMPAIGN_FNAME_LEN]; long lvnum; long i; if (!read_continue_game_part(buf,0,14)) { WARNLOG("Can't read continue game file head"); return false; } i = (char *)&game.campaign_fname[0] - (char *)&game; read_continue_game_part((unsigned char *)cmpgn_fname,i,CAMPAIGN_FNAME_LEN); cmpgn_fname[CAMPAIGN_FNAME_LEN-1] = '\0'; if (!change_campaign(cmpgn_fname)) { ERRORLOG("Unable to load campaign"); return false; } lvnum = ((struct Game *)buf)->continue_level_number; if (!is_singleplayer_like_level(lvnum)) { WARNLOG("Level number in continue file is incorrect"); return false; } set_continue_level_number(lvnum); LbMemorySet(bonus, 0, sizeof(bonus)); i = (char *)&game.intralvl.bonuses_found[0] - (char *)&game; read_continue_game_part(bonus,i,16); for (i=0; i < BONUS_LEVEL_STORAGE_COUNT; i++) game.intralvl.bonuses_found[i] = bonus[i]; LbStringCopy(game.campaign_fname,campaign.fname,sizeof(game.campaign_fname)); update_extra_levels_visibility(); i = (char *)&game.intralvl_transfered_creature - (char *)&game.intralvl.bonuses_found[0]; game.intralvl_transfered_creature.model = bonus[i]; game.intralvl_transfered_creature.explevel = bonus[i+1]; return true; }
/** * Sets the continue level number. The level informs of campaign progress. * Levels which are not part of campaign will be ignored. */ LevelNumber set_continue_level_number(LevelNumber lvnum) { if (is_singleplayer_like_level(lvnum)) game.continue_level_number = lvnum; return game.continue_level_number; }