#include "KingSystem/Ecosystem/ecoLevelSensor.h" #include "KingSystem/GameData/gdtManager.h" #include "KingSystem/Resource/resLoadRequest.h" #include "KingSystem/Utils/Byaml/Byaml.h" namespace ksys::eco { LevelSensor::LevelSensor() = default; LevelSensor::~LevelSensor() { mResHandle.requestUnload2(); if (mRootIter) delete mRootIter; } void LevelSensor::init(sead::Heap* heap) { res::LoadRequest req; req.mRequester = "LevelSensor"; mResHandle.load("Ecosystem/LevelSensor.byml", &req); auto* res = sead::DynamicCast(mResHandle.getResource()); 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