diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 3f56246a..7a6a1121 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89296,20 +89296,20 @@ 0x00000071010dcd18,WorldMgr::Remains::ctor,276,_ZN4ksys5world6EnvMgr7RemainsC2Ev 0x00000071010dce2c,sub_71010DCE2C,12, 0x00000071010dce38,sub_71010DCE38,12, -0x00000071010dce44,wm::ShootingStarMgr::ctor,60, -0x00000071010dce80,wm::ShootingStarMgr::dtor,4, -0x00000071010dce84,wm::ShootingStarMgr::dtorDelete,36, -0x00000071010dcea8,wm::ShootingStarMgr::init,36, -0x00000071010dcecc,wm::ShootingStarMgr::init_,620, -0x00000071010dd138,wm::ShootingStarMgr::calc_,368, -0x00000071010dd2a8,sub_71010DD2A8,116, +0x00000071010dce44,wm::ShootingStarMgr::ctor,60,_ZN4ksys5world15ShootingStarMgrC1Ev +0x00000071010dce80,wm::ShootingStarMgr::dtor,4,_ZN4ksys5world15ShootingStarMgrD1Ev +0x00000071010dce84,wm::ShootingStarMgr::dtorDelete,36,_ZN4ksys5world15ShootingStarMgrD0Ev +0x00000071010dcea8,wm::ShootingStarMgr::init,36,_ZN4ksys5world15ShootingStarMgr5init_EPN4sead4HeapE +0x00000071010dcecc,wm::ShootingStarMgr::init_,620,_ZN4ksys5world15ShootingStarMgr12initScheduleEv! +0x00000071010dd138,wm::ShootingStarMgr::calc_,368,_ZN4ksys5world15ShootingStarMgr5calc_Ev +0x00000071010dd2a8,sub_71010DD2A8,116,_ZN4ksys5world15ShootingStarMgr15isScheduledTimeEv 0x00000071010dd31c,sub_71010DD31C,308, 0x00000071010dd450,spawnShootingStar,412, -0x00000071010dd5ec,sub_71010DD5EC,84, -0x00000071010dd640,wm::ShootingStarMgr::spawnStar,340, -0x00000071010dd794,sub_71010DD794,160, -0x00000071010dd834,sub_71010DD834,108, -0x00000071010dd8a0,sub_71010DD8A0,88, +0x00000071010dd5ec,sub_71010DD5EC,84,_ZN4ksys5world15ShootingStarMgr17resetStarPositionEv +0x00000071010dd640,wm::ShootingStarMgr::spawnStar,340,_ZN4ksys5world15ShootingStarMgr9spawnStarEv +0x00000071010dd794,sub_71010DD794,160,_ZN4ksys5world15ShootingStarMgr19isStarPositionValidEv +0x00000071010dd834,sub_71010DD834,108,_ZNK4ksys5world15ShootingStarMgr18tryGetStarPositionEPN4sead7Vector3IfEE +0x00000071010dd8a0,sub_71010DD8A0,88,_ZN4ksys5world15ShootingStarMgr15setStarPositionEfff 0x00000071010dd8f8,sub_71010DD8F8,36, 0x00000071010dd91c,wm::CloudMgr::ctor,16892,_ZN4ksys5world6SkyMgrC1Ev 0x00000071010e1b18,sub_71010E1B18,196,_ZN4sead9SafeArrayIN4ksys5world6SkyMgr10SkyPaletteELi8EEC2Ev diff --git a/src/KingSystem/World/worldManager.h b/src/KingSystem/World/worldManager.h index 2176a7e0..2eb13ac0 100644 --- a/src/KingSystem/World/worldManager.h +++ b/src/KingSystem/World/worldManager.h @@ -190,6 +190,7 @@ public: mScalingMode == ScalingMode::Disabled; } + bool isDemo() const { return mIsDemo; } StageType getStageType() const { return mStageType; } FieldType getFieldType() const { return mFieldType; } ScalingMode getScalingMode() const { return mScalingMode; } diff --git a/src/KingSystem/World/worldShootingStarMgr.cpp b/src/KingSystem/World/worldShootingStarMgr.cpp index cbfa5078..b1d0066c 100644 --- a/src/KingSystem/World/worldShootingStarMgr.cpp +++ b/src/KingSystem/World/worldShootingStarMgr.cpp @@ -1 +1,160 @@ #include "KingSystem/World/worldShootingStarMgr.h" +#include +#include +#include "KingSystem/ActorSystem/actActorCreator.h" +#include "KingSystem/ActorSystem/actBaseProcHeapMgr.h" +#include "KingSystem/ActorSystem/actInstParamPack.h" +#include "KingSystem/GameData/gdtManager.h" +#include "KingSystem/World/worldManager.h" + +namespace ksys::world { + +static bool sScheduled = true; + +static struct { + int end = 3; + int start = 21; + int unk = 4; +} sHours; + +static sead::Vector3f sStarProperty{}; + +ShootingStarMgr::ShootingStarMgr() = default; + +ShootingStarMgr::~ShootingStarMgr() = default; + +void ShootingStarMgr::init_(sead::Heap* heap) { + if (Manager::instance()->isDemo()) + sScheduled = false; + else + initSchedule(); +} + +// NON_MATCHING +void ShootingStarMgr::initSchedule() { + if (sHours.start >= sHours.end) { + sead::FixedObjArray validHours; + + if (sHours.start <= 23) { + for (int i = 0; i < 24; ++i) { + validHours.emplaceBack(sHours.start); + } + } + if (sHours.end > 1) { + for (int i = 0; i < 23; ++i) { + validHours.emplaceBack(i); + } + } + auto rand = sead::Random(); + validHours.shuffle(&rand); + mFallHour = *validHours[0]; + } else { + mFallHour = sead::GlobalRandom::instance()->getS32Range(sHours.start, sHours.end - 1); + } + mFallMinute = sead::GlobalRandom::instance()->getU32(59); + mInitialised = true; +} + +void ShootingStarMgr::calc_() { + if (Manager::instance() != nullptr) { + if (!mIsMainField) + return; + if (sScheduled) { + if (Manager::instance()->isDemo()) { + sScheduled = false; + return; + } + TimeMgr* tm = Manager::instance()->getTimeMgr(); + if (tm != nullptr) { + int hour = tm->getHour(); + if (mInitialised) { + if (hour == mFallHour && mFallMinute < tm->getMinute()) + mNeedSpawnStar = true; + } else if (Manager::instance() != nullptr) { + if (isScheduledTime()) + initSchedule(); + } + } + } + } + if (mNeedSpawnStar && checkCamera()) { + spawnShootingStar(); + mInitialised = false; + mNeedSpawnStar = false; + } +} + +bool ShootingStarMgr::isScheduledTime() { + bool result = false; + if (Manager::instance() != nullptr) { + auto* tm = Manager::instance()->getTimeMgr(); + if (tm != nullptr) { + int hour = tm->getHour(); + if (sHours.start > sHours.unk) { + result = sHours.unk < hour && hour < sHours.start; + } else { + result = sHours.unk < hour || hour < sHours.start; + } + } + } + return result; +} + +void ShootingStarMgr::resetStarPosition() { + if (gdt::Manager::instance() != nullptr) + gdt::Manager::instance()->setVec3f(sead::Vector3f::zero, "ShootingStarPosition"); +} + +void ShootingStarMgr::spawnStar() { + if (gdt::Manager::instance() == nullptr) + return; + + if (!isStarPositionValid()) + return; + + act::InstParamPack pack; + sead::Vector3f pos; + tryGetStarPosition(&pos); + + pack.getBuffer().add(pos, "@P"); + act::ActorCreator::instance()->requestCreateActor("FldObj_ShootingStar", + act::BaseProcHeapMgr::instance()->getHeap(), + nullptr, &pack, nullptr, 1); +} + +bool ShootingStarMgr::isStarPositionValid() { + if (gdt::Manager::instance() == nullptr) + return false; + + sead::Vector3f pos; + if (!gdt::Manager::instance()->getParam().get().getVec3f(&pos, "ShootingStarPosition")) + return false; + return !(pos.x == 0 && pos.y == 0 && pos.z == 0); +} + +bool ShootingStarMgr::tryGetStarPosition(sead::Vector3f* out) const { + bool result = false; + if (gdt::Manager::instance()) + result = gdt::Manager::instance()->getParam().get().getVec3f(out, "ShootingStarPosition"); + return result; +} + +void ShootingStarMgr::setStarPosition(f32 x, f32 y, f32 z) { + sead::Vector3f pos(x, y, z); + + if (gdt::Manager::instance()) { + gdt::Manager::instance()->setVec3f(pos, "ShootingStarPosition"); + } +} + +void ShootingStarMgr::setScheduled(bool enable) { + sScheduled = enable; +} + +void ShootingStarMgr::setShootingStarHours(int start, int end, int hr_unk) { + sHours.start = start; + sHours.end = end; + sHours.unk = hr_unk; +} + +} // namespace ksys::world diff --git a/src/KingSystem/World/worldShootingStarMgr.h b/src/KingSystem/World/worldShootingStarMgr.h index 1f9023c2..c5ea57c8 100644 --- a/src/KingSystem/World/worldShootingStarMgr.h +++ b/src/KingSystem/World/worldShootingStarMgr.h @@ -1,20 +1,44 @@ #pragma once +#include +#include #include "KingSystem/Utils/Types.h" #include "KingSystem/World/worldJob.h" namespace ksys::world { -// TODO class ShootingStarMgr : public Job { public: ShootingStarMgr(); + virtual ~ShootingStarMgr(); JobType getType() const override { return JobType::ShootingStar; } + virtual void init_(sead::Heap* heap) override; + virtual void calc_() override; virtual void reset(); - u8 _20[0x30 - 0x20]; + static void setScheduled(bool enable); + void initSchedule(); + static bool isScheduledTime(); + + bool tryGetStarPosition(sead::Vector3f* out) const; + static void setStarPosition(f32 x, f32 y, f32 z); + static void spawnShootingStar(); + void spawnStar(); + + static bool checkCamera(); + bool isStarPositionValid(); + static void setShootingStarHours(int start, int end, int hr_unk); + static void resetStarPosition(); + static void resetStarProperty(); + + s32 mFallHour = 0; + s32 mFallMinute = 0; + bool mInitialised = false; + bool mNeedSpawnStar = false; + bool mIsMainField = false; + bool _2b = false; }; KSYS_CHECK_SIZE_NX150(ShootingStarMgr, 0x30);