diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 219485fb..8e499364 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -77885,7 +77885,7 @@ Address,Quality,Size,Name 0x0000007100e425b4,O,000288,_ZN4ksys3eco11LevelSensor4initEPN4sead4HeapE 0x0000007100e426d4,U,001552,Ecosystem::LevelSensor::scaleWeapon 0x0000007100e42ce4,U,001308,Ecosystem::LevelSensor::scaleActor -0x0000007100e43200,U,000576,Ecosystem::LevelSensor::calculatePoints +0x0000007100e43200,O,000576,_ZN4ksys3eco11LevelSensor15calculatePointsEv 0x0000007100e43440,O,000052,_ZN5uking6action22EventAppearRupeeActionC1ERKN4ksys3act2ai10ActionBase7InitArgE 0x0000007100e43474,U,000048,_ZN5uking6action22EventAppearRupeeAction8oneShot_Ev 0x0000007100e434a4,O,000108,_ZN5uking6action22EventAppearRupeeAction11loadParams_Ev diff --git a/src/KingSystem/Ecosystem/ecoLevelSensor.cpp b/src/KingSystem/Ecosystem/ecoLevelSensor.cpp index a5b74df2..201efafc 100644 --- a/src/KingSystem/Ecosystem/ecoLevelSensor.cpp +++ b/src/KingSystem/Ecosystem/ecoLevelSensor.cpp @@ -1,4 +1,5 @@ #include "KingSystem/Ecosystem/ecoLevelSensor.h" +#include "KingSystem/GameData/gdtManager.h" #include "KingSystem/Resource/resLoadRequest.h" #include "KingSystem/Utils/Byaml/Byaml.h" @@ -20,4 +21,53 @@ void LevelSensor::init(sead::Heap* heap) { mRootIter = new (heap) al::ByamlIter(res->getRawData()); } +void LevelSensor::calculatePoints() { + if (mDefaultPoints >= 0) { + mPoints = mDefaultPoints; + } else { + al::ByamlIter flag; + if (!mRootIter->tryGetIterByKey(&flag, "flag")) { + return; + } + float point_sum = 0; + for (int index = 0; index < flag.getSize(); index++) { + al::ByamlIter iter_enemy; + if (!flag.tryGetIterByIndex(&iter_enemy, index)) { + return; + } + const char* name; + if (!iter_enemy.tryGetStringByKey(&name, "name")) { + return; + } + s32 kill_count = 0; + if (!gdt::Manager::instance()->getParam().get().getS32(&kill_count, name)) { + bool unique_kill = false; + if (gdt::Manager::instance()->getParam().get().getBool(&unique_kill, name)) { + if (unique_kill) { + kill_count = 1; + } + } + } + if (kill_count > 0) { + f32 point; + if (!iter_enemy.tryGetFloatByKey(&point, "point")) { + return; + } + point_sum += point * kill_count; + } + } + mPoints = point_sum; + } + al::ByamlIter setting_iter; + if (mRootIter->tryGetIterByKey(&setting_iter, "setting")) { + f32 Level2WeaponPower; + f32 Level2EnemyPower; + if (setting_iter.tryGetFloatByKey(&Level2WeaponPower, "Level2WeaponPower") && + setting_iter.tryGetFloatByKey(&Level2EnemyPower, "Level2EnemyPower")) { + mWeaponPoints = mPoints * Level2WeaponPower; + mEnemyPoints = mPoints * Level2EnemyPower; + } + } +} + } // namespace ksys::eco