summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actActorUtil.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-12-02 21:19:13 +0100
committerLéo Lam <leo@leolam.fr>2020-12-02 23:11:51 +0100
commitbfbe2db425d0bfa4d03315053f0bcebd3a077618 (patch)
tree9cb3388bc7b2c602817286c38c8220ff856f0e08 /src/KingSystem/ActorSystem/actActorUtil.cpp
parent3da63099f6ebe14fa5b4fc9d142a17b6026010ef (diff)
ksys/act: Implement ActorUtil placement functions
Diffstat (limited to 'src/KingSystem/ActorSystem/actActorUtil.cpp')
-rw-r--r--src/KingSystem/ActorSystem/actActorUtil.cpp84
1 files changed, 82 insertions, 2 deletions
diff --git a/src/KingSystem/ActorSystem/actActorUtil.cpp b/src/KingSystem/ActorSystem/actActorUtil.cpp
index 98937a2d..f7e37ebe 100644
--- a/src/KingSystem/ActorSystem/actActorUtil.cpp
+++ b/src/KingSystem/ActorSystem/actActorUtil.cpp
@@ -4,16 +4,32 @@
#include "KingSystem/ActorSystem/actActorParam.h"
#include "KingSystem/ActorSystem/actBaseProcLink.h"
#include "KingSystem/ActorSystem/actInfoData.h"
+#include "KingSystem/ActorSystem/actTag.h"
+#include "KingSystem/GameData/gdtManager.h"
+#include "KingSystem/Map/mapObject.h"
+#include "KingSystem/Map/mapPlacementMgr.h"
#include "KingSystem/Resource/resResourceActorLink.h"
+#include "KingSystem/World/worldManager.h"
namespace ksys::act {
-static ActorConstDataAccess getAccessor(BaseProcLink* link) {
+namespace {
+
+ActorConstDataAccess getAccessor(BaseProcLink* link) {
ActorConstDataAccess accessor;
acquireActor(link, &accessor);
return accessor;
}
+const char* sArrowTypes[] = {
+ "NormalArrow", "BombArrow_A", "AncientArrow", "FireArrow", "IceArrow", "ElectricArrow",
+};
+gdt::FlagHandle sAnimalMasterAppearanceHandle = gdt::InvalidHandle;
+gdt::FlagHandle sFairyCountCheckHandle = gdt::InvalidHandle;
+gdt::FlagHandle sIsGetStopTimerLv2Handle = gdt::InvalidHandle;
+
+} // namespace
+
bool hasTag(Actor* actor, const sead::SafeString& tag) {
if (!actor)
return false;
@@ -70,7 +86,7 @@ bool hasOneTagAtLeast(BaseProcLink* link, const sead::SafeString& tags) {
return false;
}
-bool act::hasOneTagAtLeast(const ActorConstDataAccess& accessor, const sead::SafeString& tags) {
+bool hasOneTagAtLeast(const ActorConstDataAccess& accessor, const sead::SafeString& tags) {
sead::FixedSafeString<32> tag;
for (auto it = tags.tokenBegin(","); tags.tokenEnd(",") != it; ++it) {
it.get(&tag);
@@ -80,4 +96,68 @@ bool act::hasOneTagAtLeast(const ActorConstDataAccess& accessor, const sead::Saf
return false;
}
+// NON_MATCHING: this version doesn't have unnecessary register moves.
+bool shouldSkipSpawnWhenRaining(map::Object* obj) {
+ if (obj->getFlags().isOff(map::Object::Flag::CreateNotRain))
+ return false;
+
+ if (!world::Manager::instance())
+ return false;
+
+ const auto pos = obj->getTranslate();
+ return !world::Manager::instance()->isRaining(pos);
+}
+
+bool shouldSkipSpawnIfGodForestOff(map::Object* obj) {
+ bool value = false;
+ if (obj->getFlags().isOff(map::Object::Flag::UnderGodForestOff))
+ return false;
+ if (!gdt::Manager::instance()->getBool(sAnimalMasterAppearanceHandle, &value, true))
+ return false;
+ return value != 0;
+}
+
+bool shouldSkipSpawnGodForestActor(map::Object* obj) {
+ bool value = false;
+ if (obj->getFlags().isOn(map::Object::Flag::UnderGodForest) &&
+ gdt::Manager::instance()->getBool(sAnimalMasterAppearanceHandle, &value, true) && !value) {
+ return true;
+ }
+ return shouldSkipSpawnIfGodForestOff(obj);
+}
+
+static bool isFairyCountCheckEnabled() {
+ bool value = false;
+ return gdt::Manager::instance()->getBool(sFairyCountCheckHandle, &value, true) && value;
+}
+
+bool shouldSkipSpawnFairy(map::Object* obj) {
+ const map::ActorData& actor_data = obj->getActorData();
+ if (!actor_data.mFlags.isOnBit(map::ActorData::Flag::Fairy))
+ return false;
+
+ return isFairyCountCheckEnabled();
+}
+
+bool shouldSkipSpawnFairy(const sead::SafeString& actor) {
+ auto* info = InfoData::instance();
+ if (!info || !info->hasTag(actor.cstr(), tags::Fairy))
+ return false;
+
+ return isFairyCountCheckEnabled();
+}
+
+void initSpawnConditionGameDataFlags() {
+ sFairyCountCheckHandle = gdt::Manager::instance()->getBoolHandle("FairyCountCheck");
+ sAnimalMasterAppearanceHandle =
+ gdt::Manager::instance()->getBoolHandle("AnimalMaster_Appearance");
+ sIsGetStopTimerLv2Handle = gdt::Manager::instance()->getBoolHandle("IsGet_Obj_StopTimerLv2");
+}
+
+// TODO: remove this once IsGetStopTimerLv2 is used
+// The only purpose of this function is to prevent sIsGetStopTimerLv2Handle from being optimized out
+auto initSpawnConditionGameDataFlags_dummy() {
+ return sIsGetStopTimerLv2Handle;
+}
+
} // namespace ksys::act