diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 27559ca2..4993e887 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -76045,9 +76045,9 @@ 0x0000007100e422c8,sub_7100E422C8,356, 0x0000007100e4242c,sub_7100E4242C,96, 0x0000007100e4248c,sub_7100E4248C,104, -0x0000007100e424f4,Ecosystem::LevelSensor::ctor,40, -0x0000007100e4251c,Ecosystem::LevelSensor::dtor,72, -0x0000007100e42564,Ecosystem::LevelSensor::dtor_delete,80, +0x0000007100e424f4,Ecosystem::LevelSensor::ctor,40,_ZN4ksys3eco11LevelSensorC1Ev +0x0000007100e4251c,Ecosystem::LevelSensor::dtor,72,_ZN4ksys3eco11LevelSensorD1Ev +0x0000007100e42564,Ecosystem::LevelSensor::dtor_delete,80,_ZN4ksys3eco11LevelSensorD0Ev 0x0000007100e425b4,Ecosystem::LevelSensor::init,288, 0x0000007100e426d4,Ecosystem::LevelSensor::scaleWeapon,1552, 0x0000007100e42ce4,Ecosystem::LevelSensor::scaleActor,1308, diff --git a/src/KingSystem/CMakeLists.txt b/src/KingSystem/CMakeLists.txt index fede8909..3a64db1c 100644 --- a/src/KingSystem/CMakeLists.txt +++ b/src/KingSystem/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(ActorSystem) +add_subdirectory(Ecosystem) add_subdirectory(Framework) add_subdirectory(Map) add_subdirectory(MessageSystem) diff --git a/src/KingSystem/Ecosystem/CMakeLists.txt b/src/KingSystem/Ecosystem/CMakeLists.txt new file mode 100644 index 00000000..bb6801e4 --- /dev/null +++ b/src/KingSystem/Ecosystem/CMakeLists.txt @@ -0,0 +1,4 @@ +target_sources(uking PRIVATE + ecoLevelSensor.cpp + ecoLevelSensor.h +) diff --git a/src/KingSystem/Ecosystem/ecoLevelSensor.cpp b/src/KingSystem/Ecosystem/ecoLevelSensor.cpp new file mode 100644 index 00000000..42676953 --- /dev/null +++ b/src/KingSystem/Ecosystem/ecoLevelSensor.cpp @@ -0,0 +1,14 @@ +#include "KingSystem/Ecosystem/ecoLevelSensor.h" +#include "KingSystem/Utils/Byaml.h" + +namespace ksys::eco { + +LevelSensor::LevelSensor() = default; + +LevelSensor::~LevelSensor() { + mResHandle.requestUnload2(); + if (mBymlIter) + delete mBymlIter; +} + +} // namespace ksys::eco diff --git a/src/KingSystem/Ecosystem/ecoLevelSensor.h b/src/KingSystem/Ecosystem/ecoLevelSensor.h new file mode 100644 index 00000000..5b5d97f7 --- /dev/null +++ b/src/KingSystem/Ecosystem/ecoLevelSensor.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include "KingSystem/Resource/resHandle.h" +#include "KingSystem/Utils/Types.h" + +namespace al { +class ByamlIter; +} + +namespace ksys::act { +class Actor; +class InstParamPack; +} // namespace ksys::act + +namespace ksys::map { +class Object; +} + +namespace ksys::eco { + +enum class WeaponModifier { + None = 0, + /// This will be upgraded to Blue randomly. + RandomBlue = 1, + Blue = 2, + Yellow = 3, + /// Chests only: Weapon will never spawn with any modifiers. This overrides regular scaling. + NoneForced = 4, +}; + +class LevelSensor { +public: + LevelSensor(); + virtual ~LevelSensor(); + + void init(sead::Heap* heap); + + bool scaleWeapon(const sead::SafeString& weapon, WeaponModifier min_modifier, + const char** scaled_weapon, WeaponModifier* scaled_modifier, + act::Actor* actor) const; + + bool scaleActor(const sead::SafeString& name, map::Object* obj, const char** scaled_weapon, + act::InstParamPack* pack, const sead::Vector3f& position) const; + + void calculatePoints(); + +private: + f32 mPoints{}; + f32 mWeaponPoints{}; + f32 mEnemyPoints{}; + bool _14{}; + f32 mDefaultPoints = -1; + al::ByamlIter* mBymlIter = nullptr; + res::Handle mResHandle; +}; +KSYS_CHECK_SIZE_NX150(LevelSensor, 0x78); + +} // namespace ksys::eco