| 2602 | } |
| 2603 | |
| 2604 | void SaveGameData(SaveWriter &saveWriter) |
| 2605 | { |
| 2606 | SaveHelper file(saveWriter, "game", 320 * 1024); |
| 2607 | |
| 2608 | if (gbIsSpawn && !gbIsHellfire) |
| 2609 | file.WriteLE<uint32_t>(LoadLE32("SHAR")); |
| 2610 | else if (gbIsSpawn && gbIsHellfire) |
| 2611 | file.WriteLE<uint32_t>(LoadLE32("SHLF")); |
| 2612 | else if (!gbIsSpawn && gbIsHellfire) |
| 2613 | file.WriteLE<uint32_t>(LoadLE32("HELF")); |
| 2614 | else if (!gbIsSpawn && !gbIsHellfire) |
| 2615 | file.WriteLE<uint32_t>(LoadLE32("RETL")); |
| 2616 | else |
| 2617 | app_fatal(_("Invalid game state")); |
| 2618 | |
| 2619 | if (gbIsHellfire) { |
| 2620 | giNumberOfLevels = 25; |
| 2621 | giNumberQuests = 24; |
| 2622 | giNumberOfSmithPremiumItems = 15; |
| 2623 | } else { |
| 2624 | giNumberOfLevels = 17; |
| 2625 | giNumberQuests = 16; |
| 2626 | giNumberOfSmithPremiumItems = 6; |
| 2627 | } |
| 2628 | |
| 2629 | file.WriteLE<uint8_t>(setlevel ? 1 : 0); |
| 2630 | file.WriteBE<uint32_t>(setlvlnum); |
| 2631 | file.WriteBE<uint32_t>(currlevel); |
| 2632 | file.WriteBE<uint32_t>(getHellfireLevelType(leveltype)); |
| 2633 | file.WriteBE<int32_t>(ViewPosition.x); |
| 2634 | file.WriteBE<int32_t>(ViewPosition.y); |
| 2635 | file.WriteLE<uint8_t>(invflag ? 1 : 0); |
| 2636 | file.WriteLE<uint8_t>(chrflag ? 1 : 0); |
| 2637 | file.WriteBE<int32_t>(ActiveMonsterCount); |
| 2638 | file.WriteBE<int32_t>(ActiveItemCount); |
| 2639 | // ActiveMissileCount will be a value from 0-125 (for vanilla compatibility). Writing an unsigned value here to avoid |
| 2640 | // warnings about casting from unsigned to signed, but there's no sign extension issues when reading this as a signed |
| 2641 | // value later so it doesn't have to match in LoadGameData(). |
| 2642 | file.WriteBE<uint32_t>(static_cast<uint32_t>(std::min(Missiles.size(), MaxMissilesForSaveGame))); |
| 2643 | file.WriteBE<int32_t>(ActiveObjectCount); |
| 2644 | |
| 2645 | for (uint8_t i = 0; i < giNumberOfLevels; i++) { |
| 2646 | file.WriteBE<uint32_t>(glSeedTbl[i]); |
| 2647 | file.WriteBE<int32_t>(getHellfireLevelType(GetLevelType(i))); |
| 2648 | } |
| 2649 | |
| 2650 | Player &myPlayer = *MyPlayer; |
| 2651 | SavePlayer(file, myPlayer); |
| 2652 | |
| 2653 | for (int i = 0; i < giNumberQuests; i++) |
| 2654 | SaveQuest(&file, i); |
| 2655 | for (int i = 0; i < MAXPORTAL; i++) |
| 2656 | SavePortal(&file, i); |
| 2657 | for (int monstkill : MonsterKillCounts) |
| 2658 | file.WriteBE<int32_t>(monstkill); |
| 2659 | // add padding for vanilla save compatibility (Related to bugfix where MonsterKillCounts[MaxMonsters] was changed to MonsterKillCounts[NUM_MTYPES] |
| 2660 | file.Skip(4 * (MaxMonsters - NUM_MTYPES)); |
| 2661 |
no test coverage detected