diff --git a/CMakeLists.txt b/CMakeLists.txt index 15393254..b9a1c9c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ set(CMAKE_CXX_EXTENSIONS OFF) add_executable(uking) target_include_directories(uking PRIVATE src) target_compile_options(uking PRIVATE -fno-rtti -fno-exceptions) -target_compile_options(uking PRIVATE -Wall -Wextra -Wdeprecated) +target_compile_options(uking PRIVATE -Wall -Wextra -Wdeprecated -Wno-unused-parameter) target_compile_options(uking PRIVATE -fno-strict-aliasing) target_compile_options(uking PRIVATE -Wno-invalid-offsetof) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index bd60c994..4c5c5d37 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -1310,9 +1310,9 @@ 0x000000710004be58,AI_Action_ActivateAttackSensor::loadParams,436, 0x000000710004c00c,AI_Action_ActivateAttackSensor::rtti1,288, 0x000000710004c12c,AI_Action_ActivateAttackSensor::rtti2,92, -0x000000710004c188,AI_AIOrActionBase::isFlag1Set,12,_ZN4ksys3act2ai10ActionBase8isFailedEv -0x000000710004c194,AI_AIOrActionBase::isFinished,12,_ZN4ksys3act2ai10ActionBase10isFinishedEv -0x000000710004c1a0,AI_AIOrActionBase::isFlag2Set,12, +0x000000710004c188,AI_AIOrActionBase::isFlag1Set,12,_ZNK4ksys3act2ai10ActionBase8isFailedEv +0x000000710004c194,AI_AIOrActionBase::isFinished,12,_ZNK4ksys3act2ai10ActionBase10isFinishedEv +0x000000710004c1a0,AI_AIOrActionBase::isFlag2Set,12,_ZNK4ksys3act2ai10ActionBase10isFlag4SetEv 0x000000710004c1ac,AI_AIOrActionBase::ret0,8, 0x000000710004c1b4,AI_AIOrActionBase::ret0_2,8, 0x000000710004c1bc,AI_AIOrActionBase::m9_null,4, @@ -1325,7 +1325,7 @@ 0x000000710004c1ec,AI_AIOrActionBase::ret0_1,8, 0x000000710004c1f4,AI_AIOrActionBase::ret1_1,8, 0x000000710004c1fc,AI_AIOrActionBase::ret0_5,8, -0x000000710004c204,AI_ActionBase::isAction,8,_ZN4ksys3act2ai6Action8isActionEv +0x000000710004c204,AI_ActionBase::isAction,8,_ZNK4ksys3act2ai6Action8isActionEv 0x000000710004c20c,AI_AIOrActionBase::m28,16, 0x000000710004c21c,AI_AIOrActionBase::m29_null,4, 0x000000710004c220,AI_AIOrActionBase::ret0_6,8, @@ -15799,18 +15799,18 @@ 0x000000710024980c,AI_Action_SetInstEventFlag::init,8, 0x0000007100249814,AI_Action_SetInstEventFlag::oneShot,28, 0x0000007100249830,AI_Action_SetInstEventFlag::loadParams,4, -0x0000007100249834,AI_Action_SetInstEventFlag::rtti1,288, -0x0000007100249954,AI_Action_SetInstEventFlag::rtti2,92, +0x0000007100249834,AI_Action_SetInstEventFlag::rtti1,288,_ZNK5uking6action22SetInstEventFlagAction27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x0000007100249954,AI_Action_SetInstEventFlag::rtti2,92,_ZNK5uking6action22SetInstEventFlagAction18getRuntimeTypeInfoEv 0x00000071002499b0,AI_Action_SetLinkTagBasic::ctor,52,_ZN5uking6action21SetLinkTagBasicActionC1ERKN4ksys3act2ai10ActionBase7InitArgE 0x00000071002499e4,AI_Action_SetLinkTagBasic::dtor,20,_ZN5uking6action21SetLinkTagBasicActionD1Ev 0x00000071002499f8,AI_Action_SetLinkTagBasic::dtorDelete,52,_ZN5uking6action21SetLinkTagBasicActionD0Ev 0x0000007100249a2c,AI_Action_SetLinkTagBasic::init,8, -0x0000007100249a34,AI_Action_SetLinkTagBasic::enter,60,_ZN5uking6action21SetLinkTagBasicAction5enterEv +0x0000007100249a34,AI_Action_SetLinkTagBasic::enter,60,_ZN5uking6action21SetLinkTagBasicAction6enter_EPN4ksys3act2ai15InlineParamPackE 0x0000007100249a70,AI_Action_SetLinkTagBasic::calc,4, 0x0000007100249a74,AI_Action_SetLinkTagBasic::leave,4, -0x0000007100249a78,AI_Action_SetLinkTagBasic::loadParams,64,_ZN5uking6action21SetLinkTagBasicAction10loadParamsEv -0x0000007100249ab8,AI_Action_SetLinkTagBasic::rtti1,288, -0x0000007100249bd8,AI_Action_SetLinkTagBasic::rtti2,92, +0x0000007100249a78,AI_Action_SetLinkTagBasic::loadParams,64,_ZN5uking6action21SetLinkTagBasicAction11loadParams_Ev +0x0000007100249ab8,AI_Action_SetLinkTagBasic::rtti1,288,_ZNK5uking6action21SetLinkTagBasicAction27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x0000007100249bd8,AI_Action_SetLinkTagBasic::rtti2,92,_ZNK5uking6action21SetLinkTagBasicAction18getRuntimeTypeInfoEv 0x0000007100249c34,AI_Action_SetMaterialVisible::ctor,76, 0x0000007100249c80,AI_Action_SetMaterialVisible::dtor,20, 0x0000007100249c94,AI_Action_SetMaterialVisible::dtorDelete,52, @@ -72993,7 +72993,7 @@ 0x0000007100d15fc0,sub_7100D15FC0,108, 0x0000007100d1602c,j_BaseProcLink::cleanUp,4, 0x0000007100d16030,sub_7100D16030,8, -0x0000007100d16038,AI_AIOrActionBase::ctor,84,_ZN4ksys3act2ai10ActionBaseC1ERKNS2_7InitArgE +0x0000007100d16038,AI_AIOrActionBase::ctor,84,_ZN4ksys3act2ai10ActionBaseC2ERKNS2_7InitArgE 0x0000007100d1608c,AI_AIOrActionBase::preInit,808, 0x0000007100d163b4,AI_AIOrActionBase::getClassName,176, 0x0000007100d16464,AI_AIOrActionBase::x_0,24, @@ -73049,8 +73049,8 @@ 0x0000007100d17358,ai::getDefaultBaseProcHandle,16, 0x0000007100d17368,sub_7100D17368,12, 0x0000007100d17374,AI_AIOrActionBase::getDefaultString20,12, -0x0000007100d17380,AI_AIOrActionBase::rtti1,112, -0x0000007100d173f0,AI_AIOrActionBase::rtti2,92, +0x0000007100d17380,AI_AIOrActionBase::rtti1,112,_ZNK4ksys3act2ai10ActionBase27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x0000007100d173f0,AI_AIOrActionBase::rtti2,92,_ZNK4ksys3act2ai10ActionBase18getRuntimeTypeInfoEv 0x0000007100d1744c,AI_AIOrActionBase::dtorDelete,52,_ZN4ksys3act2ai10ActionBaseD0Ev 0x0000007100d17480,AI_AIOrActionBase::m20_null,4, 0x0000007100d17484,sub_7100D17484,336, @@ -73065,7 +73065,7 @@ 0x0000007100d17d84,ai::InlineParamPack::addBool,116,_ZN4ksys3act2ai15InlineParamPack7addBoolEbRKN4sead14SafeStringBaseIcEEi 0x0000007100d17df8,ai::InlineParamPack::addActor,132,_ZN4ksys3act2ai15InlineParamPack8addActorERKNS0_12BaseProcLinkERKN4sead14SafeStringBaseIcEEi 0x0000007100d17e7c,ai::InlineParamPack::addMesTransceiverId,152,_ZN4ksys3act2ai15InlineParamPack19addMesTransceiverIdERKNS_3mes13TransceiverIdERKN4sead14SafeStringBaseIcEEi -0x0000007100d17f14,sub_7100D17F14,112,_ZN4ksys3act2ai9ParamPack8getPairsEPNS1_18ParamNameTypePairsEb +0x0000007100d17f14,sub_7100D17F14,112,_ZNK4ksys3act2ai9ParamPack8getPairsEPNS1_18ParamNameTypePairsEb 0x0000007100d17f84,sub_7100D17F84,432,_ZN4ksys3act2ai18ParamNameTypePairs7addPairENS_14AIDefParamTypeERKN4sead14SafeStringBaseIcEEb 0x0000007100d18134,ai::ParamPack::getString,160,_ZNK4ksys3act2ai9ParamPack9getStringEPN4sead14SafeStringBaseIcEERKS5_ 0x0000007100d181d4,ai::ParamPack::getString_0,316,_ZNK4ksys3act2ai9ParamPack9setStringERKN4sead14SafeStringBaseIcEES7_ diff --git a/src/Game/AI/Action/actionSetInstEventFlag.h b/src/Game/AI/Action/actionSetInstEventFlag.h index 1f175eda..4d36ae6d 100644 --- a/src/Game/AI/Action/actionSetInstEventFlag.h +++ b/src/Game/AI/Action/actionSetInstEventFlag.h @@ -7,11 +7,14 @@ namespace uking::action { class SetInstEventFlagAction : public ksys::act::ai::Action { + SEAD_RTTI_OVERRIDE(SetInstEventFlagAction, ksys::act::ai::Action) public: explicit SetInstEventFlagAction(const InitArg& arg); ~SetInstEventFlagAction() override; - void oneShot() override; + bool oneShot() override; + bool init_(sead::Heap* heap) override; + void loadParams_() override; }; KSYS_CHECK_SIZE_NX150(SetInstEventFlagAction, 0x20); diff --git a/src/Game/AI/Action/actionSetLinkTagBasic.cpp b/src/Game/AI/Action/actionSetLinkTagBasic.cpp index 57003d74..ab334e56 100644 --- a/src/Game/AI/Action/actionSetLinkTagBasic.cpp +++ b/src/Game/AI/Action/actionSetLinkTagBasic.cpp @@ -3,12 +3,11 @@ namespace uking::action { -SetLinkTagBasicAction::SetLinkTagBasicAction(const InitArg& arg) - : ksys::act::ai::Action(arg) {} +SetLinkTagBasicAction::SetLinkTagBasicAction(const InitArg& arg) : ksys::act::ai::Action(arg) {} SetLinkTagBasicAction::~SetLinkTagBasicAction() = default; -void SetLinkTagBasicAction::enter() { +void SetLinkTagBasicAction::enter_(ksys::act::ai::InlineParamPack* params) { if (IsOn.value()) mActor->emitBasicSigOn(); else @@ -17,7 +16,7 @@ void SetLinkTagBasicAction::enter() { setFinished(); } -void SetLinkTagBasicAction::loadParams() { +void SetLinkTagBasicAction::loadParams_() { getParamStatic(&IsOn, "IsOn"); } diff --git a/src/Game/AI/Action/actionSetLinkTagBasic.h b/src/Game/AI/Action/actionSetLinkTagBasic.h index 0c13e487..75fd0f03 100644 --- a/src/Game/AI/Action/actionSetLinkTagBasic.h +++ b/src/Game/AI/Action/actionSetLinkTagBasic.h @@ -7,12 +7,13 @@ namespace uking::action { class SetLinkTagBasicAction : public ksys::act::ai::Action { + SEAD_RTTI_OVERRIDE(SetLinkTagBasicAction, ksys::act::ai::Action) public: explicit SetLinkTagBasicAction(const InitArg& arg); ~SetLinkTagBasicAction() override; - void enter() override; - void loadParams() override; + void enter_(ksys::act::ai::InlineParamPack* params) override; + void loadParams_() override; private: ksys::act::ai::ParamRef IsOn; diff --git a/src/KingSystem/ActorSystem/actAiAction.cpp b/src/KingSystem/ActorSystem/actAiAction.cpp index 32766b37..2710306e 100644 --- a/src/KingSystem/ActorSystem/actAiAction.cpp +++ b/src/KingSystem/ActorSystem/actAiAction.cpp @@ -4,8 +4,4 @@ namespace ksys::act::ai { Action::Action(const InitArg& arg) : ActionBase(arg) {} -bool Action::isAction() { - return true; -} - } // namespace ksys::act::ai diff --git a/src/KingSystem/ActorSystem/actAiAction.h b/src/KingSystem/ActorSystem/actAiAction.h index 2f21b6ba..a7817196 100644 --- a/src/KingSystem/ActorSystem/actAiAction.h +++ b/src/KingSystem/ActorSystem/actAiAction.h @@ -6,14 +6,15 @@ namespace ksys::act::ai { class Action : public ActionBase { + SEAD_RTTI_OVERRIDE(Action, ActionBase) public: explicit Action(const InitArg& arg); - virtual void enter() {} - virtual void loadParams() {} - virtual void oneShot() {} + void calc() override; + bool isAction() const override { return true; } - bool isAction() override; +protected: + virtual void calc_() {} }; KSYS_CHECK_SIZE_NX150(Action, 0x20); diff --git a/src/KingSystem/ActorSystem/actAiActionBase.cpp b/src/KingSystem/ActorSystem/actAiActionBase.cpp index 9c5fafac..ce814d5c 100644 --- a/src/KingSystem/ActorSystem/actAiActionBase.cpp +++ b/src/KingSystem/ActorSystem/actAiActionBase.cpp @@ -5,22 +5,26 @@ namespace ksys::act::ai { ActionBase::ActionBase(const InitArg& arg) : mActor{arg.actor}, mDefinitionIdx{u16(arg.def_idx)}, mRootIdx{u8(arg.root_idx)} {} -bool ActionBase::isFinished() { - return mStatus.isOn(Status::Finished); +bool ActionBase::isFinished() const { + return mFlags.isOn(Flag::Finished); } -bool ActionBase::isFailed() { - return mStatus.isOn(Status::Failed); +bool ActionBase::isFailed() const { + return mFlags.isOn(Flag::Failed); +} + +bool ActionBase::isFlag4Set() const { + return mFlags.isOn(Flag::_4); } void ActionBase::setFinished() { - mStatus.set(Status::Finished); - mStatus.reset(Status::Failed); + mFlags.set(Flag::Finished); + mFlags.reset(Flag::Failed); } void ActionBase::setFailed() { - mStatus.set(Status::Failed); - mStatus.reset(Status::Finished); + mFlags.set(Flag::Failed); + mFlags.reset(Flag::Finished); } } // namespace ksys::act::ai diff --git a/src/KingSystem/ActorSystem/actAiActionBase.h b/src/KingSystem/ActorSystem/actAiActionBase.h index 419c6b08..dafda2c3 100644 --- a/src/KingSystem/ActorSystem/actAiActionBase.h +++ b/src/KingSystem/ActorSystem/actAiActionBase.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include "KingSystem/ActorSystem/actActor.h" #include "KingSystem/ActorSystem/actAiParam.h" @@ -12,7 +13,9 @@ class Actor; namespace ai { +/// Base class for actions and AIs, which can be seen as looping actions. class ActionBase { + SEAD_RTTI_BASE(ActionBase) public: struct InitArg { Actor* actor; @@ -25,9 +28,40 @@ public: explicit ActionBase(const InitArg& arg); virtual ~ActionBase() = default; - virtual bool isAction(); + const char* getName() const; + bool init(sead::Heap* heap, bool load_map_or_tree_params); - enum class Status : u8 { + virtual bool isFinished() const; + virtual bool isFailed() const; + virtual bool isFlag4Set() const; + + virtual bool m7() { return false; } + virtual bool m8() { return false; } + virtual void m9() {} + virtual bool oneShot() { return true; } + virtual bool init_(sead::Heap* heap) { return true; } + virtual void enter_(InlineParamPack* params) {} + virtual bool reenter_(ActionBase* other, bool x); + virtual void leave_() {} + virtual void loadParams_() {} + virtual bool m16() { return false; } + virtual bool m17() { return false; } + virtual bool m18() { return true; } + virtual void m19() {} + virtual void calc() {} + virtual void getCurrentName(sead::BufferedSafeString* name, ActionBase* parent) const; + virtual void* m22() { return nullptr; } + virtual void getParams(ParamNameTypePairs* pairs, bool update_use_count) const; + virtual s32 m24() { return 0; } + virtual bool m25() { return true; } + virtual ActionBase* getCurrentChild() const { return nullptr; } + virtual bool isAction() const = 0; + virtual bool reenter(ActionBase* other) { return reenter_(other, false); } + virtual void postLeave() {} + virtual ActionBase* getAction(s32 idx) const { return nullptr; } + +protected: + enum class Flag : u8 { Finished = 1, Failed = 2, _4 = 4, @@ -38,9 +72,6 @@ public: _80 = 0x80, }; -protected: - bool isFinished(); - bool isFailed(); void setFinished(); void setFailed(); @@ -51,7 +82,7 @@ protected: ParamPack mParams; u16 mDefinitionIdx; u8 mRootIdx; - sead::TypedBitFlag mStatus; + sead::TypedBitFlag mFlags; u16 mClassIdx; u16 mPrevClassIdx; }; diff --git a/src/KingSystem/ActorSystem/actAiParam.cpp b/src/KingSystem/ActorSystem/actAiParam.cpp index 591cc65d..abb4fd3d 100644 --- a/src/KingSystem/ActorSystem/actAiParam.cpp +++ b/src/KingSystem/ActorSystem/actAiParam.cpp @@ -196,7 +196,7 @@ void InlineParamPack::addMesTransceiverId(const mes::TransceiverId& value, param.type = AIDefParamType::MesTransceiverId; } -void ParamPack::getPairs(ParamNameTypePairs* pairs, bool update_use_count) { +void ParamPack::getPairs(ParamNameTypePairs* pairs, bool update_use_count) const { for (auto* param = mParams; param; param = param->next) { if (param->data) pairs->addPair(param->type, param->name, update_use_count); diff --git a/src/KingSystem/ActorSystem/actAiParam.h b/src/KingSystem/ActorSystem/actAiParam.h index 8faaa69d..0a19fca4 100644 --- a/src/KingSystem/ActorSystem/actAiParam.h +++ b/src/KingSystem/ActorSystem/actAiParam.h @@ -82,7 +82,7 @@ public: bool load(const Actor& actor, const ParamNameTypePairs& pairs, s32 count, sead::Heap* heap); void* getAITreeVariablePointer(const sead::SafeString& key, AIDefParamType type, bool x) const; void copy(InlineParamPack* dest, bool x); - void getPairs(ParamNameTypePairs* pairs, bool update_use_count); + void getPairs(ParamNameTypePairs* pairs, bool update_use_count) const; bool getString(sead::SafeString* value, const sead::SafeString& key) const; bool setString(const sead::SafeString& value, const sead::SafeString& key) const;