From ea13bac74ad136aeb3dde81f07ccd62622be94ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Mon, 28 Sep 2026 03:39:31 +0200 Subject: ksys: move AS setting, RootAi and three others to match link order Each file moves to where its code is linked, and namespaces follow the new paths. ASSettingMgr is an unofficial name. | Old | New | |---|---| | act::ASSetting (ActorSystem/actASSetting) | res::ASSettingMgr (Resource/Actor/resResourceASSettingMgr) | | Resource/resResourceASSetting, Resource/Actor/resResourceASResourceExtension | Resource/Actor/resResourceASSetting | | ksys::DebugFinder (System/DebugFinder) | ksys::act::DebugFinder (ActorSystem/actDebugFinder) | | ActorSystem/LOD/actLodState | ActorSystem/actLodState | | ActorSystem/actAiRoot | ActorSystem/aiRootAi | | Map/mapStagePreActorCache | System/StagePreActorCache (ksys) | (AI assisted using Claude Fable 5.1 and Claude Opus 5.5) --- src/KingSystem/ActorSystem/CMakeLists.txt | 13 +- src/KingSystem/ActorSystem/LOD/actLodState.cpp | 332 --------------------- src/KingSystem/ActorSystem/LOD/actLodState.h | 58 ---- src/KingSystem/ActorSystem/actASSetting.cpp | 31 -- src/KingSystem/ActorSystem/actASSetting.h | 26 -- src/KingSystem/ActorSystem/actActor.cpp | 2 +- src/KingSystem/ActorSystem/actActorEditorNode.cpp | 2 +- .../ActorSystem/actActorLinkConstDataAccess.cpp | 2 +- src/KingSystem/ActorSystem/actActorParamMgr.cpp | 8 +- src/KingSystem/ActorSystem/actAiAction.cpp | 2 +- src/KingSystem/ActorSystem/actAiActionBase.cpp | 2 +- src/KingSystem/ActorSystem/actAiAi.cpp | 2 +- src/KingSystem/ActorSystem/actAiBehavior.cpp | 2 +- src/KingSystem/ActorSystem/actAiQuery.cpp | 2 +- src/KingSystem/ActorSystem/actAiRoot.cpp | 157 ---------- src/KingSystem/ActorSystem/actAiRoot.h | 123 -------- src/KingSystem/ActorSystem/actDebugFinder.cpp | 11 + src/KingSystem/ActorSystem/actDebugFinder.h | 19 ++ src/KingSystem/ActorSystem/actLodState.cpp | 332 +++++++++++++++++++++ src/KingSystem/ActorSystem/actLodState.h | 58 ++++ src/KingSystem/ActorSystem/aiForkAI.cpp | 2 +- src/KingSystem/ActorSystem/aiRootAi.cpp | 157 ++++++++++ src/KingSystem/ActorSystem/aiRootAi.h | 123 ++++++++ 23 files changed, 719 insertions(+), 747 deletions(-) delete mode 100644 src/KingSystem/ActorSystem/LOD/actLodState.cpp delete mode 100644 src/KingSystem/ActorSystem/LOD/actLodState.h delete mode 100644 src/KingSystem/ActorSystem/actASSetting.cpp delete mode 100644 src/KingSystem/ActorSystem/actASSetting.h delete mode 100644 src/KingSystem/ActorSystem/actAiRoot.cpp delete mode 100644 src/KingSystem/ActorSystem/actAiRoot.h create mode 100644 src/KingSystem/ActorSystem/actDebugFinder.cpp create mode 100644 src/KingSystem/ActorSystem/actDebugFinder.h create mode 100644 src/KingSystem/ActorSystem/actLodState.cpp create mode 100644 src/KingSystem/ActorSystem/actLodState.h create mode 100644 src/KingSystem/ActorSystem/aiRootAi.cpp create mode 100644 src/KingSystem/ActorSystem/aiRootAi.h (limited to 'src/KingSystem/ActorSystem') diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index c83f97de..e0b70bfd 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -13,9 +13,6 @@ target_sources(uking PRIVATE Awareness/actAwarenessInstance.h - LOD/actLodState.cpp - LOD/actLodState.h - Profiles/actRopeBase.cpp Profiles/actRopeBase.h Profiles/actWeaponBase.cpp @@ -62,10 +59,6 @@ target_sources(uking PRIVATE actAiQuery.h actAiQueries.cpp actAiQueries.h - actAiRoot.cpp - actAiRoot.h - actASSetting.cpp - actASSetting.h actBaseProc.cpp actBaseProc.h actBaseProcAccessor.cpp @@ -99,6 +92,8 @@ target_sources(uking PRIVATE actClusteredRenderer.h actDebug.cpp actDebug.h + actDebugFinder.cpp + actDebugFinder.h actGlobalParameter.cpp actGlobalParameter.h actIDamageManager.cpp @@ -110,6 +105,8 @@ target_sources(uking PRIVATE actInstParamPack.cpp actInstParamPack.h actLifeRecoveryInfo.h + actLodState.cpp + actLodState.h actPhysicsConstraints.cpp actPhysicsConstraints.h actPhysicsUserTag.cpp @@ -134,6 +131,8 @@ target_sources(uking PRIVATE aiFork6AI.h aiForkAI.cpp aiForkAI.h + aiRootAi.cpp + aiRootAi.h behaviorDummyBehavior.cpp behaviorDummyBehavior.h diff --git a/src/KingSystem/ActorSystem/LOD/actLodState.cpp b/src/KingSystem/ActorSystem/LOD/actLodState.cpp deleted file mode 100644 index 3b11296b..00000000 --- a/src/KingSystem/ActorSystem/LOD/actLodState.cpp +++ /dev/null @@ -1,332 +0,0 @@ -#include "KingSystem/ActorSystem/LOD/actLodState.h" -#include "KingSystem/ActorSystem/actActor.h" -#include "KingSystem/ActorSystem/actActorParam.h" -#include "KingSystem/ActorSystem/actActorUtil.h" -#include "KingSystem/Map/mapObject.h" -#include "KingSystem/Map/mapPlacementAreaMgr.h" -#include "KingSystem/Map/mapPlacementMgr.h" -#include "KingSystem/Resource/Actor/resResourceLod.h" -#include "KingSystem/System/OcclusionQueryCylinder.h" - -namespace ksys::act { - -// NON_MATCHING: reorders at the beginning because of initFlags -- should be equivalent -LodState::LodState(sead::Heap* heap, sead::BitFlag32 flags, Actor* actor, - int disable_calc_skip_frame, float x) - : mFlags14(flags), mActor(actor), _44(x), mDisableCalcSkipFrame(disable_calc_skip_frame) { - initFlags(); - - if (mActor->getProfile().include("Enemy") || mActor->getProfile().include("Swarm") || - mActor->getProfile().include("EnemySwarm")) { - _24 = 0; - } - if (mActor->getProfile().include("NPC")) { - _24 = 1; - } - if (mActor->getName() == "GameRomHorseBone") { - _24 = 1; - } - _25 = _24; - - if (mActor->getMapObject()) { - mDispDistance = mActor->getMapObject()->getDispDistance(); - } - - const bool is_air_octa_platform = isAirOctaPlatform(mActor->getName()); - if (!mActor->checkFlag(Actor::ActorFlag::_39) || mActor->getProfile().startsWith("Guardian")) { - if (is_air_octa_platform) { - mOcclusionQueryCylinder = new (heap) OcclusionQueryCylinder; - mOcclusionQueryCylinder->init(heap); - } - } else { - mOcclusionQueryCylinder = new (heap) OcclusionQueryCylinder; - mOcclusionQueryCylinder->init(heap); - } - - if (is_air_octa_platform) - mFlags26.set(0x40); - - if (auto* lod = mActor->getParam()->getRes().mLod) { - if (lod->mDisableConstActor.ref()) - mFlags14.set(0x1000000); - mDistanceScale = lod->mDistanceScale.ref(); - if (lod->mDisableCalcRescueDistLimit.ref()) - mFlags14.set(0x4000000); - } - - int type = 8; - if (mActor->getProfile().include("Giant") || mActor->getProfile().include("Guardian")) { - type = 1; - } else if (mActor->getProfile().include("Enemy") || mActor->getProfile().include("Swarm") || - mActor->getProfile().include("EnemySwarm")) { - type = 0; - } else if (mActor->getProfile() == "NPC") { - type = 2; - } else if (mActor->getProfile().include("Horse")) { - type = 7; - } else if (mActor->getName().include("Insect")) { - type = 4; - } else if (mActor->getName().include("Fish")) { - type = 5; - } else if (mActor->getName().include("Weapon")) { - type = 6; - } else if (mActor->getName().include("Animal")) { - type = 3; - } - mActorType = type; - _70 = 60; - - float dist = 500.0f; - - if (!hasTag(mActor, tags::Door)) { - if (mActor->getName() == "SignalFireWood" || - mActor->getName() == "DgnObj_EntranceShutter_A_01" || - mActor->getName() == "DgnObj_WarpPoint_A_01" || - mActor->getName() == "DgnObj_EntranceTerminal_A_01" || - mActor->getName().startsWith("DgnObj_DungeonEntrance_A_01") || - mActor->getName().startsWith("DgnObj_RemainsLithograph_A") || - mActor->getName().startsWith("DgnObj_RemainsLithogragh_A") || - mActor->getName() == "GreatFairyBeforeRevival" || - mActor->getName() == "TwnObj_FairySpringClose_A_01" || - mActor->getName() == "TwnObj_FairySpring_A_01" || - mActor->getName() == "Rito_BrosRock_Relief" || - mActor->getName() == "TwnObj_HyruleCastleSealCover_A_01" || - mActor->getName() == "FldObj_DownloadTerminalBody_A_01" || - mActor->getName() == "FldObj_DownloadTerminal_A_01" || - mActor->getName() == "FldObj_MapTowerWingBefore_A_01" || - mActor->getName() == "FldObj_MapTower_A_01" || - mActor->getName().startsWith("Item_CookSet") || - mActor->getName() == "DgnObj_WarpPointSP" || - mActor->getName() == "DgnObj_EntranceTerminalSP" || - mActor->getName() == "DgnObj_EntranceShutterSP" || - mActor->getName() == "DgnObj_EntranceElevatorSP" || - mActor->getName() == "DgnObj_DLC_ChampionsDungeonEntrance_A_01" || - mActor->getName().startsWith("FldObj_DLC_HeroMapRelief_Mark_A") || - mActor->getName().startsWith("FldObj_DLC_HeroMap_") || - mActor->getName() == "FldObj_DLC_HeroMapRelief_A_01") { - _70 = 60; - dist = 10.0f; - } else if (mActor->getName() == "Bros_Rock_01" || mActor->getName() == "Bros_Rock_02" || - mActor->getName() == "Bros_Rock_03" || mActor->getName() == "Bros_Rock_04" || - mActor->getName() == "Bros_Rock_05") { - _70 = 60; - dist = 30.0f; - } else if (mActor->getName() == "TwnObj_GanonGrudgeSolid_Eyeball_A_01") { - _70 = 60; - dist = 110.0f; - } else if (mActor->getName().include("TwnObj_HyruleCastleObject") || - mActor->getName().include("TwnObj_HyruleCastle_GateBridgeDoor")) { - _70 = 60; - dist = 50.0f; - } else if (mActor->getName() == "WallCrack" || mActor->getName() == "Obj_RockBroken_A_02" || - mActor->getName() == "TwnObj_HyruleCastleSealCover_A_01" || - mActor->getName() == "TwnObj_HyruleCastleMap_BossModel_A_01") { - _70 = 120; - dist = 100.0f; - } else if (mActor->getName().startsWith("MergedGrudge") && mActor->getMapObject()) { - int field_body_group = -1; - mActor->getMapObject()->getMubinIter().tryGetParamIntByKey(&field_body_group, - "FieldBodyGroup"); - if (field_body_group >= 0) { - dist = 500.0f; - } else { - _70 = 60; - dist = 10.0f; - } - } else if (mActor->getName() == "FldObj_GoronCannonSwitch_A_01" || - mActor->getName() == "FldObj_GoronCannon_A_01") { - _70 = 120; - dist = 50.0f; - } else if (mActor->getName().startsWith("Mannequin_")) { - _70 = 120; - dist = 5.0f; - } else if (mActor->getName().startsWith("KorokAnswerResponce") || - mActor->getName().startsWith("FldObj_AreaStopClimbing")) { - _70 = 900; - dist = 0.0f; - } else if (is_air_octa_platform) { - _24 = 0; - u32 hashid = 0; - if (!actor->getMapObjIter().tryGetParamUIntByKey(&hashid, "HashId") || - (hashid != 0x8F7A380B && hashid != 0x57F2CB61)) { - _78 = 85.0f; - mFlags26.set(0x30); - } - } - } - - auto* pm = map::PlacementMgr::instance(); - map::PlacementAreaMgr* ps1 = nullptr; - if (pm && pm->mPlacementActors && (ps1 = pm->mPlacementActors->mStruct1)) { - if (!ps1->mIsOneHitChallengeActive) { - if (ps1->mFlags.isOn(map::PlacementAreaMgr::Flag::FinalTrial)) { - if (actor->getName() == "DgnObj_DLC_IbutsuEx_Candle_A_01" || - actor->getName() == "TBox_Dungeon_Stone" || - actor->getName() == "DgnObj_DLC_SwordLight_A_01") { - _70 = 240; - dist = 10.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuExLava_A_01" || - actor->getName() == "DgnObj_DLC_SwitchStep_A_01" || - actor->getName() == "DgnObj_DLC_CapShutter" || - actor->getName() == "DgnObj_DLC_IbutsuExD_AncientBallSwitch_A_01" || - actor->getName() == "DungeonPit") { - _70 = 120; - dist = 50.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_F_GoalSystem_A_01" || - actor->getName() == "DgnObj_DLC_GoalShield_A" || - actor->getName() == "Npc_DungeonPriestDlc2nd_Boss" || - actor->getName() == "DgnObj_DLC_IbutsuExFloor_A_02") { - _70 = 15; - dist = 30.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuExOutWall_A_01") { - _70 = 240; - dist = 0.0f; - } else if (actor->getName().include("CylinderWall")) { - _70 = 240; - dist = 65.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_A_01") { - _70 = 240; - dist = 125.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_F_02") { - _70 = 60; - dist = 30.0f; - } else if (actor->getName() == "DgnObj_RemainsTerminalBody_A" || - actor->getName() == "FldObj_Terminal_A_01" || - actor->getName() == "DgnObj_DLC_ShutterFence_A_01" || - actor->getName() == "FldObj_DownloadTerminal_A_01" || - actor->getName() == "EventTag") { - _70 = 60; - dist = 30.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_Faucet_A_01" || - actor->getName() == "DgnObj_DLC_IbutsuEx_E_Faucet_A_02" || - actor->getName() == "SwitchTimeLag" || actor->getName() == "Area" || - actor->getName() == "ActorObserverTag") { - _70 = 60; - dist = 80.0f; - } else if (actor->getName() == "DgnObj_DLC_ShutterFence_A_01" || - actor->getName() == "DgnObj_DLC_ShutterFenceFrame_A_01") { - _70 = 60; - dist = 120.0f; - } else if (actor->getName() == "DgnObj_ElectricCable_FinalTrial" || - actor->getName() == "DgnObj_SwitchElectric0_FinalTrial" || - actor->getName() == "DgnObj_DLC_IbutsuEx_B_ElectricWire_A_02") { - _70 = 60; - dist = 90.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_B_MagnePoleAcceptor_A_01") { - _70 = 60; - dist = 75.0f; - } else if (actor->getName() == "ElectricGenerator") { - _70 = 60; - dist = 35.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuExD_Hole_A_02") { - _70 = 60; - dist = 100.0f; - } else if (actor->getName() == "DgnObj_AncientBall_B_01") { - _70 = 60; - dist = 90.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEXD_FirePillar_A_01" || - actor->getName() == "DgnObj_DLC_IbutsuEXD_FirePillar_A_02") { - _70 = 60; - dist = 75.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuExD_WallSpike_A_01" || - actor->getName() == "DgnObj_DLC_IbutsuExD_Cylinder_A_01") { - _70 = 60; - dist = 60.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_WaterPump_A_01" || - actor->getName() == "DgnObj_DungeonWater50x50_A_01") { - _70 = 60; - dist = 100.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_WaterPump_A_02") { - _70 = 60; - dist = 140.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_WaterPump_A_03") { - _70 = 60; - dist = 75.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_Shaft_A_01" || - actor->getName() == "DgnObj_DLC_IbutsuObj_StonePoleAcceptor_A_01") { - _70 = 60; - dist = 50.0f; - } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_Scaffold_A_02" || - actor->getName() == "DgnObj_DLC_IbutsuEx_E_Scaffold_A_03") { - _70 = 60; - dist = 60.0f; - } - } - } else { - if (actor->getName() == "FldObj_FlagLarge_A_01") { - _70 = 120; - dist = 70.0f; - } else if (actor->getName() == "FldObj_SoilRock_MapTower_A_01" || - actor->getName() == "TwnObj_HunterHouseLamp_A_02") { - _70 = 900; - dist = 0.0f; - } else if (actor->getName() == "TwnObj_GoddesStatue_A_01" || - actor->getName() == "FireWoodDie") { - _70 = 120; - dist = 50.0f; - } else if (actor->getName().include("FenceWoodDamage") || - actor->getName().startsWith("FldObj_Damage")) { - _70 = 30; - dist = 13.0f; - } else if (actor->getName().include("ShieldFence")) { - _70 = 30; - dist = 30.0f; - } - } - } - _6c = dist * dist; - - float value_68 = 1.0; - if (mActor->getName().startsWith("Enemy_Lynel")) { - value_68 = 2.0; - } - _68 = value_68; - - if (actor->getName() == "Npc_RitoHatago001" || actor->getName() == "Npc_TabantaHatago001" || - actor->getName() == "Npc_FaronWoods001") { - mFlags8.set(0x100000000); - } - - if (actor->getName().startsWith("Npc_Zora") && !actor->getName().isEqual("Npc_Zora003") && - !actor->getName().isEqual("Npc_ZoraB001") && !actor->getName().isEqual("Npc_Zora004")) { - mFlags8.set(0x200000000); - } - - _74 = 0.0f; - if (actor->checkFlag(Actor::ActorFlag::_29) && actor->getProfile() == "NPC") { - _74 = 900.0f; - } - - if (actor->getName().startsWith("FldObj_FlagLarge")) { - _50 = 3.0f; - } -} - -LodState::~LodState() { - if (mOcclusionQueryCylinder) - delete mOcclusionQueryCylinder; -} - -// NON_MATCHING: ????? reordering -void LodState::initFlags() { - _28 = 1.0; - _40 = 0.0; - mFlags26.reset(2); - mFlags8.set(0xFFFFFFFF'00000000); - if (!mFlags8.isOn(0x20000000)) { - mFlags8.reset(0xEFFFFFFF); - mFlags8.set(0xCFC360BF); - mFlags8.reset(0x40); - } else { - mFlags8.set(0xEFFFFFFF); - mFlags8.set(0xEFC360BF); - mFlags8.reset(0x40); - } - mFlags8.reset(0x3C9F00); - mFlags8.set(0x4000); - mFlags14.set(0x2000000); - _60 = 0xFFFF; - _64 = -3; -} - -} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/LOD/actLodState.h b/src/KingSystem/ActorSystem/LOD/actLodState.h deleted file mode 100644 index 817e1a82..00000000 --- a/src/KingSystem/ActorSystem/LOD/actLodState.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include -#include -#include "KingSystem/Utils/Types.h" - -namespace sead { -class Heap; -} - -namespace ksys { -class OcclusionQueryCylinder; -} - -namespace ksys::act { - -class Actor; - -class LodState { -public: - LodState(sead::Heap* heap, sead::BitFlag32 flags, Actor* actor, int disable_calc_skip_frame, - float x); - virtual ~LodState(); - -private: - void initFlags(); - - sead::BitFlag64 mFlags8; - sead::BitFlag32 mFlags10; - sead::BitFlag32 mFlags14; - sead::BitFlag32 mFlags18; - u32 _1c = 4; - u32 mActorType = 9; - u8 _24 = 0xff; - u8 _25; - sead::BitFlag16 mFlags26; - float _28 = 1.0; - Actor* mActor = nullptr; - OcclusionQueryCylinder* mOcclusionQueryCylinder = nullptr; - float _40 = 0.0; - float _44 = 0.0; - float _48 = 0.0; - float mDistanceScale = 1.0; - float _50 = 1.0; - float mDispDistance = 0.0; - float _58 = -1.0; - int mDisableCalcSkipFrame = 0; - u32 _60 = 0; - int _64 = -3; - float _68; - float _6c; - u32 _70; - float _74; - float _78 = 0.0; -}; -KSYS_CHECK_SIZE_NX150(LodState, 0x80); - -} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actASSetting.cpp b/src/KingSystem/ActorSystem/actASSetting.cpp deleted file mode 100644 index 2b020cfe..00000000 --- a/src/KingSystem/ActorSystem/actASSetting.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "KingSystem/ActorSystem/actASSetting.h" -#include "KingSystem/Resource/resLoadRequest.h" -#include "KingSystem/Resource/resResourceASSetting.h" - -namespace ksys::act { - -SEAD_SINGLETON_DISPOSER_IMPL(ASSetting) - -ASSetting::~ASSetting() = default; - -void ASSetting::init(const sead::SafeString& config_path, sead::Heap* heap) { - res::LoadRequest req; - req.mRequester = "ASSetting"; - req._22 = true; - mHandle.load(config_path, &req); -} - -// NON_MATCHING: sead::DirectResource to res::ASSetting cast nullptr check; branching for the return -res::ASParamParser* ASSetting::getBoneParams(const sead::SafeString& key) const { - auto* res = sead::DynamicCast(mHandle.getResource()); - if (!res) - return nullptr; - - for (auto& bones : res->getBlenderBones()) { - if (key == bones.mKeyName.ref()) - return &bones.mBoneParams; - } - return nullptr; -} - -} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actASSetting.h b/src/KingSystem/ActorSystem/actASSetting.h deleted file mode 100644 index 8c97c85a..00000000 --- a/src/KingSystem/ActorSystem/actASSetting.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include -#include -#include "KingSystem/Resource/resHandle.h" -#include "KingSystem/Resource/resResourceASSetting.h" -#include "KingSystem/Utils/Types.h" - -namespace ksys::act { - -// FIXME: very incomplete -class ASSetting { - SEAD_SINGLETON_DISPOSER(ASSetting) - ASSetting() = default; - virtual ~ASSetting(); - -public: - void init(const sead::SafeString& config_path, sead::Heap* heap); - res::ASParamParser* getBoneParams(const sead::SafeString& key) const; - -private: - res::Handle mHandle; -}; -KSYS_CHECK_SIZE_NX150(ASSetting, 0x78); - -} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actActor.cpp b/src/KingSystem/ActorSystem/actActor.cpp index ec7f3ea1..40432678 100644 --- a/src/KingSystem/ActorSystem/actActor.cpp +++ b/src/KingSystem/ActorSystem/actActor.cpp @@ -1,8 +1,8 @@ #include "KingSystem/ActorSystem/actActor.h" #include "KingSystem/ActorSystem/actActorParam.h" -#include "KingSystem/ActorSystem/actAiRoot.h" #include "KingSystem/ActorSystem/actBaseProcLink.h" #include "KingSystem/ActorSystem/actBaseProcMgr.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/Physics/System/physInstanceSet.h" namespace ksys::act { diff --git a/src/KingSystem/ActorSystem/actActorEditorNode.cpp b/src/KingSystem/ActorSystem/actActorEditorNode.cpp index 47b6621e..ecb1bf00 100644 --- a/src/KingSystem/ActorSystem/actActorEditorNode.cpp +++ b/src/KingSystem/ActorSystem/actActorEditorNode.cpp @@ -1,5 +1,5 @@ #include "KingSystem/ActorSystem/actActorEditorNode.h" -#include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/System/KingEditor.h" namespace ksys::act { diff --git a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp index 591df49e..e7ce2c15 100644 --- a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp +++ b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp @@ -3,8 +3,8 @@ #include "KingSystem/ActorSystem/actActor.h" #include "KingSystem/ActorSystem/actActorParam.h" #include "KingSystem/ActorSystem/actActorUtil.h" -#include "KingSystem/ActorSystem/actAiRoot.h" #include "KingSystem/ActorSystem/actBaseProc.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/Map/mapObject.h" #include "KingSystem/Resource/Actor/resResourceGParamList.h" #include "KingSystem/Resource/GeneralParamList/resGParamListObjectAttack.h" diff --git a/src/KingSystem/ActorSystem/actActorParamMgr.cpp b/src/KingSystem/ActorSystem/actActorParamMgr.cpp index fdf9c870..2ff51d04 100644 --- a/src/KingSystem/ActorSystem/actActorParamMgr.cpp +++ b/src/KingSystem/ActorSystem/actActorParamMgr.cpp @@ -1,11 +1,11 @@ #include "KingSystem/ActorSystem/actActorParamMgr.h" #include -#include "KingSystem/ActorSystem/actASSetting.h" #include "KingSystem/ActorSystem/actActorParam.h" #include "KingSystem/Resource/Actor/resResourceAIProgram.h" #include "KingSystem/Resource/Actor/resResourceAISchedule.h" #include "KingSystem/Resource/Actor/resResourceAS.h" #include "KingSystem/Resource/Actor/resResourceASList.h" +#include "KingSystem/Resource/Actor/resResourceASSettingMgr.h" #include "KingSystem/Resource/Actor/resResourceActorLink.h" #include "KingSystem/Resource/Actor/resResourceAnimInfo.h" #include "KingSystem/Resource/Actor/resResourceAttClient.h" @@ -140,13 +140,13 @@ void ActorParamMgr::init(sead::Heap* heap, sead::Heap* debug_heap) { res::registerEntryFactory(new (mTempHeap) res::EntryFactory(0.0, 0x80000), "bassetting"); - ASSetting::createInstance(mTempHeap); - ASSetting::instance()->init("Actor/ASSetting.bassetting", mTempHeap); + res::ASSettingMgr::createInstance(mTempHeap); + res::ASSettingMgr::instance()->init("Actor/ASSetting.bassetting", mTempHeap); ActorParam::resetDummyResources(); } ActorParamMgr::~ActorParamMgr() { - ASSetting::deleteInstance(); + res::ASSettingMgr::deleteInstance(); } bool ActorParamMgr::checkPath(const sead::SafeString& path) const { diff --git a/src/KingSystem/ActorSystem/actAiAction.cpp b/src/KingSystem/ActorSystem/actAiAction.cpp index 4c57a5e6..721afb09 100644 --- a/src/KingSystem/ActorSystem/actAiAction.cpp +++ b/src/KingSystem/ActorSystem/actAiAction.cpp @@ -2,8 +2,8 @@ #include #include "KingSystem/ActorSystem/actActor.h" #include "KingSystem/ActorSystem/actActorParam.h" -#include "KingSystem/ActorSystem/actAiRoot.h" #include "KingSystem/ActorSystem/actionDummyAction.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/Resource/Actor/resResourceAIProgram.h" namespace ksys::act::ai { diff --git a/src/KingSystem/ActorSystem/actAiActionBase.cpp b/src/KingSystem/ActorSystem/actAiActionBase.cpp index 81320ef1..794ec395 100644 --- a/src/KingSystem/ActorSystem/actAiActionBase.cpp +++ b/src/KingSystem/ActorSystem/actAiActionBase.cpp @@ -3,7 +3,7 @@ #include "KingSystem/ActorSystem/actActorParam.h" #include "KingSystem/ActorSystem/actAiAction.h" #include "KingSystem/ActorSystem/actAiInlineParam.h" -#include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/Resource/Actor/resResourceAIProgram.h" #include "KingSystem/Utils/InitTimeInfo.h" #include "KingSystem/Utils/Thread/MessageTransceiverId.h" diff --git a/src/KingSystem/ActorSystem/actAiAi.cpp b/src/KingSystem/ActorSystem/actAiAi.cpp index 26949474..7602eb47 100644 --- a/src/KingSystem/ActorSystem/actAiAi.cpp +++ b/src/KingSystem/ActorSystem/actAiAi.cpp @@ -5,8 +5,8 @@ #include "KingSystem/ActorSystem/actAiAction.h" #include "KingSystem/ActorSystem/actAiClassDef.h" #include "KingSystem/ActorSystem/actAiInlineParam.h" -#include "KingSystem/ActorSystem/actAiRoot.h" #include "KingSystem/ActorSystem/aiDummyAi.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/Resource/Actor/resResourceAIProgram.h" namespace ksys::act::ai { diff --git a/src/KingSystem/ActorSystem/actAiBehavior.cpp b/src/KingSystem/ActorSystem/actAiBehavior.cpp index 2f868984..d6e31cd4 100644 --- a/src/KingSystem/ActorSystem/actAiBehavior.cpp +++ b/src/KingSystem/ActorSystem/actAiBehavior.cpp @@ -1,7 +1,7 @@ #include "KingSystem/ActorSystem/actAiBehavior.h" #include "KingSystem/ActorSystem/actActor.h" #include "KingSystem/ActorSystem/actActorParam.h" -#include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/ActorSystem/behaviorDummyBehavior.h" #include "KingSystem/Resource/Actor/resResourceAIProgram.h" diff --git a/src/KingSystem/ActorSystem/actAiQuery.cpp b/src/KingSystem/ActorSystem/actAiQuery.cpp index 97f9ac33..cbfef6c0 100644 --- a/src/KingSystem/ActorSystem/actAiQuery.cpp +++ b/src/KingSystem/ActorSystem/actAiQuery.cpp @@ -3,7 +3,7 @@ #include "KingSystem/ActorSystem/actActor.h" #include "KingSystem/ActorSystem/actActorParam.h" #include "KingSystem/ActorSystem/actAiClassDef.h" -#include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/ActorSystem/aiRootAi.h" #include "KingSystem/Resource/Actor/resResourceAIProgram.h" namespace ksys::act::ai { diff --git a/src/KingSystem/ActorSystem/actAiRoot.cpp b/src/KingSystem/ActorSystem/actAiRoot.cpp deleted file mode 100644 index 0aa8f4ac..00000000 --- a/src/KingSystem/ActorSystem/actAiRoot.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#include "KingSystem/ActorSystem/actAiRoot.h" -#include "KingSystem/ActorSystem/actActor.h" -#include "KingSystem/ActorSystem/actAiClassDef.h" -#include "KingSystem/Utils/InitTimeInfo.h" - -namespace ksys::act::ai { - -RootAi::RootAi(const InitArg& arg) : Ai(arg) { - mBehaviorsByStopAndCalcTiming[0].fill({}); - mBehaviorsByStopAndCalcTiming[1].fill({}); -} - -RootAi::~RootAi() { - mQueries.finalize(); - mBehaviors.finalize(); - mAis.finalize(); - mActions.finalize(); - if (_140) - delete _140; -} - -bool RootAi::loadMapUnitParams(const AIDef& def, sead::Heap* heap) { - return mMapUnitParams.load(*mActor, def, heap, AIDefInstParamKind::MapUnit); -} - -bool RootAi::loadAITreeParams(const AIDef& def, sead::Heap* heap) { - return mAiTreeParams.load(*mActor, def, heap, AIDefInstParamKind::AITree); -} - -bool RootAi::isActorDeletedOrDeleting() const { - return mActor->isDeletedOrDeleting(); -} - -bool RootAi::getMapUnitParam(sead::SafeString* value, const sead::SafeString& key) const { - sead::SafeString out; - if (mMapUnitParams.getString(&out, key)) { - *value = out.cstr(); - return true; - } - *value = sead::SafeString::cEmptyString; - return false; -} - -bool RootAi::getMapUnitParam(const s32** value, const sead::SafeString& key) const { - auto* ptr = - static_cast(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Int)); - static const s32 sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -bool RootAi::getMapUnitParam(const f32** value, const sead::SafeString& key) const { - auto* ptr = - static_cast(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Float)); - static const f32 sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -bool RootAi::getMapUnitParam(const sead::Vector3f** value, const sead::SafeString& key) const { - auto* ptr = static_cast( - mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Vec3)); - *value = ptr ? ptr : &sead::Vector3f::zero; - return ptr != nullptr; -} - -bool RootAi::getMapUnitParam(const bool** value, const sead::SafeString& key) const { - auto* ptr = - static_cast(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Bool)); - static const bool sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -namespace { -sead::FixedSafeString<64> sDefaultString; - -struct Vec3Wrapper { - util::InitTimeInfoEx init_time_info_ex; - sead::Vector3f sDefaultVec3{0, 0, 0}; -}; -Vec3Wrapper sDefaultAITreeVariables; -} // namespace - -bool RootAi::getAITreeVariable(sead::SafeString** value, const sead::SafeString& key) const { - auto* ptr = static_cast( - mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::String)); - *value = ptr ? ptr : &sDefaultString; - return ptr != nullptr; -} - -bool RootAi::getAITreeVariable(s32** value, const sead::SafeString& key) const { - auto* ptr = static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Int)); - static s32 sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -bool RootAi::getAITreeVariable(f32** value, const sead::SafeString& key) const { - auto* ptr = - static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Float)); - static f32 sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -bool RootAi::getAITreeVariable(sead::Vector3f** value, const sead::SafeString& key) const { - auto* ptr = static_cast( - mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Vec3)); - *value = ptr ? ptr : &sDefaultAITreeVariables.sDefaultVec3; - return ptr != nullptr; -} - -bool RootAi::getAITreeVariable(bool** value, const sead::SafeString& key) const { - auto* ptr = - static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Bool)); - static bool sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -bool RootAi::getAITreeVariable(void** value, const sead::SafeString& key) const { - auto* ptr = static_cast( - mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::AITreeVariablePointer)); - static void* sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -bool RootAi::getAITreeVariable(u32** value, const sead::SafeString& key) const { - auto* ptr = - static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::UInt)); - static u32 sDefault{}; - *value = ptr ? ptr : &sDefault; - return ptr != nullptr; -} - -bool RootAi::getAITreeVariable2(sead::Vector3f** value, const sead::SafeString& key) const { - return getAITreeVariable(value, key); -} - -bool RootAi::getAITreeVariable2(bool** value, const sead::SafeString& key) const { - return getAITreeVariable(value, key); -} - -const char* getDefaultAiName(s32 root_idx) { - static constexpr const char* names[] = {"DemoRootAI", "Root"}; - if (root_idx >= 2) - return ""; - return names[root_idx]; -} - -const char* getDefaultActionName(s32) { - return ""; -} - -} // namespace ksys::act::ai diff --git a/src/KingSystem/ActorSystem/actAiRoot.h b/src/KingSystem/ActorSystem/actAiRoot.h deleted file mode 100644 index c9b61df6..00000000 --- a/src/KingSystem/ActorSystem/actAiRoot.h +++ /dev/null @@ -1,123 +0,0 @@ -#pragma once - -#include -#include -#include "KingSystem/ActorSystem/actAiAction.h" -#include "KingSystem/ActorSystem/actAiAi.h" -#include "KingSystem/ActorSystem/actAiBehavior.h" -#include "KingSystem/ActorSystem/actAiParam.h" -#include "KingSystem/ActorSystem/actAiQueries.h" -#include "KingSystem/ActorSystem/actAiQuery.h" -#include "KingSystem/Utils/Types.h" - -namespace ksys::act::ai { - -class IRootAi { -public: - virtual ~IRootAi() = default; -}; - -enum class RootAiFlag { - _8 = 8, -}; - -// TODO: rename -enum class RootAiFlag2 {}; - -class RootAi : public Ai, public IRootAi { - SEAD_RTTI_OVERRIDE(RootAi, Ai) -public: - explicit RootAi(const InitArg& arg); - ~RootAi() override; - - bool isChangeable() const override { return true; } - bool init_(sead::Heap* heap) override; - void enter_(InlineParamPack* params) override; - void leave_() override; - bool handleMessage_(const Message& message) override; - void calc() override; - - const ParamPack& getMapUnitParams() const { return mMapUnitParams; } - const ParamPack& getAiTreeParams() const { return mAiTreeParams; } - u32 getI() const { return mI; } - bool isActorDeletedOrDeleting() const; - - const Actions& getActions() const { return mActions; } - const Ais& getAis() const { return mAis; } - const Behaviors& getBehaviors() const { return mBehaviors; } - const Queries& getQueries() const { return mQueries; } - - bool loadMapUnitParams(const AIDef& def, sead::Heap* heap); - bool loadAITreeParams(const AIDef& def, sead::Heap* heap); - - bool getMapUnitParam(sead::SafeString* value, const sead::SafeString& key) const; - bool getMapUnitParam(const s32** value, const sead::SafeString& key) const; - bool getMapUnitParam(const f32** value, const sead::SafeString& key) const; - bool getMapUnitParam(const sead::Vector3f** value, const sead::SafeString& key) const; - bool getMapUnitParam(const bool** value, const sead::SafeString& key) const; - - bool getAITreeVariable(sead::SafeString** value, const sead::SafeString& key) const; - bool getAITreeVariable(s32** value, const sead::SafeString& key) const; - bool getAITreeVariable(f32** value, const sead::SafeString& key) const; - bool getAITreeVariable(sead::Vector3f** value, const sead::SafeString& key) const; - bool getAITreeVariable(bool** value, const sead::SafeString& key) const; - bool getAITreeVariable(void** value, const sead::SafeString& key) const; - bool getAITreeVariable(u32** value, const sead::SafeString& key) const; - // TODO: rename - bool getAITreeVariable2(sead::Vector3f** value, const sead::SafeString& key) const; - // TODO: rename - bool getAITreeVariable2(bool** value, const sead::SafeString& key) const; - - void setBehavior(Behavior* behavior); - void resetBehavior(Behavior* behavior); - -private: - friend class ActionBase; - - // TODO: rename and put this in a different translation unit - struct SomeStruct { - SomeStruct(); - virtual ~SomeStruct(); - - void* _8{}; - }; - KSYS_CHECK_SIZE_NX150(SomeStruct, 0x10); - - void calc_() override; - - f32 _40 = 1.0; - u32 _44{}; - Actions mActions; - Ais mAis; - Behaviors mBehaviors; - Queries mQueries; - sead::SafeArray mBehaviorsByStopAndCalcTiming[2]{}; - void* _138{}; - SomeStruct* _140{}; - u32 mI{}; - u16 mAt{}; - u8 _14e{}; - void* _150{}; - void* _158{}; - void* _160{}; - // TODO: is this really an atomic? - sead::Atomic _168 = 1.0; - // RootAiFlag - sead::BitFlag16 _16c; - // RootAiFlag2 - sead::BitFlag16 _16e; - ParamPack mMapUnitParams; - ParamPack mAiTreeParams; -}; -KSYS_CHECK_SIZE_NX150(RootAi, 0x180); - -const char* getDefaultAiName(s32 root_idx); -const char* getDefaultActionName(s32 idx); - -inline const char* getDefaultName(ActionType type, s32 idx) { - if (type == ActionType::AI) - return getDefaultAiName(idx); - return getDefaultActionName(idx); -} - -} // namespace ksys::act::ai diff --git a/src/KingSystem/ActorSystem/actDebugFinder.cpp b/src/KingSystem/ActorSystem/actDebugFinder.cpp new file mode 100644 index 00000000..54b4e1f8 --- /dev/null +++ b/src/KingSystem/ActorSystem/actDebugFinder.cpp @@ -0,0 +1,11 @@ +#include "KingSystem/ActorSystem/actDebugFinder.h" + +namespace ksys::act { + +SEAD_SINGLETON_DISPOSER_IMPL(DebugFinder) + +DebugFinder::DebugFinder() = default; + +DebugFinder::~DebugFinder() = default; + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actDebugFinder.h b/src/KingSystem/ActorSystem/actDebugFinder.h new file mode 100644 index 00000000..3ca020ca --- /dev/null +++ b/src/KingSystem/ActorSystem/actDebugFinder.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace ksys::act { + +class DebugFinder { + SEAD_SINGLETON_DISPOSER(DebugFinder) + DebugFinder(); + virtual ~DebugFinder(); + +private: + sead::FixedSafeString<0x40> unused_1; + sead::FixedSafeString<0x100> unused_2; + u32 unused_3 = 0; +}; + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actLodState.cpp b/src/KingSystem/ActorSystem/actLodState.cpp new file mode 100644 index 00000000..8625ab45 --- /dev/null +++ b/src/KingSystem/ActorSystem/actLodState.cpp @@ -0,0 +1,332 @@ +#include "KingSystem/ActorSystem/actLodState.h" +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/ActorSystem/actActorParam.h" +#include "KingSystem/ActorSystem/actActorUtil.h" +#include "KingSystem/Map/mapObject.h" +#include "KingSystem/Map/mapPlacementAreaMgr.h" +#include "KingSystem/Map/mapPlacementMgr.h" +#include "KingSystem/Resource/Actor/resResourceLod.h" +#include "KingSystem/System/OcclusionQueryCylinder.h" + +namespace ksys::act { + +// NON_MATCHING: reorders at the beginning because of initFlags -- should be equivalent +LodState::LodState(sead::Heap* heap, sead::BitFlag32 flags, Actor* actor, + int disable_calc_skip_frame, float x) + : mFlags14(flags), mActor(actor), _44(x), mDisableCalcSkipFrame(disable_calc_skip_frame) { + initFlags(); + + if (mActor->getProfile().include("Enemy") || mActor->getProfile().include("Swarm") || + mActor->getProfile().include("EnemySwarm")) { + _24 = 0; + } + if (mActor->getProfile().include("NPC")) { + _24 = 1; + } + if (mActor->getName() == "GameRomHorseBone") { + _24 = 1; + } + _25 = _24; + + if (mActor->getMapObject()) { + mDispDistance = mActor->getMapObject()->getDispDistance(); + } + + const bool is_air_octa_platform = isAirOctaPlatform(mActor->getName()); + if (!mActor->checkFlag(Actor::ActorFlag::_39) || mActor->getProfile().startsWith("Guardian")) { + if (is_air_octa_platform) { + mOcclusionQueryCylinder = new (heap) OcclusionQueryCylinder; + mOcclusionQueryCylinder->init(heap); + } + } else { + mOcclusionQueryCylinder = new (heap) OcclusionQueryCylinder; + mOcclusionQueryCylinder->init(heap); + } + + if (is_air_octa_platform) + mFlags26.set(0x40); + + if (auto* lod = mActor->getParam()->getRes().mLod) { + if (lod->mDisableConstActor.ref()) + mFlags14.set(0x1000000); + mDistanceScale = lod->mDistanceScale.ref(); + if (lod->mDisableCalcRescueDistLimit.ref()) + mFlags14.set(0x4000000); + } + + int type = 8; + if (mActor->getProfile().include("Giant") || mActor->getProfile().include("Guardian")) { + type = 1; + } else if (mActor->getProfile().include("Enemy") || mActor->getProfile().include("Swarm") || + mActor->getProfile().include("EnemySwarm")) { + type = 0; + } else if (mActor->getProfile() == "NPC") { + type = 2; + } else if (mActor->getProfile().include("Horse")) { + type = 7; + } else if (mActor->getName().include("Insect")) { + type = 4; + } else if (mActor->getName().include("Fish")) { + type = 5; + } else if (mActor->getName().include("Weapon")) { + type = 6; + } else if (mActor->getName().include("Animal")) { + type = 3; + } + mActorType = type; + _70 = 60; + + float dist = 500.0f; + + if (!hasTag(mActor, tags::Door)) { + if (mActor->getName() == "SignalFireWood" || + mActor->getName() == "DgnObj_EntranceShutter_A_01" || + mActor->getName() == "DgnObj_WarpPoint_A_01" || + mActor->getName() == "DgnObj_EntranceTerminal_A_01" || + mActor->getName().startsWith("DgnObj_DungeonEntrance_A_01") || + mActor->getName().startsWith("DgnObj_RemainsLithograph_A") || + mActor->getName().startsWith("DgnObj_RemainsLithogragh_A") || + mActor->getName() == "GreatFairyBeforeRevival" || + mActor->getName() == "TwnObj_FairySpringClose_A_01" || + mActor->getName() == "TwnObj_FairySpring_A_01" || + mActor->getName() == "Rito_BrosRock_Relief" || + mActor->getName() == "TwnObj_HyruleCastleSealCover_A_01" || + mActor->getName() == "FldObj_DownloadTerminalBody_A_01" || + mActor->getName() == "FldObj_DownloadTerminal_A_01" || + mActor->getName() == "FldObj_MapTowerWingBefore_A_01" || + mActor->getName() == "FldObj_MapTower_A_01" || + mActor->getName().startsWith("Item_CookSet") || + mActor->getName() == "DgnObj_WarpPointSP" || + mActor->getName() == "DgnObj_EntranceTerminalSP" || + mActor->getName() == "DgnObj_EntranceShutterSP" || + mActor->getName() == "DgnObj_EntranceElevatorSP" || + mActor->getName() == "DgnObj_DLC_ChampionsDungeonEntrance_A_01" || + mActor->getName().startsWith("FldObj_DLC_HeroMapRelief_Mark_A") || + mActor->getName().startsWith("FldObj_DLC_HeroMap_") || + mActor->getName() == "FldObj_DLC_HeroMapRelief_A_01") { + _70 = 60; + dist = 10.0f; + } else if (mActor->getName() == "Bros_Rock_01" || mActor->getName() == "Bros_Rock_02" || + mActor->getName() == "Bros_Rock_03" || mActor->getName() == "Bros_Rock_04" || + mActor->getName() == "Bros_Rock_05") { + _70 = 60; + dist = 30.0f; + } else if (mActor->getName() == "TwnObj_GanonGrudgeSolid_Eyeball_A_01") { + _70 = 60; + dist = 110.0f; + } else if (mActor->getName().include("TwnObj_HyruleCastleObject") || + mActor->getName().include("TwnObj_HyruleCastle_GateBridgeDoor")) { + _70 = 60; + dist = 50.0f; + } else if (mActor->getName() == "WallCrack" || mActor->getName() == "Obj_RockBroken_A_02" || + mActor->getName() == "TwnObj_HyruleCastleSealCover_A_01" || + mActor->getName() == "TwnObj_HyruleCastleMap_BossModel_A_01") { + _70 = 120; + dist = 100.0f; + } else if (mActor->getName().startsWith("MergedGrudge") && mActor->getMapObject()) { + int field_body_group = -1; + mActor->getMapObject()->getMubinIter().tryGetParamIntByKey(&field_body_group, + "FieldBodyGroup"); + if (field_body_group >= 0) { + dist = 500.0f; + } else { + _70 = 60; + dist = 10.0f; + } + } else if (mActor->getName() == "FldObj_GoronCannonSwitch_A_01" || + mActor->getName() == "FldObj_GoronCannon_A_01") { + _70 = 120; + dist = 50.0f; + } else if (mActor->getName().startsWith("Mannequin_")) { + _70 = 120; + dist = 5.0f; + } else if (mActor->getName().startsWith("KorokAnswerResponce") || + mActor->getName().startsWith("FldObj_AreaStopClimbing")) { + _70 = 900; + dist = 0.0f; + } else if (is_air_octa_platform) { + _24 = 0; + u32 hashid = 0; + if (!actor->getMapObjIter().tryGetParamUIntByKey(&hashid, "HashId") || + (hashid != 0x8F7A380B && hashid != 0x57F2CB61)) { + _78 = 85.0f; + mFlags26.set(0x30); + } + } + } + + auto* pm = map::PlacementMgr::instance(); + map::PlacementAreaMgr* ps1 = nullptr; + if (pm && pm->mPlacementActors && (ps1 = pm->mPlacementActors->mStruct1)) { + if (!ps1->mIsOneHitChallengeActive) { + if (ps1->mFlags.isOn(map::PlacementAreaMgr::Flag::FinalTrial)) { + if (actor->getName() == "DgnObj_DLC_IbutsuEx_Candle_A_01" || + actor->getName() == "TBox_Dungeon_Stone" || + actor->getName() == "DgnObj_DLC_SwordLight_A_01") { + _70 = 240; + dist = 10.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuExLava_A_01" || + actor->getName() == "DgnObj_DLC_SwitchStep_A_01" || + actor->getName() == "DgnObj_DLC_CapShutter" || + actor->getName() == "DgnObj_DLC_IbutsuExD_AncientBallSwitch_A_01" || + actor->getName() == "DungeonPit") { + _70 = 120; + dist = 50.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_F_GoalSystem_A_01" || + actor->getName() == "DgnObj_DLC_GoalShield_A" || + actor->getName() == "Npc_DungeonPriestDlc2nd_Boss" || + actor->getName() == "DgnObj_DLC_IbutsuExFloor_A_02") { + _70 = 15; + dist = 30.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuExOutWall_A_01") { + _70 = 240; + dist = 0.0f; + } else if (actor->getName().include("CylinderWall")) { + _70 = 240; + dist = 65.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_A_01") { + _70 = 240; + dist = 125.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_F_02") { + _70 = 60; + dist = 30.0f; + } else if (actor->getName() == "DgnObj_RemainsTerminalBody_A" || + actor->getName() == "FldObj_Terminal_A_01" || + actor->getName() == "DgnObj_DLC_ShutterFence_A_01" || + actor->getName() == "FldObj_DownloadTerminal_A_01" || + actor->getName() == "EventTag") { + _70 = 60; + dist = 30.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_Faucet_A_01" || + actor->getName() == "DgnObj_DLC_IbutsuEx_E_Faucet_A_02" || + actor->getName() == "SwitchTimeLag" || actor->getName() == "Area" || + actor->getName() == "ActorObserverTag") { + _70 = 60; + dist = 80.0f; + } else if (actor->getName() == "DgnObj_DLC_ShutterFence_A_01" || + actor->getName() == "DgnObj_DLC_ShutterFenceFrame_A_01") { + _70 = 60; + dist = 120.0f; + } else if (actor->getName() == "DgnObj_ElectricCable_FinalTrial" || + actor->getName() == "DgnObj_SwitchElectric0_FinalTrial" || + actor->getName() == "DgnObj_DLC_IbutsuEx_B_ElectricWire_A_02") { + _70 = 60; + dist = 90.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_B_MagnePoleAcceptor_A_01") { + _70 = 60; + dist = 75.0f; + } else if (actor->getName() == "ElectricGenerator") { + _70 = 60; + dist = 35.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuExD_Hole_A_02") { + _70 = 60; + dist = 100.0f; + } else if (actor->getName() == "DgnObj_AncientBall_B_01") { + _70 = 60; + dist = 90.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEXD_FirePillar_A_01" || + actor->getName() == "DgnObj_DLC_IbutsuEXD_FirePillar_A_02") { + _70 = 60; + dist = 75.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuExD_WallSpike_A_01" || + actor->getName() == "DgnObj_DLC_IbutsuExD_Cylinder_A_01") { + _70 = 60; + dist = 60.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_WaterPump_A_01" || + actor->getName() == "DgnObj_DungeonWater50x50_A_01") { + _70 = 60; + dist = 100.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_WaterPump_A_02") { + _70 = 60; + dist = 140.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_WaterPump_A_03") { + _70 = 60; + dist = 75.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_Shaft_A_01" || + actor->getName() == "DgnObj_DLC_IbutsuObj_StonePoleAcceptor_A_01") { + _70 = 60; + dist = 50.0f; + } else if (actor->getName() == "DgnObj_DLC_IbutsuEx_E_Scaffold_A_02" || + actor->getName() == "DgnObj_DLC_IbutsuEx_E_Scaffold_A_03") { + _70 = 60; + dist = 60.0f; + } + } + } else { + if (actor->getName() == "FldObj_FlagLarge_A_01") { + _70 = 120; + dist = 70.0f; + } else if (actor->getName() == "FldObj_SoilRock_MapTower_A_01" || + actor->getName() == "TwnObj_HunterHouseLamp_A_02") { + _70 = 900; + dist = 0.0f; + } else if (actor->getName() == "TwnObj_GoddesStatue_A_01" || + actor->getName() == "FireWoodDie") { + _70 = 120; + dist = 50.0f; + } else if (actor->getName().include("FenceWoodDamage") || + actor->getName().startsWith("FldObj_Damage")) { + _70 = 30; + dist = 13.0f; + } else if (actor->getName().include("ShieldFence")) { + _70 = 30; + dist = 30.0f; + } + } + } + _6c = dist * dist; + + float value_68 = 1.0; + if (mActor->getName().startsWith("Enemy_Lynel")) { + value_68 = 2.0; + } + _68 = value_68; + + if (actor->getName() == "Npc_RitoHatago001" || actor->getName() == "Npc_TabantaHatago001" || + actor->getName() == "Npc_FaronWoods001") { + mFlags8.set(0x100000000); + } + + if (actor->getName().startsWith("Npc_Zora") && !actor->getName().isEqual("Npc_Zora003") && + !actor->getName().isEqual("Npc_ZoraB001") && !actor->getName().isEqual("Npc_Zora004")) { + mFlags8.set(0x200000000); + } + + _74 = 0.0f; + if (actor->checkFlag(Actor::ActorFlag::_29) && actor->getProfile() == "NPC") { + _74 = 900.0f; + } + + if (actor->getName().startsWith("FldObj_FlagLarge")) { + _50 = 3.0f; + } +} + +LodState::~LodState() { + if (mOcclusionQueryCylinder) + delete mOcclusionQueryCylinder; +} + +// NON_MATCHING: ????? reordering +void LodState::initFlags() { + _28 = 1.0; + _40 = 0.0; + mFlags26.reset(2); + mFlags8.set(0xFFFFFFFF'00000000); + if (!mFlags8.isOn(0x20000000)) { + mFlags8.reset(0xEFFFFFFF); + mFlags8.set(0xCFC360BF); + mFlags8.reset(0x40); + } else { + mFlags8.set(0xEFFFFFFF); + mFlags8.set(0xEFC360BF); + mFlags8.reset(0x40); + } + mFlags8.reset(0x3C9F00); + mFlags8.set(0x4000); + mFlags14.set(0x2000000); + _60 = 0xFFFF; + _64 = -3; +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actLodState.h b/src/KingSystem/ActorSystem/actLodState.h new file mode 100644 index 00000000..817e1a82 --- /dev/null +++ b/src/KingSystem/ActorSystem/actLodState.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include "KingSystem/Utils/Types.h" + +namespace sead { +class Heap; +} + +namespace ksys { +class OcclusionQueryCylinder; +} + +namespace ksys::act { + +class Actor; + +class LodState { +public: + LodState(sead::Heap* heap, sead::BitFlag32 flags, Actor* actor, int disable_calc_skip_frame, + float x); + virtual ~LodState(); + +private: + void initFlags(); + + sead::BitFlag64 mFlags8; + sead::BitFlag32 mFlags10; + sead::BitFlag32 mFlags14; + sead::BitFlag32 mFlags18; + u32 _1c = 4; + u32 mActorType = 9; + u8 _24 = 0xff; + u8 _25; + sead::BitFlag16 mFlags26; + float _28 = 1.0; + Actor* mActor = nullptr; + OcclusionQueryCylinder* mOcclusionQueryCylinder = nullptr; + float _40 = 0.0; + float _44 = 0.0; + float _48 = 0.0; + float mDistanceScale = 1.0; + float _50 = 1.0; + float mDispDistance = 0.0; + float _58 = -1.0; + int mDisableCalcSkipFrame = 0; + u32 _60 = 0; + int _64 = -3; + float _68; + float _6c; + u32 _70; + float _74; + float _78 = 0.0; +}; +KSYS_CHECK_SIZE_NX150(LodState, 0x80); + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/aiForkAI.cpp b/src/KingSystem/ActorSystem/aiForkAI.cpp index d8cd4249..5989bdba 100644 --- a/src/KingSystem/ActorSystem/aiForkAI.cpp +++ b/src/KingSystem/ActorSystem/aiForkAI.cpp @@ -1,5 +1,5 @@ #include "KingSystem/ActorSystem/aiForkAI.h" -#include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/ActorSystem/aiRootAi.h" namespace ksys::act::ai { diff --git a/src/KingSystem/ActorSystem/aiRootAi.cpp b/src/KingSystem/ActorSystem/aiRootAi.cpp new file mode 100644 index 00000000..2706a208 --- /dev/null +++ b/src/KingSystem/ActorSystem/aiRootAi.cpp @@ -0,0 +1,157 @@ +#include "KingSystem/ActorSystem/aiRootAi.h" +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/ActorSystem/actAiClassDef.h" +#include "KingSystem/Utils/InitTimeInfo.h" + +namespace ksys::act::ai { + +RootAi::RootAi(const InitArg& arg) : Ai(arg) { + mBehaviorsByStopAndCalcTiming[0].fill({}); + mBehaviorsByStopAndCalcTiming[1].fill({}); +} + +RootAi::~RootAi() { + mQueries.finalize(); + mBehaviors.finalize(); + mAis.finalize(); + mActions.finalize(); + if (_140) + delete _140; +} + +bool RootAi::loadMapUnitParams(const AIDef& def, sead::Heap* heap) { + return mMapUnitParams.load(*mActor, def, heap, AIDefInstParamKind::MapUnit); +} + +bool RootAi::loadAITreeParams(const AIDef& def, sead::Heap* heap) { + return mAiTreeParams.load(*mActor, def, heap, AIDefInstParamKind::AITree); +} + +bool RootAi::isActorDeletedOrDeleting() const { + return mActor->isDeletedOrDeleting(); +} + +bool RootAi::getMapUnitParam(sead::SafeString* value, const sead::SafeString& key) const { + sead::SafeString out; + if (mMapUnitParams.getString(&out, key)) { + *value = out.cstr(); + return true; + } + *value = sead::SafeString::cEmptyString; + return false; +} + +bool RootAi::getMapUnitParam(const s32** value, const sead::SafeString& key) const { + auto* ptr = + static_cast(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Int)); + static const s32 sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +bool RootAi::getMapUnitParam(const f32** value, const sead::SafeString& key) const { + auto* ptr = + static_cast(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Float)); + static const f32 sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +bool RootAi::getMapUnitParam(const sead::Vector3f** value, const sead::SafeString& key) const { + auto* ptr = static_cast( + mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Vec3)); + *value = ptr ? ptr : &sead::Vector3f::zero; + return ptr != nullptr; +} + +bool RootAi::getMapUnitParam(const bool** value, const sead::SafeString& key) const { + auto* ptr = + static_cast(mMapUnitParams.getAITreeVariablePointer(key, AIDefParamType::Bool)); + static const bool sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +namespace { +sead::FixedSafeString<64> sDefaultString; + +struct Vec3Wrapper { + util::InitTimeInfoEx init_time_info_ex; + sead::Vector3f sDefaultVec3{0, 0, 0}; +}; +Vec3Wrapper sDefaultAITreeVariables; +} // namespace + +bool RootAi::getAITreeVariable(sead::SafeString** value, const sead::SafeString& key) const { + auto* ptr = static_cast( + mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::String)); + *value = ptr ? ptr : &sDefaultString; + return ptr != nullptr; +} + +bool RootAi::getAITreeVariable(s32** value, const sead::SafeString& key) const { + auto* ptr = static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Int)); + static s32 sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +bool RootAi::getAITreeVariable(f32** value, const sead::SafeString& key) const { + auto* ptr = + static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Float)); + static f32 sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +bool RootAi::getAITreeVariable(sead::Vector3f** value, const sead::SafeString& key) const { + auto* ptr = static_cast( + mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Vec3)); + *value = ptr ? ptr : &sDefaultAITreeVariables.sDefaultVec3; + return ptr != nullptr; +} + +bool RootAi::getAITreeVariable(bool** value, const sead::SafeString& key) const { + auto* ptr = + static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::Bool)); + static bool sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +bool RootAi::getAITreeVariable(void** value, const sead::SafeString& key) const { + auto* ptr = static_cast( + mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::AITreeVariablePointer)); + static void* sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +bool RootAi::getAITreeVariable(u32** value, const sead::SafeString& key) const { + auto* ptr = + static_cast(mAiTreeParams.getAITreeVariablePointer(key, AIDefParamType::UInt)); + static u32 sDefault{}; + *value = ptr ? ptr : &sDefault; + return ptr != nullptr; +} + +bool RootAi::getAITreeVariable2(sead::Vector3f** value, const sead::SafeString& key) const { + return getAITreeVariable(value, key); +} + +bool RootAi::getAITreeVariable2(bool** value, const sead::SafeString& key) const { + return getAITreeVariable(value, key); +} + +const char* getDefaultAiName(s32 root_idx) { + static constexpr const char* names[] = {"DemoRootAI", "Root"}; + if (root_idx >= 2) + return ""; + return names[root_idx]; +} + +const char* getDefaultActionName(s32) { + return ""; +} + +} // namespace ksys::act::ai diff --git a/src/KingSystem/ActorSystem/aiRootAi.h b/src/KingSystem/ActorSystem/aiRootAi.h new file mode 100644 index 00000000..c9b61df6 --- /dev/null +++ b/src/KingSystem/ActorSystem/aiRootAi.h @@ -0,0 +1,123 @@ +#pragma once + +#include +#include +#include "KingSystem/ActorSystem/actAiAction.h" +#include "KingSystem/ActorSystem/actAiAi.h" +#include "KingSystem/ActorSystem/actAiBehavior.h" +#include "KingSystem/ActorSystem/actAiParam.h" +#include "KingSystem/ActorSystem/actAiQueries.h" +#include "KingSystem/ActorSystem/actAiQuery.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::act::ai { + +class IRootAi { +public: + virtual ~IRootAi() = default; +}; + +enum class RootAiFlag { + _8 = 8, +}; + +// TODO: rename +enum class RootAiFlag2 {}; + +class RootAi : public Ai, public IRootAi { + SEAD_RTTI_OVERRIDE(RootAi, Ai) +public: + explicit RootAi(const InitArg& arg); + ~RootAi() override; + + bool isChangeable() const override { return true; } + bool init_(sead::Heap* heap) override; + void enter_(InlineParamPack* params) override; + void leave_() override; + bool handleMessage_(const Message& message) override; + void calc() override; + + const ParamPack& getMapUnitParams() const { return mMapUnitParams; } + const ParamPack& getAiTreeParams() const { return mAiTreeParams; } + u32 getI() const { return mI; } + bool isActorDeletedOrDeleting() const; + + const Actions& getActions() const { return mActions; } + const Ais& getAis() const { return mAis; } + const Behaviors& getBehaviors() const { return mBehaviors; } + const Queries& getQueries() const { return mQueries; } + + bool loadMapUnitParams(const AIDef& def, sead::Heap* heap); + bool loadAITreeParams(const AIDef& def, sead::Heap* heap); + + bool getMapUnitParam(sead::SafeString* value, const sead::SafeString& key) const; + bool getMapUnitParam(const s32** value, const sead::SafeString& key) const; + bool getMapUnitParam(const f32** value, const sead::SafeString& key) const; + bool getMapUnitParam(const sead::Vector3f** value, const sead::SafeString& key) const; + bool getMapUnitParam(const bool** value, const sead::SafeString& key) const; + + bool getAITreeVariable(sead::SafeString** value, const sead::SafeString& key) const; + bool getAITreeVariable(s32** value, const sead::SafeString& key) const; + bool getAITreeVariable(f32** value, const sead::SafeString& key) const; + bool getAITreeVariable(sead::Vector3f** value, const sead::SafeString& key) const; + bool getAITreeVariable(bool** value, const sead::SafeString& key) const; + bool getAITreeVariable(void** value, const sead::SafeString& key) const; + bool getAITreeVariable(u32** value, const sead::SafeString& key) const; + // TODO: rename + bool getAITreeVariable2(sead::Vector3f** value, const sead::SafeString& key) const; + // TODO: rename + bool getAITreeVariable2(bool** value, const sead::SafeString& key) const; + + void setBehavior(Behavior* behavior); + void resetBehavior(Behavior* behavior); + +private: + friend class ActionBase; + + // TODO: rename and put this in a different translation unit + struct SomeStruct { + SomeStruct(); + virtual ~SomeStruct(); + + void* _8{}; + }; + KSYS_CHECK_SIZE_NX150(SomeStruct, 0x10); + + void calc_() override; + + f32 _40 = 1.0; + u32 _44{}; + Actions mActions; + Ais mAis; + Behaviors mBehaviors; + Queries mQueries; + sead::SafeArray mBehaviorsByStopAndCalcTiming[2]{}; + void* _138{}; + SomeStruct* _140{}; + u32 mI{}; + u16 mAt{}; + u8 _14e{}; + void* _150{}; + void* _158{}; + void* _160{}; + // TODO: is this really an atomic? + sead::Atomic _168 = 1.0; + // RootAiFlag + sead::BitFlag16 _16c; + // RootAiFlag2 + sead::BitFlag16 _16e; + ParamPack mMapUnitParams; + ParamPack mAiTreeParams; +}; +KSYS_CHECK_SIZE_NX150(RootAi, 0x180); + +const char* getDefaultAiName(s32 root_idx); +const char* getDefaultActionName(s32 idx); + +inline const char* getDefaultName(ActionType type, s32 idx) { + if (type == ActionType::AI) + return getDefaultAiName(idx); + return getDefaultActionName(idx); +} + +} // namespace ksys::act::ai -- cgit v1.2.3