diff options
| author | robojumper <robojumper@gmail.com> | 2024-09-12 22:23:11 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-12 16:23:11 -0400 |
| commit | e2c4bb7be7fa731a335bce4bc22283d899133e39 (patch) | |
| tree | 91152d84cae384b376f4ce4c87e9e247255ec954 /src/REL/d | |
| parent | 9aa30ee4995be938e1ea05f6d476d63fcb8cc67e (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.cpp | 2 | ||||
| -rw-r--r-- | src/REL/d/t/d_t_dowsing.cpp | 81 | ||||
| -rw-r--r-- | src/REL/d/t/d_t_genki_dws_tgt.cpp | 69 | ||||
| -rw-r--r-- | src/REL/d/t/d_t_holy_water.cpp | 41 | ||||
| -rw-r--r-- | src/REL/d/t/d_t_light_shaft_eff.cpp | 16 | ||||
| -rw-r--r-- | src/REL/d/t/d_t_map_inst.cpp | 12 | ||||
| -rw-r--r-- | src/REL/d/t/d_t_tackle.cpp | 16 |
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; +} |
