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) --- .../Query/queryIsSuccessEndLastDemoAction.cpp | 2 +- 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 ++++++ src/KingSystem/Map/CMakeLists.txt | 2 - src/KingSystem/Map/mapObject.cpp | 2 +- src/KingSystem/Map/mapPlacementAreaMgr.h | 2 +- src/KingSystem/Map/mapPlacementMapMgr.h | 7 +- src/KingSystem/Map/mapStagePreActorCache.cpp | 7 - src/KingSystem/Map/mapStagePreActorCache.h | 29 -- .../Actor/resResourceASResourceExtension.cpp | 338 --------------- .../Resource/Actor/resResourceASSetting.cpp | 472 +++++++++++++++++++++ .../Resource/Actor/resResourceASSetting.h | 63 +++ .../Resource/Actor/resResourceASSettingMgr.h | 26 ++ src/KingSystem/Resource/CMakeLists.txt | 6 +- src/KingSystem/Resource/resResourceASSetting.cpp | 113 ----- src/KingSystem/Resource/resResourceASSetting.h | 63 --- src/KingSystem/System/CMakeLists.txt | 4 +- src/KingSystem/System/DebugFinder.cpp | 11 - src/KingSystem/System/DebugFinder.h | 19 - src/KingSystem/System/StagePreActorCache.cpp | 7 + src/KingSystem/System/StagePreActorCache.h | 31 ++ 42 files changed, 1331 insertions(+), 1339 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 delete mode 100644 src/KingSystem/Map/mapStagePreActorCache.cpp delete mode 100644 src/KingSystem/Map/mapStagePreActorCache.h delete mode 100644 src/KingSystem/Resource/Actor/resResourceASResourceExtension.cpp create mode 100644 src/KingSystem/Resource/Actor/resResourceASSetting.cpp create mode 100644 src/KingSystem/Resource/Actor/resResourceASSetting.h create mode 100644 src/KingSystem/Resource/Actor/resResourceASSettingMgr.h delete mode 100644 src/KingSystem/Resource/resResourceASSetting.cpp delete mode 100644 src/KingSystem/Resource/resResourceASSetting.h delete mode 100644 src/KingSystem/System/DebugFinder.cpp delete mode 100644 src/KingSystem/System/DebugFinder.h create mode 100644 src/KingSystem/System/StagePreActorCache.cpp create mode 100644 src/KingSystem/System/StagePreActorCache.h (limited to 'src') diff --git a/src/Game/Actor/Query/queryIsSuccessEndLastDemoAction.cpp b/src/Game/Actor/Query/queryIsSuccessEndLastDemoAction.cpp index 6c79cdc9..6d9dda5c 100644 --- a/src/Game/Actor/Query/queryIsSuccessEndLastDemoAction.cpp +++ b/src/Game/Actor/Query/queryIsSuccessEndLastDemoAction.cpp @@ -1,7 +1,7 @@ #include "Game/Actor/Query/queryIsSuccessEndLastDemoAction.h" #include #include "KingSystem/ActorSystem/actActor.h" -#include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/ActorSystem/aiRootAi.h" namespace uking::query { 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 diff --git a/src/KingSystem/Map/CMakeLists.txt b/src/KingSystem/Map/CMakeLists.txt index b201b701..52a8c659 100644 --- a/src/KingSystem/Map/CMakeLists.txt +++ b/src/KingSystem/Map/CMakeLists.txt @@ -26,6 +26,4 @@ target_sources(uking PRIVATE mapPlacementTree.h mapRail.cpp mapRail.h - mapStagePreActorCache.cpp - mapStagePreActorCache.h ) diff --git a/src/KingSystem/Map/mapObject.cpp b/src/KingSystem/Map/mapObject.cpp index a22274f2..c5e838a7 100644 --- a/src/KingSystem/Map/mapObject.cpp +++ b/src/KingSystem/Map/mapObject.cpp @@ -6,7 +6,7 @@ #include "KingSystem/Graphics/gfxForestRenderer.h" #include "KingSystem/Map/mapObjectLink.h" #include "KingSystem/Map/mapPlacementMgr.h" -#include "KingSystem/Map/mapStagePreActorCache.h" +#include "KingSystem/System/StagePreActorCache.h" #include "KingSystem/Terrain/teraSystem.h" #include "KingSystem/Utils/Debug.h" diff --git a/src/KingSystem/Map/mapPlacementAreaMgr.h b/src/KingSystem/Map/mapPlacementAreaMgr.h index dee435f5..e040c417 100644 --- a/src/KingSystem/Map/mapPlacementAreaMgr.h +++ b/src/KingSystem/Map/mapPlacementAreaMgr.h @@ -6,8 +6,8 @@ #include #include -#include "KingSystem/Map/mapStagePreActorCache.h" #include "KingSystem/Map/mapTypes.h" +#include "KingSystem/System/StagePreActorCache.h" #include "KingSystem/Utils/Types.h" namespace ksys::gdt { diff --git a/src/KingSystem/Map/mapPlacementMapMgr.h b/src/KingSystem/Map/mapPlacementMapMgr.h index 913c419a..6fb6d848 100644 --- a/src/KingSystem/Map/mapPlacementMapMgr.h +++ b/src/KingSystem/Map/mapPlacementMapMgr.h @@ -8,11 +8,14 @@ #include "KingSystem/Resource/resHandle.h" #include "KingSystem/Utils/Types.h" +namespace ksys::act { +class FarActorMerge; +} // namespace ksys::act + namespace ksys::map { class MapProperties; class Placement18; -class FarActorMerge; class PlacementActors; class PlacementMap; @@ -49,7 +52,7 @@ private: s32 _18; s32 _1c; PlacementMapArray mMapArray; - FarActorMerge* mFarActorMerge; + act::FarActorMerge* mFarActorMerge; s32 mNeedLoadDynMap; s32 mNeedLoadDynMapPhysics; bool mIsShrineOrDivineBeast; diff --git a/src/KingSystem/Map/mapStagePreActorCache.cpp b/src/KingSystem/Map/mapStagePreActorCache.cpp deleted file mode 100644 index cc853e2a..00000000 --- a/src/KingSystem/Map/mapStagePreActorCache.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "KingSystem/Map/mapStagePreActorCache.h" - -namespace ksys::map { - -SEAD_SINGLETON_DISPOSER_IMPL(StagePreActorCache) - -} // namespace ksys::map diff --git a/src/KingSystem/Map/mapStagePreActorCache.h b/src/KingSystem/Map/mapStagePreActorCache.h deleted file mode 100644 index 666779e8..00000000 --- a/src/KingSystem/Map/mapStagePreActorCache.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include - -namespace ksys::gfx { -class ForestRenderer; -} - -namespace ksys::map { - -class LazyTraverseList; - -// TODO -class StagePreActorCache { - SEAD_SINGLETON_DISPOSER(StagePreActorCache) - StagePreActorCache(); - -public: - LazyTraverseList* getObjects() const { return mObjects; } - auto* getForestRenderer() { return mForestRenderer; } - -private: - char _0[0x20]; - LazyTraverseList* mObjects; - gfx::ForestRenderer* mForestRenderer; -}; - -} // namespace ksys::map diff --git a/src/KingSystem/Resource/Actor/resResourceASResourceExtension.cpp b/src/KingSystem/Resource/Actor/resResourceASResourceExtension.cpp deleted file mode 100644 index c44948f1..00000000 --- a/src/KingSystem/Resource/Actor/resResourceASResourceExtension.cpp +++ /dev/null @@ -1,338 +0,0 @@ -#include "KingSystem/Resource/Actor/resResourceASResourceExtension.h" -#include -#include -#include -#include "KingSystem/ActorSystem/actASSetting.h" -#include "KingSystem/Resource/resResourceASSetting.h" - -namespace ksys::res { - -bool ASFrameCtrlParser::parse(const ASParamParser::ParseArgs& args) { - mRate.init(1.0, "Rate", "再生速度", "Min=0.f,Max=10.f", &mObj); - mStartFrame.init(0.0, "StartFrame", "開始フレーム", "Min=0.f,Max=100.f", &mObj); - mEndFrame.init(-1.0, "EndFrame", "終了フレーム", "Min=-1.f,Max=100.f", &mObj); - mLoopStopCount.init(-1.0, "LoopStopCount", "ループ停止回数", "Min=-1.f,Max=10.f", &mObj); - mLoopStopCountRandom.init(0.0, "LoopStopCountRandom", "ランダムループ追加回数", - "Min=0.f,Max=10.f", &mObj); - mReversePlay.init(false, "ReversePlay", "逆再生", "", &mObj); - mUseGlobalFrame.init(false, "UseGlobalFrame", "グローバルフレーム使う", "", &mObj); - mFootType.init(0, "FootType", "足解決", "", &mObj); - mConnect.init(false, "Connect", "接続", "", &mObj); - mAnmLoop.init(0, "AnmLoop", "ループ設定", "", &mObj); - - mList.addObj(&mObj, "FrameCtrl0"); - return true; -} - -bool ASTriggerEventsParser::parse(const ASParamParser::ParseArgs& args) { - const int num_objs = args.res_list.getResParameterObjNum(); - if (num_objs == 0) - return true; - - if (!mEvents.tryAllocBuffer(num_objs, args.heap)) - return false; - - auto it = mEvents.begin(); - const auto end = mEvents.end(); - - sead::FixedSafeString<32> obj_name{"Event"}; - const auto obj_name_prefix_len = obj_name.calcLength(); - - auto res_it = args.res_list.objBegin(); - const auto res_end = args.res_list.objEnd(); - - while (res_it != res_end && it != end) { - u32 type_index = -1; - const auto TypeIndex = agl::utl::getResParameter(res_it.getObj(), "TypeIndex"); - if (TypeIndex.ptr()) - type_index = *TypeIndex.getData(); - - // TODO: add a TypeIndex enum - it->type_index = type_index > 33 ? 88 : int(type_index) + 54; - - it->frame.init(0.0, "Frame", "フレーム", "Min=0.f,Max=100.f", &it->obj); - it->value.init("", "Value", "値", "", &it->obj); - - obj_name.trim(obj_name_prefix_len); - obj_name.appendWithFormat("%d", it.getIndex()); - mList.addObj(&it->obj, obj_name); - - ++res_it; - ++it; - } - - return true; -} - -bool ASHoldEventsParser::parse(const ASParamParser::ParseArgs& args) { - const int num_objs = args.res_list.getResParameterObjNum(); - if (num_objs == 0) - return true; - - if (!mEvents.tryAllocBuffer(num_objs, args.heap)) - return false; - - auto it = mEvents.begin(); - const auto end = mEvents.end(); - - sead::FixedSafeString<32> obj_name{"Event"}; - const auto obj_name_prefix_len = obj_name.calcLength(); - - auto res_it = args.res_list.objBegin(); - const auto res_end = args.res_list.objEnd(); - - while (res_it != res_end && it != end) { - u32 type_index = -1; - const auto TypeIndex = agl::utl::getResParameter(res_it.getObj(), "TypeIndex"); - if (TypeIndex.ptr()) - type_index = *TypeIndex.getData(); - - // TODO: add a TypeIndex enum - it->type_index = type_index > 53 ? 88 : int(type_index); - - it->start_frame.init(0.0, "StartFrame", "開始フレーム", "Min=0.f,Max=100.f", &it->obj); - it->end_frame.init(0.0, "EndFrame", "終了フレーム", "Min=0.f,Max=100.f", &it->obj); - it->value.init("", "Value", "値", "", &it->obj); - - obj_name.trim(obj_name_prefix_len); - obj_name.appendWithFormat("%d", it.getIndex()); - mList.addObj(&it->obj, obj_name); - - ++res_it; - ++it; - } - - return true; -} - -bool ASStringArrayParser::parse(const ASParamParser::ParseArgs& args) { - const int size = args.res_list.getResParameterObj(0).getNum(); - if (size != 0) { - if (!mValues.tryAllocBuffer(size, args.heap)) - return false; - - sead::FixedSafeString<32> param_name{"Value"}; - const auto param_name_prefix_len = param_name.calcLength(); - - for (int i = 0; i < size; ++i) { - param_name.trim(param_name_prefix_len); - param_name.appendWithFormat("%d", i); - mValues[i].value.init("", param_name, "値", "", &mObj); - } - } - - mList.addObj(&mObj, "StringArray0"); - return true; -} - -bool ASRangesParser::parse(const ASParamParser::ParseArgs& args) { - const int num_objs = args.res_list.getResParameterObjNum(); - if (num_objs == 0) - return true; - - if (!mRanges.tryAllocBuffer(num_objs, args.heap)) - return false; - - auto it = mRanges.begin(); - const auto end = mRanges.end(); - - sead::FixedSafeString<32> obj_name{"Range"}; - const auto obj_name_prefix_len = obj_name.calcLength(); - - auto res_it = args.res_list.objBegin(); - const auto res_end = args.res_list.objEnd(); - - while (res_it != res_end && it != end) { - obj_name.trim(obj_name_prefix_len); - obj_name.appendWithFormat("%d", it.getIndex()); - - it->start.init(0.0, "Start", "開始", "Min=0.f,Max=1.f", &it->obj); - it->end.init(0.0, "End", "終了", "Min=0.f,Max=1.f", &it->obj); - - mList.addObj(&it->obj, obj_name); - - ++res_it; - ++it; - } - - return true; -} - -bool ASFloatArrayParser::parse(const ASParamParser::ParseArgs& args) { - const int size = args.res_list.getResParameterObj(0).getNum(); - if (size != 0) { - if (!mValues.tryAllocBuffer(size, args.heap)) - return false; - - sead::FixedSafeString<32> param_name{"Value"}; - const auto param_name_prefix_len = param_name.calcLength(); - - for (int i = 0; i < size; ++i) { - param_name.trim(param_name_prefix_len); - param_name.appendWithFormat("%d", i); - mValues[i].value.init(1.0, param_name, "値", "", &mObj); - } - } - - mList.addObj(&mObj, "FloatArray0"); - return true; -} - -bool ASIntArrayParser::parse(const ASParamParser::ParseArgs& args) { - const int size = args.res_list.getResParameterObj(0).getNum(); - if (size != 0) { - if (!mValues.tryAllocBuffer(size, args.heap)) - return false; - - sead::FixedSafeString<32> param_name{"Value"}; - const auto param_name_prefix_len = param_name.calcLength(); - - for (int i = 0; i < size; ++i) { - param_name.trim(param_name_prefix_len); - param_name.appendWithFormat("%d", i); - mValues[i].value.init(1, param_name, "値", "", &mObj); - } - } - - mList.addObj(&mObj, "IntArray0"); - return true; -} - -bool ASBitIndexParser::parse(const ASParamParser::ParseArgs& args) { - const auto obj = args.res_list.getResParameterObj(0); - if (obj.getNum() < 1) - return true; - - const auto TypeIndex = agl::utl::getResParameter(obj, "TypeIndex"); - if (!TypeIndex.ptr()) - return true; - - mTypeIndex = *TypeIndex.getData(); - return true; -} - -template -static ASParamParser* factoryImpl_(sead::Heap* heap) { - return new (heap) T; -} - -static ASParamParser* dummyASParserFactoryImpl_(sead::Heap*) { - return nullptr; -} - -namespace { -struct Factory { - const char* name; - ASParamParser* (*make)(sead::Heap* heap); -}; - -sead::SafeArray sASFactories{{ - {"FrameCtrl", factoryImpl_}, - {"TriggerEvents", factoryImpl_}, - {"HoldEvents", factoryImpl_}, - {"StringArray", factoryImpl_}, - {"Ranges", factoryImpl_}, - {"FloatArray", factoryImpl_}, - {"IntArray", factoryImpl_}, - {"BitIndex", factoryImpl_}, - {"BlenderBone", dummyASParserFactoryImpl_}, -}}; -} // namespace - -ASExtensions::~ASExtensions() { - for (auto*& parser : mParsers) { - if (parser && parser->getType() != ASParamParser::Type::BlenderBone) - delete parser; - parser = nullptr; - } - mParsers.freeBuffer(); -} - -bool ASExtensions::parse(const ASExtensions::ParseArgs& args) { - const auto Extend = agl::utl::getResParameterList(args.res_list, "Extend"); - if (!Extend) - return true; - - const auto num_extensions = Extend.getResParameterListNum(); - if (num_extensions == 0) - return true; - - if (!mParsers.tryAllocBuffer(num_extensions, args.heap)) - return false; - mParsers.fill(nullptr); - - auto it = mParsers.begin(); - const auto end = mParsers.end(); - - ASParamParser::ParseArgs parse_args{}; - parse_args.list = &mList; - parse_args.heap = args.heap; - - auto res_it = Extend.listBegin(); - const auto res_end = Extend.listEnd(); - - for (; it != end && res_it != res_end; ++it, ++res_it) { - parse_args.res_list = res_it.getList(); - *it = makeParser(parse_args); - - constexpr int bone = int(ASParamParser::Type::BlenderBone); - if (*it == nullptr && parse_args.res_list.getParameterListNameHash() != - agl::utl::ParameterBase::calcHash(sASFactories[bone].name)) { - return false; - } - } - - args.list->addList(&mList, "Extend"); - return true; -} - -ASParamParser* ASExtensions::makeParser(const ASParamParser::ParseArgs& args) const { - const auto is_factory = [&args](int i) { - return args.res_list.getParameterListNameHash() == - agl::utl::ParameterBase::calcHash(sASFactories[i].name); - }; - - std::optional type; - for (int i = 0; i < ASParamParser::NumTypes - 1; ++i) { - if (!is_factory(i)) - continue; - type = i; - break; - } - - if (!type.has_value() && is_factory(int(ASParamParser::Type::BlenderBone))) { - const auto obj = args.res_list.getResParameterObj(0); - if (obj.getNum() > 0) { - const sead::SafeString name = obj.getResParameter(0).getData(); - return act::ASSetting::instance()->getBoneParams(name); - } - } - - if (!type.has_value()) - return nullptr; - - const auto& factory = sASFactories[*type]; - - auto* parser = factory.make(args.heap); - if (!parser) - return nullptr; - - if (!parser->parse(args)) { - delete parser; - return nullptr; - } - - args.list->addList(&parser->getList(), factory.name); - return parser; -} - -ASParamParser* ASExtensions::getParser(ASParamParser::Type type) const { - for (int i = 0, n = mParsers.size(); i < n; ++i) { - auto* parser = mParsers[i]; - if (parser && parser->getType() == type) - return parser; - } - return nullptr; -} - -} // namespace ksys::res diff --git a/src/KingSystem/Resource/Actor/resResourceASSetting.cpp b/src/KingSystem/Resource/Actor/resResourceASSetting.cpp new file mode 100644 index 00000000..915bd1c4 --- /dev/null +++ b/src/KingSystem/Resource/Actor/resResourceASSetting.cpp @@ -0,0 +1,472 @@ +#include "KingSystem/Resource/Actor/resResourceASSetting.h" +#include +#include +#include +#include "KingSystem/Resource/Actor/resResourceASResourceExtension.h" +#include "KingSystem/Resource/Actor/resResourceASSettingMgr.h" +#include "KingSystem/Resource/resLoadRequest.h" + +namespace ksys::res { + +bool ASFrameCtrlParser::parse(const ASParamParser::ParseArgs& args) { + mRate.init(1.0, "Rate", "再生速度", "Min=0.f,Max=10.f", &mObj); + mStartFrame.init(0.0, "StartFrame", "開始フレーム", "Min=0.f,Max=100.f", &mObj); + mEndFrame.init(-1.0, "EndFrame", "終了フレーム", "Min=-1.f,Max=100.f", &mObj); + mLoopStopCount.init(-1.0, "LoopStopCount", "ループ停止回数", "Min=-1.f,Max=10.f", &mObj); + mLoopStopCountRandom.init(0.0, "LoopStopCountRandom", "ランダムループ追加回数", + "Min=0.f,Max=10.f", &mObj); + mReversePlay.init(false, "ReversePlay", "逆再生", "", &mObj); + mUseGlobalFrame.init(false, "UseGlobalFrame", "グローバルフレーム使う", "", &mObj); + mFootType.init(0, "FootType", "足解決", "", &mObj); + mConnect.init(false, "Connect", "接続", "", &mObj); + mAnmLoop.init(0, "AnmLoop", "ループ設定", "", &mObj); + + mList.addObj(&mObj, "FrameCtrl0"); + return true; +} + +bool ASTriggerEventsParser::parse(const ASParamParser::ParseArgs& args) { + const int num_objs = args.res_list.getResParameterObjNum(); + if (num_objs == 0) + return true; + + if (!mEvents.tryAllocBuffer(num_objs, args.heap)) + return false; + + auto it = mEvents.begin(); + const auto end = mEvents.end(); + + sead::FixedSafeString<32> obj_name{"Event"}; + const auto obj_name_prefix_len = obj_name.calcLength(); + + auto res_it = args.res_list.objBegin(); + const auto res_end = args.res_list.objEnd(); + + while (res_it != res_end && it != end) { + u32 type_index = -1; + const auto TypeIndex = agl::utl::getResParameter(res_it.getObj(), "TypeIndex"); + if (TypeIndex.ptr()) + type_index = *TypeIndex.getData(); + + // TODO: add a TypeIndex enum + it->type_index = type_index > 33 ? 88 : int(type_index) + 54; + + it->frame.init(0.0, "Frame", "フレーム", "Min=0.f,Max=100.f", &it->obj); + it->value.init("", "Value", "値", "", &it->obj); + + obj_name.trim(obj_name_prefix_len); + obj_name.appendWithFormat("%d", it.getIndex()); + mList.addObj(&it->obj, obj_name); + + ++res_it; + ++it; + } + + return true; +} + +bool ASHoldEventsParser::parse(const ASParamParser::ParseArgs& args) { + const int num_objs = args.res_list.getResParameterObjNum(); + if (num_objs == 0) + return true; + + if (!mEvents.tryAllocBuffer(num_objs, args.heap)) + return false; + + auto it = mEvents.begin(); + const auto end = mEvents.end(); + + sead::FixedSafeString<32> obj_name{"Event"}; + const auto obj_name_prefix_len = obj_name.calcLength(); + + auto res_it = args.res_list.objBegin(); + const auto res_end = args.res_list.objEnd(); + + while (res_it != res_end && it != end) { + u32 type_index = -1; + const auto TypeIndex = agl::utl::getResParameter(res_it.getObj(), "TypeIndex"); + if (TypeIndex.ptr()) + type_index = *TypeIndex.getData(); + + // TODO: add a TypeIndex enum + it->type_index = type_index > 53 ? 88 : int(type_index); + + it->start_frame.init(0.0, "StartFrame", "開始フレーム", "Min=0.f,Max=100.f", &it->obj); + it->end_frame.init(0.0, "EndFrame", "終了フレーム", "Min=0.f,Max=100.f", &it->obj); + it->value.init("", "Value", "値", "", &it->obj); + + obj_name.trim(obj_name_prefix_len); + obj_name.appendWithFormat("%d", it.getIndex()); + mList.addObj(&it->obj, obj_name); + + ++res_it; + ++it; + } + + return true; +} + +bool ASStringArrayParser::parse(const ASParamParser::ParseArgs& args) { + const int size = args.res_list.getResParameterObj(0).getNum(); + if (size != 0) { + if (!mValues.tryAllocBuffer(size, args.heap)) + return false; + + sead::FixedSafeString<32> param_name{"Value"}; + const auto param_name_prefix_len = param_name.calcLength(); + + for (int i = 0; i < size; ++i) { + param_name.trim(param_name_prefix_len); + param_name.appendWithFormat("%d", i); + mValues[i].value.init("", param_name, "値", "", &mObj); + } + } + + mList.addObj(&mObj, "StringArray0"); + return true; +} + +bool ASRangesParser::parse(const ASParamParser::ParseArgs& args) { + const int num_objs = args.res_list.getResParameterObjNum(); + if (num_objs == 0) + return true; + + if (!mRanges.tryAllocBuffer(num_objs, args.heap)) + return false; + + auto it = mRanges.begin(); + const auto end = mRanges.end(); + + sead::FixedSafeString<32> obj_name{"Range"}; + const auto obj_name_prefix_len = obj_name.calcLength(); + + auto res_it = args.res_list.objBegin(); + const auto res_end = args.res_list.objEnd(); + + while (res_it != res_end && it != end) { + obj_name.trim(obj_name_prefix_len); + obj_name.appendWithFormat("%d", it.getIndex()); + + it->start.init(0.0, "Start", "開始", "Min=0.f,Max=1.f", &it->obj); + it->end.init(0.0, "End", "終了", "Min=0.f,Max=1.f", &it->obj); + + mList.addObj(&it->obj, obj_name); + + ++res_it; + ++it; + } + + return true; +} + +bool ASFloatArrayParser::parse(const ASParamParser::ParseArgs& args) { + const int size = args.res_list.getResParameterObj(0).getNum(); + if (size != 0) { + if (!mValues.tryAllocBuffer(size, args.heap)) + return false; + + sead::FixedSafeString<32> param_name{"Value"}; + const auto param_name_prefix_len = param_name.calcLength(); + + for (int i = 0; i < size; ++i) { + param_name.trim(param_name_prefix_len); + param_name.appendWithFormat("%d", i); + mValues[i].value.init(1.0, param_name, "値", "", &mObj); + } + } + + mList.addObj(&mObj, "FloatArray0"); + return true; +} + +bool ASIntArrayParser::parse(const ASParamParser::ParseArgs& args) { + const int size = args.res_list.getResParameterObj(0).getNum(); + if (size != 0) { + if (!mValues.tryAllocBuffer(size, args.heap)) + return false; + + sead::FixedSafeString<32> param_name{"Value"}; + const auto param_name_prefix_len = param_name.calcLength(); + + for (int i = 0; i < size; ++i) { + param_name.trim(param_name_prefix_len); + param_name.appendWithFormat("%d", i); + mValues[i].value.init(1, param_name, "値", "", &mObj); + } + } + + mList.addObj(&mObj, "IntArray0"); + return true; +} + +bool ASBitIndexParser::parse(const ASParamParser::ParseArgs& args) { + const auto obj = args.res_list.getResParameterObj(0); + if (obj.getNum() < 1) + return true; + + const auto TypeIndex = agl::utl::getResParameter(obj, "TypeIndex"); + if (!TypeIndex.ptr()) + return true; + + mTypeIndex = *TypeIndex.getData(); + return true; +} + +bool ASSetting::BoneParams::parse(const ASParamParser::ParseArgs& args) { + const auto num_objects = args.res_list.getResParameterObjNum(); + if (num_objects == 0) + return true; + + if (!mBuffer.tryAllocBuffer(num_objects, args.heap)) + return false; + + auto it = mBuffer.begin(); + const auto end = mBuffer.end(); + + sead::FixedSafeString<32> obj_name{"BoneParam"}; + const auto obj_name_base_len = obj_name.calcLength(); + + auto res_it = args.res_list.objBegin(); + const auto res_end = args.res_list.objEnd(); + + for (; it != end && res_it != res_end; ++it, ++res_it) { + it->mBone.init("", "Bone", "ボーン名", "", &it->mObj); + it->mWeight.init(0.0, "Weight", "ウェイト値", "Min=0.f,Max=1.f", &it->mObj); + + obj_name.trim(obj_name_base_len); + obj_name.appendWithFormat("%d", res_it.getIndex()); + mList.addObj(&it->mObj, obj_name); + } + + return true; +} + +f32 ASSetting::BoneParams::getBoneWeight(const sead::SafeString& name) const { + for (const auto& param : mBuffer) { + if (name == *param.mBone) + return *param.mWeight; + } + return 1.0; +} + +namespace { +struct Factory { + const char* name; + ASParamParser* (*make)(sead::Heap* heap); +}; + +extern sead::SafeArray sASFactories; +} // namespace + +ASExtensions::~ASExtensions() { + for (auto*& parser : mParsers) { + if (parser && parser->getType() != ASParamParser::Type::BlenderBone) + delete parser; + parser = nullptr; + } + mParsers.freeBuffer(); +} + +bool ASExtensions::parse(const ASExtensions::ParseArgs& args) { + const auto Extend = agl::utl::getResParameterList(args.res_list, "Extend"); + if (!Extend) + return true; + + const auto num_extensions = Extend.getResParameterListNum(); + if (num_extensions == 0) + return true; + + if (!mParsers.tryAllocBuffer(num_extensions, args.heap)) + return false; + mParsers.fill(nullptr); + + auto it = mParsers.begin(); + const auto end = mParsers.end(); + + ASParamParser::ParseArgs parse_args{}; + parse_args.list = &mList; + parse_args.heap = args.heap; + + auto res_it = Extend.listBegin(); + const auto res_end = Extend.listEnd(); + + for (; it != end && res_it != res_end; ++it, ++res_it) { + parse_args.res_list = res_it.getList(); + *it = makeParser(parse_args); + + constexpr int bone = int(ASParamParser::Type::BlenderBone); + if (*it == nullptr && parse_args.res_list.getParameterListNameHash() != + agl::utl::ParameterBase::calcHash(sASFactories[bone].name)) { + return false; + } + } + + args.list->addList(&mList, "Extend"); + return true; +} + +ASParamParser* ASExtensions::makeParser(const ASParamParser::ParseArgs& args) const { + const auto is_factory = [&args](int i) { + return args.res_list.getParameterListNameHash() == + agl::utl::ParameterBase::calcHash(sASFactories[i].name); + }; + + std::optional type; + for (int i = 0; i < ASParamParser::NumTypes - 1; ++i) { + if (!is_factory(i)) + continue; + type = i; + break; + } + + if (!type.has_value() && is_factory(int(ASParamParser::Type::BlenderBone))) { + const auto obj = args.res_list.getResParameterObj(0); + if (obj.getNum() > 0) { + const sead::SafeString name = obj.getResParameter(0).getData(); + return ASSettingMgr::instance()->getBoneParams(name); + } + } + + if (!type.has_value()) + return nullptr; + + const auto& factory = sASFactories[*type]; + + auto* parser = factory.make(args.heap); + if (!parser) + return nullptr; + + if (!parser->parse(args)) { + delete parser; + return nullptr; + } + + args.list->addList(&parser->getList(), factory.name); + return parser; +} + +// NON_MATCHING: sead::DirectResource to res::ASSetting cast nullptr check; branching for the return +ASParamParser* ASSettingMgr::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; +} + +ASParamParser* ASExtensions::getParser(ASParamParser::Type type) const { + for (int i = 0, n = mParsers.size(); i < n; ++i) { + auto* parser = mParsers[i]; + if (parser && parser->getType() == type) + return parser; + } + return nullptr; +} + +ASSetting::ASSetting() { + mType = "assetting"; + mVersion = 0; +} + +ASSetting::~ASSetting() { + mBlenderBones.freeBuffer(); +} + +void ASSetting::doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) {} + +bool allocBlenderBones(sead::Buffer& buffer, int size, sead::Heap* heap, + int align = sizeof(void*)); + +bool ASSetting::parse_(u8* data, size_t size, sead::Heap* heap) { + if (!data) + return true; + + agl::utl::ResParameterArchive archive{data}; + const auto root = archive.getRootList(); + + addList(&mBlenderBoneList, "BlenderBone"); + + const auto lists = agl::utl::getResParameterList(root, "BlenderBone"); + if (!lists.ptr()) + return true; + + const auto num_blender_bones = lists.getResParameterListNum(); + if (num_blender_bones == 0) + return true; + + if (!allocBlenderBones(mBlenderBones, num_blender_bones, heap)) + return false; + + auto res_it = lists.listBegin(); + const auto res_it_end = lists.listEnd(); + sead::FixedSafeString<32> list_name{"BlenderBone"}; + const auto list_name_base_len = list_name.calcLength(); + + ASParamParser::ParseArgs args; + args.res_list = {}; + args.heap = heap; + + auto it = mBlenderBones.begin(); + const auto end = mBlenderBones.end(); + for (; it != end && res_it != res_it_end; ++it, ++res_it) { + list_name.trim(list_name_base_len); + list_name.appendWithFormat("%d", it.getIndex()); + mBlenderBoneList.addList(&it->mList, list_name); + + it->mKeyName.init("", "KeyName", "キー名", "", &it->mNameParamObj); + it->mList.addObj(&it->mNameParamObj, "NameParam"); + it->mList.addList(&it->mBoneParams.getList(), "BoneParam"); + + const auto list = *res_it; + args.list = &it->mList; + args.res_list = agl::utl::getResParameterList(list, "BoneParam"); + if (!it->mBoneParams.parse(args)) + return false; + } + + applyResParameterArchive(archive); + return true; +} + +bool allocBlenderBones(sead::Buffer& buffer, int size, sead::Heap* heap, + int align) { + return buffer.tryAllocBuffer(size, heap, align); +} + +SEAD_SINGLETON_DISPOSER_IMPL(ASSettingMgr) + +void ASSettingMgr::init(const sead::SafeString& config_path, sead::Heap* heap) { + LoadRequest req; + req.mRequester = "ASSetting"; + req._22 = true; + mHandle.load(config_path, &req); +} + +template +static ASParamParser* factoryImpl_(sead::Heap* heap) { + return new (heap) T; +} + +static ASParamParser* dummyASParserFactoryImpl_(sead::Heap*) { + return nullptr; +} + +namespace { +sead::SafeArray sASFactories{{ + {"FrameCtrl", factoryImpl_}, + {"TriggerEvents", factoryImpl_}, + {"HoldEvents", factoryImpl_}, + {"StringArray", factoryImpl_}, + {"Ranges", factoryImpl_}, + {"FloatArray", factoryImpl_}, + {"IntArray", factoryImpl_}, + {"BitIndex", factoryImpl_}, + {"BlenderBone", dummyASParserFactoryImpl_}, +}}; +} // namespace + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/Actor/resResourceASSetting.h b/src/KingSystem/Resource/Actor/resResourceASSetting.h new file mode 100644 index 00000000..84575fc4 --- /dev/null +++ b/src/KingSystem/Resource/Actor/resResourceASSetting.h @@ -0,0 +1,63 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "KingSystem/Resource/Actor/resResourceASResourceExtension.h" +#include "KingSystem/Resource/resResource.h" + +namespace ksys::res { + +class ASSetting : public agl::utl::IParameterIO, public Resource { + SEAD_RTTI_OVERRIDE(ASSetting, Resource) + +public: + struct BoneParam { + agl::utl::ParameterObj mObj; + agl::utl::Parameter mBone; + agl::utl::Parameter mWeight; + }; + KSYS_CHECK_SIZE_NX150(BoneParam, 0x78); + + class BoneParams : public ASParamParser { + SEAD_RTTI_OVERRIDE(BoneParams, ASParamParser) + public: + BoneParams() : ASParamParser(Type::BlenderBone) {} + ~BoneParams() override { mBuffer.freeBuffer(); } + bool parse(const ParseArgs& args) override; + f32 getBoneWeight(const sead::SafeString& name) const; + + sead::Buffer mBuffer; + }; + + struct BlenderBone { + agl::utl::ParameterList mList; + agl::utl::ParameterObj mNameParamObj; + agl::utl::Parameter mKeyName; + BoneParams mBoneParams; + }; + KSYS_CHECK_SIZE_NX150(BlenderBone, 0x108); + + ASSetting(); + ~ASSetting() override; + + void doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) override; + bool needsParse() const override { return true; } + bool parse_(u8* data, size_t size, sead::Heap* heap) override; + + sead::Buffer& getBlenderBones() { return mBlenderBones; } + const sead::Buffer& getBlenderBones() const { return mBlenderBones; } + +private: + sead::Buffer mBlenderBones; + agl::utl::ParameterList mBlenderBoneList; +}; +KSYS_CHECK_SIZE_NX150(ASSetting, 0x260); + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/Actor/resResourceASSettingMgr.h b/src/KingSystem/Resource/Actor/resResourceASSettingMgr.h new file mode 100644 index 00000000..e4d16984 --- /dev/null +++ b/src/KingSystem/Resource/Actor/resResourceASSettingMgr.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include "KingSystem/Resource/Actor/resResourceASSetting.h" +#include "KingSystem/Resource/resHandle.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { + +// FIXME: very incomplete +class ASSettingMgr { + SEAD_SINGLETON_DISPOSER(ASSettingMgr) + ASSettingMgr() = default; + virtual ~ASSettingMgr() = default; + +public: + void init(const sead::SafeString& config_path, sead::Heap* heap); + ASParamParser* getBoneParams(const sead::SafeString& key) const; + +private: + Handle mHandle; +}; +KSYS_CHECK_SIZE_NX150(ASSettingMgr, 0x78); + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index 1a9e5b28..825fe47a 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -128,8 +128,6 @@ target_sources(uking PRIVATE resResource.cpp resResource.h - resResourceASSetting.cpp - resResourceASSetting.h resResourceArchive.cpp resResourceArchive.h resResourceGameData.cpp @@ -153,8 +151,10 @@ target_sources(uking PRIVATE Actor/resResourceASList.h Actor/resResourceASResource.cpp Actor/resResourceASResource.h - Actor/resResourceASResourceExtension.cpp Actor/resResourceASResourceExtension.h + Actor/resResourceASSetting.cpp + Actor/resResourceASSetting.h + Actor/resResourceASSettingMgr.h Actor/resResourceAttCheck.cpp Actor/resResourceAttCheck.h Actor/resResourceAttClient.cpp diff --git a/src/KingSystem/Resource/resResourceASSetting.cpp b/src/KingSystem/Resource/resResourceASSetting.cpp deleted file mode 100644 index be0a3865..00000000 --- a/src/KingSystem/Resource/resResourceASSetting.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "KingSystem/Resource/resResourceASSetting.h" - -namespace ksys::res { - -ASSetting::ASSetting() { - mType = "assetting"; - mVersion = 0; -} - -ASSetting::~ASSetting() { - mBlenderBones.freeBuffer(); -} - -void ASSetting::doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) {} - -bool allocBlenderBones(sead::Buffer& buffer, int size, sead::Heap* heap, - int align = sizeof(void*)) { - return buffer.tryAllocBuffer(size, heap, align); -} - -bool ASSetting::parse_(u8* data, size_t size, sead::Heap* heap) { - if (!data) - return true; - - agl::utl::ResParameterArchive archive{data}; - const auto root = archive.getRootList(); - - addList(&mBlenderBoneList, "BlenderBone"); - - const auto lists = agl::utl::getResParameterList(root, "BlenderBone"); - if (!lists.ptr()) - return true; - - const auto num_blender_bones = lists.getResParameterListNum(); - if (num_blender_bones == 0) - return true; - - if (!allocBlenderBones(mBlenderBones, num_blender_bones, heap)) - return false; - - auto res_it = lists.listBegin(); - const auto res_it_end = lists.listEnd(); - sead::FixedSafeString<32> list_name{"BlenderBone"}; - const auto list_name_base_len = list_name.calcLength(); - - ASParamParser::ParseArgs args; - args.res_list = {}; - args.heap = heap; - - auto it = mBlenderBones.begin(); - const auto end = mBlenderBones.end(); - for (; it != end && res_it != res_it_end; ++it, ++res_it) { - list_name.trim(list_name_base_len); - list_name.appendWithFormat("%d", it.getIndex()); - mBlenderBoneList.addList(&it->mList, list_name); - - it->mKeyName.init("", "KeyName", "キー名", "", &it->mNameParamObj); - it->mList.addObj(&it->mNameParamObj, "NameParam"); - it->mList.addList(&it->mBoneParams.getList(), "BoneParam"); - - const auto list = *res_it; - args.list = &it->mList; - args.res_list = agl::utl::getResParameterList(list, "BoneParam"); - if (!it->mBoneParams.parse(args)) - return false; - } - - applyResParameterArchive(archive); - return true; -} - -ASSetting::BoneParams::~BoneParams() { - mBuffer.freeBuffer(); -} - -bool ASSetting::BoneParams::parse(const ASParamParser::ParseArgs& args) { - const auto num_objects = args.res_list.getResParameterObjNum(); - if (num_objects == 0) - return true; - - if (!mBuffer.tryAllocBuffer(num_objects, args.heap)) - return false; - - auto it = mBuffer.begin(); - const auto end = mBuffer.end(); - - sead::FixedSafeString<32> obj_name{"BoneParam"}; - const auto obj_name_base_len = obj_name.calcLength(); - - auto res_it = args.res_list.objBegin(); - const auto res_end = args.res_list.objEnd(); - - for (; it != end && res_it != res_end; ++it, ++res_it) { - it->mBone.init("", "Bone", "ボーン名", "", &it->mObj); - it->mWeight.init(0.0, "Weight", "ウェイト値", "Min=0.f,Max=1.f", &it->mObj); - - obj_name.trim(obj_name_base_len); - obj_name.appendWithFormat("%d", res_it.getIndex()); - mList.addObj(&it->mObj, obj_name); - } - - return true; -} - -f32 ASSetting::BoneParams::getBoneWeight(const sead::SafeString& name) const { - for (const auto& param : mBuffer) { - if (name == *param.mBone) - return *param.mWeight; - } - return 1.0; -} - -} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceASSetting.h b/src/KingSystem/Resource/resResourceASSetting.h deleted file mode 100644 index c9462199..00000000 --- a/src/KingSystem/Resource/resResourceASSetting.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "KingSystem/Resource/Actor/resResourceASResourceExtension.h" -#include "KingSystem/Resource/resResource.h" - -namespace ksys::res { - -class ASSetting : public agl::utl::IParameterIO, public Resource { - SEAD_RTTI_OVERRIDE(ASSetting, Resource) - -public: - struct BoneParam { - agl::utl::ParameterObj mObj; - agl::utl::Parameter mBone; - agl::utl::Parameter mWeight; - }; - KSYS_CHECK_SIZE_NX150(BoneParam, 0x78); - - class BoneParams : public ASParamParser { - SEAD_RTTI_OVERRIDE(BoneParams, ASParamParser) - public: - BoneParams() : ASParamParser(Type::BlenderBone) {} - ~BoneParams() override; - bool parse(const ParseArgs& args) override; - f32 getBoneWeight(const sead::SafeString& name) const; - - sead::Buffer mBuffer; - }; - - struct BlenderBone { - agl::utl::ParameterList mList; - agl::utl::ParameterObj mNameParamObj; - agl::utl::Parameter mKeyName; - BoneParams mBoneParams; - }; - KSYS_CHECK_SIZE_NX150(BlenderBone, 0x108); - - ASSetting(); - ~ASSetting() override; - - void doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) override; - bool needsParse() const override { return true; } - bool parse_(u8* data, size_t size, sead::Heap* heap) override; - - sead::Buffer& getBlenderBones() { return mBlenderBones; } - const sead::Buffer& getBlenderBones() const { return mBlenderBones; } - -private: - sead::Buffer mBlenderBones; - agl::utl::ParameterList mBlenderBoneList; -}; -KSYS_CHECK_SIZE_NX150(ASSetting, 0x260); - -} // namespace ksys::res diff --git a/src/KingSystem/System/CMakeLists.txt b/src/KingSystem/System/CMakeLists.txt index 333d110d..81b08666 100644 --- a/src/KingSystem/System/CMakeLists.txt +++ b/src/KingSystem/System/CMakeLists.txt @@ -15,8 +15,6 @@ target_sources(uking PRIVATE CoreInfo.h CurrentResNameMgr.cpp CurrentResNameMgr.h - DebugFinder.cpp - DebugFinder.h DebugMessage.h GameConfig.h HavokWorkerMgr.cpp @@ -48,6 +46,8 @@ target_sources(uking PRIVATE Revision.h StageInfo.cpp StageInfo.h + StagePreActorCache.cpp + StagePreActorCache.h StarterPackMgr.cpp StarterPackMgr.h StringBoard.h diff --git a/src/KingSystem/System/DebugFinder.cpp b/src/KingSystem/System/DebugFinder.cpp deleted file mode 100644 index 7e5a1d82..00000000 --- a/src/KingSystem/System/DebugFinder.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "KingSystem/System/DebugFinder.h" - -namespace ksys { - -SEAD_SINGLETON_DISPOSER_IMPL(DebugFinder) - -DebugFinder::DebugFinder() = default; - -DebugFinder::~DebugFinder() = default; - -} // namespace ksys diff --git a/src/KingSystem/System/DebugFinder.h b/src/KingSystem/System/DebugFinder.h deleted file mode 100644 index 16eb4e4c..00000000 --- a/src/KingSystem/System/DebugFinder.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include -#include - -namespace ksys { - -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 diff --git a/src/KingSystem/System/StagePreActorCache.cpp b/src/KingSystem/System/StagePreActorCache.cpp new file mode 100644 index 00000000..0b4a6484 --- /dev/null +++ b/src/KingSystem/System/StagePreActorCache.cpp @@ -0,0 +1,7 @@ +#include "KingSystem/System/StagePreActorCache.h" + +namespace ksys { + +SEAD_SINGLETON_DISPOSER_IMPL(StagePreActorCache) + +} // namespace ksys diff --git a/src/KingSystem/System/StagePreActorCache.h b/src/KingSystem/System/StagePreActorCache.h new file mode 100644 index 00000000..2b9927ff --- /dev/null +++ b/src/KingSystem/System/StagePreActorCache.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +namespace ksys::gfx { +class ForestRenderer; +} + +namespace ksys::map { +class LazyTraverseList; +} + +namespace ksys { + +// TODO +class StagePreActorCache { + SEAD_SINGLETON_DISPOSER(StagePreActorCache) + StagePreActorCache(); + +public: + map::LazyTraverseList* getObjects() const { return mObjects; } + auto* getForestRenderer() { return mForestRenderer; } + +private: + char _0[0x20]; + map::LazyTraverseList* mObjects; + gfx::ForestRenderer* mForestRenderer; +}; + +} // namespace ksys -- cgit v1.2.3