Skip to content

Commit

Permalink
libdoomsday|World: Internal thinker state is serializable
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Dec 7, 2016
1 parent fe91c63 commit 6ba20fc
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 6 deletions.
18 changes: 17 additions & 1 deletion doomsday/apps/libdoomsday/include/doomsday/world/map.h
Expand Up @@ -22,8 +22,9 @@

#include "../libdoomsday.h"
#include "../resource/mapmanifest.h"
#include <de/Error>
#include <de/Observers>
#include <de/Reader>
#include <de/Writer>

class EntityDatabase;

Expand Down Expand Up @@ -73,6 +74,10 @@ class LIBDOOMSDAY_PUBLIC BaseMap
*/
EntityDatabase &entityDatabase() const;

virtual void serializeInternalState(de::Writer &to) const;

virtual void deserializeInternalState(de::Reader &from);

DENG2_AS_IS_METHODS()

public:
Expand All @@ -83,6 +88,17 @@ class LIBDOOMSDAY_PUBLIC BaseMap
DENG2_PRIVATE(d)
};

typedef de::duint16 InternalSerialId;

// Identifiers for serialized internal state.
enum InternalSerialIds
{
THINKER_DATA = 0x0001,
MOBJ_THINKER_DATA = 0x0002,
CLIENT_MOBJ_THINKER_DATA = 0x0003,
STATE_ANIMATOR = 0x0004,
};

} // namespace world

#endif // LIBDOOMSDAY_WORLD_MAP_H
Expand Up @@ -58,6 +58,8 @@ class LIBDOOMSDAY_PUBLIC MobjThinkerData : public ThinkerData
*/
virtual void damageReceived(int points, mobj_t const *inflictor);

void operator << (de::Reader &from) override;

private:
DENG2_PRIVATE(d)
};
Expand Down
16 changes: 11 additions & 5 deletions doomsday/apps/libdoomsday/include/doomsday/world/thinkerdata.h
Expand Up @@ -25,6 +25,7 @@
#include <de/Process>
#include <de/Id>
#include <de/IObject>
#include <de/ISerializable>

/**
* Base class for thinker private data.
Expand All @@ -34,6 +35,7 @@
class LIBDOOMSDAY_PUBLIC ThinkerData
: public Thinker::IData
, public de::IObject
, public de::ISerializable
{
public:
DENG2_DEFINE_AUDIENCE2(Deletion, void thinkerBeingDeleted(thinker_s &))
Expand All @@ -42,9 +44,9 @@ class LIBDOOMSDAY_PUBLIC ThinkerData
ThinkerData();
ThinkerData(ThinkerData const &other);

void setThinker(thinker_s *thinker);
void think();
IData *duplicate() const;
void setThinker(thinker_s *thinker) override;
void think() override;
IData *duplicate() const override;

thinker_s &thinker();
thinker_s const &thinker() const;
Expand All @@ -57,8 +59,12 @@ class LIBDOOMSDAY_PUBLIC ThinkerData
virtual void initBindings();

// Implements IObject.
de::Record &objectNamespace();
de::Record const &objectNamespace() const;
de::Record &objectNamespace() override;
de::Record const &objectNamespace() const override;

// Implements ISerializable.
void operator >> (de::Writer &to) const override;
void operator << (de::Reader &from) override;

private:
DENG2_PRIVATE(d)
Expand Down
6 changes: 6 additions & 0 deletions doomsday/apps/libdoomsday/src/world/map.cpp
Expand Up @@ -96,4 +96,10 @@ EntityDatabase &BaseMap::entityDatabase() const
return d->entityDatabase;
}

void BaseMap::serializeInternalState(Writer &) const
{}

void BaseMap::deserializeInternalState(Reader &)
{}

} // namespace world
6 changes: 6 additions & 0 deletions doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp
Expand Up @@ -73,3 +73,9 @@ void MobjThinkerData::stateChanged(state_t const *)

void MobjThinkerData::damageReceived(int, mobj_t const *)
{}

void MobjThinkerData::operator << (Reader &from)
{
ThinkerData::operator << (from);
initBindings();
}
25 changes: 25 additions & 0 deletions doomsday/apps/libdoomsday/src/world/thinkerdata.cpp
Expand Up @@ -18,6 +18,7 @@
*/

#include "doomsday/world/thinkerdata.h"
#include "doomsday/world/map.h"

using namespace de;

Expand Down Expand Up @@ -93,6 +94,30 @@ Record const &ThinkerData::objectNamespace() const
void ThinkerData::initBindings()
{}

void ThinkerData::operator >> (Writer &to) const
{
to << world::InternalSerialId(world::THINKER_DATA)
<< d->names;
}

void ThinkerData::operator << (Reader &from)
{
world::InternalSerialId sid;
from >> sid;

switch (sid)
{
case world::THINKER_DATA:
from >> d->names;
break;

default:
throw DeserializationError("ThinkerData::operator <<",
"Invalid serial identifier " +
String::number(sid));
}
}

#ifdef DENG2_DEBUG
duint32 ThinkerData::DebugCounter::total = 0;
ThinkerData::DebugValidator ensureAllPrivateDataIsReleased;
Expand Down

0 comments on commit 6ba20fc

Please sign in to comment.