From 6ba20fcf5eb92bb3a7b57943c8b5dc5953472aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Wed, 7 Dec 2016 07:56:38 +0200 Subject: [PATCH] libdoomsday|World: Internal thinker state is serializable --- .../libdoomsday/include/doomsday/world/map.h | 18 ++++++++++++- .../include/doomsday/world/mobjthinkerdata.h | 2 ++ .../include/doomsday/world/thinkerdata.h | 16 ++++++++---- doomsday/apps/libdoomsday/src/world/map.cpp | 6 +++++ .../libdoomsday/src/world/mobjthinkerdata.cpp | 6 +++++ .../libdoomsday/src/world/thinkerdata.cpp | 25 +++++++++++++++++++ 6 files changed, 67 insertions(+), 6 deletions(-) diff --git a/doomsday/apps/libdoomsday/include/doomsday/world/map.h b/doomsday/apps/libdoomsday/include/doomsday/world/map.h index d5af428ea2..1dd2f066c4 100644 --- a/doomsday/apps/libdoomsday/include/doomsday/world/map.h +++ b/doomsday/apps/libdoomsday/include/doomsday/world/map.h @@ -22,8 +22,9 @@ #include "../libdoomsday.h" #include "../resource/mapmanifest.h" -#include #include +#include +#include class EntityDatabase; @@ -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: @@ -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 diff --git a/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h b/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h index 09889423ff..72278960f0 100644 --- a/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h +++ b/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h @@ -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) }; diff --git a/doomsday/apps/libdoomsday/include/doomsday/world/thinkerdata.h b/doomsday/apps/libdoomsday/include/doomsday/world/thinkerdata.h index b4050c81fe..128e65a1cf 100644 --- a/doomsday/apps/libdoomsday/include/doomsday/world/thinkerdata.h +++ b/doomsday/apps/libdoomsday/include/doomsday/world/thinkerdata.h @@ -25,6 +25,7 @@ #include #include #include +#include /** * Base class for thinker private data. @@ -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 &)) @@ -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; @@ -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) diff --git a/doomsday/apps/libdoomsday/src/world/map.cpp b/doomsday/apps/libdoomsday/src/world/map.cpp index 43292be7c3..58dd57644f 100644 --- a/doomsday/apps/libdoomsday/src/world/map.cpp +++ b/doomsday/apps/libdoomsday/src/world/map.cpp @@ -96,4 +96,10 @@ EntityDatabase &BaseMap::entityDatabase() const return d->entityDatabase; } +void BaseMap::serializeInternalState(Writer &) const +{} + +void BaseMap::deserializeInternalState(Reader &) +{} + } // namespace world diff --git a/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp b/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp index e47fd052ef..d2bfe100ac 100644 --- a/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp +++ b/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp @@ -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(); +} diff --git a/doomsday/apps/libdoomsday/src/world/thinkerdata.cpp b/doomsday/apps/libdoomsday/src/world/thinkerdata.cpp index ce0f025de3..e9e3b6eb6d 100644 --- a/doomsday/apps/libdoomsday/src/world/thinkerdata.cpp +++ b/doomsday/apps/libdoomsday/src/world/thinkerdata.cpp @@ -18,6 +18,7 @@ */ #include "doomsday/world/thinkerdata.h" +#include "doomsday/world/map.h" using namespace de; @@ -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;