diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 794a7b43..c21ddc15 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -88834,20 +88834,20 @@ 0x00000071010bf9d0,sub_71010BF9D0,16, 0x00000071010bf9e0,DualHeap::rtti1,288, 0x00000071010bfb00,DualHeap::rtti2,92, -0x00000071010bfb5c,GlobalMessage::sc::ctor,68, -0x00000071010bfba0,sub_71010BFBA0,132, -0x00000071010bfc24,sub_71010BFC24,104, -0x00000071010bfc8c,sub_71010BFC8C,36, -0x00000071010bfcb0,j__ZdlPv_1194,4, -0x00000071010bfcb4,sub_71010BFCB4,8, -0x00000071010bfcbc,sub_71010BFCBC,8, -0x00000071010bfcc4,sub_71010BFCC4,8, -0x00000071010bfccc,sub_71010BFCCC,8, -0x00000071010bfcd4,sub_71010BFCD4,8, -0x00000071010bfcdc,sub_71010BFCDC,44, -0x00000071010bfd08,sub_71010BFD08,8, -0x00000071010bfd10,sub_71010BFD10,36, -0x00000071010bfd34,sub_71010BFD34,12, +0x00000071010bfb5c,GlobalMessage::sc::ctor,68,_ZN4ksys7MessageC1Ev +0x00000071010bfba0,sub_71010BFBA0,132,_ZN4ksys7MessageC1ERKNS_16MesTransceiverIdES3_RKNS_11MessageTypeEPvRKNS0_11DelayParamsEb +0x00000071010bfc24,sub_71010BFC24,104,_ZN4ksys7MessageC1ERKNS_16MesTransceiverIdERKNS_11MessageTypeEPvRKNS0_11DelayParamsEb +0x00000071010bfc8c,sub_71010BFC8C,36,_ZN4ksys7MessageD1Ev +0x00000071010bfcb0,j__ZdlPv_1194,4,_ZN4ksys7MessageD0Ev +0x00000071010bfcb4,sub_71010BFCB4,8,_ZNK4ksys7Message9getSourceEv +0x00000071010bfcbc,sub_71010BFCBC,8,_ZNK4ksys7Message14getDestinationEv +0x00000071010bfcc4,sub_71010BFCC4,8,_ZNK4ksys7Message7getTypeEv +0x00000071010bfccc,sub_71010BFCCC,8,_ZNK4ksys7Message11getUserDataEv +0x00000071010bfcd4,sub_71010BFCD4,8,_ZNK4ksys7Message10getField48Ev +0x00000071010bfcdc,sub_71010BFCDC,44,_ZNK4ksys7Message17shouldBeProcessedEv +0x00000071010bfd08,sub_71010BFD08,8,_ZNK4ksys7Message10getField60Ev +0x00000071010bfd10,sub_71010BFD10,36,_ZN4ksys7Message14setDestinationERKNS_16MesTransceiverIdE +0x00000071010bfd34,sub_71010BFD34,12,_ZN4ksys7Message10setField48ERKj 0x00000071010bfd40,Struct1A::ctor,56,_ZN4ksys15MessageReceiverC1Ev 0x00000071010bfd78,Struct1A::dtor,28,_ZN4ksys15MessageReceiverD1Ev 0x00000071010bfd94,j__ZdlPv_1195,4,_ZN4ksys15MessageReceiverD0Ev @@ -92681,7 +92681,7 @@ 0x00000071011f6474,sub_71011F6474,8, 0x00000071011f647c,sub_71011F647C,204, 0x00000071011f6548,sub_71011F6548,92, -0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys22MessageTransceiverBaseC1Ev +0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys22MessageTransceiverBaseC2Ev 0x00000071011f65c8,nullsub_4673,4,_ZN4ksys22MessageTransceiverBaseD1Ev 0x00000071011f65cc,j__ZdlPv_1225,4,_ZN4ksys22MessageTransceiverBaseD0Ev 0x00000071011f65d0,sub_71011F65D0,28,_ZNK4ksys22MessageTransceiverBase18checkGeneratorFlagEv diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index 48f737e5..ec2e0301 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -7,6 +7,8 @@ target_sources(uking PRIVATE Thread/ManagedTask.h Thread/ManagedTaskHandle.cpp Thread/ManagedTaskHandle.h + Thread/Message.cpp + Thread/Message.h Thread/MessageDispatcherBase.cpp Thread/MessageDispatcherBase.h Thread/MessageReceiver.cpp diff --git a/src/KingSystem/Utils/Thread/Message.cpp b/src/KingSystem/Utils/Thread/Message.cpp new file mode 100644 index 00000000..96eada1d --- /dev/null +++ b/src/KingSystem/Utils/Thread/Message.cpp @@ -0,0 +1,61 @@ +#include "KingSystem/Utils/Thread/Message.h" + +namespace ksys { + +Message::Message() = default; + +Message::Message(const MesTransceiverId& source, const MesTransceiverId& destination, + const MessageType& type, void* user_data, const Message::DelayParams& delay_params, + bool x) + : mSource(source), mDestination(destination), mType(type), mUserData(user_data), + mDelayParams(delay_params), _60(x) {} + +Message::Message(const MesTransceiverId& source, const MessageType& type, void* user_data, + const Message::DelayParams& delay_params, bool x) + : mSource(source), mType(type), mUserData(user_data), mDelayParams(delay_params), _60(x) {} + +Message::~Message() = default; + +const MesTransceiverId& Message::getSource() const { + return mSource; +} + +const MesTransceiverId& Message::getDestination() const { + return mDestination; +} + +const MessageType& Message::getType() const { + return mType; +} + +void* Message::getUserData() const { + return mUserData; +} + +u32 Message::getField48() const { + return _48; +} + +bool Message::shouldBeProcessed() const { + if (mDelayParams.delay_ticks != 0) + return false; + + if (!mDelayParams.delayer) + return true; + + return mDelayParams.delayer->shouldProcessMessage(); +} + +bool Message::getField60() const { + return _60; +} + +void Message::setDestination(const MesTransceiverId& dest) { + mDestination = dest; +} + +void Message::setField48(const u32& v) { + _48 = v; +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/Message.h b/src/KingSystem/Utils/Thread/Message.h new file mode 100644 index 00000000..15b99452 --- /dev/null +++ b/src/KingSystem/Utils/Thread/Message.h @@ -0,0 +1,67 @@ +#pragma once + +#include + +#include "KingSystem/Utils/Thread/MessageTransceiverId.h" + +namespace ksys { + +struct MessageType { + MessageType() = default; + MessageType(u32 v) : value(v) {} // NOLINT(google-explicit-constructor) + + u32 value; +}; + +class MessageDelayer { +public: + MessageDelayer() = default; + virtual ~MessageDelayer() = default; + virtual bool shouldProcessMessage() = 0; +}; + +class Message { +public: + struct DelayParams { + DelayParams() : delay_ticks(), delayer() {} + DelayParams(const DelayParams& other) { *this = other; } + // Yes, this operator is quite pointless, but we need it to match. + DelayParams& operator=(const DelayParams& other) { + delay_ticks = other.delay_ticks; + delayer = other.delayer; + return *this; + } + + int delay_ticks; + MessageDelayer* delayer; + }; + + Message(); + Message(const MesTransceiverId& source, const MesTransceiverId& destination, + const MessageType& type, void* user_data, const DelayParams& delay_params, bool x); + Message(const MesTransceiverId& source, const MessageType& type, void* user_data, + const DelayParams& delay_params, bool x); + + virtual ~Message(); + + virtual const MesTransceiverId& getSource() const; + virtual const MesTransceiverId& getDestination() const; + virtual const MessageType& getType() const; + virtual void* getUserData() const; + virtual u32 getField48() const; + virtual bool getField60() const; + virtual void setDestination(const MesTransceiverId& dest); + virtual void setField48(const u32& v); + virtual bool shouldBeProcessed() const; + +private: + MesTransceiverId mSource{}; + MesTransceiverId mDestination{}; + MessageType mType{}; + void* mUserData{}; + u32 _48 = 0xffffffff; + DelayParams mDelayParams{}; + bool _60 = true; +}; + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverId.h b/src/KingSystem/Utils/Thread/MessageTransceiverId.h index 84e19d39..8c9371b0 100644 --- a/src/KingSystem/Utils/Thread/MessageTransceiverId.h +++ b/src/KingSystem/Utils/Thread/MessageTransceiverId.h @@ -9,8 +9,9 @@ namespace ksys { class MessageReceiver; struct MesTransceiverId { - MesTransceiverId() { reset(); } - MesTransceiverId(u32& id, MessageReceiver* receiver) : id(++id), receiver(receiver) {} + MesTransceiverId() : receiver(), next() { reset(); } + MesTransceiverId(const MesTransceiverId& other) { *this = other; } + MesTransceiverId(u32& id, MessageReceiver* receiver) : id(++id), receiver(receiver), next() {} ~MesTransceiverId() { reset(); } void reset() { @@ -30,8 +31,8 @@ struct MesTransceiverId { u32 queue_id = 0xffffffff; u32 id = 0xffffffff; - MessageReceiver* receiver{}; - MesTransceiverId** next{}; + MessageReceiver* receiver; + MesTransceiverId** next; }; KSYS_CHECK_SIZE_NX150(MesTransceiverId, 0x18);