mirror of
https://github.com/zeldaret/ss
synced 2026-06-14 22:19:00 -04:00
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user