MCPcopy Create free account
hub / github.com/diasurgical/DevilutionX / SaveGameData

Function SaveGameData

Source/loadsave.cpp:2604–2766  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2602}
2603
2604void 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

Callers 1

pfile_write_heroFunction · 0.85

Calls 15

LoadLE32Function · 0.85
app_fatalFunction · 0.85
getHellfireLevelTypeFunction · 0.85
GetLevelTypeFunction · 0.85
SavePlayerFunction · 0.85
SaveQuestFunction · 0.85
SavePortalFunction · 0.85
SaveMonsterFunction · 0.85
SaveMissileFunction · 0.85
SaveObjectFunction · 0.85
SaveLightingFunction · 0.85
SaveDroppedItemsFunction · 0.85

Tested by

no test coverage detected