Skip to content

Commit fb0e108

Browse files
committed
Improve serialization (not tested much yet)
1 parent 26ad6bc commit fb0e108

3 files changed

Lines changed: 393 additions & 19 deletions

File tree

‎Spore ModAPI/SourceCode/DLL/AddressesSimulator.cpp‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,56 @@ namespace Simulator
723723
DefineAddress(GetAllocator, SelectAddress(0x690180, 0x69de70));
724724
}
725725

726+
namespace Addresses(SerializerReadStream)
727+
{
728+
DefineAddress(Open, SelectAddress(0x6903b0, 0x69e090));
729+
DefineAddress(Close, SelectAddress(0x68f860, 0x69d480));
730+
DefineAddress(IsOpen, SelectAddress(0x68f8b0, 0x69d4d0));
731+
DefineAddress(IsGood, SelectAddress(0x5a2c00, 0x950190));
732+
DefineAddress(GetRecord, SelectAddress(0x69f450, 0xfc7910));
733+
DefineAddress(GetDatabase, SelectAddress(0xf5c360, 0x7f55c0));
734+
DefineAddress(ReadObjectPointer, SelectAddress(0x690450, 0x69e170));
735+
DefineAddress(ReadPointer, SelectAddress(0x68f8d0, 0x69d4f0));
736+
DefineAddress(ReadProperty, SelectAddress(0x68f920, 0x69d540));
737+
DefineAddress(ReadRawData, SelectAddress(0x68fbb0, 0x69d830));
738+
DefineAddress(ReadPropertyByID, SelectAddress(0x68f5e0, 0x69d1d0));
739+
DefineAddress(GetSerializationVersion, SelectAddress(0x95a4f0, 0x93b630));
740+
DefineAddress(SetSerializationVersion, SelectAddress(0x1054390, 0xfcc100));
741+
742+
DefineAddress(Skip, SelectAddress(0x68f620, 0x69d210));
743+
}
744+
745+
namespace Addresses(SerializerWriteStream)
746+
{
747+
DefineAddress(Open, SelectAddress(0x690540, 0x69e260));
748+
DefineAddress(Close, SelectAddress(0x68fc30, 0x69d8e0));
749+
DefineAddress(IsOpen, SelectAddress(0x68fc80, 0x69d930));
750+
DefineAddress(IsGood, SelectAddress(0x68f690, 0xab2ff0));
751+
DefineAddress(GetRecord, SelectAddress(0x959a00, 0xfcc1d0));
752+
DefineAddress(GetDatabase, SelectAddress(0x95a4f0, 0x93b630));
753+
DefineAddress(WriteObjectPointer, SelectAddress(0x68fca0, 0x69d950));
754+
DefineAddress(WritePointer, SelectAddress(0x68fcd0, 0x69d980));
755+
DefineAddress(WriteProperty, SelectAddress(0x68fd20, 0x69d9d0));
756+
DefineAddress(WriteRawData, SelectAddress(0x68ffb0, 0x69dc60));
757+
DefineAddress(WritePropertyWithID, SelectAddress(0x68f6a0, 0x69d280));
758+
}
759+
760+
namespace Addresses(SerializerReadStreamPrivate)
761+
{
762+
DefineAddress(IsOpen, SelectAddress(0x685e30, 0x692e60));
763+
DefineAddress(SetSerializationVersion, SelectAddress(0x685e10, 0x692e80));
764+
DefineAddress(GetSerializationVersion, SelectAddress(0x685e20, 0x692e90));
765+
766+
DefineAddress(openStream, SelectAddress(0x686770, 0x6938d0));
767+
}
768+
769+
namespace Addresses(SerializerWriteStreamPrivate)
770+
{
771+
DefineAddress(IsOpen, SelectAddress(0x685e30, 0x692e60));
772+
773+
DefineAddress(openStream, SelectAddress(0x686890, 0x693a70));
774+
}
775+
726776
namespace Addresses(cGameData)
727777
{
728778
DefineAddress(Write, SelectAddress(0xB18430, 0xB184D0));

‎Spore ModAPI/SourceCode/Simulator/Serialization.cpp‎

Lines changed: 175 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ namespace Simulator
4747

4848
#ifndef MODAPI_DLL_EXPORT
4949

50-
ICOMSerializer::~ICOMSerializer() = default;
51-
5250
COMSerializer::COMSerializer(ISerializerDatabase* pDatabase)
5351
: mbBusyWritingClassObjects(false)
5452
, mClassIDMapForWriting()
@@ -63,8 +61,6 @@ namespace Simulator
6361
mpDatabase = pDatabase;
6462
}
6563

66-
COMSerializer::~COMSerializer() = default;
67-
6864
int COMSerializer::AddRef()
6965
{
7066
return DefaultRefCounted::AddRef();
@@ -78,12 +74,13 @@ namespace Simulator
7874
void* COMSerializer::Cast(uint32_t type) const
7975
{
8076
CLASS_CAST(ICOMSerializer);
77+
CLASS_CAST(Object);
8178
return nullptr;
8279
}
8380

8481
auto_METHOD_VIRTUAL(COMSerializer, ICOMSerializer, bool, Open,
85-
Args(ISerializerDatabase* pDatabase),
86-
Args(pDatabase));
82+
Args(ISerializerDatabase* pDatabase, int mode_DEPRECATED),
83+
Args(pDatabase, mode_DEPRECATED));
8784
auto_METHOD_VIRTUAL_(COMSerializer, ICOMSerializer, bool, Close);
8885
auto_METHOD_VIRTUAL(COMSerializer, ICOMSerializer, bool, LoadClassObjects,
8986
Args(uint32_t clientVersion),
@@ -118,8 +115,6 @@ namespace Simulator
118115

119116
}
120117

121-
SerializerDatabase::~SerializerDatabase() = default;
122-
123118
int SerializerDatabase::AddRef()
124119
{
125120
return Database::AddRef();
@@ -133,7 +128,9 @@ namespace Simulator
133128
void* SerializerDatabase::Cast(uint32_t type) const
134129
{
135130
CLASS_CAST(ISerializerDatabase);
136-
return nullptr;
131+
return (type == Object::TYPE)
132+
? (void*)this
133+
: nullptr;
137134
}
138135

139136
auto_METHOD_VIRTUAL_(SerializerDatabase, ISerializerDatabase, Resource::Database*, AsDatabase);
@@ -203,6 +200,175 @@ namespace Simulator
203200
Args(bool bOpenForReading, bool bOpenForWriting),
204201
Args(bOpenForReading, bOpenForWriting));
205202

203+
SerializerReadStream::SerializerReadStream()
204+
: mbOK(true)
205+
, mVersion(0)
206+
, mpRecord(nullptr)
207+
, mpDatabase(nullptr)
208+
{
209+
210+
}
211+
212+
void* SerializerReadStream::Cast(uint32_t type) const
213+
{
214+
CLASS_CAST(ISerializerReadStream);
215+
CLASS_CAST(Object);
216+
return nullptr;
217+
}
218+
219+
auto_METHOD_VIRTUAL(SerializerReadStream, ISerializerReadStream, bool, Open,
220+
Args(ISerializerDatabase* pDatabase, const ResourceKey& key),
221+
Args(pDatabase, key));
222+
auto_METHOD_VIRTUAL_(SerializerReadStream, ISerializerReadStream, bool, Close);
223+
auto_METHOD_VIRTUAL_const_(SerializerReadStream, ISerializerReadStream, bool, IsOpen);
224+
auto_METHOD_VIRTUAL_const_(SerializerReadStream, ISerializerReadStream, bool, IsGood);
225+
auto_METHOD_VIRTUAL_const_(SerializerReadStream, ISerializerReadStream, Resource::IRecord*, GetRecord);
226+
auto_METHOD_VIRTUAL_const_(SerializerReadStream, ISerializerReadStream, ISerializerDatabase*, GetDatabase);
227+
auto_METHOD_VIRTUAL(SerializerReadStream, ISerializerReadStream, bool, ReadObjectPointer,
228+
Args(uint32_t castTypeID, ObjectPtr& dst, bool bLoadImmediately),
229+
Args(castTypeID, dst, bLoadImmediately));
230+
auto_METHOD_VIRTUAL(SerializerReadStream, ISerializerReadStream, bool, ReadPointer,
231+
Args(ISimulatorSerializable* pointer, bool bLoadImmediately),
232+
Args(pointer, bLoadImmediately));
233+
auto_METHOD_VIRTUAL(SerializerReadStream, ISerializerReadStream, bool, ReadProperty,
234+
Args(App::Property& dst),
235+
Args(dst));
236+
auto_METHOD_VIRTUAL(SerializerReadStream, ISerializerReadStream, bool, ReadRawData,
237+
Args(void* pBuffer, size_t size),
238+
Args(pBuffer, size));
239+
auto_METHOD_VIRTUAL(SerializerReadStream, ISerializerReadStream, bool, ReadPropertyByID,
240+
Args(uint32_t propertyID, App::Property& dst),
241+
Args(propertyID, dst));
242+
auto_METHOD_VIRTUAL_const_(SerializerReadStream, ISerializerReadStream, uint32_t, GetSerializationVersion);
243+
auto_METHOD_VIRTUAL_VOID(SerializerReadStream, ISerializerReadStream, SetSerializationVersion,
244+
Args(uint32_t version),
245+
Args(version));
246+
247+
auto_METHOD_VIRTUAL(SerializerReadStream, ISerializerReadStream, bool, Skip,
248+
Args(const uint32_t skipCount),
249+
Args(skipCount));
250+
251+
SerializerWriteStream::SerializerWriteStream()
252+
: mpRecord(nullptr)
253+
, mpDatabase(nullptr)
254+
, mbOK(true)
255+
{
256+
257+
}
258+
259+
void* SerializerWriteStream::Cast(uint32_t type) const
260+
{
261+
CLASS_CAST(SerializerWriteStream);
262+
CLASS_CAST(Object);
263+
return nullptr;
264+
}
265+
266+
auto_METHOD_VIRTUAL(SerializerWriteStream, ISerializerWriteStream, bool, Open,
267+
Args(ISerializerDatabase* pDatabase, const ResourceKey& key, bool bTruncate),
268+
Args(pDatabase, key, bTruncate));
269+
auto_METHOD_VIRTUAL_(SerializerWriteStream, ISerializerWriteStream, bool, Close);
270+
auto_METHOD_VIRTUAL_const_(SerializerWriteStream, ISerializerWriteStream, bool, IsOpen);
271+
auto_METHOD_VIRTUAL_const_(SerializerWriteStream, ISerializerWriteStream, bool, IsGood);
272+
auto_METHOD_VIRTUAL_const_(SerializerWriteStream, ISerializerWriteStream, Resource::IRecord*, GetRecord);
273+
auto_METHOD_VIRTUAL_const_(SerializerWriteStream, ISerializerWriteStream, ISerializerDatabase*, GetDatabase);
274+
auto_METHOD_VIRTUAL(SerializerWriteStream, ISerializerWriteStream, bool, WriteObjectPointer,
275+
Args(Object* pObject),
276+
Args(pObject));
277+
auto_METHOD_VIRTUAL(SerializerWriteStream, ISerializerWriteStream, bool, WritePointer,
278+
Args(ISimulatorSerializable* pointer),
279+
Args(pointer));
280+
auto_METHOD_VIRTUAL(SerializerWriteStream, ISerializerWriteStream, bool, WriteProperty,
281+
Args(App::Property& src),
282+
Args(src));
283+
auto_METHOD_VIRTUAL(SerializerWriteStream, ISerializerWriteStream, bool, WriteRawData,
284+
Args(void* pData, size_t size),
285+
Args(pData, size));
286+
auto_METHOD_VIRTUAL(SerializerWriteStream, ISerializerWriteStream, bool, WritePropertyWithID,
287+
Args(uint32_t propertyID, App::Property& src),
288+
Args(propertyID, src));
289+
290+
SerializerReadStreamPrivate::SerializerReadStreamPrivate(ISerializerDatabase* pDatabase, uint32_t nResourceType, uint32_t nInstance, uint32_t nGroupID)
291+
: mpDatabase(nullptr)
292+
, mpReadStream(nullptr)
293+
{
294+
openStream(pDatabase, nResourceType, nInstance, nGroupID);
295+
}
296+
297+
SerializerReadStreamPrivate::SerializerReadStreamPrivate(ISerializerReadStream& readStream, uint32_t nResourceType, uint32_t nInstance, uint32_t nGroupID)
298+
: SerializerReadStreamPrivate(readStream.GetDatabase(), nResourceType, nInstance, nGroupID)
299+
{
300+
301+
}
302+
303+
SerializerReadStreamPrivate::SerializerReadStreamPrivate(ISerializerDatabase* pDatabase, const ResourceKey& key)
304+
: SerializerReadStreamPrivate(pDatabase, key.typeID, key.instanceID, key.groupID)
305+
{
306+
307+
}
308+
309+
SerializerReadStreamPrivate::SerializerReadStreamPrivate(ISerializerReadStream& readStream, const ResourceKey& key)
310+
: SerializerReadStreamPrivate(readStream, key.typeID, key.instanceID, key.groupID)
311+
{
312+
313+
}
314+
315+
SerializerReadStreamPrivate::~SerializerReadStreamPrivate()
316+
{
317+
if (mpReadStream && mpReadStream->IsOpen())
318+
{
319+
mpReadStream->Close();
320+
}
321+
}
322+
323+
auto_METHOD_(SerializerReadStreamPrivate, bool, IsOpen);
324+
auto_METHOD_VOID(SerializerReadStreamPrivate, SetSerializationVersion,
325+
Args(uint32_t version),
326+
Args(version));
327+
auto_METHOD_const_(SerializerReadStreamPrivate, uint32_t, GetSerializationVersion);
328+
329+
auto_METHOD(SerializerReadStreamPrivate, bool, openStream,
330+
Args(ISerializerDatabase* pDatabase, uint32_t nResourceType, uint32_t nInstance, uint32_t nGroupID),
331+
Args(pDatabase, nResourceType, nInstance, nGroupID));
332+
333+
SerializerWriteStreamPrivate::SerializerWriteStreamPrivate(ISerializerDatabase* pDatabase, uint32_t nResourceType, uint32_t nInstance, uint32_t nGroupID)
334+
: mpDatabase(nullptr)
335+
, mpWriteStream(nullptr)
336+
{
337+
openStream(pDatabase, nResourceType, nInstance, nGroupID);
338+
}
339+
340+
SerializerWriteStreamPrivate::SerializerWriteStreamPrivate(ISerializerWriteStream& writeStream, uint32_t nResourceType, uint32_t nInstance, uint32_t nGroupID)
341+
: SerializerWriteStreamPrivate(writeStream.GetDatabase(), nResourceType, nInstance, nGroupID)
342+
{
343+
344+
}
345+
346+
SerializerWriteStreamPrivate::SerializerWriteStreamPrivate(ISerializerDatabase* pDatabase, const ResourceKey& key)
347+
: SerializerWriteStreamPrivate(pDatabase, key.typeID, key.instanceID, key.groupID)
348+
{
349+
350+
}
351+
352+
SerializerWriteStreamPrivate::SerializerWriteStreamPrivate(ISerializerWriteStream& writeStream, const ResourceKey& key)
353+
: SerializerWriteStreamPrivate(writeStream, key.typeID, key.instanceID, key.groupID)
354+
{
355+
356+
}
357+
358+
SerializerWriteStreamPrivate::~SerializerWriteStreamPrivate()
359+
{
360+
if (mpWriteStream && mpWriteStream->IsOpen())
361+
{
362+
mpWriteStream->Close();
363+
}
364+
}
365+
366+
auto_METHOD_(SerializerWriteStreamPrivate, bool, IsOpen);
367+
368+
auto_METHOD(SerializerWriteStreamPrivate, bool, openStream,
369+
Args(ISerializerDatabase* pDatabase, uint32_t nResourceType, uint32_t nInstance, uint32_t nGroupID),
370+
Args(pDatabase, nResourceType, nInstance, nGroupID));
371+
206372
#endif
207373

208374
}

0 commit comments

Comments
 (0)