mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-10 23:02:08 +00:00
- put the state pointer serializer in a virtual function so that types.cpp can operate without any knowledge of Doom states.
This commit is contained in:
parent
1ce11ff02a
commit
ef8b4c7d5e
5 changed files with 78 additions and 51 deletions
|
@ -445,6 +445,18 @@ FSerializer &FSerializer::Sprite(const char *key, int32_t &spritenum, int32_t *d
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// only here so that it can be virtually overridden. Without reference this cannot save anything.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
FSerializer& FSerializer::StatePointer(const char* key, void* ptraddr, bool *res)
|
||||||
|
{
|
||||||
|
if (res) *res = false;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
|
@ -93,6 +93,9 @@ public:
|
||||||
FCompressedBuffer GetCompressedOutput();
|
FCompressedBuffer GetCompressedOutput();
|
||||||
// The sprite serializer is a special case because it is needed by the VM to handle its 'spriteid' type.
|
// The sprite serializer is a special case because it is needed by the VM to handle its 'spriteid' type.
|
||||||
virtual FSerializer &Sprite(const char *key, int32_t &spritenum, int32_t *def);
|
virtual FSerializer &Sprite(const char *key, int32_t &spritenum, int32_t *def);
|
||||||
|
// This is only needed by the type system.
|
||||||
|
virtual FSerializer& StatePointer(const char* key, void* ptraddr, bool *res);
|
||||||
|
|
||||||
FSerializer &StringPtr(const char *key, const char *&charptr); // This only retrieves the address but creates no permanent copy of the string unlike the regular char* serializer.
|
FSerializer &StringPtr(const char *key, const char *&charptr); // This only retrieves the address but creates no permanent copy of the string unlike the regular char* serializer.
|
||||||
FSerializer &AddString(const char *key, const char *charptr);
|
FSerializer &AddString(const char *key, const char *charptr);
|
||||||
const char *GetString(const char *key);
|
const char *GetString(const char *key);
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
#include "textureid.h"
|
#include "textureid.h"
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
|
|
||||||
FTypeTable TypeTable;
|
FTypeTable TypeTable;
|
||||||
|
@ -1079,6 +1078,46 @@ bool PName::ReadValue(FSerializer &ar, const char *key, void *addr) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* PStatePointer **********************************************************/
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// PStatePointer Default Constructor
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
PStatePointer::PStatePointer()
|
||||||
|
{
|
||||||
|
mDescriptiveName = "Pointer<State>";
|
||||||
|
PointedType = NewStruct(NAME_State, nullptr, true);
|
||||||
|
IsConst = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// PStatePointer :: WriteValue
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void PStatePointer::WriteValue(FSerializer& ar, const char* key, const void* addr) const
|
||||||
|
{
|
||||||
|
ar.StatePointer(key, const_cast<void*>(addr), nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// PStatePointer :: ReadValue
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
bool PStatePointer::ReadValue(FSerializer& ar, const char* key, void* addr) const
|
||||||
|
{
|
||||||
|
bool res = false;
|
||||||
|
ar.StatePointer(key, addr, &res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* PSpriteID ******************************************************************/
|
/* PSpriteID ******************************************************************/
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -2524,52 +2563,3 @@ CCMD(typetable)
|
||||||
DumpTypeTable();
|
DumpTypeTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
// fixme: The VM depends on this but it's engine specific. Needs a better solution.
|
|
||||||
|
|
||||||
/* PStatePointer **********************************************************/
|
|
||||||
#ifdef GZDOOM
|
|
||||||
#include "info.h"
|
|
||||||
#include "serializer_doom.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// PStatePointer Default Constructor
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
PStatePointer::PStatePointer()
|
|
||||||
{
|
|
||||||
mDescriptiveName = "Pointer<State>";
|
|
||||||
PointedType = NewStruct(NAME_State, nullptr, true);
|
|
||||||
IsConst = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// PStatePointer :: WriteValue
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void PStatePointer::WriteValue(FSerializer& ar, const char* key, const void* addr) const
|
|
||||||
{
|
|
||||||
#ifdef GZDOOM
|
|
||||||
ar(key, *(FState**)addr);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// PStatePointer :: ReadValue
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
bool PStatePointer::ReadValue(FSerializer& ar, const char* key, void* addr) const
|
|
||||||
{
|
|
||||||
bool res = false;
|
|
||||||
#ifdef GZDOOM
|
|
||||||
::Serialize(ar, key, *(FState**)addr, nullptr, &res);
|
|
||||||
#endif
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -165,6 +165,27 @@ FSerializer &FDoomSerializer::Sprite(const char *key, int32_t &spritenum, int32_
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
FSerializer& FDoomSerializer::StatePointer(const char* key, void* ptraddr, bool *res)
|
||||||
|
{
|
||||||
|
if (isWriting())
|
||||||
|
{
|
||||||
|
if (res) *res = true;
|
||||||
|
(*this)(key, *(FState**)ptraddr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::Serialize(*this, key, *(FState**)ptraddr, nullptr, res);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<> FSerializer &Serialize(FSerializer &ar, const char *key, FPolyObj *&value, FPolyObj **defval)
|
template<> FSerializer &Serialize(FSerializer &ar, const char *key, FPolyObj *&value, FPolyObj **defval)
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,7 +29,8 @@ public:
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FSerializer &Sprite(const char *key, int32_t &spritenum, int32_t *def) override;
|
FSerializer &Sprite(const char *key, int32_t &spritenum, int32_t *def) override;
|
||||||
|
FSerializer& StatePointer(const char* key, void* ptraddr, bool *res) override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FSerializer &SerializeArgs(FSerializer &arc, const char *key, int *args, int *defargs, int special);
|
FSerializer &SerializeArgs(FSerializer &arc, const char *key, int *args, int *defargs, int special);
|
||||||
|
|
Loading…
Reference in a new issue