summaryrefslogtreecommitdiff
path: root/src/REL/d
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2024-09-12 22:23:11 +0200
committerGitHub <noreply@github.com>2024-09-12 16:23:11 -0400
commite2c4bb7be7fa731a335bce4bc22283d899133e39 (patch)
tree91152d84cae384b376f4ce4c87e9e247255ec954 /src/REL/d
parent9aa30ee4995be938e1ea05f6d476d63fcb8cc67e (diff)
Dowsing (#17)
* Dowsing. * d_t_dowsing * d_t_holy_water OK
Diffstat (limited to 'src/REL/d')
-rw-r--r--src/REL/d/a/d_a_t_wood_area.cpp2
-rw-r--r--src/REL/d/t/d_t_dowsing.cpp81
-rw-r--r--src/REL/d/t/d_t_genki_dws_tgt.cpp69
-rw-r--r--src/REL/d/t/d_t_holy_water.cpp41
-rw-r--r--src/REL/d/t/d_t_light_shaft_eff.cpp16
-rw-r--r--src/REL/d/t/d_t_map_inst.cpp12
-rw-r--r--src/REL/d/t/d_t_tackle.cpp16
7 files changed, 235 insertions, 2 deletions
diff --git a/src/REL/d/a/d_a_t_wood_area.cpp b/src/REL/d/a/d_a_t_wood_area.cpp
index 43921e3a..2bf155e4 100644
--- a/src/REL/d/a/d_a_t_wood_area.cpp
+++ b/src/REL/d/a/d_a_t_wood_area.cpp
@@ -56,7 +56,7 @@ extern u16 PARTICLE_RESOURCE_ID_MAPPING[];
void dAcTWoodArea_c::initializeState_Wait() {}
void dAcTWoodArea_c::executeState_Wait() {
- if (dPlayer::LINK != nullptr && (dPlayer::LINK->someFlags & 0x2000)) {
+ if (dPlayer::LINK != nullptr && (dPlayer::LINK->someFlags_0x350 & 0x2000)) {
// This is a bit messed up
mVec3_c dist = position - dPlayer::LINK->position;
f32 attachRadius = getAttachRadius();
diff --git a/src/REL/d/t/d_t_dowsing.cpp b/src/REL/d/t/d_t_dowsing.cpp
index e69de29b..9a664f63 100644
--- a/src/REL/d/t/d_t_dowsing.cpp
+++ b/src/REL/d/t/d_t_dowsing.cpp
@@ -0,0 +1,81 @@
+#include <d/tg/d_t_dowsing.h>
+#include <toBeSorted/item_story_flag_manager.h>
+#include <toBeSorted/room_manager.h>
+#include <toBeSorted/sceneflag_manager.h>
+
+SPECIAL_ACTOR_PROFILE(T_DOWSING, dTgDowsing_c, fProfile::T_DOWSING, 0x0293, 0, 0);
+
+dTgDowsing_c::dTgDowsing_c() : mDowsingTarget(this, DowsingTarget::SLOT_NONE) {}
+
+int dTgDowsing_c::create() {
+ mDowsingOption = getDowsingOption();
+ if (mDowsingOption > 11) {
+ mDowsingOption = DOWSING_MAX;
+ }
+ mUntriggerStoryFlag = getUntriggerStoryFlag();
+ mTriggerStoryFlag = getTriggerStoryFlag();
+ rotation.z = 0;
+ bool doThing = getDowsingOptionNum() <= DOWSING_MAX && (1 << getDowsingOptionNum() & 0xC3F) != 0;
+
+ mDowsingTarget.initialize(!doThing ? DowsingTarget::SLOT_QUEST : DowsingTarget::SLOT_STORY_EVENT, 0, nullptr, 0);
+ mTargetActive = false;
+ return SUCCEEDED;
+}
+
+int dTgDowsing_c::doDelete() {
+ return 1;
+}
+
+int dTgDowsing_c::actorExecute() {
+ if (getTriggerSceneFlag() < 0xFF && SceneflagManager::sInstance->checkBoolFlag(roomid, getTriggerSceneFlag()) ||
+ getUntriggerSceneFlag() < 0xFF &&
+ !SceneflagManager::sInstance->checkBoolFlag(roomid, getUntriggerSceneFlag()) ||
+ !checkDowsing()) {
+ mDowsingTarget.doUnregister();
+ mTargetActive = false;
+ } else if (!mTargetActive && checkDowsing()) {
+ mDowsingTarget.doRegister();
+ mTargetActive = true;
+ }
+ return 1;
+}
+
+int dTgDowsing_c::draw() {
+ return 1;
+}
+
+bool dTgDowsing_c::checkDowsing() const {
+ if (!((mUntriggerStoryFlag == 0 || mUntriggerStoryFlag >= 0x7FF ||
+ !StoryFlagManager::sInstance->getCounterOrFlag(mUntriggerStoryFlag)) &&
+ (mTriggerStoryFlag == 0 || mTriggerStoryFlag >= 0x7FF ||
+ StoryFlagManager::sInstance->getCounterOrFlag(mTriggerStoryFlag)))) {
+ return false;
+ }
+
+ switch (mDowsingOption) {
+ case TRIAL_0:
+ return ItemFlagManager::sInstance->getFlag(187) && !StoryFlagManager::sInstance->getCounterOrFlag(93);
+ case TRIAL_1:
+ return ItemFlagManager::sInstance->getFlag(188) && !StoryFlagManager::sInstance->getCounterOrFlag(97);
+ case TRIAL_2:
+ return ItemFlagManager::sInstance->getFlag(189) && !StoryFlagManager::sInstance->getCounterOrFlag(98);
+ case TRIAL_3:
+ return ItemFlagManager::sInstance->getFlag(193) && !StoryFlagManager::sInstance->getCounterOrFlag(99);
+ case PROPELLER:
+ return DowsingTarget::hasPropellerDowsing();
+ case WATER_BASIN:
+ return DowsingTarget::hasWaterBasinDowsing();
+ case CRYSTAL_BALL:
+ return DowsingTarget::hasCrystalBallDowsing();
+ case PUMPKIN:
+ return DowsingTarget::hasPumpkinDowsing();
+ case NEW_PLANT_SPECIES:
+ return DowsingTarget::hasNewPlantSpeciesDowsing();
+ case PARTY_WHEEL:
+ return DowsingTarget::hasPartyWheelDowsing();
+ case ZELDA:
+ return DowsingTarget::hasZeldaDowsing();
+ default:
+ return true;
+ }
+}
diff --git a/src/REL/d/t/d_t_genki_dws_tgt.cpp b/src/REL/d/t/d_t_genki_dws_tgt.cpp
index e69de29b..550eb670 100644
--- a/src/REL/d/t/d_t_genki_dws_tgt.cpp
+++ b/src/REL/d/t/d_t_genki_dws_tgt.cpp
@@ -0,0 +1,69 @@
+#include <d/tg/d_t_genki_dws_tgt.h>
+#include <toBeSorted/room_manager.h>
+#include <toBeSorted/sceneflag_manager.h>
+#include <toBeSorted/item_story_flag_manager.h>
+#include <toBeSorted/scgame.h>
+
+SPECIAL_ACTOR_PROFILE(TAG_GENKI_DOWSING_TARGET, dTgGenkiDwsTgt_c, fProfile::TAG_GENKI_DOWSING_TARGET, 0x02A5, 0, 0);
+
+int dTgGenkiDwsTgt_c::create() {
+ u16 batQuestActivated = StoryFlagManager::sInstance->getCounterOrFlag(304);
+ if (batQuestActivated == 0 || !ScGame::sInstance->currentSpawnInfo.isNight()) {
+ return FAILED;
+ }
+
+ u16 flag = getSceneFlagFromParams();
+ if (flag < 0xFF) {
+ bool flagSet = SceneflagManager::sInstance->checkFlag(roomid, flag);
+ if (flagSet) {
+ return FAILED;
+ }
+ } else {
+ return FAILED;
+ }
+
+
+ int roomId_tmp = roomid;
+ if (addActorToRoom(-1)) {
+ roomid = roomId_tmp;
+ changeLoadedEntitiesWithSet();
+ } else {
+ return FAILED;
+ }
+ scale.x = 1.0f;
+ scale.y = 1.0f;
+ scale.z = 1.0f;
+
+ static mVec3_c offset(0.0f, 25.0f, 0.0f);
+ mDowsingTarget.initialize(DowsingTarget::SLOT_CRYSTAL, 0, &offset, 1.0f);
+ return SUCCEEDED;
+}
+
+int dTgGenkiDwsTgt_c::doDelete() {
+ changeLoadedEntitiesNoSet();
+ return 1;
+}
+
+int dTgGenkiDwsTgt_c::actorExecute() {
+ bool flag = SceneflagManager::sInstance->checkFlag(roomid, getSceneFlagFromParams());
+ if (flag) {
+ deleteRequest();
+ } else {
+ RoomManager *mgr = RoomManager::m_Instance;
+ if (mgr != nullptr) {
+ dRoom *room = RoomManager::m_Instance->GetRoomByIndex(roomid);
+ if (room != nullptr) {
+ if (room->flags & 8) {
+ mDowsingTarget.doRegister();
+ } else {
+ mDowsingTarget.doUnregister();
+ }
+ }
+ }
+ }
+ return 1;
+}
+
+u16 dTgGenkiDwsTgt_c::getSceneFlagFromParams() {
+ return params & 0xFF;
+}
diff --git a/src/REL/d/t/d_t_holy_water.cpp b/src/REL/d/t/d_t_holy_water.cpp
index e69de29b..ebc49f6e 100644
--- a/src/REL/d/t/d_t_holy_water.cpp
+++ b/src/REL/d/t/d_t_holy_water.cpp
@@ -0,0 +1,41 @@
+#include <d/d_player.h>
+#include <d/tg/d_t_holy_water.h>
+
+SPECIAL_ACTOR_PROFILE(TAG_HOLY_WATER, dTgHolyWater_c, fProfile::TAG_HOLY_WATER, 0x0224, 0, 4);
+
+int dTgHolyWater_c::create() {
+ mDowsingTarget.initialize(DowsingTarget::SLOT_STORY_EVENT, 0, nullptr, 0.0f);
+ return SUCCEEDED;
+}
+
+int dTgHolyWater_c::doDelete() {
+ return 1;
+}
+
+int dTgHolyWater_c::actorExecute() {
+ if (dowsingActive()) {
+ mDowsingTarget.doRegister();
+ } else {
+ mDowsingTarget.doUnregister();
+ }
+ if (isLinkNearby()) {
+ dPlayer::LINK->mForceOrPreventActionFlags |= 0x10000000;
+ }
+ return 1;
+}
+
+int dTgHolyWater_c::draw() {
+ return 1;
+}
+
+bool dTgHolyWater_c::isLinkNearby() {
+ mVec3_c diff = dPlayer::LINK->position - (position + mVec3_c::Ey * scale.y * 0.5f);
+ diff.x /= scale.x;
+ diff.y /= scale.y;
+ diff.z /= scale.z;
+ return diff.x <= 0.5f && diff.x >= -0.5f && diff.y <= 0.5f && diff.y >= -0.5f && diff.z <= 0.5f && diff.z >= -0.5f;
+}
+
+bool dTgHolyWater_c::dowsingActive() {
+ return DowsingTarget::hasSacredWaterDowsing();
+}
diff --git a/src/REL/d/t/d_t_light_shaft_eff.cpp b/src/REL/d/t/d_t_light_shaft_eff.cpp
index 2c5158ae..5fcad377 100644
--- a/src/REL/d/t/d_t_light_shaft_eff.cpp
+++ b/src/REL/d/t/d_t_light_shaft_eff.cpp
@@ -2,4 +2,18 @@
SPECIAL_ACTOR_PROFILE(TAG_LIGHT_SHAFT_EFF, dTgLightShaftEff_c, fProfile::TAG_LIGHT_SHAFT_EFF, 0x025E, 0, 0);
-// clang-format on
+int dTgLightShaftEff_c::create() {
+ return SUCCEEDED;
+}
+
+int dTgLightShaftEff_c::doDelete() {
+ return 1;
+}
+
+int dTgLightShaftEff_c::actorExecute() {
+ return 1;
+}
+
+int dTgLightShaftEff_c::draw() {
+ return 1;
+}
diff --git a/src/REL/d/t/d_t_map_inst.cpp b/src/REL/d/t/d_t_map_inst.cpp
index bcea34c0..d18510f0 100644
--- a/src/REL/d/t/d_t_map_inst.cpp
+++ b/src/REL/d/t/d_t_map_inst.cpp
@@ -4,5 +4,17 @@ SPECIAL_ACTOR_PROFILE(TAG_MAP_INST, dTgMapInst_c, fProfile::TAG_MAP_INST, 0x021d
int dTgMapInst_c::create() {
field_0xfc = params & 0xff;
+ return SUCCEEDED;
+}
+
+int dTgMapInst_c::doDelete() {
+ return 1;
+}
+
+int dTgMapInst_c::actorExecute() {
+ return 1;
+}
+
+int dTgMapInst_c::draw() {
return 1;
}
diff --git a/src/REL/d/t/d_t_tackle.cpp b/src/REL/d/t/d_t_tackle.cpp
index 58286c21..37b2b333 100644
--- a/src/REL/d/t/d_t_tackle.cpp
+++ b/src/REL/d/t/d_t_tackle.cpp
@@ -1,3 +1,19 @@
#include <d/tg/d_t_tackle.h>
SPECIAL_ACTOR_PROFILE(TACKLE_TAG, dTgTackle_c, fProfile::TACKLE_TAG, 0x0241, 0, 0);
+
+int dTgTackle_c::create() {
+ return SUCCEEDED;
+}
+
+int dTgTackle_c::doDelete() {
+ return 1;
+}
+
+int dTgTackle_c::actorExecute() {
+ return 1;
+}
+
+int dTgTackle_c::draw() {
+ return 1;
+}