diff options
Diffstat (limited to 'src')
| -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 | ||||
| -rw-r--r-- | src/d/a/d_a_base.cpp | 3 | ||||
| -rw-r--r-- | src/toBeSorted/counters/counter.cpp | 29 | ||||
| -rw-r--r-- | src/toBeSorted/counters/rupee_counter.cpp | 7 | ||||
| -rw-r--r-- | src/toBeSorted/dowsing_target.cpp | 272 | ||||
| -rw-r--r-- | src/toBeSorted/sound_info.cpp | 13 |
12 files changed, 527 insertions, 34 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; +} diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index 0ebbe74c..7aea5fe8 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -109,9 +109,8 @@ int dAcBase_c::initAllocatorWork1Heap(int size, char *name, int align) { return initAllocator(size, name, dHeap::work1Heap.heap, align); } -extern "C" int fn_802EE510(mAllocator_c *, int size, EGG::Heap *heap, char *name, int align, int unk); int dAcBase_c::initAllocator(int size, char *name, EGG::Heap *heap, int align) { - if (fn_802EE510(&heap_allocator, size, heap, name, 0x20, 0) == 0) { + if (!heap_allocator.createNewTempFrmHeap(size, heap, name, 0x20, 0)) { return 0; } sound_source = FUN_8002c690(); diff --git a/src/toBeSorted/counters/counter.cpp b/src/toBeSorted/counters/counter.cpp index 2c388e44..42729f33 100644 --- a/src/toBeSorted/counters/counter.cpp +++ b/src/toBeSorted/counters/counter.cpp @@ -1,26 +1,5 @@ #include <toBeSorted/counters/counter.h> - -// TODO use the item flag manager once it exists -class ItemFlagManager { -public: - ItemFlagManager() {} - /** 0x08 */ virtual ~ItemFlagManager(); - /** 0x0C */ virtual void setFlagszptr(); - /** 0x10 */ virtual void onDirty(); - /** 0x14 */ virtual void copyFlagsFromSave() = 0; - /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; - /** 0x1C */ virtual bool doCommit() = 0; - /** 0x20 */ virtual void setFlag(u16 flag); - /** 0x24 */ virtual void unsetFlag(u16 flag); - /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); - /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag); - /** 0x30 */ virtual u16 getUncommittedValue(u16 flag); - /** 0x34 */ virtual void unk3(); - /** 0x38 */ virtual u16 *getSaveFlagSpace() = 0; -}; - -// TODO set up item flag manager -extern "C" ItemFlagManager *lbl_80575400; +#include <toBeSorted/item_story_flag_manager.h> /* 8016cc40 */ s32 Counter::checkedAdd(s32 num) { @@ -43,13 +22,13 @@ extern "C" ItemFlagManager *lbl_80575400; } /* 8016cd30 */ u16 Counter::getCommittedValue() { - return lbl_80575400->getCounterOrFlag(counterId | 0x4000); + return ItemFlagManager::sInstance->getCounterOrFlag(counterId | 0x4000); } /* 8016cd50 */ u16 Counter::getUncommittedValue() { - return lbl_80575400->getUncommittedValue(counterId | 0x4000); + return ItemFlagManager::sInstance->getUncommittedValue(counterId | 0x4000); } /* 8016cd70 */ void Counter::setValue(u16 num) { - lbl_80575400->setFlagOrCounterToValue(counterId | 0x4000, num); + ItemFlagManager::sInstance->setFlagOrCounterToValue(counterId | 0x4000, num); } diff --git a/src/toBeSorted/counters/rupee_counter.cpp b/src/toBeSorted/counters/rupee_counter.cpp index d1264a74..02f3cd0f 100644 --- a/src/toBeSorted/counters/rupee_counter.cpp +++ b/src/toBeSorted/counters/rupee_counter.cpp @@ -1,4 +1,5 @@ #include <toBeSorted/counters/counter.h> +#include <toBeSorted/item_story_flag_manager.h> static u16 getBaseCapacity(); static u16 getExtraWalletCapacity(); @@ -17,10 +18,6 @@ struct WalletStruct { u16 capacity; }; -// TODO set up item flag manager -extern "C" void *lbl_80575400; -extern "C" u16 fn_800BF5E0(void *data, u16 flag); - /* 8016DE10 */ static u16 getBaseCapacity() { int i = 0; /* 804E91B0 */ WalletStruct wallet_definitions[4] = { @@ -31,7 +28,7 @@ extern "C" u16 fn_800BF5E0(void *data, u16 flag); }; const WalletStruct *wallet = &wallet_definitions[3]; for (; i < 4; i++, wallet--) { - if (fn_800BF5E0(lbl_80575400, wallet->flag)) { + if (ItemFlagManager::sInstance->getFlag(wallet->flag)) { return wallet->capacity; } } diff --git a/src/toBeSorted/dowsing_target.cpp b/src/toBeSorted/dowsing_target.cpp new file mode 100644 index 00000000..84eea947 --- /dev/null +++ b/src/toBeSorted/dowsing_target.cpp @@ -0,0 +1,272 @@ +#include <c/c_math.h> +#include <m/m_mtx.h> +#include <nw4r/ut/ut_LinkList.h> +#include <toBeSorted/dowsing_target.h> +#include <toBeSorted/item_story_flag_manager.h> +#include <toBeSorted/tlist.h> + +typedef TList<DowsingTarget, 0> DowsingList; + +DowsingList DOWSING_LISTS[8]; + +static const int DOWSING_TARGET_STORY_FLAGS[8] = { + 100, + 105, + 100, + 104, + 108, + 110, + 109, + 102, +}; + +DowsingTarget::~DowsingTarget() { + doUnregister(); +} + +void DowsingTarget::initialize(DowsingSlot type, u16 unk, const mVec3_c *offset, f32 unk2) { + reinitialize(type); + field_0x0E = unk; + if (offset != nullptr) { + mOffset = *offset; + } +} + +static bool insertDowsingTarget(DowsingTarget *target); +static bool removeDowsingTarget(DowsingTarget *target); + +bool DowsingTarget::doRegister() { + return insertDowsingTarget(this); +} + +bool DowsingTarget::doUnregister() { + return removeDowsingTarget(this); +} + +void DowsingTarget::reinitialize(DowsingSlot type) { + bool res = doUnregister(); + mDowsingSlot = type; + if (res) { + doRegister(); + } +} + +void DowsingTarget::getPosition(mVec3_c &position) { + mMtx_c mtx; + mMtx_c mtx2; + PSMTXTrans(mtx.m, mpActor->position.x, mpActor->position.y, mpActor->position.z); + mtx.YrotM(mpActor->rotation.y); + PSMTXScale(mtx2.m, mpActor->scale.x, mpActor->scale.y, mpActor->scale.z); + PSMTXConcat(mtx.m, mtx2.m, mtx.m); + PSMTXMultVec(mtx.m, mOffset, position); +} + +bool DowsingTarget::hasZeldaDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(100); +} + +bool DowsingTarget::hasKikwiDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(56) && !StoryFlagManager::sInstance->getCounterOrFlag(57); +} + +bool DowsingTarget::hasKeyPieceDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(106) && !StoryFlagManager::sInstance->getCounterOrFlag(120); +} + +bool DowsingTarget::hasDesertNodeDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(107) && !StoryFlagManager::sInstance->getCounterOrFlag(8); +} + +bool DowsingTarget::hasAnyTrialDowsing() { + // TODO more complicated code + return ItemFlagManager::sInstance->getFlag(187) && !StoryFlagManager::sInstance->getCounterOrFlag(93) || + ItemFlagManager::sInstance->getFlag(188) && !StoryFlagManager::sInstance->getCounterOrFlag(97) || + ItemFlagManager::sInstance->getFlag(189) && !StoryFlagManager::sInstance->getCounterOrFlag(98) || + ItemFlagManager::sInstance->getFlag(193) && !StoryFlagManager::sInstance->getCounterOrFlag(99); +} + +bool DowsingTarget::hasSacredWaterDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(64) && !StoryFlagManager::sInstance->getCounterOrFlag(65); +} + +bool DowsingTarget::hasSandshipDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(271) && !StoryFlagManager::sInstance->getCounterOrFlag(14); +} + +bool DowsingTarget::hasTadtoneDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(81) && !StoryFlagManager::sInstance->getCounterOrFlag(18); +} + +bool DowsingTarget::hasPropellerDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(668); +} + +bool DowsingTarget::hasWaterBasinDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(669); +} + +bool DowsingTarget::hasCrystalBallDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(670); +} + +bool DowsingTarget::hasPumpkinDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(680); +} + +bool DowsingTarget::hasNewPlantSpeciesDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(681); +} + +bool DowsingTarget::hasPartyWheelDowsing() { + return StoryFlagManager::sInstance->getCounterOrFlag(682); +} + +bool DowsingTarget::hasDowsingInSlot(int slot) { + if (slot >= 8) { + return false; + } + + if (slot == 6) { + return true; + } + + if (slot == 0) { + return hasZeldaDowsing() || hasAnyTrialDowsing() || hasSacredWaterDowsing() || hasSandshipDowsing() || + hasTadtoneDowsing() || hasPropellerDowsing() || hasWaterBasinDowsing(); + } else if (slot == 2) { + return hasCrystalBallDowsing() || hasPumpkinDowsing() || hasNewPlantSpeciesDowsing() || hasKikwiDowsing() || + hasKeyPieceDowsing() || hasDesertNodeDowsing() || hasPartyWheelDowsing(); + } else if (StoryFlagManager::sInstance->getCounterOrFlag(DOWSING_TARGET_STORY_FLAGS[slot])) { + // TODO small instruction shuffle + return true; + } + + return false; +} + +#define MYCLAMP(low, high, x) ((x) < (low) ? (low) : ((x) > (high) ? (high) : (x))) + +DowsingTarget *DowsingTarget::getDowsingInfo(const mVec3_c &playerPosition, const mVec3_c &dowsingDirection, f32 *p3, + f32 *p4, f32 *intensity, int slot) { + if (slot >= 8) { + return nullptr; + } + mVec3_c dwsDir = dowsingDirection; + dwsDir.normalize(); + DowsingList *list = &DOWSING_LISTS[slot]; + DowsingTarget *best = nullptr; + + for (DowsingList::Iterator node = list->GetBeginIter(); node != list->GetEndIter(); ++node) { + mVec3_c targetPos; + node->getPosition(targetPos); + mVec3_c targetDir = mVec3_c(targetPos - playerPosition); + f32 proximity = nw4r::ut::Max(10000.0f - targetDir.mag(), 0.0f); + + targetDir.normalize(); + + f32 dot = dwsDir.dot(targetDir); + dot = MYCLAMP(-1.0f, 1.0f, dot); + f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot); + + f32 f9 = (5461 - labs(cM::atan2s(a, dot))) * (1.0f / 5461.0f); + if (!(f9 < 0.0f)) { + f32 val; + f32 f10 = MYCLAMP(0.0f, 0.9f, proximity * 0.0001f) * 1.1111112f; + if (f9 > 0.85f) { + f9 = 0.85f; + } + + f9 = f9 * 1.1764705f; + f9 *= f9; + if (f9 > 1.0f) { + f9 = 1.0f; + } + + val = f9 * f10; + if (val > *intensity) { + *intensity = val; + *p3 = f10; + *p4 = f9; + best = &*node; + } + } + } + return best; +} + +void DowsingTarget::init() {} + +void DowsingTarget::execute() {} + +// Not sure what this is +inline static TListNode *getNode(u8 slot, DowsingTarget *t) { + if (t->mLink.mpNext == nullptr || t->mLink.mpPrev == nullptr) { + return &DOWSING_LISTS[slot].mNode; + } else { + return &t->mLink; + } +} + +static bool insertDowsingTarget(DowsingTarget *target) { + u8 slot = target->getSlot(); + if (slot == DowsingTarget::SLOT_NONE) { + return false; + } + + if (getNode(slot, target) != &DOWSING_LISTS[slot].mNode) { + return false; + } + DOWSING_LISTS[slot].insert(target); + return true; +} + +static bool removeDowsingTarget(DowsingTarget *target) { + u8 slot = target->getSlot(); + if (slot == DowsingTarget::SLOT_NONE) { + return false; + } + + if (getNode(slot, target) != &DOWSING_LISTS[slot].mNode) { + DOWSING_LISTS[slot].remove(target); + return true; + } + return false; +} + +u8 DowsingTarget::getTopDowsingIcon() { + if (hasZeldaDowsing()) { + return 19; + } else if (hasAnyTrialDowsing()) { + return 20; + } else if (hasSacredWaterDowsing()) { + return 5; + } else if (hasSandshipDowsing()) { + return 18; + } else if (hasTadtoneDowsing()) { + return 17; + } else if (hasPropellerDowsing()) { + return 10; + } else if (hasWaterBasinDowsing()) { + return 14; + } + return 19; +} + +u8 DowsingTarget::getLeftDowsingIcon() { + if (hasCrystalBallDowsing()) { + return 15; + } else if (hasPumpkinDowsing()) { + return 12; + } else if (hasNewPlantSpeciesDowsing()) { + return 21; + } else if (hasPartyWheelDowsing()) { + return 13; + } else if (hasKikwiDowsing()) { + return 8; + } else if (hasKeyPieceDowsing()) { + return 11; + } else if (hasDesertNodeDowsing()) { + return 7; + } + return 15; +} diff --git a/src/toBeSorted/sound_info.cpp b/src/toBeSorted/sound_info.cpp new file mode 100644 index 00000000..0009e3c7 --- /dev/null +++ b/src/toBeSorted/sound_info.cpp @@ -0,0 +1,13 @@ +#include <d/a/d_a_base.h> + +extern "C" SoundSource *soundForActorInitRelated_803889c0(int, fBase_c *, char *, u8); + +extern "C" bool fn_8002C250(SoundInfo *p1, int someNum, char *name, mVec3_c *position) { + p1->sound_source = soundForActorInitRelated_803889c0(someNum, p1->actor, name, 0); + if (!p1->sound_source) { + return false; + } + p1->actor->sound_list.insert(p1); + p1->obj_pos = position; + return true; +} |
