diff --git a/data/uking_functions.csv b/data/uking_functions.csv index ecc929b1..f2d6ea80 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -72818,61 +72818,61 @@ 0x0000007100d0dc3c,sub_7100D0DC3C,168,_ZNK4ksys3act20ActorConstDataAccess11linkAcquireEPNS0_12BaseProcLinkE 0x0000007100d0dce4,act::acc::Actor::baseProcLinkFromActor,168,_ZNK4ksys3act20ActorConstDataAccess22linkAcquireImmediatelyEPNS0_12BaseProcLinkE 0x0000007100d0dd8c,act::acc::Actor::getMessageTransceiverId,160, -0x0000007100d0de2c,ActorAccessor::isPlayerClass,136, -0x0000007100d0deb4,act::acc::Actor::isWeaponActorProfile,136, -0x0000007100d0df3c,act::acc::Actor::isNPCClass,136, -0x0000007100d0dfc4,sub_7100D0DFC4,136, -0x0000007100d0e04c,ActorAccessor::getActorProfile,156, +0x0000007100d0de2c,ActorAccessor::isPlayerClass,136,_ZNK4ksys3act20ActorConstDataAccess15isPlayerProfileEv +0x0000007100d0deb4,act::acc::Actor::isWeaponActorProfile,136,_ZNK4ksys3act20ActorConstDataAccess15isWeaponProfileEv +0x0000007100d0df3c,act::acc::Actor::isNPCClass,136,_ZNK4ksys3act20ActorConstDataAccess12isNPCProfileEv +0x0000007100d0dfc4,sub_7100D0DFC4,136,_ZNK4ksys3act20ActorConstDataAccess14isEnemyProfileEv +0x0000007100d0e04c,ActorAccessor::getActorProfile,156,_ZNK4ksys3act20ActorConstDataAccess10getProfileEv 0x0000007100d0e0e8,ActorAccessor::getName,156,_ZNK4ksys3act20ActorConstDataAccess7getNameEv -0x0000007100d0e184,sub_7100D0E184,176, -0x0000007100d0e234,sub_7100D0E234,180, -0x0000007100d0e2e8,sub_7100D0E2E8,180, +0x0000007100d0e184,sub_7100D0E184,176,_ZNK4ksys3act20ActorConstDataAccess11getLiftTypeEv +0x0000007100d0e234,sub_7100D0E234,180,_ZNK4ksys3act20ActorConstDataAccess19isDisableFreezeLiftEv +0x0000007100d0e2e8,sub_7100D0E2E8,180,_ZNK4ksys3act20ActorConstDataAccess17isDisableBurnLiftEv 0x0000007100d0e39c,sub_7100D0E39C,160, -0x0000007100d0e43c,act::acc::Actor::hasTagByName,160, -0x0000007100d0e4dc,act::acc::Actor::hasTag,160, -0x0000007100d0e57c,sub_7100D0E57C,148, +0x0000007100d0e43c,act::acc::Actor::hasTagByName,160,_ZNK4ksys3act20ActorConstDataAccess6hasTagEPKc +0x0000007100d0e4dc,act::acc::Actor::hasTag,160,_ZNK4ksys3act20ActorConstDataAccess6hasTagEj +0x0000007100d0e57c,sub_7100D0E57C,148,_ZNK4ksys3act20ActorConstDataAccess13getUniqueNameEv 0x0000007100d0e610,ActorAccessor::getId,140,_ZNK4ksys3act20ActorConstDataAccess5getIdEv 0x0000007100d0e69c,sub_7100D0E69C,280,_ZNK4ksys3act20ActorConstDataAccess26acquireConnectedCalcParentEPNS0_24ActorLinkConstDataAccessE 0x0000007100d0e7b4,sub_7100D0E7B4,280,_ZNK4ksys3act20ActorConstDataAccess25acquireConnectedCalcChildEPNS0_24ActorLinkConstDataAccessE -0x0000007100d0e8cc,sub_7100D0E8CC,152, -0x0000007100d0e964,act::act::Actor::deleteLater,156, -0x0000007100d0ea00,act::acc::Actor::fadeOutDelete,164, +0x0000007100d0e8cc,sub_7100D0E8CC,152,_ZNK4ksys3act20ActorConstDataAccess11checkFlag2BEv +0x0000007100d0e964,act::act::Actor::deleteLater,156,_ZNK4ksys3act20ActorConstDataAccess11deleteLaterENS0_8BaseProc12DeleteReasonE +0x0000007100d0ea00,act::acc::Actor::fadeOutDelete,164,_ZNK4ksys3act20ActorConstDataAccess8deleteExENS0_8BaseProc12DeleteReasonE 0x0000007100d0eaa4,sub_7100D0EAA4,188, -0x0000007100d0eb60,act::acc::Actor::sleep,156, -0x0000007100d0ebfc,act::acc::Actor::wakeUp,156, -0x0000007100d0ec98,act::acc::Actor::setMtxVelAngVelLife_0,244, -0x0000007100d0ed8c,act::acc::Actor::setMtxVelAngVelLife,240, -0x0000007100d0ee7c,act::acc::Actor::isStateSleep,148, -0x0000007100d0ef10,act::acc::Actor::isStateCalc,148, +0x0000007100d0eb60,act::acc::Actor::sleep,156,_ZNK4ksys3act20ActorConstDataAccess5sleepENS0_8BaseProc15SleepWakeReasonE +0x0000007100d0ebfc,act::acc::Actor::wakeUp,156,_ZNK4ksys3act20ActorConstDataAccess6wakeUpENS0_8BaseProc15SleepWakeReasonE +0x0000007100d0ec98,act::acc::Actor::setMtxVelAngVelLife_0,244,_ZNK4ksys3act20ActorConstDataAccess13setPropertiesEiRKN4sead8Matrix34IfEERKNS2_7Vector3IfEESA_SA_bii +0x0000007100d0ed8c,act::acc::Actor::setMtxVelAngVelLife,240,_ZNK4ksys3act20ActorConstDataAccess13setPropertiesERKN4sead8Matrix34IfEERKNS2_7Vector3IfEESA_SA_bii +0x0000007100d0ee7c,act::acc::Actor::isStateSleep,148,_ZNK4ksys3act20ActorConstDataAccess12isStateSleepEv +0x0000007100d0ef10,act::acc::Actor::isStateCalc,148,_ZNK4ksys3act20ActorConstDataAccess11isStateCalcEv 0x0000007100d0efa4,sub_7100D0EFA4,164, 0x0000007100d0f048,sub_7100D0F048,148, -0x0000007100d0f0dc,ActorAccessor::isDelete,164, +0x0000007100d0f0dc,ActorAccessor::isDelete,164,_ZNK4ksys3act20ActorConstDataAccess19isDeletedOrDeletingEv 0x0000007100d0f180,sub_7100D0F180,148, 0x0000007100d0f214,ActorAccessor::getField568,140, 0x0000007100d0f2a0,sub_7100D0F2A0,152, 0x0000007100d0f338,sub_7100D0F338,152, 0x0000007100d0f3d0,sub_7100D0F3D0,140, -0x0000007100d0f45c,act::getGParamList,144, -0x0000007100d0f4ec,sub_7100D0F4EC,144, +0x0000007100d0f45c,act::getGParamList,144,_ZNK4ksys3act20ActorConstDataAccess13getGParamListEv +0x0000007100d0f4ec,sub_7100D0F4EC,144,_ZNK4ksys3act20ActorConstDataAccess11getShopDataEv 0x0000007100d0f57c,sub_7100D0F57C,184, -0x0000007100d0f634,sub_7100D0F634,176, -0x0000007100d0f6e4,sub_7100D0F6E4,176, -0x0000007100d0f794,sub_7100D0F794,176, -0x0000007100d0f844,sub_7100D0F844,180, -0x0000007100d0f8f8,sub_7100D0F8F8,172, -0x0000007100d0f9a4,act::acc::Actor::getPlacementLinkData,148, -0x0000007100d0fa38,act::acc::getPlacementObj,140, -0x0000007100d0fac4,act::acc::getEnemyRank,180, -0x0000007100d0fb78,act::acc::getSameGroupActorName,256, +0x0000007100d0f634,sub_7100D0F634,176,_ZNK4ksys3act20ActorConstDataAccess19getAttackSpHitActorEv +0x0000007100d0f6e4,sub_7100D0F6E4,176,_ZNK4ksys3act20ActorConstDataAccess17getAttackSpHitTagEv +0x0000007100d0f794,sub_7100D0F794,176,_ZNK4ksys3act20ActorConstDataAccess19getAttackWeakHitTagEv +0x0000007100d0f844,sub_7100D0F844,180,_ZNK4ksys3act20ActorConstDataAccess19getAttackSpHitRatioEv +0x0000007100d0f8f8,sub_7100D0F8F8,172,_ZNK4ksys3act20ActorConstDataAccess14getAttackPowerEv +0x0000007100d0f9a4,act::acc::Actor::getPlacementLinkData,148,_ZNK4ksys3act20ActorConstDataAccess20getMapObjectLinkDataEv +0x0000007100d0fa38,act::acc::getPlacementObj,140,_ZNK4ksys3act20ActorConstDataAccess12getMapObjectEv +0x0000007100d0fac4,act::acc::getEnemyRank,180,_ZNK4ksys3act20ActorConstDataAccess12getEnemyRankEv +0x0000007100d0fb78,act::acc::getSameGroupActorName,256,_ZNK4ksys3act20ActorConstDataAccess21getSameGroupActorNameEPN4sead14SafeStringBaseIcEE 0x0000007100d0fc78,sub_7100D0FC78,220, 0x0000007100d0fd54,sub_7100D0FD54,164, 0x0000007100d0fdf8,sub_7100D0FDF8,180, 0x0000007100d0feac,sub_7100D0FEAC,156, 0x0000007100d0ff48,sub_7100D0FF48,148, 0x0000007100d0ffdc,sub_7100D0FFDC,196, -0x0000007100d100a0,sub_7100D100A0,152, +0x0000007100d100a0,sub_7100D100A0,152,_ZNK4ksys3act20ActorConstDataAccess11checkFlag18Ev 0x0000007100d10138,sub_7100D10138,248,_ZNK4ksys3act20ActorConstDataAccess22hasConnectedCalcParentEv -0x0000007100d10230,sub_7100D10230,368, +0x0000007100d10230,sub_7100D10230,368,_ZNK4ksys3act20ActorConstDataAccess26isPlayerTheConnectedParentEv 0x0000007100d103a0,act::acc::Actor::x,168, 0x0000007100d10448,sub_7100D10448,168, 0x0000007100d104f0,sub_7100D104F0,184, @@ -72913,8 +72913,8 @@ 0x0000007100d11fb0,sub_7100D11FB0,180, 0x0000007100d12064,act::actor::getField418,156, 0x0000007100d12100,sub_7100D12100,148, -0x0000007100d12194,act::acc::Actor::setParent,172, -0x0000007100d12240,act::acc::Actor::setThisActorAsChild,172, +0x0000007100d12194,act::acc::Actor::setParent,172,_ZN4ksys3act20ActorConstDataAccess20setThisActorAsParentEPNS0_8BaseProcEb +0x0000007100d12240,act::acc::Actor::setThisActorAsChild,172,_ZN4ksys3act20ActorConstDataAccess19setThisActorAsChildEPNS0_8BaseProcEb 0x0000007100d122ec,sub_7100D122EC,180, 0x0000007100d123a0,sub_7100D123A0,672, 0x0000007100d12640,sub_7100D12640,280, @@ -72958,12 +72958,12 @@ 0x0000007100d1463c,sub_7100D1463C,156, 0x0000007100d146d8,sub_7100D146D8,168, 0x0000007100d14780,sub_7100D14780,180, -0x0000007100d14834,sub_7100D14834,208, -0x0000007100d14904,sub_7100D14904,200, -0x0000007100d149cc,sub_7100D149CC,152, -0x0000007100d14a64,sub_7100D14A64,180, -0x0000007100d14b18,sub_7100D14B18,180, -0x0000007100d14bcc,sub_7100D14BCC,180, +0x0000007100d14834,sub_7100D14834,208,_ZNK4ksys3act20ActorConstDataAccess15isFlyingBalloonEv +0x0000007100d14904,sub_7100D14904,200,_ZNK4ksys3act20ActorConstDataAccess29getBalloonHungActorBaseProcIDEv +0x0000007100d149cc,sub_7100D149CC,152,_ZNK4ksys3act20ActorConstDataAccess11checkFlag25Ev +0x0000007100d14a64,sub_7100D14A64,180,_ZNK4ksys3act20ActorConstDataAccess18getHorseMoveRadiusEv +0x0000007100d14b18,sub_7100D14B18,180,_ZNK4ksys3act20ActorConstDataAccess19getHorseAvoidOffsetEv +0x0000007100d14bcc,sub_7100D14BCC,180,_ZNK4ksys3act20ActorConstDataAccess33horseTargetedIsCircularMoveAlwaysEv 0x0000007100d14c80,sub_7100D14C80,192, 0x0000007100d14d40,sub_7100D14D40,204, 0x0000007100d14e0c,sub_7100D14E0C,152, @@ -72991,7 +72991,7 @@ 0x0000007100d15e50,sub_7100D15E50,204, 0x0000007100d15f1c,golemWeakPointGetOneDrop,164, 0x0000007100d15fc0,sub_7100D15FC0,108, -0x0000007100d1602c,j_BaseProcLink::cleanUp,4, +0x0000007100d1602c,j_BaseProcLink::cleanUp,4,_ZN4ksys3act12BaseProcLinkD2Ev 0x0000007100d16030,sub_7100D16030,8, 0x0000007100d16038,AI_AIOrActionBase::ctor,84,_ZN4ksys3act2ai10ActionBaseC2ERKNS2_7InitArgE 0x0000007100d1608c,AI_AIOrActionBase::preInit,808,_ZN4ksys3act2ai10ActionBase4initEPN4sead4HeapEb diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index 6e255033..abc4c10f 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -2,6 +2,7 @@ target_sources(uking PRIVATE Profiles/actRopeBase.cpp Profiles/actRopeBase.h + actActor.cpp actActor.h actActorCaptureMgr.cpp actActorCaptureMgr.h diff --git a/src/KingSystem/ActorSystem/actActor.cpp b/src/KingSystem/ActorSystem/actActor.cpp new file mode 100644 index 00000000..ec5da1c3 --- /dev/null +++ b/src/KingSystem/ActorSystem/actActor.cpp @@ -0,0 +1,10 @@ +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/ActorSystem/actActorParam.h" + +namespace ksys::act { + +const sead::SafeString& Actor::getProfile() const { + return mActorParam->getProfile(); +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actActor.h b/src/KingSystem/ActorSystem/actActor.h index c623d4f2..36df33a3 100644 --- a/src/KingSystem/ActorSystem/actActor.h +++ b/src/KingSystem/ActorSystem/actActor.h @@ -1,11 +1,17 @@ #pragma once +#include +#include #include #include "KingSystem/ActorSystem/actBaseProc.h" #include "KingSystem/Map/mapMubinIter.h" namespace ksys { +namespace map { +class Object; +} // namespace map + namespace act { namespace ai { @@ -23,15 +29,38 @@ public: _4 = 4, }; + enum class ActorFlag { + _18 = 0x18, + _25 = 0x25, + _2b = 0x2b, + }; + + enum class DeleteType { + _1 = 1, + _2 = 2, + _3 = 3, + }; + Actor(); // FIXME ~Actor() override; SEAD_RTTI_OVERRIDE(Actor, BaseProc) + const sead::SafeString& getProfile() const; + const char* getUniqueName() const; + ai::RootAi* getRootAi() const { return mRootAi; } const ActorParam* getParam() const { return mActorParam; } + map::Object* getMapObject() const { return mMapObject; } const map::MubinIter& getMapObjIter() const { return mMapObjIter; } + bool checkFlag(ActorFlag flag) const; + bool deleteEx(DeleteType type, DeleteReason reason, bool* ok = nullptr); + + void setProperties(int x, const sead::Matrix34f& mtx, const sead::Vector3f& vel, + const sead::Vector3f& ang_vel, const sead::Vector3f& scale, + bool is_life_infinite, int i, int life) const; + virtual s32 getMaxLife(); virtual LifeRecoverInfo* getLifeRecoverInfo(); @@ -54,9 +83,11 @@ protected: /* 0x578 */ u8 TEMP_0x578[0x648 - 0x578]; /* 0x648 */ map::MubinIter mMapObjIter; /* 0x658 */ u8 TEMP_0x650[0x710 - 0x658]; - // The name could be incorrect. + /* ..... */ // The name could be incorrect. /* 0x710 */ sead::TypedBitFlag mStasisFlags; - /* 0x714 */ u8 TEMP_0x714[0x838 - 0x714]; // FIXME + /* 0x714 */ u8 TEMP_0x714[0x7c8 - 0x714]; // FIXME + /* 0x7c8 */ map::Object* mMapObject; + /* 0x7d0 */ u8 TEMP_0x7d0[0x838 - 0x7d0]; }; KSYS_CHECK_SIZE_NX150(Actor, 0x838); diff --git a/src/KingSystem/ActorSystem/actActorConstDataAccess.cpp b/src/KingSystem/ActorSystem/actActorConstDataAccess.cpp index 1765c745..209961a4 100644 --- a/src/KingSystem/ActorSystem/actActorConstDataAccess.cpp +++ b/src/KingSystem/ActorSystem/actActorConstDataAccess.cpp @@ -1,6 +1,16 @@ #include "KingSystem/ActorSystem/actActorConstDataAccess.h" #include #include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/ActorSystem/actActorParam.h" +#include "KingSystem/ActorSystem/actActorUtil.h" +#include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/Map/mapObject.h" +#include "KingSystem/Resource/GeneralParamList/resGParamListObjectAttack.h" +#include "KingSystem/Resource/GeneralParamList/resGParamListObjectEnemy.h" +#include "KingSystem/Resource/GeneralParamList/resGParamListObjectHorseTargetedInfo.h" +#include "KingSystem/Resource/GeneralParamList/resGParamListObjectLiftable.h" +#include "KingSystem/Resource/GeneralParamList/resGParamListObjectSystem.h" +#include "KingSystem/Resource/resResourceGParamList.h" namespace ksys::act { @@ -10,6 +20,10 @@ static BaseProc* getProcIfActor(BaseProc* proc) { return nullptr; } +inline Actor* ActorConstDataAccess::getActor() const { + return static_cast(getProcIfActor(mProc)); +} + bool ActorConstDataAccess::acquireActor(const ActorLinkConstDataAccess& other) { return acquire(getProcIfActor(other.mProc)); } @@ -19,11 +33,11 @@ bool ActorConstDataAccess::hasProc(BaseProc* proc) const { } bool ActorConstDataAccess::hasProc(const BaseProcLink& link) const { - return link.hasProcById(getProcIfActor(mProc)); + return link.hasProcById(getActor()); } bool ActorConstDataAccess::linkAcquire(BaseProcLink* link) const { - auto* proc = getProcIfActor(mProc); + auto* proc = getActor(); if (proc) return link->acquire(proc, false); @@ -32,7 +46,7 @@ bool ActorConstDataAccess::linkAcquire(BaseProcLink* link) const { } bool ActorConstDataAccess::linkAcquireImmediately(BaseProcLink* link) const { - auto* proc = getProcIfActor(mProc); + auto* proc = getActor(); if (proc) return link->acquire(proc, true); @@ -40,6 +54,27 @@ bool ActorConstDataAccess::linkAcquireImmediately(BaseProcLink* link) const { return false; } +bool ActorConstDataAccess::isPlayerProfile() const { + return act::isPlayerProfile(getActor()); +} + +bool ActorConstDataAccess::isWeaponProfile() const { + return act::isWeaponProfile(getActor()); +} + +bool ActorConstDataAccess::isNPCProfile() const { + return act::isNPCProfile(getActor()); +} + +bool ActorConstDataAccess::isEnemyProfile() const { + return act::isEnemyProfile(getActor()); +} + +const sead::SafeString& ActorConstDataAccess::getProfile() const { + auto* actor = getActor(); + return actor && actor->getParam() ? actor->getProfile() : sead::SafeString::cEmptyString; +} + void ActorConstDataAccess::debugLog(s32, const sead::SafeString&) const { // Intentionally left empty. } @@ -51,15 +86,57 @@ const sead::SafeString& ActorConstDataAccess::getName() const { return proc->getName(); } +const sead::SafeString& ActorConstDataAccess::getLiftType() const { + auto* actor = getActor(); + if (!actor) + return sead::SafeString::cEmptyString; + return actor->getParam()->getRes().mGParamList->getLiftable()->mLiftType.ref(); +} + +bool ActorConstDataAccess::isDisableFreezeLift() const { + auto* actor = getActor(); + if (!actor) + return false; + return actor->getParam()->getRes().mGParamList->getLiftable()->mDisableFreezeLift.ref(); +} + +bool ActorConstDataAccess::isDisableBurnLift() const { + auto* actor = getActor(); + if (!actor) + return false; + return actor->getParam()->getRes().mGParamList->getLiftable()->mDisableBurnLift.ref(); +} + +bool ActorConstDataAccess::hasTag(const char* tag) const { + auto* actor = getActor(); + if (!actor) + return false; + return actor->getParam()->getRes().mActorLink->hasTag(tag); +} + +bool ActorConstDataAccess::hasTag(u32 tag) const { + auto* actor = getActor(); + if (!actor) + return false; + return actor->getParam()->getRes().mActorLink->hasTag(tag); +} + +const char* ActorConstDataAccess::getUniqueName() const { + auto* actor = getActor(); + if (!actor) + return nullptr; + return actor->getUniqueName(); +} + u32 ActorConstDataAccess::getId() const { - auto* proc = getProcIfActor(mProc); + auto* proc = getActor(); if (!proc) return 0xffffffff; return proc->getId(); } bool ActorConstDataAccess::acquireConnectedCalcParent(ActorLinkConstDataAccess* accessor) const { - auto* proc = getProcIfActor(mProc); + auto* proc = getActor(); if (!proc) return false; @@ -68,7 +145,7 @@ bool ActorConstDataAccess::acquireConnectedCalcParent(ActorLinkConstDataAccess* } bool ActorConstDataAccess::acquireConnectedCalcChild(ActorLinkConstDataAccess* accessor) const { - auto* proc = getProcIfActor(mProc); + auto* proc = getActor(); if (!proc) return false; @@ -77,10 +154,258 @@ bool ActorConstDataAccess::acquireConnectedCalcChild(ActorLinkConstDataAccess* a } bool ActorConstDataAccess::hasConnectedCalcParent() const { - auto* proc = getProcIfActor(mProc); + auto* proc = getActor(); return proc && sead::DynamicCast(proc->getConnectedCalcParent()) != nullptr; } +bool ActorConstDataAccess::checkFlag2B() const { + auto* actor = getActor(); + if (!actor) + return false; + return actor->checkFlag(Actor::ActorFlag::_2b); +} + +bool ActorConstDataAccess::deleteLater(BaseProc::DeleteReason reason) const { + auto* actor = getActor(); + if (!actor) + return false; + return actor->deleteLater(reason); +} + +bool ActorConstDataAccess::deleteEx(BaseProc::DeleteReason reason) const { + auto* actor = getActor(); + if (!actor) + return false; + return actor->deleteEx(Actor::DeleteType::_1, reason); +} + +bool ActorConstDataAccess::sleep(BaseProc::SleepWakeReason reason) const { + auto* actor = getActor(); + if (!actor) + return false; + actor->sleep(reason); + return true; +} + +bool ActorConstDataAccess::wakeUp(BaseProc::SleepWakeReason reason) const { + auto* actor = getActor(); + if (!actor) + return false; + actor->wakeUp(reason); + return true; +} + +bool ActorConstDataAccess::setProperties(int x, const sead::Matrix34f& mtx, + const sead::Vector3f& vel, const sead::Vector3f& ang_vel, + const sead::Vector3f& scale, bool is_life_infinite, int i, + int life) const { + auto* actor = getActor(); + if (!actor) + return false; + actor->setProperties(x, mtx, vel, ang_vel, scale, is_life_infinite, i, life); + return true; +} + +bool ActorConstDataAccess::setProperties(const sead::Matrix34f& mtx, const sead::Vector3f& vel, + const sead::Vector3f& ang_vel, const sead::Vector3f& scale, + bool is_life_infinite, int i, int life) const { + return setProperties(0, mtx, vel, ang_vel, scale, is_life_infinite, i, life); +} + +bool ActorConstDataAccess::isStateSleep() const { + auto* actor = getActor(); + return actor && actor->isSleep(); +} + +bool ActorConstDataAccess::isStateCalc() const { + auto* actor = getActor(); + return actor && actor->isCalc(); +} + +bool ActorConstDataAccess::isDeletedOrDeleting() const { + auto* actor = getActor(); + return actor && actor->isDeletedOrDeleting(); +} + +res::GParamList* ActorConstDataAccess::getGParamList() const { + auto* actor = getActor(); + if (!actor) + return nullptr; + return actor->getParam()->getRes().mGParamList; +} + +res::Shop* ActorConstDataAccess::getShopData() const { + auto* actor = getActor(); + if (!actor) + return nullptr; + return actor->getParam()->getRes().mShopData; +} + +const sead::SafeString& ActorConstDataAccess::getAttackSpHitActor() const { + auto* actor = getActor(); + if (!actor) + return sead::SafeString::cEmptyString; + return actor->getParam()->getRes().mGParamList->getAttack()->mSpHitActor.ref(); +} + +const sead::SafeString& ActorConstDataAccess::getAttackSpHitTag() const { + auto* actor = getActor(); + if (!actor) + return sead::SafeString::cEmptyString; + return actor->getParam()->getRes().mGParamList->getAttack()->mSpHitTag.ref(); +} + +const sead::SafeString& ActorConstDataAccess::getAttackWeakHitTag() const { + auto* actor = getActor(); + if (!actor) + return sead::SafeString::cEmptyString; + return actor->getParam()->getRes().mGParamList->getAttack()->mSpWeakHitActor.ref(); +} + +f32 ActorConstDataAccess::getAttackSpHitRatio() const { + auto* actor = getActor(); + if (!actor) + return 1.0f; + return actor->getParam()->getRes().mGParamList->getAttack()->mSpHitRatio.ref(); +} + +s32 ActorConstDataAccess::getAttackPower() const { + auto* actor = getActor(); + if (!actor) + return 0; + return actor->getParam()->getRes().mGParamList->getAttack()->mPower.ref(); +} + +map::ObjectLinkData* ActorConstDataAccess::getMapObjectLinkData() const { + auto* actor = getActor(); + if (!actor) + return nullptr; + + auto* object = actor->getMapObject(); + if (!object) + return nullptr; + + return object->getLinkData(); +} + +map::Object* ActorConstDataAccess::getMapObject() const { + auto* actor = getActor(); + if (!actor) + return nullptr; + return actor->getMapObject(); +} + +s32 ActorConstDataAccess::getEnemyRank() const { + auto* actor = getActor(); + if (!actor) + return 0; + + auto* gparam = actor->getParam()->getRes().mGParamList; + if (!gparam || !gparam->getEnemy()) + return 0; + + return gparam->getEnemy()->mRank.ref(); +} + +bool ActorConstDataAccess::getSameGroupActorName(sead::SafeString* name) const { + auto* actor = getActor(); + if (!actor) { + *name = sead::SafeString::cEmptyString; + return false; + } + + auto* gparam = actor->getParam()->getRes().mGParamList; + if (!gparam || !gparam->getSystem()) { + *name = actor->getName(); + return false; + } + + const auto& group_name = gparam->getSystem()->mSameGroupActorName.ref(); + if (group_name.isEmpty()) { + *name = actor->getName(); + return false; + } + + *name = group_name; + return true; +} + +bool ActorConstDataAccess::checkFlag18() const { + auto* actor = getActor(); + return actor && actor->checkFlag(Actor::ActorFlag::_18); +} + +bool ActorConstDataAccess::isPlayerTheConnectedParent() const { + auto* actor = getActor(); + if (!actor) + return false; + + auto* parent = sead::DynamicCast(actor->getConnectedCalcParent()); + if (!parent) + return false; + + return parent->getProfile() == "Player"; +} + +void ActorConstDataAccess::setThisActorAsParent(BaseProc* child, bool delete_parent_on_delete) { + auto* actor = getActor(); + if (!actor) + return; + child->setConnectedCalcParent(actor, delete_parent_on_delete); +} + +void ActorConstDataAccess::setThisActorAsChild(BaseProc* parent, bool delete_child_on_delete) { + auto* actor = getActor(); + if (!actor) + return; + parent->setConnectedCalcChild(actor, delete_child_on_delete); +} + +bool ActorConstDataAccess::isFlyingBalloon() const { + auto* actor = getActor(); + if (!actor) + return false; + bool* value; + return actor->getRootAi()->getAITreeVariable(&value, "IsFlyingBalloon") && *value; +} + +u32 ActorConstDataAccess::getBalloonHungActorBaseProcID() const { + auto* actor = getActor(); + if (!actor) + return -1; + int* value; + if (!actor->getRootAi()->getAITreeVariable(&value, "BalloonHungActorBaseProcID")) + return -1; + return *value; +} + +bool ActorConstDataAccess::checkFlag25() const { + auto* actor = getActor(); + return actor && actor->checkFlag(Actor::ActorFlag::_25); +} + +f32 ActorConstDataAccess::getHorseMoveRadius() const { + auto* actor = getActor(); + if (!actor) + return -1.0; + return actor->getParam()->getRes().mGParamList->getHorseTargetedInfo()->mHorseMoveRadius.ref(); +} + +f32 ActorConstDataAccess::getHorseAvoidOffset() const { + auto* actor = getActor(); + if (!actor) + return -1.0; + return actor->getParam()->getRes().mGParamList->getHorseTargetedInfo()->mHorseAvoidOffset.ref(); +} + +bool ActorConstDataAccess::horseTargetedIsCircularMoveAlways() const { + auto* actor = getActor(); + if (!actor) + return false; + auto* gparam = actor->getParam()->getRes().mGParamList; + return gparam->getHorseTargetedInfo()->mIsCircularMoveAlways.ref(); +} + bool acquireActor(BaseProcLink* link, ActorConstDataAccess* accessor) { return link->getProcInContext([accessor](BaseProc* proc, bool valid) { if (!proc) { diff --git a/src/KingSystem/ActorSystem/actActorConstDataAccess.h b/src/KingSystem/ActorSystem/actActorConstDataAccess.h index 125021ed..0b09fb79 100644 --- a/src/KingSystem/ActorSystem/actActorConstDataAccess.h +++ b/src/KingSystem/ActorSystem/actActorConstDataAccess.h @@ -1,13 +1,27 @@ #pragma once +#include +#include #include #include "KingSystem/ActorSystem/actActorLinkConstDataAccess.h" #include "KingSystem/ActorSystem/actBaseProc.h" #include "KingSystem/ActorSystem/actBaseProcLink.h" #include "KingSystem/Utils/Types.h" +namespace ksys::map { +class Object; +class ObjectLinkData; +} // namespace ksys::map + +namespace ksys::res { +class GParamList; +class Shop; +} // namespace ksys::res + namespace ksys::act { +class Actor; + class ActorConstDataAccess : public ActorLinkConstDataAccess { public: ActorConstDataAccess() = default; @@ -34,23 +48,77 @@ public: void debugLog(s32, const sead::SafeString& method_name) const; + bool isPlayerProfile() const; + bool isWeaponProfile() const; + bool isNPCProfile() const; + bool isEnemyProfile() const; + const sead::SafeString& getProfile() const; const sead::SafeString& getName() const; + + const sead::SafeString& getLiftType() const; + bool isDisableFreezeLift() const; + bool isDisableBurnLift() const; + bool hasTag(const char* tag) const; bool hasTag(u32 tag) const; + const char* getUniqueName() const; u32 getId() const; bool acquireConnectedCalcParent(ActorLinkConstDataAccess* accessor) const; bool acquireConnectedCalcChild(ActorLinkConstDataAccess* accessor) const; bool hasConnectedCalcParent() const; + bool checkFlag2B() const; bool deleteLater(BaseProc::DeleteReason reason) const; - bool fadeOutDelete(BaseProc::DeleteReason reason) const; + bool deleteEx(BaseProc::DeleteReason reason) const; bool sleep(BaseProc::SleepWakeReason reason) const; bool wakeUp(BaseProc::SleepWakeReason reason) const; + bool setProperties(int x, const sead::Matrix34f& mtx, const sead::Vector3f& vel, + const sead::Vector3f& ang_vel, const sead::Vector3f& scale, + bool is_life_infinite, int i, int life) const; + bool setProperties(const sead::Matrix34f& mtx, const sead::Vector3f& vel, + const sead::Vector3f& ang_vel, const sead::Vector3f& scale, + bool is_life_infinite, int i, int life) const; + bool isStateSleep() const; + bool isStateCalc() const; + bool isDeletedOrDeleting() const; + + res::GParamList* getGParamList() const; + res::Shop* getShopData() const; + + const sead::SafeString& getAttackSpHitActor() const; + const sead::SafeString& getAttackSpHitTag() const; + const sead::SafeString& getAttackWeakHitTag() const; + f32 getAttackSpHitRatio() const; + s32 getAttackPower() const; + + map::ObjectLinkData* getMapObjectLinkData() const; + map::Object* getMapObject() const; + + s32 getEnemyRank() const; + + bool getSameGroupActorName(sead::SafeString* name) const; + + bool checkFlag18() const; + bool isPlayerTheConnectedParent() const; + + void setThisActorAsParent(BaseProc* child, bool delete_parent_on_delete); + void setThisActorAsChild(BaseProc* parent, bool delete_child_on_delete); bool isAttClientEnabled(const sead::SafeString& client) const; + bool isFlyingBalloon() const; + u32 getBalloonHungActorBaseProcID() const; + + bool checkFlag25() const; + + f32 getHorseMoveRadius() const; + f32 getHorseAvoidOffset() const; + bool horseTargetedIsCircularMoveAlways() const; + private: + Actor* getActor() const; + u8 _10 = 0; }; KSYS_CHECK_SIZE_NX150(ActorConstDataAccess, 0x18); diff --git a/src/KingSystem/ActorSystem/actActorLimiter.cpp b/src/KingSystem/ActorSystem/actActorLimiter.cpp index 08925e8a..631ff074 100644 --- a/src/KingSystem/ActorSystem/actActorLimiter.cpp +++ b/src/KingSystem/ActorSystem/actActorLimiter.cpp @@ -46,7 +46,7 @@ bool ActorLimiter::List::addActor(BaseProc* proc, bool allow_evicting_old_actors acquireActor(&target_node->proc_link, &acc); } - acc.fadeOutDelete(BaseProc::DeleteReason::_15); + acc.deleteEx(BaseProc::DeleteReason::_15); } if (target_node == nullptr) diff --git a/src/KingSystem/ActorSystem/actBaseProc.h b/src/KingSystem/ActorSystem/actBaseProc.h index 7cd1388b..c17e49e2 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.h +++ b/src/KingSystem/ActorSystem/actBaseProc.h @@ -90,6 +90,7 @@ public: State getState() const { return mState; } bool isInit() const { return mState == State::Init; } bool isCalc() const { return mState == State::Calc; } + bool isSleep() const { return mState == State::Sleep; } bool isDeletedOrDeleting() const { return mState == State::Delete || mStateFlags.isOn(StateFlags::RequestDelete); }