From 78fa540ec9109352b545d6d6f12c7ef3ed344e9a Mon Sep 17 00:00:00 2001 From: ephphatha Date: Sun, 5 Sep 2021 21:06:25 +1000 Subject: [PATCH] Save/LoadObject by reference --- Source/loadsave.cpp | 148 +++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 76 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index aa1b30b50..ea317bb8b 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -682,43 +682,41 @@ void LoadMissile(LoadHelper *file, Missile &missile) missile.limitReached = file->NextBool32(); } -void LoadObject(LoadHelper *file, int i) +void LoadObject(LoadHelper &file, Object &object) { - Object *pObject = &Objects[i]; - - pObject->_otype = static_cast<_object_id>(file->NextLE()); - pObject->position.x = file->NextLE(); - pObject->position.y = file->NextLE(); - pObject->_oLight = file->NextBool32(); - pObject->_oAnimFlag = file->NextLE(); - file->Skip(4); // Skip pointer _oAnimData - pObject->_oAnimDelay = file->NextLE(); - pObject->_oAnimCnt = file->NextLE(); - pObject->_oAnimLen = file->NextLE(); - pObject->_oAnimFrame = file->NextLE(); - pObject->_oAnimWidth = file->NextLE(); - file->Skip(4); // Skip _oAnimWidth2 - pObject->_oDelFlag = file->NextBool32(); - pObject->_oBreak = file->NextLE(); - file->Skip(3); // Alignment - pObject->_oSolidFlag = file->NextBool32(); - pObject->_oMissFlag = file->NextBool32(); - - pObject->_oSelFlag = file->NextLE(); - file->Skip(3); // Alignment - pObject->_oPreFlag = file->NextBool32(); - pObject->_oTrapFlag = file->NextBool32(); - pObject->_oDoorFlag = file->NextBool32(); - pObject->_olid = file->NextLE(); - pObject->_oRndSeed = file->NextLE(); - pObject->_oVar1 = file->NextLE(); - pObject->_oVar2 = file->NextLE(); - pObject->_oVar3 = file->NextLE(); - pObject->_oVar4 = file->NextLE(); - pObject->_oVar5 = file->NextLE(); - pObject->_oVar6 = file->NextLE(); - pObject->bookMessage = static_cast<_speech_id>(file->NextLE()); - pObject->_oVar8 = file->NextLE(); + object._otype = static_cast<_object_id>(file.NextLE()); + object.position.x = file.NextLE(); + object.position.y = file.NextLE(); + object._oLight = file.NextBool32(); + object._oAnimFlag = file.NextLE(); + file.Skip(4); // Skip pointer _oAnimData + object._oAnimDelay = file.NextLE(); + object._oAnimCnt = file.NextLE(); + object._oAnimLen = file.NextLE(); + object._oAnimFrame = file.NextLE(); + object._oAnimWidth = file.NextLE(); + file.Skip(4); // Skip _oAnimWidth2 + object._oDelFlag = file.NextBool32(); + object._oBreak = file.NextLE(); + file.Skip(3); // Alignment + object._oSolidFlag = file.NextBool32(); + object._oMissFlag = file.NextBool32(); + + object._oSelFlag = file.NextLE(); + file.Skip(3); // Alignment + object._oPreFlag = file.NextBool32(); + object._oTrapFlag = file.NextBool32(); + object._oDoorFlag = file.NextBool32(); + object._olid = file.NextLE(); + object._oRndSeed = file.NextLE(); + object._oVar1 = file.NextLE(); + object._oVar2 = file.NextLE(); + object._oVar3 = file.NextLE(); + object._oVar4 = file.NextLE(); + object._oVar5 = file.NextLE(); + object._oVar6 = file.NextLE(); + object.bookMessage = static_cast<_speech_id>(file.NextLE()); + object._oVar8 = file.NextLE(); } void LoadItem(LoadHelper *file, int i) @@ -1328,43 +1326,41 @@ void SaveMissile(SaveHelper *file, Missile &missile) file->WriteLE(missile.limitReached ? 1 : 0); } -void SaveObject(SaveHelper *file, int i) +void SaveObject(SaveHelper &file, const Object &object) { - Object *pObject = &Objects[i]; - - file->WriteLE(pObject->_otype); - file->WriteLE(pObject->position.x); - file->WriteLE(pObject->position.y); - file->WriteLE(pObject->_oLight ? 1 : 0); - file->WriteLE(pObject->_oAnimFlag); - file->Skip(4); // Skip pointer _oAnimData - file->WriteLE(pObject->_oAnimDelay); - file->WriteLE(pObject->_oAnimCnt); - file->WriteLE(pObject->_oAnimLen); - file->WriteLE(pObject->_oAnimFrame); - file->WriteLE(pObject->_oAnimWidth); - file->WriteLE(CalculateWidth2(pObject->_oAnimWidth)); // Write _oAnimWidth2 for vanilla compatibility - file->WriteLE(pObject->_oDelFlag ? 1 : 0); - file->WriteLE(pObject->_oBreak); - file->Skip(3); // Alignment - file->WriteLE(pObject->_oSolidFlag ? 1 : 0); - file->WriteLE(pObject->_oMissFlag ? 1 : 0); - - file->WriteLE(pObject->_oSelFlag); - file->Skip(3); // Alignment - file->WriteLE(pObject->_oPreFlag ? 1 : 0); - file->WriteLE(pObject->_oTrapFlag ? 1 : 0); - file->WriteLE(pObject->_oDoorFlag ? 1 : 0); - file->WriteLE(pObject->_olid); - file->WriteLE(pObject->_oRndSeed); - file->WriteLE(pObject->_oVar1); - file->WriteLE(pObject->_oVar2); - file->WriteLE(pObject->_oVar3); - file->WriteLE(pObject->_oVar4); - file->WriteLE(pObject->_oVar5); - file->WriteLE(pObject->_oVar6); - file->WriteLE(pObject->bookMessage); - file->WriteLE(pObject->_oVar8); + file.WriteLE(object._otype); + file.WriteLE(object.position.x); + file.WriteLE(object.position.y); + file.WriteLE(object._oLight ? 1 : 0); + file.WriteLE(object._oAnimFlag); + file.Skip(4); // Skip pointer _oAnimData + file.WriteLE(object._oAnimDelay); + file.WriteLE(object._oAnimCnt); + file.WriteLE(object._oAnimLen); + file.WriteLE(object._oAnimFrame); + file.WriteLE(object._oAnimWidth); + file.WriteLE(CalculateWidth2(object._oAnimWidth)); // Write _oAnimWidth2 for vanilla compatibility + file.WriteLE(object._oDelFlag ? 1 : 0); + file.WriteLE(object._oBreak); + file.Skip(3); // Alignment + file.WriteLE(object._oSolidFlag ? 1 : 0); + file.WriteLE(object._oMissFlag ? 1 : 0); + + file.WriteLE(object._oSelFlag); + file.Skip(3); // Alignment + file.WriteLE(object._oPreFlag ? 1 : 0); + file.WriteLE(object._oTrapFlag ? 1 : 0); + file.WriteLE(object._oDoorFlag ? 1 : 0); + file.WriteLE(object._olid); + file.WriteLE(object._oRndSeed); + file.WriteLE(object._oVar1); + file.WriteLE(object._oVar2); + file.WriteLE(object._oVar3); + file.WriteLE(object._oVar4); + file.WriteLE(object._oVar5); + file.WriteLE(object._oVar6); + file.WriteLE(object.bookMessage); + file.WriteLE(object._oVar8); } void SavePremium(SaveHelper *file, int i) @@ -1741,7 +1737,7 @@ void LoadGame(bool firstflag) for (int &objectId : AvailableObjects) objectId = file.NextLE(); for (int i = 0; i < ActiveObjectCount; i++) - LoadObject(&file, ActiveObjects[i]); + LoadObject(file, Objects[ActiveObjects[i]]); for (int i = 0; i < ActiveObjectCount; i++) SyncObjectAnim(Objects[ActiveObjects[i]]); @@ -1938,7 +1934,7 @@ void SaveGameData() for (int objectId : AvailableObjects) file.WriteLE(objectId); for (int i = 0; i < ActiveObjectCount; i++) - SaveObject(&file, ActiveObjects[i]); + SaveObject(file, Objects[ActiveObjects[i]]); file.WriteBE(ActiveLightCount); @@ -2063,7 +2059,7 @@ void SaveLevel() for (int objectId : AvailableObjects) file.WriteLE(objectId); for (int i = 0; i < ActiveObjectCount; i++) - SaveObject(&file, ActiveObjects[i]); + SaveObject(file, Objects[ActiveObjects[i]]); } for (int itemId : ActiveItems) @@ -2142,7 +2138,7 @@ void LoadLevel() for (int &objectId : AvailableObjects) objectId = file.NextLE(); for (int i = 0; i < ActiveObjectCount; i++) - LoadObject(&file, ActiveObjects[i]); + LoadObject(file, Objects[ActiveObjects[i]]); if (!gbSkipSync) { for (int i = 0; i < ActiveObjectCount; i++) SyncObjectAnim(Objects[ActiveObjects[i]]);