diff --git a/data/uking_functions.csv b/data/uking_functions.csv index cfc31bfa..b8476131 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -48872,7 +48872,7 @@ 0x00000071007b6e1c,sub_71007B6E1C,92, 0x00000071007b6e78,sub_71007B6E78,160, 0x00000071007b6f18,sub_71007B6F18,24, -0x00000071007b6f30,sub_71007B6F30,12, +0x00000071007b6f30,sub_71007B6F30,12,_ZN4ksys19MesTransceiverIdGen9setField0ERKj 0x00000071007b6f3c,sub_71007B6F3C,88, 0x00000071007b6f94,StateMachineWrapper::dtor,80, 0x00000071007b6fe4,StateMachineWrapper::dtorDelete,88, @@ -88848,12 +88848,12 @@ 0x00000071010bfd08,sub_71010BFD08,8, 0x00000071010bfd10,sub_71010BFD10,36, 0x00000071010bfd34,sub_71010BFD34,12, -0x00000071010bfd40,Struct1A::ctor,56, -0x00000071010bfd78,Struct1A::dtor,28, -0x00000071010bfd94,j__ZdlPv_1195,4, -0x00000071010bfd98,Struct1C::getId,8, -0x00000071010bfda0,sub_71010BFDA0,8, -0x00000071010bfda8,nullsub_4504,4, +0x00000071010bfd40,Struct1A::ctor,56,_ZN4ksys19MesTransceiverIdGenC1Ev +0x00000071010bfd78,Struct1A::dtor,28,_ZN4ksys19MesTransceiverIdGenD1Ev +0x00000071010bfd94,j__ZdlPv_1195,4,_ZN4ksys19MesTransceiverIdGenD0Ev +0x00000071010bfd98,Struct1C::getId,8,_ZN4ksys19MesTransceiverIdGen5getIdEv +0x00000071010bfda0,sub_71010BFDA0,8,_ZN4ksys19MesTransceiverIdGen2m1EPv +0x00000071010bfda8,nullsub_4504,4,_ZN4ksys19MesTransceiverIdGen2m2EPv 0x00000071010bfdac,StateMachine::ctor,44, 0x00000071010bfdd8,StateMachine::getState,64, 0x00000071010bfe18,StateMachine::run,76, @@ -88872,29 +88872,29 @@ 0x00000071010bff78,sub_71010BFF78,52, 0x00000071010bffac,sub_71010BFFAC,52, 0x00000071010bffe0,sub_71010BFFE0,36, -0x00000071010c0004,Struct1B::ctor,56, -0x00000071010c003c,j_Struct1A::dtor,4, -0x00000071010c0040,sub_71010C0040,36, -0x00000071010c0064,sub_71010C0064,12, -0x00000071010c0070,sub_71010C0070,60, -0x00000071010c00ac,sub_71010C00AC,32, -0x00000071010c00cc,sub_71010C00CC,16, -0x00000071010c00dc,sub_71010C00DC,48, -0x00000071010c010c,sub_71010C010C,8, -0x00000071010c0114,nullsub_4510,4, -0x00000071010c0118,Struct1C::x,16, -0x00000071010c0128,sub_71010C0128,16, -0x00000071010c0138,sub_71010C0138,112, -0x00000071010c01a8,sub_71010C01A8,92, +0x00000071010c0004,Struct1B::ctor,56,_ZN4ksys21MesTransceiverIdGenExC1Ev +0x00000071010c003c,j_Struct1A::dtor,4,_ZN4ksys21MesTransceiverIdGenExD1Ev +0x00000071010c0040,sub_71010C0040,36,_ZN4ksys21MesTransceiverIdGenExD0Ev +0x00000071010c0064,sub_71010C0064,12,_ZN4ksys21MesTransceiverIdGenEx2m1EPv +0x00000071010c0070,sub_71010C0070,60,_ZN4ksys21MesTransceiverIdGenEx2m2EPv +0x00000071010c00ac,sub_71010C00AC,32,_ZNK4ksys21MesTransceiverIdGenEx9checkFlagEv +0x00000071010c00cc,sub_71010C00CC,16,_ZNK4ksys21MesTransceiverIdGenEx12checkCounterEv +0x00000071010c00dc,sub_71010C00DC,48,_ZN4ksys21MesTransceiverIdGenEx7setFlagEb +0x00000071010c010c,sub_71010C010C,8,_ZN4ksys21MesTransceiverIdGenEx2m6EPv +0x00000071010c0114,nullsub_4510,4,_ZN4ksys21MesTransceiverIdGenEx2m7EPv +0x00000071010c0118,Struct1C::x,16,_ZN4ksys21MesTransceiverIdGenEx14setFlagPointerEPh +0x00000071010c0128,sub_71010C0128,16,_ZN4ksys21MesTransceiverIdGenEx16clearFlagPointerEv +0x00000071010c0138,sub_71010C0138,112,_ZNK4ksys21MesTransceiverIdGenEx27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071010c01a8,sub_71010C01A8,92,_ZNK4ksys21MesTransceiverIdGenEx18getRuntimeTypeInfoEv 0x00000071010c0204,sub_71010C0204,104, -0x00000071010c026c,Struct1C::ctor,56, -0x00000071010c02a4,Struct1C::dtor,4, -0x00000071010c02a8,sub_71010C02A8,36, -0x00000071010c02cc,sub_71010C02CC,16, -0x00000071010c02dc,sub_71010C02DC,16, -0x00000071010c02ec,sub_71010C02EC,204, -0x00000071010c03b8,sub_71010C03B8,92, -0x00000071010c0414,sub_71010C0414,140, +0x00000071010c026c,Struct1C::ctor,56,_ZN4ksys28MesTransceiverIdGenExAdapterC1EPNS_19MesTransceiverIdGenE +0x00000071010c02a4,Struct1C::dtor,4,_ZN4ksys28MesTransceiverIdGenExAdapterD1Ev +0x00000071010c02a8,sub_71010C02A8,36,_ZN4ksys28MesTransceiverIdGenExAdapterD0Ev +0x00000071010c02cc,sub_71010C02CC,16,_ZN4ksys28MesTransceiverIdGenExAdapter2m6EPv +0x00000071010c02dc,sub_71010C02DC,16,_ZN4ksys28MesTransceiverIdGenExAdapter2m7EPv +0x00000071010c02ec,sub_71010C02EC,204,_ZNK4ksys28MesTransceiverIdGenExAdapter27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071010c03b8,sub_71010C03B8,92,_ZNK4ksys28MesTransceiverIdGenExAdapter18getRuntimeTypeInfoEv +0x00000071010c0414,sub_71010C0414,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys21MesTransceiverIdGenExEE9isDerivedEPKNS0_9InterfaceE 0x00000071010c04a0,j_j_Struct1A::dtor,4, 0x00000071010c04a4,sub_71010C04A4,36, 0x00000071010c04c8,sub_71010C04C8,16, @@ -92681,17 +92681,17 @@ 0x00000071011f6474,sub_71011F6474,8, 0x00000071011f647c,sub_71011F647C,204, 0x00000071011f6548,sub_71011F6548,92, -0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys18MessageTransceiverC1Ev -0x00000071011f65c8,nullsub_4673,4,_ZN4ksys18MessageTransceiverD1Ev -0x00000071011f65cc,j__ZdlPv_1225,4,_ZN4ksys18MessageTransceiverD0Ev -0x00000071011f65d0,sub_71011F65D0,28, -0x00000071011f65ec,sub_71011F65EC,28, -0x00000071011f6608,sub_71011F6608,8,_ZN4ksys18MessageTransceiver2m2Ev -0x00000071011f6610,sub_71011F6610,8,_ZN4ksys18MessageTransceiver2m3Ev -0x00000071011f6618,sub_71011F6618,8,_ZN4ksys18MessageTransceiver2m4Ev -0x00000071011f6620,sub_71011F6620,8,_ZN4ksys18MessageTransceiver2m5Ev -0x00000071011f6628,getGlobalMessage,8,_ZN4ksys18MessageTransceiver13getDispatcherEv -0x00000071011f6630,GlobalMessage::setGlobalPtr_,16,_ZN4ksys18MessageTransceiver19setGlobalDispatcherEPNS_21MessageDispatcherBaseE +0x00000071011f65a4,getGlobalMessagePtr,36,_ZN4ksys22MessageTransceiverBaseC1Ev +0x00000071011f65c8,nullsub_4673,4,_ZN4ksys22MessageTransceiverBaseD1Ev +0x00000071011f65cc,j__ZdlPv_1225,4,_ZN4ksys22MessageTransceiverBaseD0Ev +0x00000071011f65d0,sub_71011F65D0,28,_ZNK4ksys22MessageTransceiverBase18checkGeneratorFlagEv +0x00000071011f65ec,sub_71011F65EC,28,_ZNK4ksys22MessageTransceiverBase21checkGeneratorCounterEv +0x00000071011f6608,sub_71011F6608,8,_ZN4ksys22MessageTransceiverBase2m2Ev +0x00000071011f6610,sub_71011F6610,8,_ZN4ksys22MessageTransceiverBase2m3Ev +0x00000071011f6618,sub_71011F6618,8,_ZN4ksys22MessageTransceiverBase2m4Ev +0x00000071011f6620,sub_71011F6620,8,_ZN4ksys22MessageTransceiverBase2m5Ev +0x00000071011f6628,getGlobalMessage,8,_ZN4ksys22MessageTransceiverBase13getDispatcherEv +0x00000071011f6630,GlobalMessage::setGlobalPtr_,16,_ZN4ksys22MessageTransceiverBase19setGlobalDispatcherEPNS_21MessageDispatcherBaseE 0x00000071011f6640,sub_71011F6640,16, 0x00000071011f6650,j_j_Struct1A::dtor_1,4, 0x00000071011f6654,sub_71011F6654,36, diff --git a/lib/sead b/lib/sead index 785bd9cb..9ce3831e 160000 --- a/lib/sead +++ b/lib/sead @@ -1 +1 @@ -Subproject commit 785bd9cbc723960f10757bcf03a338f80812d1d9 +Subproject commit 9ce3831edcb432942600283f33ebc93c0b810d29 diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index 887eeadf..be2d117a 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -9,10 +9,16 @@ target_sources(uking PRIVATE Thread/ManagedTaskHandle.h Thread/MessageDispatcherBase.cpp Thread/MessageDispatcherBase.h - Thread/MessageTransceiver.cpp - Thread/MessageTransceiver.h + Thread/MessageTransceiverBase.cpp + Thread/MessageTransceiverBase.h Thread/MessageTransceiverId.cpp Thread/MessageTransceiverId.h + Thread/MessageTransceiverIdGen.cpp + Thread/MessageTransceiverIdGen.h + Thread/MessageTransceiverIdGenEx.cpp + Thread/MessageTransceiverIdGenEx.h + Thread/MessageTransceiverIdGenExAdapter.cpp + Thread/MessageTransceiverIdGenExAdapter.h Thread/Task.cpp Thread/Task.h Thread/TaskData.h diff --git a/src/KingSystem/Utils/Thread/MessageDispatcherBase.cpp b/src/KingSystem/Utils/Thread/MessageDispatcherBase.cpp index f5c8aa41..a980c558 100644 --- a/src/KingSystem/Utils/Thread/MessageDispatcherBase.cpp +++ b/src/KingSystem/Utils/Thread/MessageDispatcherBase.cpp @@ -1,5 +1,5 @@ #include "KingSystem/Utils/Thread/MessageDispatcherBase.h" -#include "KingSystem/Utils/Thread/MessageTransceiver.h" +#include "KingSystem/Utils/Thread/MessageTransceiverBase.h" namespace ksys { @@ -8,7 +8,7 @@ MessageDispatcherBase::MessageDispatcherBase() = default; MessageDispatcherBase::~MessageDispatcherBase() = default; void MessageDispatcherBase::setAsGlobalInstance() { - MessageTransceiver::setGlobalDispatcher(this); + MessageTransceiverBase::setGlobalDispatcher(this); } } // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiver.cpp b/src/KingSystem/Utils/Thread/MessageTransceiver.cpp deleted file mode 100644 index e5643150..00000000 --- a/src/KingSystem/Utils/Thread/MessageTransceiver.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "KingSystem/Utils/Thread/MessageTransceiver.h" - -namespace ksys { - -MessageTransceiver::MessageTransceiver() = default; - -MessageTransceiver::~MessageTransceiver() = default; - -bool MessageTransceiver::m2() { - return false; -} - -bool MessageTransceiver::m3() { - return false; -} - -bool MessageTransceiver::m4() { - return false; -} - -bool MessageTransceiver::m5() { - return false; -} - -MessageDispatcherBase* MessageTransceiver::getDispatcher() { - return mDispatcher; -} - -void MessageTransceiver::setGlobalDispatcher(MessageDispatcherBase* dispatcher) { - sDispatcher = dispatcher; -} - -} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverBase.cpp b/src/KingSystem/Utils/Thread/MessageTransceiverBase.cpp new file mode 100644 index 00000000..f7bb2486 --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverBase.cpp @@ -0,0 +1,44 @@ +#include "KingSystem/Utils/Thread/MessageTransceiverBase.h" +#include "KingSystem/Utils/Thread/MessageTransceiverIdGenEx.h" + +namespace ksys { + +MessageDispatcherBase* MessageTransceiverBase::sDispatcher{}; + +MessageTransceiverBase::MessageTransceiverBase() = default; + +MessageTransceiverBase::~MessageTransceiverBase() = default; + +bool MessageTransceiverBase::checkGeneratorFlag() const { + return getGenerator()->checkFlag(); +} + +bool MessageTransceiverBase::checkGeneratorCounter() const { + return getGenerator()->checkCounter(); +} + +bool MessageTransceiverBase::m2() { + return false; +} + +bool MessageTransceiverBase::m3() { + return false; +} + +bool MessageTransceiverBase::m4() { + return false; +} + +bool MessageTransceiverBase::m5() { + return false; +} + +MessageDispatcherBase* MessageTransceiverBase::getDispatcher() { + return mDispatcher; +} + +void MessageTransceiverBase::setGlobalDispatcher(MessageDispatcherBase* dispatcher) { + sDispatcher = dispatcher; +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiver.h b/src/KingSystem/Utils/Thread/MessageTransceiverBase.h similarity index 65% rename from src/KingSystem/Utils/Thread/MessageTransceiver.h rename to src/KingSystem/Utils/Thread/MessageTransceiverBase.h index 6d130120..e74ca070 100644 --- a/src/KingSystem/Utils/Thread/MessageTransceiver.h +++ b/src/KingSystem/Utils/Thread/MessageTransceiverBase.h @@ -6,18 +6,19 @@ namespace ksys { class MessageDispatcherBase; struct MesTransceiverId; +class MesTransceiverIdGenEx; -class MessageTransceiver { +class MessageTransceiverBase { public: - MessageTransceiver(); - virtual ~MessageTransceiver(); - bool checkX(); - bool checkY(); + MessageTransceiverBase(); + virtual ~MessageTransceiverBase(); + bool checkGeneratorFlag() const; + bool checkGeneratorCounter() const; virtual bool m2(); virtual bool m3(); virtual bool m4(); virtual bool m5(); - virtual void* getSomePtr() = 0; + virtual MesTransceiverIdGenEx* getGenerator() const = 0; MessageDispatcherBase* getDispatcher(); static void setGlobalDispatcher(MessageDispatcherBase* dispatcher); diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverId.h b/src/KingSystem/Utils/Thread/MessageTransceiverId.h index f071483e..71b97d13 100644 --- a/src/KingSystem/Utils/Thread/MessageTransceiverId.h +++ b/src/KingSystem/Utils/Thread/MessageTransceiverId.h @@ -6,29 +6,34 @@ namespace ksys { +class MesTransceiverIdGen; + struct MesTransceiverId { MesTransceiverId() { reset(); } + MesTransceiverId(u32& id, MesTransceiverIdGen* generator) + : _0(0xffffffff), id(++id), generator(generator) {} + ~MesTransceiverId() { reset(); } void reset() { - _0 = -1; - _4 = -1; - _8 = nullptr; - _10 = nullptr; + _0 = 0xffffffff; + id = 0xffffffff; + generator = nullptr; + next = nullptr; } MesTransceiverId& operator=(const MesTransceiverId& other) { _0 = other._0; - _4 = other._4; - _8 = other._8; - _10 = other._10; + id = other.id; + generator = other.generator; + next = other.next; return *this; } - s32 _0{}; - s32 _4{}; - void* _8{}; - void* _10{}; + u32 _0{}; + u32 id{}; + MesTransceiverIdGen* generator{}; + MesTransceiverId** next{}; }; KSYS_CHECK_SIZE_NX150(MesTransceiverId, 0x18); diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverIdGen.cpp b/src/KingSystem/Utils/Thread/MessageTransceiverIdGen.cpp new file mode 100644 index 00000000..fa1362fc --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverIdGen.cpp @@ -0,0 +1,21 @@ +#include "KingSystem/Utils/Thread/MessageTransceiverIdGen.h" + +namespace ksys { + +u32 MesTransceiverIdGen::sId{}; + +MesTransceiverIdGen::MesTransceiverIdGen() : mTransceiverId(sId, this) {} + +MesTransceiverIdGen::~MesTransceiverIdGen() = default; + +MesTransceiverId* MesTransceiverIdGen::getId() { + return &mTransceiverId; +} + +bool MesTransceiverIdGen::m1(void*) { + return true; +} + +void MesTransceiverIdGen::m2(void* x) {} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverIdGen.h b/src/KingSystem/Utils/Thread/MessageTransceiverIdGen.h new file mode 100644 index 00000000..51d365fe --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverIdGen.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include "KingSystem/Utils/Thread/MessageTransceiverId.h" + +namespace ksys { + +class MesTransceiverIdGen { +public: + MesTransceiverIdGen(); + virtual ~MesTransceiverIdGen(); + virtual MesTransceiverId* getId(); + virtual bool m1(void*); + virtual void m2(void* x); + virtual void setField0(const u32& value) { mTransceiverId._0 = value; } + +protected: + MesTransceiverId mTransceiverId; + +private: + static u32 sId; +}; + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverIdGenEx.cpp b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenEx.cpp new file mode 100644 index 00000000..0f4f87b0 --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenEx.cpp @@ -0,0 +1,53 @@ +#include "KingSystem/Utils/Thread/MessageTransceiverIdGenEx.h" + +namespace ksys { + +MesTransceiverIdGenEx::MesTransceiverIdGenEx() = default; + +MesTransceiverIdGenEx::~MesTransceiverIdGenEx() = default; + +bool MesTransceiverIdGenEx::m1(void* x) { + return m6(x); +} + +void MesTransceiverIdGenEx::m2(void* x) { + m7(x); + --mCounter; + static_cast(mCounter.load()); +} + +bool MesTransceiverIdGenEx::checkFlag() const { + return mFlag && *mFlag == 1; +} + +bool MesTransceiverIdGenEx::checkCounter() const { + return mCounter > 0; +} + +void MesTransceiverIdGenEx::setFlag(bool update_counter) { + if (mFlag) { + if (update_counter) + mCounter.increment(); + *mFlag = 1; + } +} + +bool MesTransceiverIdGenEx::m6(void* x) { + return true; +} + +void MesTransceiverIdGenEx::m7(void* x) {} + +void MesTransceiverIdGenEx::setFlagPointer(u8* ptr) { + if (ptr) { + mFlag = ptr; + *mFlag = 0; + } +} + +void MesTransceiverIdGenEx::clearFlagPointer() { + *mFlag = 0; + mFlag = nullptr; +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverIdGenEx.h b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenEx.h new file mode 100644 index 00000000..e03fb53e --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenEx.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include "KingSystem/Utils/Thread/MessageTransceiverIdGen.h" + +namespace ksys { + +class MesTransceiverIdGenEx : public MesTransceiverIdGen { +public: + MesTransceiverIdGenEx(); + ~MesTransceiverIdGenEx() override; + bool m1(void*) override; + void m2(void* x) override; + + bool checkFlag() const; + bool checkCounter() const; + void setFlag(bool update_counter); + + void setFlagPointer(u8* ptr); + void clearFlagPointer(); + + SEAD_RTTI_BASE(MesTransceiverIdGenEx) + +protected: + virtual bool m6(void* x); + virtual void m7(void* x); + +private: + u8* mFlag{}; + sead::Atomic mCounter; +}; + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverIdGenExAdapter.cpp b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenExAdapter.cpp new file mode 100644 index 00000000..c674581e --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenExAdapter.cpp @@ -0,0 +1,18 @@ +#include "KingSystem/Utils/Thread/MessageTransceiverIdGenExAdapter.h" + +namespace ksys { + +MesTransceiverIdGenExAdapter::MesTransceiverIdGenExAdapter(MesTransceiverIdGen* wrapped) + : mGenerator(wrapped) {} + +MesTransceiverIdGenExAdapter::~MesTransceiverIdGenExAdapter() = default; + +bool MesTransceiverIdGenExAdapter::m6(void* x) { + return mGenerator->m1(x); +} + +void MesTransceiverIdGenExAdapter::m7(void* x) { + return mGenerator->m2(x); +} + +} // namespace ksys diff --git a/src/KingSystem/Utils/Thread/MessageTransceiverIdGenExAdapter.h b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenExAdapter.h new file mode 100644 index 00000000..1353572c --- /dev/null +++ b/src/KingSystem/Utils/Thread/MessageTransceiverIdGenExAdapter.h @@ -0,0 +1,21 @@ +#pragma once + +#include "KingSystem/Utils/Thread/MessageTransceiverIdGenEx.h" + +namespace ksys { + +class MesTransceiverIdGenExAdapter : public MesTransceiverIdGenEx { + SEAD_RTTI_OVERRIDE(MesTransceiverIdGenExAdapter, MesTransceiverIdGenEx) +public: + explicit MesTransceiverIdGenExAdapter(MesTransceiverIdGen* wrapped); + ~MesTransceiverIdGenExAdapter() override; + +protected: + bool m6(void* x) override; + void m7(void* x) override; + +private: + MesTransceiverIdGen* mGenerator; +}; + +} // namespace ksys