Browse Source

Save/LoadObject by reference

pull/2820/head
ephphatha 5 years ago committed by Anders Jenbo
parent
commit
78fa540ec9
  1. 148
      Source/loadsave.cpp

148
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<int32_t>());
pObject->position.x = file->NextLE<int32_t>();
pObject->position.y = file->NextLE<int32_t>();
pObject->_oLight = file->NextBool32();
pObject->_oAnimFlag = file->NextLE<uint32_t>();
file->Skip(4); // Skip pointer _oAnimData
pObject->_oAnimDelay = file->NextLE<int32_t>();
pObject->_oAnimCnt = file->NextLE<int32_t>();
pObject->_oAnimLen = file->NextLE<uint32_t>();
pObject->_oAnimFrame = file->NextLE<uint32_t>();
pObject->_oAnimWidth = file->NextLE<int32_t>();
file->Skip(4); // Skip _oAnimWidth2
pObject->_oDelFlag = file->NextBool32();
pObject->_oBreak = file->NextLE<int8_t>();
file->Skip(3); // Alignment
pObject->_oSolidFlag = file->NextBool32();
pObject->_oMissFlag = file->NextBool32();
pObject->_oSelFlag = file->NextLE<int8_t>();
file->Skip(3); // Alignment
pObject->_oPreFlag = file->NextBool32();
pObject->_oTrapFlag = file->NextBool32();
pObject->_oDoorFlag = file->NextBool32();
pObject->_olid = file->NextLE<int32_t>();
pObject->_oRndSeed = file->NextLE<uint32_t>();
pObject->_oVar1 = file->NextLE<int32_t>();
pObject->_oVar2 = file->NextLE<int32_t>();
pObject->_oVar3 = file->NextLE<int32_t>();
pObject->_oVar4 = file->NextLE<int32_t>();
pObject->_oVar5 = file->NextLE<int32_t>();
pObject->_oVar6 = file->NextLE<uint32_t>();
pObject->bookMessage = static_cast<_speech_id>(file->NextLE<int32_t>());
pObject->_oVar8 = file->NextLE<int32_t>();
object._otype = static_cast<_object_id>(file.NextLE<int32_t>());
object.position.x = file.NextLE<int32_t>();
object.position.y = file.NextLE<int32_t>();
object._oLight = file.NextBool32();
object._oAnimFlag = file.NextLE<uint32_t>();
file.Skip(4); // Skip pointer _oAnimData
object._oAnimDelay = file.NextLE<int32_t>();
object._oAnimCnt = file.NextLE<int32_t>();
object._oAnimLen = file.NextLE<uint32_t>();
object._oAnimFrame = file.NextLE<uint32_t>();
object._oAnimWidth = file.NextLE<int32_t>();
file.Skip(4); // Skip _oAnimWidth2
object._oDelFlag = file.NextBool32();
object._oBreak = file.NextLE<int8_t>();
file.Skip(3); // Alignment
object._oSolidFlag = file.NextBool32();
object._oMissFlag = file.NextBool32();
object._oSelFlag = file.NextLE<int8_t>();
file.Skip(3); // Alignment
object._oPreFlag = file.NextBool32();
object._oTrapFlag = file.NextBool32();
object._oDoorFlag = file.NextBool32();
object._olid = file.NextLE<int32_t>();
object._oRndSeed = file.NextLE<uint32_t>();
object._oVar1 = file.NextLE<int32_t>();
object._oVar2 = file.NextLE<int32_t>();
object._oVar3 = file.NextLE<int32_t>();
object._oVar4 = file.NextLE<int32_t>();
object._oVar5 = file.NextLE<int32_t>();
object._oVar6 = file.NextLE<uint32_t>();
object.bookMessage = static_cast<_speech_id>(file.NextLE<int32_t>());
object._oVar8 = file.NextLE<int32_t>();
}
void LoadItem(LoadHelper *file, int i)
@ -1328,43 +1326,41 @@ void SaveMissile(SaveHelper *file, Missile &missile)
file->WriteLE<uint32_t>(missile.limitReached ? 1 : 0);
}
void SaveObject(SaveHelper *file, int i)
void SaveObject(SaveHelper &file, const Object &object)
{
Object *pObject = &Objects[i];
file->WriteLE<int32_t>(pObject->_otype);
file->WriteLE<int32_t>(pObject->position.x);
file->WriteLE<int32_t>(pObject->position.y);
file->WriteLE<uint32_t>(pObject->_oLight ? 1 : 0);
file->WriteLE<uint32_t>(pObject->_oAnimFlag);
file->Skip(4); // Skip pointer _oAnimData
file->WriteLE<int32_t>(pObject->_oAnimDelay);
file->WriteLE<int32_t>(pObject->_oAnimCnt);
file->WriteLE<uint32_t>(pObject->_oAnimLen);
file->WriteLE<uint32_t>(pObject->_oAnimFrame);
file->WriteLE<int32_t>(pObject->_oAnimWidth);
file->WriteLE<int32_t>(CalculateWidth2(pObject->_oAnimWidth)); // Write _oAnimWidth2 for vanilla compatibility
file->WriteLE<uint32_t>(pObject->_oDelFlag ? 1 : 0);
file->WriteLE<int8_t>(pObject->_oBreak);
file->Skip(3); // Alignment
file->WriteLE<uint32_t>(pObject->_oSolidFlag ? 1 : 0);
file->WriteLE<uint32_t>(pObject->_oMissFlag ? 1 : 0);
file->WriteLE<int8_t>(pObject->_oSelFlag);
file->Skip(3); // Alignment
file->WriteLE<uint32_t>(pObject->_oPreFlag ? 1 : 0);
file->WriteLE<uint32_t>(pObject->_oTrapFlag ? 1 : 0);
file->WriteLE<uint32_t>(pObject->_oDoorFlag ? 1 : 0);
file->WriteLE<int32_t>(pObject->_olid);
file->WriteLE<uint32_t>(pObject->_oRndSeed);
file->WriteLE<int32_t>(pObject->_oVar1);
file->WriteLE<int32_t>(pObject->_oVar2);
file->WriteLE<int32_t>(pObject->_oVar3);
file->WriteLE<int32_t>(pObject->_oVar4);
file->WriteLE<int32_t>(pObject->_oVar5);
file->WriteLE<uint32_t>(pObject->_oVar6);
file->WriteLE<int32_t>(pObject->bookMessage);
file->WriteLE<int32_t>(pObject->_oVar8);
file.WriteLE<int32_t>(object._otype);
file.WriteLE<int32_t>(object.position.x);
file.WriteLE<int32_t>(object.position.y);
file.WriteLE<uint32_t>(object._oLight ? 1 : 0);
file.WriteLE<uint32_t>(object._oAnimFlag);
file.Skip(4); // Skip pointer _oAnimData
file.WriteLE<int32_t>(object._oAnimDelay);
file.WriteLE<int32_t>(object._oAnimCnt);
file.WriteLE<uint32_t>(object._oAnimLen);
file.WriteLE<uint32_t>(object._oAnimFrame);
file.WriteLE<int32_t>(object._oAnimWidth);
file.WriteLE<int32_t>(CalculateWidth2(object._oAnimWidth)); // Write _oAnimWidth2 for vanilla compatibility
file.WriteLE<uint32_t>(object._oDelFlag ? 1 : 0);
file.WriteLE<int8_t>(object._oBreak);
file.Skip(3); // Alignment
file.WriteLE<uint32_t>(object._oSolidFlag ? 1 : 0);
file.WriteLE<uint32_t>(object._oMissFlag ? 1 : 0);
file.WriteLE<int8_t>(object._oSelFlag);
file.Skip(3); // Alignment
file.WriteLE<uint32_t>(object._oPreFlag ? 1 : 0);
file.WriteLE<uint32_t>(object._oTrapFlag ? 1 : 0);
file.WriteLE<uint32_t>(object._oDoorFlag ? 1 : 0);
file.WriteLE<int32_t>(object._olid);
file.WriteLE<uint32_t>(object._oRndSeed);
file.WriteLE<int32_t>(object._oVar1);
file.WriteLE<int32_t>(object._oVar2);
file.WriteLE<int32_t>(object._oVar3);
file.WriteLE<int32_t>(object._oVar4);
file.WriteLE<int32_t>(object._oVar5);
file.WriteLE<uint32_t>(object._oVar6);
file.WriteLE<int32_t>(object.bookMessage);
file.WriteLE<int32_t>(object._oVar8);
}
void SavePremium(SaveHelper *file, int i)
@ -1741,7 +1737,7 @@ void LoadGame(bool firstflag)
for (int &objectId : AvailableObjects)
objectId = file.NextLE<int8_t>();
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<int8_t>(objectId);
for (int i = 0; i < ActiveObjectCount; i++)
SaveObject(&file, ActiveObjects[i]);
SaveObject(file, Objects[ActiveObjects[i]]);
file.WriteBE<int32_t>(ActiveLightCount);
@ -2063,7 +2059,7 @@ void SaveLevel()
for (int objectId : AvailableObjects)
file.WriteLE<int8_t>(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<int8_t>();
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]]);

Loading…
Cancel
Save