////////////////////////////////////////////////////////////////////////// // // DATAPACK // // Invocations contain a field 'datapack' which contains additional // data for the invocation, packed up in a serialized format. Executing // the invocation involves unpacking the datapack. // // The actual contents of the datapack depends on the type of invocation: // // InvocationKind::INVALID: // // Nothing. // // InvocationKind::LUA_CALL: // // A lua function call. The class name, the function name, and then // the function arguments. // // InvocationKind::LUA_EXPR: // // A block of lua source code, in plaintext. // // InvocationKind::FLUSH_PRINTS: // // Line number in ascii. // // InvocationKind::TICK: // // Nothing. // // InvocationKind::LUA_SOURCE: // // Packaged lua sourcecode. See drvutil::package_lua_source. // ////////////////////////////////////////////////////////////////////////// #ifndef INVOCATION_HPP #define INVOCATION_HPP #include "wrap-string.hpp" #include "wrap-map.hpp" #include "wrap-deque.hpp" #include "streambuffer.hpp" #include "enginewrapper.hpp" class Invocation : public eng::opnew { public: private: InvocationKind kind_; int64_t actor_; int64_t place_; eng::string datapack_; public: Invocation(); Invocation(InvocationKind kind, int64_t actor, int64_t place, std::string_view datapack); bool valid() const { return kind_ != InvocationKind::INVALID; } InvocationKind kind() const { return kind_; } int64_t actor() const { return actor_; } int64_t place() const { return place_; } const eng::string &datapack() const { return datapack_; } void serialize(StreamBuffer *sb) const; void deserialize(StreamBuffer *sb); eng::string debug_string() const; }; using UniqueInvocation = std::unique_ptr; class InvocationQueue : public eng::deque { }; #endif // INVOCATION_HPP