summaryrefslogtreecommitdiff
path: root/src/KingSystem/Ecosystem/ecoSystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/KingSystem/Ecosystem/ecoSystem.cpp')
-rw-r--r--src/KingSystem/Ecosystem/ecoSystem.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/KingSystem/Ecosystem/ecoSystem.cpp b/src/KingSystem/Ecosystem/ecoSystem.cpp
index 83fd3c8c..0e6fded4 100644
--- a/src/KingSystem/Ecosystem/ecoSystem.cpp
+++ b/src/KingSystem/Ecosystem/ecoSystem.cpp
@@ -1,7 +1,26 @@
#include "KingSystem/Ecosystem/ecoSystem.h"
+#include "KingSystem/Resource/resLoadRequest.h"
+#include "KingSystem/Utils/Byaml/Byaml.h"
namespace ksys::eco {
+constexpr const char* sAreaItemTypeStr[] = {
+ "Animal",
+ "Fish",
+ "Insect",
+ "Bird",
+ "Mushroom",
+ "Fruit",
+ "Mineral",
+ "Plant",
+ "Enemy",
+ "GrassCut",
+ "AutoCliffMaterial",
+ "AutoPlacementMaterial",
+ "RuinAutoPlacement",
+ "RainBonusMaterial",
+};
+
static const char* sStatusEffectNames[22] = {"StatusEffect",
"LifeRecover",
"LifeMaxUp",
@@ -27,6 +46,55 @@ static const char* sStatusEffectNames[22] = {"StatusEffect",
SEAD_SINGLETON_DISPOSER_IMPL(Ecosystem)
+static void setEcoMapInfo(EcoMapInfo& info, const u8* data) {
+ info.mHeader = reinterpret_cast<const EcoMapHeader*>(data);
+ info.mRowOffsets = reinterpret_cast<const u32*>(info.mHeader + 1);
+ info.mRows =
+ reinterpret_cast<const char*>(info.mRowOffsets) + sizeof(int) * info.mHeader->num_rows;
+}
+
+void Ecosystem::init(sead::Heap* heap) {
+ res::LoadRequest req;
+ req.mRequester = "Ecosystem";
+
+ req._22 = false;
+ mHandles.mFieldMapArea.load("Ecosystem/FieldMapArea.beco", &req);
+
+ req._22 = true;
+ mHandles.mAreaData.load("Ecosystem/AreaData.byml", &req);
+
+ req._22 = false;
+ mHandles.mMapTower.load("Ecosystem/MapTower.beco", &req);
+
+ req._22 = false;
+ mHandles.mStatusEffectList.load("Ecosystem/StatusEffectList.byml", &req);
+
+ req._22 = false;
+ mHandles.mLoadBalancer.load("Ecosystem/LoadBalancer.beco", &req);
+
+ auto* field_map_area =
+ sead::DynamicCast<sead::DirectResource>(mHandles.mFieldMapArea.getResource());
+ setEcoMapInfo(mFieldMapArea, field_map_area->getRawData());
+
+ auto* map_tower = sead::DynamicCast<sead::DirectResource>(mHandles.mMapTower.getResource());
+ setEcoMapInfo(mMapTower, map_tower->getRawData());
+
+ auto* load_balancer =
+ sead::DynamicCast<sead::DirectResource>(mHandles.mLoadBalancer.getResource());
+ setEcoMapInfo(mLoadBalancer, load_balancer->getRawData());
+
+ auto* area_data = sead::DynamicCast<sead::DirectResource>(mHandles.mAreaData.getResource());
+ mAreaDataIter = new (heap) al::ByamlIter(area_data->getRawData());
+ mAreaDataSize = mAreaDataIter->getSize();
+
+ auto* status_effect_list =
+ sead::DynamicCast<sead::DirectResource>(mHandles.mStatusEffectList.getResource());
+ mStatusEffectListIter = new (heap) al::ByamlIter(status_effect_list->getRawData());
+
+ mLevelSensor = new (heap) LevelSensor;
+ mLevelSensor->init(heap);
+}
+
void Ecosystem::calc() {}
// FP instructions rearranged.
@@ -65,6 +133,64 @@ s32 Ecosystem::getMapArea(const EcoMapInfo& info, f32 posX, f32 posZ) const {
}
#endif
+void Ecosystem::getAreaItems(s32 areaNum, AreaItemType type, AreaItemSet* out) const {
+ out->count = 0;
+
+ if (areaNum < 0 || areaNum >= int(mAreaDataSize))
+ return;
+
+ al::ByamlIter area_iter;
+ if (!mAreaDataIter->tryGetIterByIndex(&area_iter, areaNum))
+ return;
+
+ al::ByamlIter items_iter;
+ if (!area_iter.tryGetIterByKey(&items_iter, sAreaItemTypeStr[u32(type)]))
+ return;
+
+ out->count = items_iter.getSize();
+
+ for (int i = 0; i < out->count; ++i) {
+ al::ByamlIter item_iter;
+ if (!items_iter.tryGetIterByIndex(&item_iter, i))
+ continue;
+
+ auto& entry = out->items[i];
+
+ item_iter.tryGetStringByKey(&entry.name, "name");
+ item_iter.tryGetFloatByKey(&entry.num, "num");
+
+ if (!item_iter.tryGetStringByKey(&entry.set, "set"))
+ entry.set = nullptr;
+
+ if (!item_iter.tryGetFloatByKey(&entry.radius, "radius"))
+ entry.radius = 0.0;
+
+ al::ByamlIter weapons_iter;
+ if (item_iter.tryGetIterByKey(&weapons_iter, "weapons")) {
+ // Fill in weapon information now.
+ for (int w_idx = 0; w_idx < weapons_iter.getSize(); ++w_idx) {
+ al::ByamlIter weapon_iter;
+ if (!weapons_iter.tryGetIterByIndex(&weapon_iter, w_idx))
+ continue;
+
+ auto& weapon = entry.weapons[w_idx];
+ weapon_iter.tryGetStringByKey(&weapon.name, "name");
+ if (!weapon_iter.tryGetFloatByKey(&weapon.prob, "prob")) {
+ // Try to get `prob` again, this time as an integer.
+ int prob;
+ if (weapon_iter.tryGetIntByKey(&prob, "prob"))
+ weapon.prob = prob;
+ else
+ weapon.prob = 100.0;
+ }
+ }
+ entry.num_weapons = weapons_iter.getSize();
+ } else {
+ entry.num_weapons = 0;
+ }
+ }
+}
+
void Ecosystem::getAreaNameByNum(s32 areaNum, const char** out) const {
*out = nullptr;
@@ -199,4 +325,6 @@ void Ecosystem::getEcoTraitsByNum(s32 areaNum, EcosystemTraits* out) const {
}
}
+Ecosystem::~Ecosystem() = default;
+
} // namespace ksys::eco