mirror of
https://github.com/zeldaret/ss
synced 2026-07-04 20:55:29 -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user