| 2319 | } |
| 2320 | |
| 2321 | void LoadGame(bool firstflag) |
| 2322 | { |
| 2323 | FreeGameMem(); |
| 2324 | |
| 2325 | LoadHelper file(OpenSaveArchive(gSaveNumber), "game"); |
| 2326 | if (!file.IsValid()) |
| 2327 | app_fatal(_("Unable to open save file archive")); |
| 2328 | |
| 2329 | if (!IsHeaderValid(file.NextLE<uint32_t>())) |
| 2330 | app_fatal(_("Invalid save file")); |
| 2331 | |
| 2332 | if (gbIsHellfireSaveGame) { |
| 2333 | giNumberOfLevels = 25; |
| 2334 | giNumberQuests = 24; |
| 2335 | giNumberOfSmithPremiumItems = 15; |
| 2336 | } else { |
| 2337 | // Todo initialize additional levels and quests if we are running Hellfire |
| 2338 | giNumberOfLevels = 17; |
| 2339 | giNumberQuests = 16; |
| 2340 | giNumberOfSmithPremiumItems = 6; |
| 2341 | } |
| 2342 | |
| 2343 | pfile_remove_temp_files(); |
| 2344 | |
| 2345 | setlevel = file.NextBool8(); |
| 2346 | setlvlnum = static_cast<_setlevels>(file.NextBE<uint32_t>()); |
| 2347 | currlevel = file.NextBE<uint32_t>(); |
| 2348 | leveltype = static_cast<dungeon_type>(file.NextBE<uint32_t>()); |
| 2349 | if (!setlevel) |
| 2350 | leveltype = GetLevelType(currlevel); |
| 2351 | int viewX = file.NextBE<int32_t>(); |
| 2352 | int viewY = file.NextBE<int32_t>(); |
| 2353 | invflag = file.NextBool8(); |
| 2354 | chrflag = file.NextBool8(); |
| 2355 | int tmpNummonsters = file.NextBE<int32_t>(); |
| 2356 | auto savedItemCount = file.NextBE<uint32_t>(); |
| 2357 | int tmpNummissiles = file.NextBE<int32_t>(); |
| 2358 | int tmpNobjects = file.NextBE<int32_t>(); |
| 2359 | |
| 2360 | if (!gbIsHellfire && IsAnyOf(leveltype, DTYPE_NEST, DTYPE_CRYPT)) |
| 2361 | app_fatal(_("Player is on a Hellfire only level")); |
| 2362 | |
| 2363 | for (uint8_t i = 0; i < giNumberOfLevels; i++) { |
| 2364 | glSeedTbl[i] = file.NextBE<uint32_t>(); |
| 2365 | file.Skip(4); // Skip loading gnLevelTypeTbl |
| 2366 | } |
| 2367 | |
| 2368 | Player &myPlayer = *MyPlayer; |
| 2369 | |
| 2370 | LoadPlayer(file, myPlayer); |
| 2371 | |
| 2372 | if (sgGameInitInfo.nDifficulty < DIFF_NORMAL || sgGameInitInfo.nDifficulty > DIFF_HELL) |
| 2373 | sgGameInitInfo.nDifficulty = DIFF_NORMAL; |
| 2374 | |
| 2375 | for (int i = 0; i < giNumberQuests; i++) |
| 2376 | LoadQuest(&file, i); |
| 2377 | for (int i = 0; i < MAXPORTAL; i++) |
| 2378 | LoadPortal(&file, i); |
no test coverage detected