mirror of
https://github.com/zeldaret/ss
synced 2026-05-31 09:21:42 -04:00
4996 lines
178 KiB
C++
4996 lines
178 KiB
C++
#include "c/c_math.h"
|
|
#include "m/m_pad.h"
|
|
#define NEED_DIRECT_FRAMECTRL_ACCESS
|
|
#include "c/c_lib.h"
|
|
#include "common.h"
|
|
#include "d/a/d_a_player.h"
|
|
#include "d/a/obj/d_a_obj_tbox.h"
|
|
#include "d/d_base.h"
|
|
#include "d/d_cs_base.h"
|
|
#include "d/d_cs_game.h"
|
|
#include "d/d_cursor_hit_check.h"
|
|
#include "d/d_d2d.h"
|
|
#include "d/d_fader.h"
|
|
#include "d/d_message.h"
|
|
#include "d/d_pad.h"
|
|
#include "d/d_pad_nav.h"
|
|
#include "d/d_player.h"
|
|
#include "d/d_rumble.h"
|
|
#include "d/d_sc_game.h"
|
|
#include "d/d_stage.h"
|
|
#include "d/d_stage_mgr.h"
|
|
#include "d/flag/sceneflag_manager.h"
|
|
#include "d/flag/storyflag_manager.h"
|
|
#include "d/lyt/d2d.h"
|
|
#include "d/lyt/d_lyt_control_game.h"
|
|
#include "d/lyt/d_lyt_map.h"
|
|
#include "d/lyt/d_lyt_map_global.h"
|
|
#include "d/lyt/d_lyt_unknowns.h"
|
|
#include "d/lyt/d_textbox.h"
|
|
#include "d/lyt/d_window.h"
|
|
#include "d/lyt/meter/d_lyt_meter.h"
|
|
#include "d/lyt/msg_window/d_lyt_msg_window.h"
|
|
#include "d/snd/d_snd_small_effect_mgr.h"
|
|
#include "egg/core/eggColorFader.h"
|
|
#include "f/f_base.h"
|
|
#include "f/f_manager.h"
|
|
#include "f/f_profile_name.h"
|
|
#include "m/m_vec.h"
|
|
#include "m/m_video.h"
|
|
#include "nw4r/lyt/lyt_bounding.h"
|
|
#include "nw4r/lyt/lyt_group.h"
|
|
#include "nw4r/lyt/lyt_pane.h"
|
|
#include "nw4r/lyt/lyt_types.h"
|
|
#include "s/s_StateInterfaces.hpp"
|
|
#include "sized_string.h"
|
|
#include "toBeSorted/arc_managers/layout_arc_manager.h"
|
|
#include "toBeSorted/d_beacon.h"
|
|
#include "toBeSorted/event_manager.h"
|
|
|
|
struct dLytMap_HIO_c {
|
|
dLytMap_HIO_c();
|
|
virtual ~dLytMap_HIO_c();
|
|
|
|
/* 0x04 */ f32 field_0x04;
|
|
/* 0x08 */ f32 field_0x08;
|
|
/* 0x0C */ f32 mFootstepsScale;
|
|
/* 0x10 */ f32 field_0x10;
|
|
/* 0x14 */ f32 field_0x14;
|
|
/* 0x18 */ u8 field_0x18;
|
|
/* 0x19 */ u8 field_0x19;
|
|
/* 0x1A */ u8 field_0x1A;
|
|
/* 0x1B */ u8 field_0x1B;
|
|
/* 0x1C */ u8 field_0x1C;
|
|
/* 0x1D */ u8 field_0x1D;
|
|
/* 0x1E */ u8 field_0x1E;
|
|
/* 0x1F */ u8 field_0x1F;
|
|
/* 0x20 */ u8 field_0x20;
|
|
/* 0x21 */ u8 field_0x21;
|
|
/* 0x22 */ u8 field_0x22;
|
|
/* 0x23 */ u8 field_0x23;
|
|
/* 0x24 */ u8 field_0x24;
|
|
/* 0x25 */ u8 field_0x25;
|
|
/* 0x26 */ u8 field_0x26;
|
|
/* 0x27 */ u8 field_0x27;
|
|
/* 0x28 */ u8 field_0x28;
|
|
/* 0x29 */ u8 field_0x29;
|
|
/* 0x2A */ u8 mFootstepsAlpha;
|
|
/* 0x2B */ u8 field_0x2B;
|
|
/* 0x2C */ f32 field_0x2C;
|
|
|
|
f32 getField_0x04() const {
|
|
return field_0x04;
|
|
}
|
|
};
|
|
|
|
dLytMap_HIO_c sHio;
|
|
|
|
dLytMap_HIO_c::dLytMap_HIO_c() {
|
|
field_0x04 = -10.0f;
|
|
field_0x10 = 14.0f;
|
|
field_0x14 = 32.0f;
|
|
field_0x18 = 0;
|
|
field_0x19 = 0xFF;
|
|
field_0x1A = 0xF;
|
|
field_0x1B = 0x12;
|
|
field_0x1C = 9;
|
|
field_0x2C = 0.0f;
|
|
field_0x1D = 0x2D;
|
|
field_0x1E = 0x2D;
|
|
field_0x1F = 0x1E;
|
|
field_0x20 = 0x17;
|
|
field_0x21 = 0x5A;
|
|
field_0x22 = 0x2D;
|
|
field_0x23 = 0x2D;
|
|
field_0x24 = 0x35;
|
|
field_0x25 = 0x2D;
|
|
field_0x26 = 0x5A;
|
|
field_0x27 = 0x2D;
|
|
field_0x28 = 0x5A;
|
|
field_0x29 = 0x5;
|
|
field_0x08 = 10.0f;
|
|
mFootstepsScale = 0.4f;
|
|
mFootstepsAlpha = 0x80;
|
|
field_0x2B = 10;
|
|
}
|
|
|
|
dLytMap_HIO_c::~dLytMap_HIO_c() {}
|
|
|
|
inline mVec3_c vec2ToVec3XY(const mVec2_c &v) {
|
|
return mVec3_c(v.x, v.y, 0.0f);
|
|
}
|
|
|
|
void dMapFootPrintsQueue_c::init() {
|
|
int j = ARRAY_LENGTH(mEntries) - 1;
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mEntries); i++) {
|
|
mEntries[i].position.set(0.0f, 0.0f, 0.0f);
|
|
mEntries[i].pNext = &mEntries[j];
|
|
mEntries[j].pPrev = &mEntries[i];
|
|
j = i;
|
|
}
|
|
|
|
mpFirst = &mEntries[0];
|
|
mpLast = &mEntries[0];
|
|
mCount = 0;
|
|
}
|
|
|
|
void dMapFootPrintsQueue_c::addStep(const mVec3_c &pos, const mAng &rot) {
|
|
mpLast->position = pos;
|
|
mpLast->rotation = rot;
|
|
if (mpFirst == mpLast && mCount == ARRAY_LENGTH(mEntries)) {
|
|
mpFirst = mpFirst->pPrev;
|
|
}
|
|
mpLast = mpLast->pPrev;
|
|
if (mCount < ARRAY_LENGTH(mEntries)) {
|
|
mCount++;
|
|
}
|
|
}
|
|
|
|
dMapFootPrintEntry *dMapFootPrintsQueue_c::getFirst() const {
|
|
if (mCount == 0) {
|
|
return nullptr;
|
|
}
|
|
return mpLast->pNext;
|
|
}
|
|
|
|
dMapFootPrintEntry *dMapFootPrintsQueue_c::getNext(const dMapFootPrintEntry *it) const {
|
|
dMapFootPrintEntry *ret = nullptr;
|
|
if (it != mpFirst) {
|
|
ret = it->pNext;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void dMapFootPrintsMgr_c::execute() {
|
|
dAcPy_c *link = getLinkPtr();
|
|
const mVec3_c &linkPos = link->mPosition;
|
|
if (mQueue.isEmpty()) {
|
|
mQueue.addStep(linkPos, link->mRotation.y);
|
|
} else {
|
|
mVec3_c lastPos = mQueue.getFirst()->position;
|
|
mVec3_c diff = mVec3_c(linkPos - lastPos);
|
|
f32 absXZ = diff.squareMagXZ();
|
|
mAng rot = diff.atan2sX_Z();
|
|
if (absXZ >= mMinStepDistanceSq) {
|
|
mQueue.addStep(linkPos, rot);
|
|
}
|
|
}
|
|
}
|
|
|
|
dLytMapFootPrints_c::dLytMapFootPrints_c(dLytMapGlobal_c *global)
|
|
: mpGlobal(global),
|
|
mpPane(nullptr),
|
|
field_0xA0(0.0f),
|
|
mMaxNumSteps(ARRAY_LENGTH(mFootprintPositions)),
|
|
mCurrentNumSteps(0),
|
|
field_0x198(0.0f),
|
|
field_0x19C(0.0f),
|
|
mVisible(false) {
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mFootprintPositions); i++) {
|
|
mFootprintPositions[i].set(0.0f, 0.0f);
|
|
}
|
|
}
|
|
|
|
dLytMapGlobal_c *dLytMapFootPrints_c::getGlobal() const {
|
|
return mpGlobal;
|
|
}
|
|
|
|
bool dLytMapFootPrints_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("footPrint_00.brlyt", nullptr);
|
|
nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane();
|
|
root->SetVisible(false);
|
|
root->SetAlpha(0);
|
|
root->SetInfluencedAlpha(true);
|
|
mpPane = mLyt.findPane("P_all_01");
|
|
mLyt.calc();
|
|
field_0xA0 = 1.0f;
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapFootPrints_c::remove() {
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapFootPrints_c::execute() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
u8 globalAlpha = global->getAlpha();
|
|
nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane();
|
|
if (globalAlpha != 0) {
|
|
root->SetVisible(true);
|
|
root->SetAlpha(globalAlpha);
|
|
} else {
|
|
root->SetVisible(false);
|
|
root->SetAlpha(0);
|
|
}
|
|
const dMapFootPrintsQueue_c *queue = dLytControlGame_c::getInstance()->getFootprintsQueue();
|
|
mVec2_c playerPos;
|
|
global->projectOntoMap(playerPos, global->getPlayerPos());
|
|
mMaxNumSteps = sHio.field_0x2B;
|
|
|
|
const dMapFootPrintEntry *it = queue->getFirst();
|
|
int i = 0;
|
|
|
|
for (; it != nullptr; it = queue->getNext(it)) {
|
|
mVec2_c footstepPos;
|
|
global->projectOntoMap(footstepPos, it->position);
|
|
mVec2_c diff;
|
|
diff = footstepPos - playerPos;
|
|
f32 dist = diff.length();
|
|
|
|
for (f32 step = dist / global->getField_0x44(); step >= sHio.field_0x08 / field_0x198;
|
|
step /= global->getField_0x44()) {
|
|
f32 tmp = (sHio.field_0x08 / field_0x198) / step;
|
|
|
|
mVec2_c v = mVec2_c((footstepPos - playerPos) * tmp + playerPos);
|
|
mFootprintPositions[i] = v;
|
|
if (++i >= mMaxNumSteps) {
|
|
break;
|
|
}
|
|
playerPos = v;
|
|
diff = footstepPos - playerPos;
|
|
step = diff.length();
|
|
}
|
|
if (i >= mMaxNumSteps) {
|
|
break;
|
|
}
|
|
}
|
|
mCurrentNumSteps = i;
|
|
return true;
|
|
}
|
|
|
|
void dLytMapFootPrints_c::draw() {
|
|
if (!mVisible) {
|
|
return;
|
|
}
|
|
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
u8 globalAlpha = global->getAlpha();
|
|
if (globalAlpha == 0) {
|
|
return;
|
|
}
|
|
|
|
// TODO - GPR regswap between pane and mFootprintPositions[i]
|
|
nw4r::lyt::Pane *pane = mLyt.getLayout()->GetRootPane();
|
|
|
|
f32 scale = field_0x19C * sHio.mFootstepsScale;
|
|
mVec2_c scaleV = mVec2_c(scale, scale);
|
|
mpPane->SetScale(scaleV);
|
|
|
|
f32 globalAlphaF = globalAlpha;
|
|
|
|
for (int i = 0; i < mCurrentNumSteps; i++) {
|
|
mVec2_c pos = mVec2_c(global->getField_0x20() + mFootprintPositions[i]);
|
|
pane->SetTranslate(vec2ToVec3XY(pos));
|
|
|
|
// TODO - FPR regswaps, maybe fewer temps would work
|
|
f32 constantAlpha = sHio.mFootstepsAlpha / 255.0f;
|
|
f32 alpha = globalAlphaF * field_0x19C;
|
|
int range = mMaxNumSteps;
|
|
f32 fadingFactor = ((f32)(range - i) / (f32)range);
|
|
pane->SetAlpha(alpha * fadingFactor * constantAlpha);
|
|
|
|
pane->CalculateMtx(mLyt.getDrawInfo());
|
|
pane->Draw(mLyt.getDrawInfo());
|
|
}
|
|
}
|
|
|
|
void dLytMapPutIcon_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("mapPutIcon_00.brlyt", nullptr);
|
|
mVisible = true;
|
|
mLyt.calc();
|
|
}
|
|
|
|
void dLytMapPutIcon_c::remove() {
|
|
// no-op
|
|
}
|
|
|
|
void dLytMapPutIcon_c::execute() {
|
|
mLyt.calc();
|
|
}
|
|
|
|
void dLytMapPutIcon_c::draw() {
|
|
if (mVisible) {
|
|
mLyt.draw();
|
|
}
|
|
}
|
|
|
|
void dLytMapPutIcon_c::setPosition(const mVec2_c &pos) {
|
|
mVec3_c pos3 = vec2ToVec3XY(mVec2_c(pos));
|
|
mLyt.getLayout()->GetRootPane()->SetTranslate(pos3);
|
|
}
|
|
|
|
void dLytMapPutIcon_c::setScale(f32 scale) {
|
|
mLyt.getLayout()->GetRootPane()->SetScale(mVec2_c(scale, scale));
|
|
}
|
|
|
|
STATE_DEFINE(dLytMapPinIcon_c, Wait);
|
|
STATE_DEFINE(dLytMapPinIcon_c, ToSelect);
|
|
STATE_DEFINE(dLytMapPinIcon_c, Select);
|
|
STATE_DEFINE(dLytMapPinIcon_c, ToUnselect);
|
|
STATE_DEFINE(dLytMapPinIcon_c, Remove);
|
|
|
|
STATE_DEFINE(dLytMapPinIconAggregate_c, Wait);
|
|
STATE_DEFINE(dLytMapPinIconAggregate_c, Select);
|
|
STATE_DEFINE(dLytMapPinIconAggregate_c, Remove);
|
|
|
|
STATE_DEFINE(dLytMapFloorBtn_c, Wait);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, ToSelect);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, Select);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, ToWait);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, ToDecide);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, Decide);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, ToSelectInDecide);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, SelectInDecide);
|
|
STATE_DEFINE(dLytMapFloorBtn_c, DecideToSelectInDecide);
|
|
|
|
STATE_DEFINE(dLytMapFloorBtnMgr_c, Invisible);
|
|
STATE_DEFINE(dLytMapFloorBtnMgr_c, Wait);
|
|
|
|
nw4r::ut::Color sMapFaderColor(0xFF, 0xFF, 0xFF, 0xFF);
|
|
|
|
STATE_DEFINE(dLytMapPopupInfo_c, Invisible);
|
|
STATE_DEFINE(dLytMapPopupInfo_c, In);
|
|
STATE_DEFINE(dLytMapPopupInfo_c, Wait);
|
|
STATE_DEFINE(dLytMapPopupInfo_c, WaitInvalid);
|
|
STATE_DEFINE(dLytMapPopupInfo_c, Out);
|
|
|
|
STATE_DEFINE(dLytMapSavePopupAction_c, Invisible);
|
|
STATE_DEFINE(dLytMapSavePopupAction_c, In);
|
|
STATE_DEFINE(dLytMapSavePopupAction_c, Wait);
|
|
STATE_DEFINE(dLytMapSavePopupAction_c, Out);
|
|
|
|
STATE_DEFINE(dLytMapSaveCaption_c, Invisible);
|
|
STATE_DEFINE(dLytMapSaveCaption_c, In);
|
|
STATE_DEFINE(dLytMapSaveCaption_c, Wait);
|
|
STATE_DEFINE(dLytMapSaveCaption_c, Out);
|
|
|
|
STATE_DEFINE(dLytMapSaveObj_c, Wait);
|
|
STATE_DEFINE(dLytMapSaveObj_c, ToSelect);
|
|
STATE_DEFINE(dLytMapSaveObj_c, Select);
|
|
STATE_DEFINE(dLytMapSaveObj_c, ToWait);
|
|
STATE_DEFINE(dLytMapSaveObj_c, Decide);
|
|
|
|
STATE_DEFINE(dLytMapMain_c, Invisible);
|
|
STATE_DEFINE(dLytMapMain_c, RenderingWait);
|
|
STATE_DEFINE(dLytMapMain_c, In);
|
|
STATE_DEFINE(dLytMapMain_c, Active);
|
|
STATE_DEFINE(dLytMapMain_c, Out);
|
|
STATE_DEFINE(dLytMapMain_c, FloorChange);
|
|
STATE_DEFINE(dLytMapMain_c, ChgMapUpDirection);
|
|
STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_Map);
|
|
STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_MapRot);
|
|
STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_WA);
|
|
STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_CsrRot);
|
|
STATE_DEFINE(dLytMapMain_c, ResetPos);
|
|
STATE_DEFINE(dLytMapMain_c, ResetPosWithFloorChange);
|
|
STATE_DEFINE(dLytMapMain_c, EventSwBankSmall_Step1);
|
|
STATE_DEFINE(dLytMapMain_c, EventSwBankSmall_Step2);
|
|
STATE_DEFINE(dLytMapMain_c, EventSwBankSmall_Step3);
|
|
STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step1);
|
|
STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step2);
|
|
STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step3);
|
|
STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step4);
|
|
STATE_DEFINE(dLytMapMain_c, EventDungeonMapGet_Step1);
|
|
STATE_DEFINE(dLytMapMain_c, EventDungeonMapGet_Step2);
|
|
STATE_DEFINE(dLytMapMain_c, EventDungeonMapGet_Step3);
|
|
STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step1);
|
|
STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step2);
|
|
STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step3);
|
|
STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step4);
|
|
STATE_DEFINE(dLytMapMain_c, EventForestMapChange_Step1);
|
|
STATE_DEFINE(dLytMapMain_c, EventForestMapChange_Step2);
|
|
STATE_DEFINE(dLytMapMain_c, EventForestMapChange_Step3);
|
|
STATE_DEFINE(dLytMapMain_c, EventSignalAdd_Step1);
|
|
STATE_DEFINE(dLytMapMain_c, EventSignalAdd_Step2);
|
|
STATE_DEFINE(dLytMapMain_c, EventSignalAdd_Step3);
|
|
STATE_DEFINE(dLytMapMain_c, EventGoddessCube_Step1);
|
|
STATE_DEFINE(dLytMapMain_c, EventGoddessCube_Step2);
|
|
STATE_DEFINE(dLytMapMain_c, EventGoddessCube_Step3);
|
|
STATE_DEFINE(dLytMapMain_c, EventSaveObjMsgWindow);
|
|
STATE_DEFINE(dLytMapMain_c, EventSaveObjSelect);
|
|
STATE_DEFINE(dLytMapMain_c, EventSaveObjConfirmMsgWindow);
|
|
STATE_DEFINE(dLytMapMain_c, EventSaveObjDecide);
|
|
|
|
dLytMapFader_c::dLytMapFader_c()
|
|
: mFader(
|
|
0.0f, 0.0f, mVideo::m_video->pRenderMode->fbWidth, mVideo::m_video->pRenderMode->efbHeight, sMapFaderColor,
|
|
EGG::ColorFader::STATUS_PREPARE_OUT
|
|
) {}
|
|
|
|
dLytMapFader_c::~dLytMapFader_c() {}
|
|
|
|
void dLytMapFader_c::calc() {
|
|
mFader.calc();
|
|
}
|
|
|
|
void dLytMapFader_c::draw() {
|
|
mFader.draw();
|
|
}
|
|
|
|
#define LYT_MAP_PIN_ICON_ANIM_SCALE 0
|
|
#define LYT_MAP_PIN_ICON_ANIM_ERASE 1
|
|
#define LYT_MAP_PIN_ICON_ANIM_LOOP 2
|
|
#define LYT_MAP_PIN_ICON_NUM_ANIMS 3
|
|
|
|
void dLytMapPinIcon_c::initializeState_Wait() {
|
|
mLyt.calc();
|
|
}
|
|
void dLytMapPinIcon_c::executeState_Wait() {
|
|
bool keepGoing = false;
|
|
if (field_0x1D0 != nullptr) {
|
|
keepGoing = !field_0x1D0->field_0x04;
|
|
}
|
|
if (!keepGoing) {
|
|
return;
|
|
}
|
|
|
|
if (!mIsSet) {
|
|
return;
|
|
}
|
|
|
|
if (field_0x1BC == 0) {
|
|
return;
|
|
}
|
|
|
|
mStateMgr.changeState(StateID_ToSelect);
|
|
}
|
|
void dLytMapPinIcon_c::finalizeState_Wait() {}
|
|
|
|
void dLytMapPinIcon_c::initializeState_ToSelect() {
|
|
d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE];
|
|
m->bind(false);
|
|
m->setFrame(0.0f);
|
|
}
|
|
void dLytMapPinIcon_c::executeState_ToSelect() {
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
void dLytMapPinIcon_c::finalizeState_ToSelect() {
|
|
field_0x1D0->field_0x04 = true;
|
|
}
|
|
|
|
void dLytMapPinIcon_c::initializeState_Select() {}
|
|
void dLytMapPinIcon_c::executeState_Select() {
|
|
if (field_0x1D0->field_0x05 && dPad::getDownTrigC()) {
|
|
removeBeacon();
|
|
field_0x1D0->field_0x04 = false;
|
|
d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE];
|
|
if (m->isBound()) {
|
|
m->unbind();
|
|
}
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_REMOVE);
|
|
mStateMgr.changeState(StateID_Remove);
|
|
return;
|
|
}
|
|
|
|
if (field_0x1BC == 0) {
|
|
d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE];
|
|
m->bind(false);
|
|
m->setFrame(0.0f);
|
|
mLyt.calc();
|
|
m->unbind();
|
|
mStateMgr.changeState(StateID_ToUnselect);
|
|
} else {
|
|
d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE];
|
|
if (m->isBound()) {
|
|
m->play();
|
|
}
|
|
}
|
|
}
|
|
void dLytMapPinIcon_c::finalizeState_Select() {}
|
|
|
|
void dLytMapPinIcon_c::initializeState_ToUnselect() {}
|
|
void dLytMapPinIcon_c::executeState_ToUnselect() {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
void dLytMapPinIcon_c::finalizeState_ToUnselect() {
|
|
field_0x1D0->field_0x04 = false;
|
|
}
|
|
|
|
void dLytMapPinIcon_c::initializeState_Remove() {}
|
|
void dLytMapPinIcon_c::executeState_Remove() {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
void dLytMapPinIcon_c::finalizeState_Remove() {}
|
|
|
|
void dLytMapPinIcon_c::updatePosition() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
if (mIsSet) {
|
|
mVec2_c pos2d;
|
|
global->projectOntoMap(pos2d, mPosition);
|
|
pos2d += global->getField_0x20();
|
|
mVec3_c translate3d = vec2ToVec3XY(pos2d);
|
|
mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d);
|
|
}
|
|
|
|
bool vis = mIsSet;
|
|
mLyt.getLayout()->GetRootPane()->SetVisible(mIsSet);
|
|
if (mpBounding != nullptr) {
|
|
mpBounding->SetVisible(vis);
|
|
}
|
|
|
|
mLyt.getLayout()->GetRootPane()->SetAlpha(global->getAlpha());
|
|
mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true);
|
|
mLyt.calc();
|
|
}
|
|
|
|
void dLytMapPinIcon_c::checkPointedAt() {
|
|
field_0x1BC = 0;
|
|
dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit();
|
|
if (chk != nullptr && chk->getType() == 'lyt ' &&
|
|
static_cast<dCursorHitCheckLyt_c *>(chk)->getHitPane() == mpBounding) {
|
|
field_0x1BC = 1;
|
|
}
|
|
}
|
|
|
|
void dLytMapPinIcon_c::setPosition(const mVec3_c &pos) {
|
|
d2d::AnmGroup_c *anm;
|
|
|
|
mPosition = pos;
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
mVec2_c pos2d;
|
|
global->projectOntoMap(pos2d, pos);
|
|
pos2d += global->getField_0x20();
|
|
mVec3_c translate3d = vec2ToVec3XY(mVec2_c(pos2d));
|
|
|
|
mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d);
|
|
mLyt.getLayout()->GetRootPane()->SetVisible(true);
|
|
|
|
anm = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE];
|
|
|
|
anm->bind(false);
|
|
anm->setFrame(0.0f);
|
|
mLyt.calc();
|
|
anm->unbind();
|
|
mIsSet = true;
|
|
}
|
|
|
|
void dLytMapPinIcon_c::removeBeacon() {
|
|
mIsSet = false;
|
|
if (mpBounding != nullptr) {
|
|
mpBounding->SetVisible(false);
|
|
}
|
|
setBeaconPosition(nullptr, mIndex);
|
|
}
|
|
|
|
dLytMapPinIcon_c::~dLytMapPinIcon_c() {
|
|
if (dCsMgr_c::GetInstance()->isRegist(&mCsHitCheck)) {
|
|
dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck);
|
|
}
|
|
}
|
|
|
|
dLytMapGlobal_c *dLytMapPinIcon_c::getGlobal() const {
|
|
return dLytMapGlobal_c::GetInstance();
|
|
}
|
|
|
|
static const d2d::LytBrlanMapping sMapPinIconBrlanMap[] = {
|
|
{"mapPutIcon_00_scale.brlan", "G_scale_00"},
|
|
{"mapPutIcon_00_erase.brlan", "G_scale_00"},
|
|
{ "mapPutIcon_00_loop.brlan", "G_loop_00"},
|
|
};
|
|
|
|
bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("mapPutIcon_00.brlyt", nullptr);
|
|
|
|
d2d::AnmGroup_c *pAnmGroups = mAnmGroups;
|
|
|
|
for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) {
|
|
pAnmGroups[i].init(sMapPinIconBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPinIconBrlanMap[i].mName);
|
|
pAnmGroups[i].bind(false);
|
|
pAnmGroups[i].setFrame(0.0f);
|
|
}
|
|
|
|
mLyt.calc();
|
|
|
|
for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) {
|
|
pAnmGroups[i].unbind();
|
|
}
|
|
|
|
mpBounding = mLyt.findBounding("B_mark_00");
|
|
mCsHitCheck.init(mpBounding, 2, 1, 0);
|
|
dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck);
|
|
|
|
mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].bind(false);
|
|
mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].bind(false);
|
|
|
|
mLyt.calc();
|
|
|
|
mStateMgr.changeState(StateID_Wait);
|
|
field_0x1BC = 0;
|
|
mIsSet = false;
|
|
mLoopFrame = 0;
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapPinIcon_c::remove() {
|
|
dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck);
|
|
for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].remove();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void dLytMapPinIcon_c::setScale(f32 scale) {
|
|
// TODO - probably inlines
|
|
f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame();
|
|
d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE];
|
|
grp->setFrame(scale * frame);
|
|
mLyt.calc();
|
|
}
|
|
|
|
bool dLytMapPinIcon_c::execute() {
|
|
checkPointedAt();
|
|
mStateMgr.executeState();
|
|
field_0x1BC = 0;
|
|
d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP];
|
|
grp->setFrame(mLoopFrame);
|
|
|
|
// TODO - probably inlines
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame();
|
|
grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE];
|
|
f32 tmp = global->getZoomFrame();
|
|
grp->setFrame(tmp * frame);
|
|
|
|
mLyt.calc();
|
|
mCsHitCheck.resetCachedHitboxes();
|
|
mCsHitCheck.execute();
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapPinIcon_c::draw() {
|
|
mLyt.draw();
|
|
return true;
|
|
}
|
|
|
|
void dLytMapPinIconAggregate_c::initializeState_Wait() {}
|
|
void dLytMapPinIconAggregate_c::executeState_Wait() {
|
|
for (int i = 0; i < 5; i++) {
|
|
if (mPins[i].isSelect()) {
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
}
|
|
}
|
|
void dLytMapPinIconAggregate_c::finalizeState_Wait() {}
|
|
|
|
void dLytMapPinIconAggregate_c::initializeState_Select() {}
|
|
void dLytMapPinIconAggregate_c::executeState_Select() {
|
|
bool anyRemove = false;
|
|
for (int i = 0; i < 5; i++) {
|
|
if (mPins[i].isRemove()) {
|
|
mStateMgr.changeState(StateID_Remove);
|
|
anyRemove = true;
|
|
// a bit convoluted, an early return would've done the trick
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!anyRemove) {
|
|
bool allSelect = true;
|
|
for (int i = 0; i < 5; i++) {
|
|
if (mPins[i].isSelect()) {
|
|
allSelect = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (allSelect) {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
}
|
|
}
|
|
void dLytMapPinIconAggregate_c::finalizeState_Select() {}
|
|
|
|
void dLytMapPinIconAggregate_c::initializeState_Remove() {}
|
|
void dLytMapPinIconAggregate_c::executeState_Remove() {
|
|
field_0x9A0->field_0x04 = false;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
void dLytMapPinIconAggregate_c::finalizeState_Remove() {}
|
|
|
|
bool dLytMapPinIconAggregate_c::findNewBeaconId(s32 *pOutId) {
|
|
bool ret = false;
|
|
for (s32 idx = 0; idx < getMaxBeaconCount(); idx++) {
|
|
s32 existingIndex = mPins[idx].mIndex;
|
|
if (!mPins[idx].mIsSet) {
|
|
// If we have an unused id, use that
|
|
*pOutId = idx;
|
|
ret = true;
|
|
break;
|
|
}
|
|
|
|
// Otherwise use the lowest id ("oldest beacon"?)
|
|
if (existingIndex < *pOutId) {
|
|
*pOutId = existingIndex;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void dLytMapPinIconAggregate_c::setScale(f32 scale) {
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].setScale(scale);
|
|
}
|
|
}
|
|
|
|
void dLytMapPinIconAggregate_c::updatePosition() {
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].updatePosition();
|
|
}
|
|
}
|
|
|
|
void dLytMapPinIconAggregate_c::setUnk(LytMap0x80520B5C *unk) {
|
|
field_0x9A0 = unk;
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].field_0x1D0 = unk;
|
|
}
|
|
}
|
|
|
|
bool dLytMapPinIconAggregate_c::setPosition(s32 index, const mVec3_c &position) {
|
|
bool ret = false;
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
if (mPins[idx].mIndex == index) {
|
|
mPins[idx].setPosition(position);
|
|
ret = true;
|
|
break;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void dLytMapPinIconAggregate_c::unsetAll() {
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].mIsSet = false;
|
|
}
|
|
}
|
|
|
|
u32 dLytMapPinIconAggregate_c::getNumSetPins() const {
|
|
s32 num = 0;
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
if (mPins[idx].mIsSet) {
|
|
num++;
|
|
}
|
|
}
|
|
return num;
|
|
}
|
|
|
|
bool dLytMapPinIconAggregate_c::build(d2d::ResAccIf_c *resAcc) {
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].build(resAcc);
|
|
}
|
|
mLoopFrame = 0;
|
|
mLoopFrameMax = mPins[0].mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].getAnimDuration();
|
|
mStateMgr.changeState(StateID_Wait);
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapPinIconAggregate_c::remove() {
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].remove();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapPinIconAggregate_c::execute() {
|
|
mLoopFrame++;
|
|
if (mLoopFrame > mLoopFrameMax) {
|
|
mLoopFrame = 0;
|
|
}
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].mLoopFrame = mLoopFrame;
|
|
mPins[idx].execute();
|
|
}
|
|
mStateMgr.executeState();
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapPinIconAggregate_c::draw() {
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) {
|
|
mPins[idx].draw();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void dLytMapFloorBtn_c::init() {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
void dLytMapFloorBtn_c::execute() {
|
|
mStateMgr.executeState();
|
|
}
|
|
|
|
void dLytMapFloorBtn_c::directlyDecide() {
|
|
if (mpAnmGroups->mOnOff.isBound()) {
|
|
mpAnmGroups->mOnOff.unbind();
|
|
}
|
|
if (mpAnmGroups->mDecide.isBound()) {
|
|
mpAnmGroups->mDecide.unbind();
|
|
}
|
|
mpAnmGroups->mOnOffLight.bind(false);
|
|
mpAnmGroups->mOnOffLight.setToEnd();
|
|
mpOwnerLyt->calc();
|
|
mpAnmGroups->mOnOffLight.unbind();
|
|
}
|
|
|
|
void dLytMapFloorBtn_c::directlyUndecide() {
|
|
if (mpAnmGroups->mOnOffLight.isBound()) {
|
|
mpAnmGroups->mOnOffLight.unbind();
|
|
}
|
|
if (mpAnmGroups->mDecide.isBound()) {
|
|
mpAnmGroups->mDecide.unbind();
|
|
}
|
|
mpAnmGroups->mOnOff.bind(false);
|
|
mpAnmGroups->mOnOff.setFrame(0.0f);
|
|
mpOwnerLyt->calc();
|
|
mpAnmGroups->mOnOff.unbind();
|
|
}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_Wait() {}
|
|
void dLytMapFloorBtn_c::executeState_Wait() {
|
|
if (mSelected) {
|
|
dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0);
|
|
mpAnmGroups->mOnOff.bind(false);
|
|
mpAnmGroups->mOnOff.setFrame(0.0f);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR);
|
|
mStateMgr.changeState(StateID_ToSelect);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_Wait() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_ToSelect() {}
|
|
void dLytMapFloorBtn_c::executeState_ToSelect() {
|
|
if (mpAnmGroups->mOnOff.isEndReached()) {
|
|
mpOwnerLyt->calc();
|
|
mpAnmGroups->mOnOff.unbind();
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_ToSelect() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_Select() {}
|
|
void dLytMapFloorBtn_c::executeState_Select() {
|
|
if (!mSelected) {
|
|
mpAnmGroups->mOnOff.bind(false);
|
|
mpAnmGroups->mOnOff.setBackward();
|
|
mpAnmGroups->mOnOff.setToStart();
|
|
mStateMgr.changeState(StateID_ToWait);
|
|
} else if (mDecided) {
|
|
mpAnmGroups->mDecide.bind(false);
|
|
mpAnmGroups->mDecide.setFrame(0.0f);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_SELECT_FLOOR);
|
|
mStateMgr.changeState(StateID_ToSelectInDecide);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_Select() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_ToWait() {}
|
|
void dLytMapFloorBtn_c::executeState_ToWait() {
|
|
if (mpAnmGroups->mOnOff.isStop2()) {
|
|
mpOwnerLyt->calc();
|
|
mpAnmGroups->mOnOff.unbind();
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_ToWait() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_ToSelectInDecide() {}
|
|
void dLytMapFloorBtn_c::executeState_ToSelectInDecide() {
|
|
if (mpAnmGroups->mDecide.isStop2()) {
|
|
mpOwnerLyt->calc();
|
|
mpAnmGroups->mDecide.unbind();
|
|
mStateMgr.changeState(StateID_SelectInDecide);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_ToSelectInDecide() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_SelectInDecide() {}
|
|
void dLytMapFloorBtn_c::executeState_SelectInDecide() {
|
|
if (!mSelected) {
|
|
mpAnmGroups->mOnOffLight.bind(false);
|
|
mpAnmGroups->mOnOffLight.setToStart();
|
|
mStateMgr.changeState(StateID_ToDecide);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_SelectInDecide() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_ToDecide() {}
|
|
void dLytMapFloorBtn_c::executeState_ToDecide() {
|
|
if (mpAnmGroups->mOnOffLight.isStop2()) {
|
|
mpAnmGroups->mOnOffLight.unbind();
|
|
mpOwnerLyt->calc();
|
|
mStateMgr.changeState(StateID_Decide);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_ToDecide() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_Decide() {}
|
|
void dLytMapFloorBtn_c::executeState_Decide() {
|
|
if (mSelected) {
|
|
mpAnmGroups->mOnOffLight.bind(false);
|
|
mpAnmGroups->mOnOffLight.setBackward();
|
|
mpAnmGroups->mOnOffLight.setToStart();
|
|
dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR);
|
|
mStateMgr.changeState(StateID_DecideToSelectInDecide);
|
|
} else if (!mDecided) {
|
|
mpAnmGroups->mOnOff.bind(false);
|
|
mpAnmGroups->mOnOff.setFrame(0.0f);
|
|
mpOwnerLyt->getLayout()->Animate(0);
|
|
mpOwnerLyt->calc();
|
|
mpAnmGroups->mOnOff.unbind();
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_Decide() {}
|
|
|
|
void dLytMapFloorBtn_c::initializeState_DecideToSelectInDecide() {}
|
|
void dLytMapFloorBtn_c::executeState_DecideToSelectInDecide() {
|
|
if (mpAnmGroups->mOnOffLight.isStop2()) {
|
|
mpOwnerLyt->calc();
|
|
mpAnmGroups->mOnOffLight.unbind();
|
|
mStateMgr.changeState(StateID_SelectInDecide);
|
|
}
|
|
}
|
|
void dLytMapFloorBtn_c::finalizeState_DecideToSelectInDecide() {}
|
|
|
|
static const char *sFloorBtnBoundings[] = {
|
|
"B_choices_00",
|
|
"B_choices_01",
|
|
"B_choices_02",
|
|
"B_choices_03",
|
|
};
|
|
|
|
static const char *sFloorBtnText[] = {
|
|
"T_text_00",
|
|
"T_text_01",
|
|
"T_text_02",
|
|
"T_text_03",
|
|
};
|
|
|
|
static const char *sFloorBtnTextS[] = {
|
|
"T_textS_00",
|
|
"T_textS_01",
|
|
"T_textS_02",
|
|
"T_textS_03",
|
|
};
|
|
|
|
static const d2d::LytBrlanMapping brlanMapFloorBtnMgr[] = {
|
|
{"mapFloorBtn_00_btnV.brlan", "G_btnV_00"},
|
|
};
|
|
|
|
#define MAP_FLOOR_BTN_MGR_ANIM_BTNV 0
|
|
#define MAP_FLOOR_BTN_MGR_NUM_ANIMS 1
|
|
|
|
static const char *brlanListFloorBtn[] = {
|
|
"mapFloorBtn_00_btnLoop.brlan",
|
|
"mapFloorBtn_00_btnOnOffNormal.brlan",
|
|
"mapFloorBtn_00_btnDecideNormal.brlan",
|
|
"mapFloorBtn_00_btnOnOffLight.brlan",
|
|
};
|
|
|
|
static const char *groupListFloorBtn[][4] = {
|
|
{"G_btnLoop_00", "G_btn_00", "G_btn_00", "G_btn_00"},
|
|
{"G_btnLoop_01", "G_btn_01", "G_btn_01", "G_btn_01"},
|
|
{"G_btnLoop_02", "G_btn_02", "G_btn_02", "G_btn_02"},
|
|
{"G_btnLoop_03", "G_btn_03", "G_btn_03", "G_btn_03"},
|
|
};
|
|
|
|
#define MAP_FLOOR_BTN_MGR_NUM_BTNS 4
|
|
|
|
bool dLytMapFloorBtnMgr_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("mapFloorBtn_00.brlyt", nullptr);
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].init(brlanMapFloorBtnMgr[i].mFile, resAcc, mLyt.getLayout(), brlanMapFloorBtnMgr[i].mName);
|
|
}
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mBtnGroups[i].mLoop.init(brlanListFloorBtn[0], resAcc, mLyt.getLayout(), groupListFloorBtn[i][0]);
|
|
mBtnGroups[i].mOnOff.init(brlanListFloorBtn[1], resAcc, mLyt.getLayout(), groupListFloorBtn[i][1]);
|
|
mBtnGroups[i].mDecide.init(brlanListFloorBtn[2], resAcc, mLyt.getLayout(), groupListFloorBtn[i][2]);
|
|
mBtnGroups[i].mOnOffLight.init(brlanListFloorBtn[3], resAcc, mLyt.getLayout(), groupListFloorBtn[i][3]);
|
|
}
|
|
|
|
nw4r::lyt::Bounding *bounding;
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
bounding = mLyt.findBounding(sFloorBtnBoundings[i]);
|
|
mFloorBtns[i].init();
|
|
mFloorBtns[i].mpBounding = bounding;
|
|
bounding->SetVisible(false);
|
|
mCsHitChecks[i].init(bounding, 0x2, 0, 0);
|
|
dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[i]);
|
|
}
|
|
|
|
mpPane = mLyt.findPane("N_all_00");
|
|
mpPane->SetInfluencedAlpha(true);
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mFloorBtns[i].mpOwnerLyt = &mLyt;
|
|
mFloorBtns[i].mpAnmGroups = &mBtnGroups[i];
|
|
}
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mBtnGroups[i].mOnOff.bind(false);
|
|
mBtnGroups[i].mOnOff.setFrame(0.0f);
|
|
}
|
|
|
|
mLyt.getLayout()->Animate(0);
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mBtnGroups[i].mOnOff.unbind();
|
|
}
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mBtnGroups[i].mLoop.bind(false);
|
|
}
|
|
|
|
mLyt.calc();
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mCsHitChecks[i].resetCachedHitboxes();
|
|
mCsHitChecks[i].execute();
|
|
}
|
|
|
|
mPointerVisible = false;
|
|
mPrevPointerVisible = false;
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mFloorBtns[i].mSelected = false;
|
|
}
|
|
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapFloorBtnMgr_c::remove() {
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[i]);
|
|
}
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mBtnGroups[i].mOnOff.remove();
|
|
mBtnGroups[i].mLoop.remove();
|
|
mBtnGroups[i].mDecide.remove();
|
|
mBtnGroups[i].mOnOffLight.remove();
|
|
}
|
|
// not removing our own anm group...
|
|
|
|
dPadNav::setNavEnabled(false, false);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dLytMapFloorBtnMgr_c::execute() {
|
|
field_0x70C = 4;
|
|
if (*mStateMgr.getStateID() != StateID_Invisible) {
|
|
if (mPointerVisible) {
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mFloorBtns[i].execute();
|
|
}
|
|
mStateMgr.executeState();
|
|
} else {
|
|
// Determine the currently active floor
|
|
s32 activeBtn = 0;
|
|
s32 direction = dPadNav::getFSStickNavDirection();
|
|
if (mPointerVisible != mPrevPointerVisible) {
|
|
// We just turned off pointing, so make the decided button the selected one too
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
if (mFloorBtns[i].mDecided) {
|
|
activeBtn = i;
|
|
}
|
|
}
|
|
} else {
|
|
// Normal handling - pointing off, selected button stays selected
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
if (mFloorBtns[i].mSelected) {
|
|
activeBtn = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Handle navigation
|
|
if (activeBtn > 0 && (direction == dPadNav::FS_STICK_UP || direction == dPadNav::FS_STICK_UP_RIGHT ||
|
|
direction == dPadNav::FS_STICK_UP_LEFT)) {
|
|
activeBtn--;
|
|
}
|
|
|
|
if (activeBtn < mNumFloors - 1 &&
|
|
(direction == dPadNav::FS_STICK_DOWN || direction == dPadNav::FS_STICK_DOWN_RIGHT ||
|
|
direction == dPadNav::FS_STICK_DOWN_LEFT)) {
|
|
activeBtn++;
|
|
}
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
if (i == activeBtn) {
|
|
mFloorBtns[i].mSelected = true;
|
|
if (dCsBase_c::GetInstance() != nullptr) {
|
|
dCsBase_c::GetInstance()->setCursorStickTargetPane(mFloorBtns[i].mpBounding);
|
|
}
|
|
} else {
|
|
mFloorBtns[i].mSelected = false;
|
|
}
|
|
}
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mFloorBtns[i].execute();
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mBtnGroups[i].mLoop.play();
|
|
if (mBtnGroups[i].mOnOff.isBound()) {
|
|
mBtnGroups[i].mOnOff.play();
|
|
}
|
|
if (mBtnGroups[i].mDecide.isBound()) {
|
|
mBtnGroups[i].mDecide.play();
|
|
}
|
|
if (mBtnGroups[i].mOnOffLight.isBound()) {
|
|
mBtnGroups[i].mOnOffLight.play();
|
|
}
|
|
}
|
|
}
|
|
mLyt.calc();
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mCsHitChecks[i].resetCachedHitboxes();
|
|
mCsHitChecks[i].execute();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void dLytMapFloorBtnMgr_c::checkPointedAtBtn() {
|
|
mPrevPointerVisible = mPointerVisible;
|
|
mPointerVisible = dPadNav::isPointerVisible();
|
|
if (mForceNoNav) {
|
|
dPadNav::stopFSStickNav();
|
|
mPointerVisible = true;
|
|
}
|
|
|
|
if (mPointerVisible) {
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
mFloorBtns[i].mSelected = false;
|
|
}
|
|
|
|
dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit();
|
|
if (chk != nullptr && chk->getType() == 'lyt ') {
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
if (chk == &mCsHitChecks[i]) {
|
|
mFloorBtns[i].mSelected = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 dLytMapFloorBtnMgr_c::getPointedAtBtnIdx() const {
|
|
s32 idx = -1;
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
if (mFloorBtns[i].mSelected) {
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
return idx;
|
|
}
|
|
|
|
bool dLytMapFloorBtnMgr_c::isUsingPointerNav() const {
|
|
return mPointerVisible;
|
|
}
|
|
|
|
void dLytMapFloorBtnMgr_c::resetFloor(s32 newFloorBtn) {
|
|
mFloorBtns[mSelectedBtnIdx].mDecided = false;
|
|
mFloorBtns[mSelectedBtnIdx].directlyUndecide();
|
|
mFloorBtns[mSelectedBtnIdx].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Wait);
|
|
|
|
mFloorBtns[newFloorBtn].mDecided = true;
|
|
mFloorBtns[newFloorBtn].directlyDecide();
|
|
mFloorBtns[newFloorBtn].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide);
|
|
|
|
mSelectedBtnIdx = newFloorBtn;
|
|
}
|
|
|
|
void dLytMapFloorBtnMgr_c::decideSelectedFloor() {
|
|
for (int i = 0; i < mNumFloors; i++) {
|
|
if (mFloorBtns[i].mSelected) {
|
|
if (i != mSelectedBtnIdx) {
|
|
mFloorBtns[mSelectedBtnIdx].mDecided = false;
|
|
mFloorBtns[i].mDecided = true;
|
|
}
|
|
mSelectedBtnIdx = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool dLytMapFloorBtnMgr_c::canDecideFloor() const {
|
|
bool ret = false;
|
|
|
|
s32 idx = getPointedAtBtnIdx();
|
|
if (idx >= 0) {
|
|
// When pointing at a button that is thus selected but not yet decided,
|
|
// we can decide on that button if it's not busy animating...
|
|
if (!mFloorBtns[idx].mDecided) {
|
|
if (mFloorBtns[idx].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Select)) {
|
|
bool busy = mFloorBtns[idx].mpAnmGroups->mOnOff.isBound() ||
|
|
mFloorBtns[idx].mpAnmGroups->mDecide.isBound() ||
|
|
mFloorBtns[idx].mpAnmGroups->mOnOffLight.isBound();
|
|
if (!busy) {
|
|
ret = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < mNumFloors; i++) {
|
|
// But if any other button is animating and in a changing state, also forbid
|
|
if (i != idx) {
|
|
bool busy = mFloorBtns[i].mpAnmGroups->mOnOff.isBound() || mFloorBtns[i].mpAnmGroups->mDecide.isBound() ||
|
|
mFloorBtns[i].mpAnmGroups->mOnOffLight.isBound();
|
|
|
|
if (busy) {
|
|
if (!mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Wait) &&
|
|
!mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Decide)) {
|
|
ret = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
s32 dLytMapFloorBtnMgr_c::getCurrentFloor() const {
|
|
s32 ret = -1;
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
if (mFloorBtns[i].mDecided) {
|
|
ret = i;
|
|
}
|
|
}
|
|
return mBaseFloorOffset - ret;
|
|
}
|
|
|
|
// What it says on the tin
|
|
static const char *sFloorBtnLabels[] = {
|
|
"FLOOR_F3", "FLOOR_F2", "FLOOR_F1", "FLOOR_B1", "FLOOR_B2", "FLOOR_B3",
|
|
};
|
|
|
|
void dLytMapFloorBtnMgr_c::init(s32 numFloors, s32 baseFloorOffset, s32 selectedFloor) {
|
|
mNumFloors = numFloors;
|
|
mBaseFloorOffset = baseFloorOffset;
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
bool visible = i < mNumFloors && mNumFloors >= 2;
|
|
mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible);
|
|
}
|
|
|
|
if (mNumFloors >= 2) {
|
|
mLyt.getLayout()->GetRootPane()->SetVisible(true);
|
|
mAnmGroups[0].bind(false);
|
|
mAnmGroups[0].setFrame(mNumFloors - 2);
|
|
|
|
for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) {
|
|
bool visible = i < mNumFloors && mNumFloors >= 2;
|
|
mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible);
|
|
if (visible) {
|
|
int labelIdx = (2 - mBaseFloorOffset) + i;
|
|
dTextBox_c *textBox = mLyt.getTextBox(sFloorBtnText[i]);
|
|
textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr);
|
|
textBox = mLyt.getTextBox(sFloorBtnTextS[i]);
|
|
textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr);
|
|
}
|
|
}
|
|
|
|
// Floor buttons are descending but selectedFloor is ascending
|
|
s32 tmp = -(selectedFloor - baseFloorOffset);
|
|
mSelectedBtnIdx = tmp;
|
|
mFloorBtns[tmp].mDecided = true;
|
|
mFloorBtns[tmp].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide);
|
|
|
|
// TODO probably an inline
|
|
d2d::AnmGroup_c &anm = mBtnGroups[tmp].mOnOffLight;
|
|
|
|
anm.bind(false);
|
|
mBtnGroups[tmp].mOnOffLight.setToEnd();
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
anm.unbind();
|
|
if (mAnmGroups[0].bind(false)) {
|
|
mAnmGroups[0].unbind();
|
|
}
|
|
} else {
|
|
mLyt.getLayout()->GetRootPane()->SetVisible(false);
|
|
}
|
|
}
|
|
|
|
void dLytMapFloorBtnMgr_c::initializeState_Invisible() {}
|
|
void dLytMapFloorBtnMgr_c::executeState_Invisible() {}
|
|
void dLytMapFloorBtnMgr_c::finalizeState_Invisible() {}
|
|
|
|
void dLytMapFloorBtnMgr_c::initializeState_Wait() {}
|
|
void dLytMapFloorBtnMgr_c::executeState_Wait() {}
|
|
void dLytMapFloorBtnMgr_c::finalizeState_Wait() {}
|
|
|
|
dLytMapFloorBtnMgr_c::~dLytMapFloorBtnMgr_c() {
|
|
for (int i = 0; i < 4; i++) {
|
|
if (dCsMgr_c::GetInstance()->isRegist(&mCsHitChecks[i])) {
|
|
dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[i]);
|
|
}
|
|
}
|
|
dPadNav::setNavEnabled(false, false);
|
|
}
|
|
|
|
#define MAP_POPUP_INFO_ANIM_IN 0
|
|
#define MAP_POPUP_INFO_ANIM_OUT 1
|
|
#define MAP_POPUP_INFO_ANIM_INPUT 2
|
|
|
|
#define MAP_POPUP_INFO_NUM_ANIMS 3
|
|
|
|
void dLytMapPopupInfo_c::initializeState_Invisible() {}
|
|
void dLytMapPopupInfo_c::executeState_Invisible() {}
|
|
void dLytMapPopupInfo_c::finalizeState_Invisible() {}
|
|
|
|
void dLytMapPopupInfo_c::initializeState_In() {
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_IN].bind(false);
|
|
}
|
|
void dLytMapPopupInfo_c::executeState_In() {
|
|
if (mAnmGroups[MAP_POPUP_INFO_ANIM_IN].isEndReached()) {
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_IN].unbind();
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
}
|
|
void dLytMapPopupInfo_c::finalizeState_In() {}
|
|
|
|
void dLytMapPopupInfo_c::initializeState_Wait() {}
|
|
void dLytMapPopupInfo_c::executeState_Wait() {
|
|
if (dLytMsgWindow_c::getInstance()->isVisible()) {
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false);
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setForward();
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart();
|
|
mStateMgr.changeState(StateID_WaitInvalid);
|
|
} else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) {
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind();
|
|
}
|
|
}
|
|
void dLytMapPopupInfo_c::finalizeState_Wait() {}
|
|
|
|
void dLytMapPopupInfo_c::initializeState_WaitInvalid() {}
|
|
void dLytMapPopupInfo_c::executeState_WaitInvalid() {
|
|
if (!dLytMsgWindow_c::getInstance()->isVisible()) {
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false);
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setBackward();
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart();
|
|
mStateMgr.changeState(StateID_Wait);
|
|
} else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) {
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind();
|
|
}
|
|
}
|
|
void dLytMapPopupInfo_c::finalizeState_WaitInvalid() {}
|
|
|
|
void dLytMapPopupInfo_c::initializeState_Out() {
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].bind(false);
|
|
}
|
|
void dLytMapPopupInfo_c::executeState_Out() {
|
|
if (mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].isEndReached()) {
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].unbind();
|
|
}
|
|
}
|
|
void dLytMapPopupInfo_c::finalizeState_Out() {}
|
|
|
|
static const d2d::LytBrlanMapping sMapPopupInfoBrlanMap[] = {
|
|
{ "mapPopupInfo_00_in.brlan", "G_inOut_00"},
|
|
{ "mapPopupInfo_00_out.brlan", "G_inOut_00"},
|
|
{"mapPopupInfo_00_inPut.brlan", "G_input_00"},
|
|
};
|
|
|
|
void dLytMapPopupInfo_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("mapPopupInfo_00.brlyt", nullptr);
|
|
for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].init(sMapPopupInfoBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPopupInfoBrlanMap[i].mName);
|
|
}
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
}
|
|
|
|
void dLytMapPopupInfo_c::remove() {
|
|
for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].remove();
|
|
}
|
|
}
|
|
|
|
void dLytMapPopupInfo_c::execute() {
|
|
mStateMgr.executeState();
|
|
mLyt.calc();
|
|
for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) {
|
|
if (mAnmGroups[i].isBound()) {
|
|
mAnmGroups[i].play();
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapPopupInfo_c::draw() {
|
|
mLyt.draw();
|
|
}
|
|
|
|
#define MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT 0
|
|
#define MAP_SAVE_POPUP_ACTION_ANIM_INPUT 1
|
|
|
|
#define MAP_SAVE_POPUP_ACTION_NUM_ANIMS 2
|
|
|
|
void dLytMapSavePopupAction_c::initializeState_Invisible() {}
|
|
void dLytMapSavePopupAction_c::executeState_Invisible() {
|
|
if (mInRequest) {
|
|
mStateMgr.changeState(StateID_In);
|
|
}
|
|
}
|
|
void dLytMapSavePopupAction_c::finalizeState_Invisible() {}
|
|
|
|
void dLytMapSavePopupAction_c::initializeState_In() {
|
|
// TODO - explain why this seems unnecessarily complicated
|
|
mpAnmGroupInOut->bind(false);
|
|
mpAnmGroupInOut->setForward();
|
|
mpAnmGroupInOut->setToStart();
|
|
mInOutFrame = mpAnmGroupInOut->getFrame();
|
|
mpAnmGroupInOut->unbind();
|
|
}
|
|
void dLytMapSavePopupAction_c::executeState_In() {
|
|
// TODO - explain why this seems unnecessarily complicated
|
|
mpAnmGroupInOut->bind(false);
|
|
mpAnmGroupInOut->setFrame(mInOutFrame);
|
|
mpAnmGroupInOut->play();
|
|
if (mpAnmGroupInOut->isEndReached()) {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
mInOutFrame = mpAnmGroupInOut->getFrame();
|
|
mpAnmGroupInOut->unbind();
|
|
}
|
|
void dLytMapSavePopupAction_c::finalizeState_In() {}
|
|
|
|
void dLytMapSavePopupAction_c::initializeState_Wait() {}
|
|
void dLytMapSavePopupAction_c::executeState_Wait() {
|
|
if (!mInRequest) {
|
|
mStateMgr.changeState(StateID_Out);
|
|
}
|
|
}
|
|
void dLytMapSavePopupAction_c::finalizeState_Wait() {}
|
|
|
|
void dLytMapSavePopupAction_c::initializeState_Out() {
|
|
// TODO - explain why this seems unnecessarily complicated
|
|
mpAnmGroupInOut->bind(false);
|
|
mpAnmGroupInOut->setBackward();
|
|
mpAnmGroupInOut->setToStart();
|
|
mInOutFrame = mpAnmGroupInOut->getFrame();
|
|
mpAnmGroupInOut->unbind();
|
|
}
|
|
void dLytMapSavePopupAction_c::executeState_Out() {
|
|
// TODO - explain why this seems unnecessarily complicated
|
|
mpAnmGroupInOut->bind(false);
|
|
mpAnmGroupInOut->setBackward();
|
|
mpAnmGroupInOut->setFrame(mInOutFrame);
|
|
mpAnmGroupInOut->play();
|
|
if (mpAnmGroupInOut->isStop2()) {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
mInOutFrame = mpAnmGroupInOut->getFrame();
|
|
mpAnmGroupInOut->unbind();
|
|
}
|
|
void dLytMapSavePopupAction_c::finalizeState_Out() {}
|
|
|
|
void dLytMapSavePopupAction_c::execute() {
|
|
mStateMgr.executeState();
|
|
}
|
|
|
|
void dLytMapSavePopupAction_c::init(d2d::AnmGroup_c *pGroups) {
|
|
mpAnmGroupInOut = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT];
|
|
mpAnmGroupInput = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT];
|
|
}
|
|
|
|
void dLytMapSavePopupAction_c::hide() {
|
|
mpAnmGroupInOut->bind(false);
|
|
mpAnmGroupInOut->setFrame(0.0f);
|
|
mpAnmGroupInOut->unbind();
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
}
|
|
|
|
static const d2d::LytBrlanMapping sMapSavePopupActionBrlanMap[] = {
|
|
{"mapPopup_00_inOut.brlan", "G_inOut_00"},
|
|
{"mapPopup_00_scale.brlan", "G_scale_00"},
|
|
};
|
|
|
|
void dLytMapSavePopup_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("mapPopup_00.brlyt", nullptr);
|
|
for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].init(
|
|
sMapSavePopupActionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSavePopupActionBrlanMap[i].mName
|
|
);
|
|
}
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mActions); i++) {
|
|
mActions[i].init(mAnmGroups);
|
|
mActions[i].mStateMgr.changeState(dLytMapSavePopupAction_c::StateID_Invisible);
|
|
}
|
|
}
|
|
|
|
void dLytMapSavePopup_c::remove() {
|
|
for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].remove();
|
|
}
|
|
}
|
|
|
|
void dLytMapSavePopup_c::execute() {
|
|
for (int i = 0; i < mStatueNum; i++) {
|
|
mActions[i].mInRequest = mCurrentlyInStatue == i;
|
|
}
|
|
|
|
for (int i = 0; i < mStatueNum; i++) {
|
|
mActions[i].execute();
|
|
}
|
|
}
|
|
|
|
void dLytMapSavePopup_c::draw() {
|
|
nw4r::lyt::Bounding *pBounding;
|
|
|
|
f32 scaleX = mLyt.getDrawInfo().GetLocationAdjustScale().x;
|
|
nw4r::lyt::Pane *rootPane = mLyt.getLayout()->GetRootPane();
|
|
for (int i = 0; i < mStatueNum; i++) {
|
|
const sStateIDIf_c *stateID = mActions[i].mStateMgr.getStateID();
|
|
if (*stateID != dLytMapSavePopupAction_c::StateID_Invisible) {
|
|
pBounding = mpStatueBoundings[i];
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].bind(false);
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].setFrame(30.0f);
|
|
const dMapSaveObjDefinition *def = dLytMap_c::GetInstance()->getSaveObjDefinition(i);
|
|
f32 width = setStatueLabel(def->statueLabel);
|
|
|
|
f32 allScaleX = mLyt.findPane("N_all_00")->GetScale().x;
|
|
// TODO fadds regswap
|
|
f32 x = pBounding->GetGlobalMtx()._03 + (0.5f * width * allScaleX * scaleX) + sHio.field_0x04;
|
|
f32 y = pBounding->GetGlobalMtx()._13;
|
|
mVec2_c translate2d(x, y);
|
|
mVec3_c translate = vec2ToVec3XY(translate2d);
|
|
rootPane->SetTranslate(translate);
|
|
|
|
if (*stateID == dLytMapSavePopupAction_c::StateID_In) {
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false);
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame);
|
|
mLyt.calc();
|
|
mLyt.draw();
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind();
|
|
} else if (*stateID == dLytMapSavePopupAction_c::StateID_Wait) {
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false);
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setToEnd();
|
|
mLyt.calc();
|
|
mLyt.draw();
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind();
|
|
} else if (*stateID == dLytMapSavePopupAction_c::StateID_Out) {
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false);
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setBackward();
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame);
|
|
mLyt.calc();
|
|
mLyt.draw();
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind();
|
|
}
|
|
mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].unbind();
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapSavePopup_c::set(nw4r::lyt::Bounding **pStatueBoundings, s32 count) {
|
|
mpStatueBoundings = pStatueBoundings;
|
|
mStatueNum = count;
|
|
}
|
|
|
|
f32 dLytMapSavePopup_c::setStatueLabel(const char *label) {
|
|
static const char *sTPopupS = "T_popupS_00";
|
|
static const char *sTPopup = "T_popup_00";
|
|
static const char *sBg = "W_bgP_00";
|
|
dTextBox_c *textBox;
|
|
|
|
textBox = mLyt.getTextBox(sTPopupS);
|
|
textBox->setMessageWithGlobalTextProcessor2(label, nullptr);
|
|
textBox->GetLineWidth(nullptr);
|
|
textBox = mLyt.getTextBox(sTPopup);
|
|
textBox->setMessageWithGlobalTextProcessor2(label, nullptr);
|
|
|
|
dWindow_c *w = mLyt.getWindow(sBg);
|
|
w->UpdateSize(textBox, 60.0f);
|
|
return w->GetSize().width;
|
|
}
|
|
|
|
void dLytMapSavePopup_c::hide(s32 statueIdx) {
|
|
mActions[statueIdx].hide();
|
|
}
|
|
|
|
#define MAP_SAVE_CAPTION_ANIM_TYPE 0
|
|
#define MAP_SAVE_CAPTION_ANIM_TEXTLINE 1
|
|
#define MAP_SAVE_CAPTION_ANIM_IN 2
|
|
#define MAP_SAVE_CAPTION_ANIM_LOOP 3
|
|
#define MAP_SAVE_CAPTION_ANIM_OUT 4
|
|
|
|
#define MAP_SAVE_CAPTION_NUM_ANIMS 5
|
|
|
|
void dLytMapSaveCaption_c::initializeState_Invisible() {}
|
|
void dLytMapSaveCaption_c::executeState_Invisible() {}
|
|
void dLytMapSaveCaption_c::finalizeState_Invisible() {}
|
|
|
|
void dLytMapSaveCaption_c::initializeState_In() {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false);
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f);
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false);
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].setFrame(0.0f);
|
|
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind();
|
|
}
|
|
void dLytMapSaveCaption_c::executeState_In() {
|
|
if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].isEndReached()) {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false);
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].unbind();
|
|
mStateMgr.changeState(StateID_In);
|
|
}
|
|
}
|
|
void dLytMapSaveCaption_c::finalizeState_In() {}
|
|
|
|
void dLytMapSaveCaption_c::initializeState_Wait() {}
|
|
void dLytMapSaveCaption_c::executeState_Wait() {}
|
|
void dLytMapSaveCaption_c::finalizeState_Wait() {}
|
|
|
|
void dLytMapSaveCaption_c::initializeState_Out() {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].bind(false);
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].setFrame(0.0f);
|
|
}
|
|
void dLytMapSaveCaption_c::executeState_Out() {
|
|
if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].isEndReached()) {
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].unbind();
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind();
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
}
|
|
}
|
|
void dLytMapSaveCaption_c::finalizeState_Out() {}
|
|
|
|
static const d2d::LytBrlanMapping sMapSaveCaptionBrlanMap[] = {
|
|
{ "mapSaveCaption_00_type.brlan", "G_type_00"},
|
|
{"mapSaveCaption_00_textLine.brlan", "G_textLine_00"},
|
|
{ "mapSaveCaption_00_in.brlan", "G__inOut_00"},
|
|
{ "mapSaveCaption_00_loop.brlan", "G_loop_00"},
|
|
{ "mapSaveCaption_00_out.brlan", "G__inOut_00"},
|
|
};
|
|
|
|
void dLytMapSaveCaption_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("mapSaveCaption_00.brlyt", nullptr);
|
|
for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].init(
|
|
sMapSaveCaptionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveCaptionBrlanMap[i].mName
|
|
);
|
|
}
|
|
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
}
|
|
|
|
void dLytMapSaveCaption_c::remove() {
|
|
for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].remove();
|
|
}
|
|
}
|
|
|
|
void dLytMapSaveCaption_c::execute() {
|
|
mStateMgr.executeState();
|
|
for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) {
|
|
if (mAnmGroups[i].isBound()) {
|
|
mAnmGroups[i].play();
|
|
}
|
|
}
|
|
mLyt.calc();
|
|
}
|
|
|
|
void dLytMapSaveCaption_c::draw() {
|
|
if (*mStateMgr.getStateID() != StateID_Invisible) {
|
|
mLyt.draw();
|
|
}
|
|
}
|
|
|
|
void dLytMapSaveCaption_c::setType(s32 type) {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].bind(false);
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].setFrame(type);
|
|
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].unbind();
|
|
}
|
|
|
|
void dLytMapSaveCaption_c::setLabel(const char *label) {
|
|
mLyt.getTextBox("T_captionS_00")->setMessageWithGlobalTextProcessor2(label, nullptr);
|
|
mLyt.getTextBox("T_caption_00")->setMessageWithGlobalTextProcessor2(label, nullptr);
|
|
// ok
|
|
const char *tmp = "T_captionS_00";
|
|
dTextBox_c *box = mLyt.getTextBox(tmp);
|
|
// Setting message twice...
|
|
box->setMessageWithGlobalTextProcessor2(label, nullptr);
|
|
|
|
f32 width = box->GetLineWidth(nullptr);
|
|
const wchar_t *text = dMessage_c::getTextMessageByLabel(label, true, nullptr, 0);
|
|
s32 lines = box->calcTextLines(text, dMessage_c::getGlobalTagProcessor());
|
|
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].bind(false);
|
|
if (width < 226.0f) {
|
|
if (lines == 1) {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(0.0f);
|
|
} else {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(1.0f);
|
|
}
|
|
} else {
|
|
if (lines == 1) {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(2.0f);
|
|
} else {
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(3.0f);
|
|
}
|
|
}
|
|
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].unbind();
|
|
}
|
|
|
|
#define MAP_SAVE_OBJ_ANIM_ON_OFF 0
|
|
#define MAP_SAVE_OBJ_ANIM_DECIDE 1
|
|
#define MAP_SAVE_OBJ_ANIM_LOOP 2
|
|
|
|
#define MAP_SAVE_OBJ_NUM_ANIMS 3
|
|
|
|
void dLytMapSaveObj_c::initializeState_Wait() {}
|
|
void dLytMapSaveObj_c::executeState_Wait() {
|
|
if (mSelectRequest) {
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false);
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setForward();
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f);
|
|
mStateMgr.changeState(StateID_ToSelect);
|
|
}
|
|
}
|
|
void dLytMapSaveObj_c::finalizeState_Wait() {}
|
|
|
|
void dLytMapSaveObj_c::initializeState_ToSelect() {}
|
|
void dLytMapSaveObj_c::executeState_ToSelect() {
|
|
if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isEndReached()) {
|
|
dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_START_POINT);
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind();
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
|
|
if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) {
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play();
|
|
}
|
|
}
|
|
void dLytMapSaveObj_c::finalizeState_ToSelect() {}
|
|
|
|
void dLytMapSaveObj_c::initializeState_Select() {}
|
|
void dLytMapSaveObj_c::executeState_Select() {
|
|
if (!mSelectRequest) {
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false);
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setBackward();
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setToStart();
|
|
mDecideRequest = false;
|
|
mStateMgr.changeState(StateID_ToWait);
|
|
} else if (mDecideRequest) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_DECIDE_START_POINT);
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].bind(false);
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f);
|
|
mStateMgr.changeState(StateID_Decide);
|
|
}
|
|
}
|
|
void dLytMapSaveObj_c::finalizeState_Select() {}
|
|
|
|
void dLytMapSaveObj_c::initializeState_ToWait() {}
|
|
void dLytMapSaveObj_c::executeState_ToWait() {
|
|
if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isStop2()) {
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind();
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
|
|
if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) {
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play();
|
|
}
|
|
}
|
|
void dLytMapSaveObj_c::finalizeState_ToWait() {}
|
|
|
|
void dLytMapSaveObj_c::initializeState_Decide() {}
|
|
void dLytMapSaveObj_c::executeState_Decide() {
|
|
if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isEndReached()) {
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].unbind();
|
|
mDecideFinished = true;
|
|
}
|
|
|
|
if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isBound()) {
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].play();
|
|
}
|
|
}
|
|
void dLytMapSaveObj_c::finalizeState_Decide() {}
|
|
|
|
void dLytMapSaveObj_c::setPosition(const mVec3_c &position) {
|
|
mLyt.getLayout()->GetRootPane()->SetTranslate(position);
|
|
}
|
|
|
|
void dLytMapSaveObj_c::setAlpha(u8 alpha) {
|
|
mLyt.getLayout()->GetRootPane()->SetAlpha(alpha);
|
|
}
|
|
|
|
void dLytMapSaveObj_c::init() {
|
|
mSelectRequest = false;
|
|
mDecideRequest = false;
|
|
mDecideFinished = false;
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false);
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f);
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind();
|
|
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f);
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].bind(false);
|
|
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
static const d2d::LytBrlanMapping sMapSaveObjBrlanMap[] = {
|
|
{ "mapSaveObj_00_saveObjOnOff.brlan", "G_saveBtn_00"},
|
|
{"mapSaveObj_00_saveObjDecide.brlan", "G_saveBtn_00"},
|
|
{ "mapSaveObj_00_saveObjLoop.brlan", "G_saveBtnLoop_00"},
|
|
};
|
|
|
|
void dLytMapSaveObj_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("mapSaveObj_00.brlyt", nullptr);
|
|
for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].init(sMapSaveObjBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveObjBrlanMap[i].mName);
|
|
}
|
|
|
|
mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true);
|
|
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false);
|
|
mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f);
|
|
mLyt.calc();
|
|
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
void dLytMapSaveObj_c::remove() {
|
|
for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].remove();
|
|
}
|
|
}
|
|
|
|
void dLytMapSaveObj_c::execute() {
|
|
mStateMgr.executeState();
|
|
if (mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].isBound()) {
|
|
mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].play();
|
|
}
|
|
}
|
|
|
|
void dLytMapSaveObj_c::draw() {
|
|
nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane();
|
|
// @bug calc should be in execute...
|
|
mLyt.calc();
|
|
root->Draw(mLyt.getDrawInfo());
|
|
}
|
|
|
|
#pragma dont_inline on
|
|
dLytMapMain_c::dLytMapMain_c()
|
|
: mStateMgr(*this),
|
|
mFlowMgr(&mFlow),
|
|
mFloorBtnMgr(&mGlobal),
|
|
mFootPrints(&mGlobal),
|
|
mAreaGroup(0),
|
|
mMapUpDirectionAfterZoomToDetail(true),
|
|
field_0x8C93(0),
|
|
mMapEvent(MAP_EVENT_NONE),
|
|
mNextMapEvent(MAP_EVENT_NONE),
|
|
field_0x8CAC(0),
|
|
field_0x8D38(0.0f, 0.0f),
|
|
field_0x8D40(1.0f),
|
|
field_0x8D44(0),
|
|
field_0x8D46(0),
|
|
field_0x8D48(0),
|
|
field_0x8D4C(0.0f),
|
|
field_0x8D50(0.0f),
|
|
field_0x8D58(0),
|
|
field_0x8D5C(1),
|
|
field_0x8D60(0),
|
|
field_0x8D64(0),
|
|
field_0x8D68(0),
|
|
field_0x8D6A(0),
|
|
field_0x8D6B(0),
|
|
mpRegionPane1(nullptr),
|
|
mpRegionPane2(nullptr),
|
|
field_0x8DB0(0),
|
|
mNavEnabled(false),
|
|
mDrawScaleFrame(false),
|
|
mDisplayedBeaconCount(0),
|
|
mShowIslandNames(false),
|
|
field_0x8DBD(0),
|
|
field_0x8DBE(0),
|
|
field_0x8DBF(0),
|
|
field_0x8DC0(-1),
|
|
field_0x8DC4(0) {
|
|
field_0x8D78 = 0.0f;
|
|
field_0x8D7C = 0.0f;
|
|
field_0x8D80 = 0.0f;
|
|
field_0x8D84 = 0.0f;
|
|
field_0x8D88 = 0.0f;
|
|
}
|
|
#pragma dont_inline reset
|
|
|
|
dLytMapMain_c::~dLytMapMain_c() {
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) {
|
|
if (dCsMgr_c::GetInstance()->isRegist(&mHitChecks[i])) {
|
|
dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
dLytMapGlobal_c *dLytMapMain_c::getGlobal() {
|
|
return &mGlobal;
|
|
}
|
|
|
|
dMapSavedData dLytMapMain_c::sSavedMapData = {
|
|
{
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
},
|
|
false
|
|
};
|
|
|
|
const dMapSavedData dLytMapMain_c::sDefaultMapData = {
|
|
{
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
{dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0},
|
|
},
|
|
false
|
|
};
|
|
|
|
static const char *const sTextboxLabelMapping[][2] = {
|
|
{ "T_sNameS_00", "MAP_00"},
|
|
{ "T_sName_00", "MAP_00"},
|
|
{ "T_pNameS_00", "MAP_01"},
|
|
{ "T_pName_00", "MAP_01"},
|
|
{ "T_pNameS_01", "MAP_01"},
|
|
{ "T_fNameS_00", "MAP_02"},
|
|
{ "T_fName_00", "MAP_02"},
|
|
{ "T_fNameS_01", "MAP_02"},
|
|
{ "T_nFnameS_00", "MAP_03"},
|
|
{ "T_nFname_00", "MAP_03"},
|
|
{ "T_nFnameS_01", "MAP_03"},
|
|
{ "T_lNameS_00", "MAP_04"},
|
|
{ "T_lName_00", "MAP_04"},
|
|
{ "T_lNameS_01", "MAP_04"},
|
|
{ "T_sVnameS_00", "MAP_05"},
|
|
{ "T_sVname_00", "MAP_05"},
|
|
{ "T_sVnameS_01", "MAP_05"},
|
|
{ "T_nVnameS_00", "MAP_06"},
|
|
{ "T_nVname_00", "MAP_06"},
|
|
{ "T_nVnameS_01", "MAP_06"},
|
|
{ "T_dNameS_01", "MAP_08"},
|
|
{ "T_dName_01", "MAP_08"},
|
|
{ "T_dNameS_00", "MAP_08"},
|
|
{ "T_dNameS_02", "MAP_07"},
|
|
{ "T_dName_02", "MAP_07"},
|
|
{ "T_dNameS_03", "MAP_07"},
|
|
{ "T_gNameS_01", "MAP_10"},
|
|
{ "T_gName_01", "MAP_10"},
|
|
{ "T_gNameS_04", "MAP_10"},
|
|
{ "T_gNameS_00", "MAP_09"},
|
|
{ "T_gName_00", "MAP_09"},
|
|
{ "T_gNameS_03", "MAP_09"},
|
|
{ "T_gNameS_02", "MAP_40"},
|
|
{ "T_gName_02", "MAP_40"},
|
|
{ "T_gNameS_05", "MAP_40"},
|
|
{ "T_lastDs_00", "MAP_17"},
|
|
{ "T_lastD_00", "MAP_17"},
|
|
{ "T_pampkinNS_00", "MAP_27"},
|
|
{ "T_pampkinN_00", "MAP_27"},
|
|
{ "T_teryNS_00", "MAP_28"},
|
|
{ "T_teryN_00", "MAP_28"},
|
|
{ "T_tikurinNS_00", "MAP_29"},
|
|
{ "T_tikurinN_00", "MAP_29"},
|
|
{ "T_musiNS_00", "MAP_31"},
|
|
{ "T_musiN_00", "MAP_31"},
|
|
{ "T_utaNS_00", "MAP_30"},
|
|
{ "T_utaN_00", "MAP_30"},
|
|
{ "T_ruretouNS_00", "MAP_26"},
|
|
{ "T_ruretouN_00", "MAP_26"},
|
|
{ "T_toForestS_00", "MAP_58"},
|
|
{ "T_toForest_00", "MAP_58"},
|
|
{"T_toVolcanoS_00", "MAP_59"},
|
|
{ "T_toVolcano_00", "MAP_59"},
|
|
{ "T_toDesertS_00", "MAP_60"},
|
|
{ "T_toDesert_00", "MAP_60"},
|
|
{ "T_fD1s_00", "MAP_11"},
|
|
{ "T_fD1_00", "MAP_11"},
|
|
{ "T_fD2s_00", "MAP_14"},
|
|
{ "T_fD2_00", "MAP_14"},
|
|
{ "T_vD2s_00", "MAP_16"},
|
|
{ "T_vD2_00", "MAP_16"},
|
|
{ "T_vD1s_00", "MAP_12"},
|
|
{ "T_vD1_00", "MAP_12"},
|
|
{ "T_dD1s_00", "MAP_13"},
|
|
{ "T_dD1_00", "MAP_13"},
|
|
{ "T_dD2s_00", "MAP_15"},
|
|
{ "T_dD2_00", "MAP_15"},
|
|
{ "T_lastDs_00", "MAP_17"},
|
|
{ "T_lastD_00", "MAP_17"},
|
|
};
|
|
|
|
static const char *sHyliasRealmMapLabel = "MAP_64";
|
|
|
|
void dLytMapMain_c::loadTextboxes() {
|
|
bool hyliasRealm = dScGame_c::isCurrentStage("F403") || dScGame_c::isCurrentStage("F404");
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sTextboxLabelMapping); i++) {
|
|
dTextBox_c *box = mLyt.getTextBox(sTextboxLabelMapping[i][0]);
|
|
if (hyliasRealm && (i == 2 || i == 3 || i == 4)) {
|
|
// Replace "Sealed Grounds" with "Hylia's Realm"
|
|
box->setMessageWithGlobalTextProcessor2(sHyliasRealmMapLabel, nullptr);
|
|
} else {
|
|
box->setMessageWithGlobalTextProcessor2(sTextboxLabelMapping[i][1], nullptr);
|
|
}
|
|
}
|
|
}
|
|
static const d2d::LytBrlanMapping sMapMainBrlanMap[] = {
|
|
{ "map_00_in.brlan", "G_inOut_00"},
|
|
{ "map_00_titleOnOff.brlan", "G_titleOnOff_00"},
|
|
{ "map_00_nOnOff.brlan", "G_nOnOff_00"},
|
|
{ "map_00_mapV.brlan", "G_mapV_00"},
|
|
{ "map_00_worldState.brlan", "G_worldState"},
|
|
{ "map_00_player2patten.brlan", "G_2Pattern_00"},
|
|
{ "map_00_rotate.brlan", "G_rotate_00"},
|
|
{ "map_00_out.brlan", "G_inOut_00"},
|
|
{ "map_00_mapDraw.brlan", "G_plainC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_forestC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_nForestC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_sVolcanoC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_mineC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_desertC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_lakeC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_glenC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_seaC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_nVolcanoC_00"},
|
|
{ "map_00_mapDraw.brlan", "G_glenC_01"},
|
|
{ "map_00_skyLoftUpDown.brlan", "G_skyloftUD_00"},
|
|
{"map_00_LinkPositionLight.brlan", "G_linkPointL_00"},
|
|
{ "map_00_mapZinForest.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_zoomWakuIn.brlan", "G_zoomWaku_00"},
|
|
{ "map_00_zoomWakuOut.brlan", "G_zoomWaku_00"},
|
|
{ "map_00_mapZoutForest.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZinPlant.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaOutPlant.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaInPlant.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZoutPlant.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZinDesert.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZoutDesert.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZinVolcano.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZoutVolcano.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaOutForest.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaOutDesert.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaOutVolcano.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaInForest.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaInDesert.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaInVolcano.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaInSkyMap.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaOutSkyMap.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaInSkyMap2.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaOutSkyMap2.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaInSkyCorse.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_mapZaOutSkyCorse.brlan", "G_ZoomInOut_00"},
|
|
{ "map_00_sunRote.brlan", "G_sun_00"},
|
|
{ "map_00_inNoCam.brlan", "G_inOut_00"},
|
|
{ "map_00_outNoCam.brlan", "G_inOut_00"},
|
|
{ "map_00_cloudLoop.brlan", "G_cloudLoop_00"},
|
|
{ "map_00_lightLoop.brlan", "G_lightLoop_00"},
|
|
{ "map_00_nushiLoop.brlan", "G_nushiLoop_00"},
|
|
{ "map_00_type.brlan", "G_type_00"},
|
|
{ "map_00_kumoPattern.brlan", "G_kumoPattern_00"},
|
|
{ "map_00_titleLine.brlan", "G_textLine_00"},
|
|
};
|
|
|
|
#define MAP_MAIN_ANIM_IN 0
|
|
#define MAP_MAIN_ANIM_TITLE_ON_OFF 1
|
|
#define MAP_MAIN_ANIM_N_ON_OFF 2
|
|
#define MAP_MAIN_ANIM_MAP_V 3
|
|
#define MAP_MAIN_ANIM_WORLD_STATE 4
|
|
#define MAP_MAIN_ANIM_PLAYER_2_PATTERN 5
|
|
#define MAP_MAIN_ANIM_ROTATE 6
|
|
#define MAP_MAIN_ANIM_OUT 7
|
|
#define MAP_MAIN_ANIM_DRAW_PLAIN 8
|
|
#define MAP_MAIN_ANIM_DRAW_FOREST 9
|
|
#define MAP_MAIN_ANIM_DRAW_N_FOREST 10
|
|
#define MAP_MAIN_ANIM_DRAW_S_VOLCANO 11
|
|
#define MAP_MAIN_ANIM_DRAW_MINE 12
|
|
#define MAP_MAIN_ANIM_DRAW_DESERT 13
|
|
#define MAP_MAIN_ANIM_DRAW_LAKE 14
|
|
#define MAP_MAIN_ANIM_DRAW_GLEN_00 15
|
|
#define MAP_MAIN_ANIM_DRAW_SEA 16
|
|
#define MAP_MAIN_ANIM_DRAW_N_VOLCANO 17
|
|
#define MAP_MAIN_ANIM_DRAW_GLEN_01 18
|
|
#define MAP_MAIN_ANIM_SKYLOFT_UP_DOWN 19
|
|
#define MAP_MAIN_ANIM_LINK_POSITION_LIGHT 20
|
|
|
|
#define MAP_MAIN_ANIM_MAP_Z_IN_FOREST 21
|
|
#define MAP_MAIN_ANIM_MAP_Z_WAKU_IN 22
|
|
|
|
#define MAP_MAIN_ANIM_MAP_Z_IN_PLANT 25
|
|
|
|
#define MAP_MAIN_ANIM_MAP_ZA_IN_PLANT 27
|
|
|
|
#define MAP_MAIN_ANIM_MAP_Z_IN_DESERT 29
|
|
|
|
#define MAP_MAIN_ANIM_MAP_Z_IN_VOLCANO 31
|
|
|
|
#define MAP_MAIN_ANIM_MAP_ZA_IN_FOREST 36
|
|
#define MAP_MAIN_ANIM_MAP_ZA_IN_DESERT 37
|
|
#define MAP_MAIN_ANIM_MAP_ZA_IN_VOLCANO 38
|
|
|
|
#define MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2 41
|
|
#define MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE 44
|
|
|
|
#define MAP_MAIN_ANIM_SUN_ROTE 45
|
|
#define MAP_MAIN_ANIM_IN_NO_CAM 46
|
|
#define MAP_MAIN_ANIM_OUT_NO_CAM 47
|
|
#define MAP_MAIN_ANIM_CLOUD_LOOP 48
|
|
#define MAP_MAIN_ANIM_LIGHT_LOOP 49
|
|
#define MAP_MAIN_ANIM_NUSHI_LOOP 50
|
|
#define MAP_MAIN_ANIM_TYPE 51
|
|
#define MAP_MAIN_ANIM_KUMO_PATTERN 52
|
|
#define MAP_MAIN_ANIM_TITE_LINE 53
|
|
|
|
#define MAP_MAIN_NUM_ANIMS 54
|
|
|
|
static const char *sGroupName = "G_ref_00";
|
|
|
|
static const char *sBoundingNames[] = {
|
|
"B_noroshi_00", "B_houkoul_00", "B_remoCon_00", "B_nunchaku_00", "B_tittle_00", "B_saveIcon_00",
|
|
"B_saveIcon_01", "B_saveIcon_02", "B_saveIcon_03", "B_saveIcon_04", "B_saveIcon_05", "B_saveIcon_06",
|
|
"B_saveIcon_07", "B_saveIcon_08", "B_saveIcon_28", "B_saveIcon_10", "B_saveIcon_11", "B_saveIcon_12",
|
|
"B_saveIcon_13", "B_saveIcon_14", "B_saveIcon_15", "B_saveIcon_16", "B_saveIcon_17", "B_saveIcon_18",
|
|
"B_saveIcon_19", "B_saveIcon_20", "B_saveIcon_21", "B_saveIcon_22", "B_saveIcon_23", "B_saveIcon_24",
|
|
"B_saveIcon_25", "B_saveIcon_26", "B_saveIcon_27",
|
|
};
|
|
|
|
#define MAP_MAIN_NUM_BOUNDINGS_NORMAL 5
|
|
#define MAP_MAIN_OFFSET_BOUNDINGS_SAVEICON 5
|
|
#define MAP_MAIN_NUM_BOUNDINGS_SAVEICON 28
|
|
|
|
#define MAP_MAIN_NUM_BOUNDINGS 33
|
|
|
|
static const char *sPaneNames[] = {
|
|
"N_pName_00", "N_fName_00", "N_nFname_00", "N_sVname_00", "N_dName_02", "N_dName_00",
|
|
"N_lName_00", "N_gName_02", "N_gName_01", "N_nVname_00", "N_gName_00",
|
|
};
|
|
|
|
static const char *sDungeonPaneNames[] = {
|
|
"N_fD1_00", "N_vD1_00", "N_dD1_00", "N_fD2_00", "N_dD2_00", "N_vD2_00", "N_lastD_00",
|
|
};
|
|
|
|
static const char *sDungeonPicNames[] = {
|
|
"P_fD1_00", "P_vD1_00", "P_dD1_00", "P_fD2_00", "P_dD2_00", "P_vD2_00", "P_lastD_00",
|
|
};
|
|
|
|
static const char *sPriorityGroupNames[] = {
|
|
"G_priority_00",
|
|
"G_priority_02",
|
|
};
|
|
|
|
void dLytMapMain_c::build() {
|
|
field_0x8DBF = 0;
|
|
field_0x8DB0 = 0;
|
|
if (dScGame_c::isCurrentStage("F102")) {
|
|
// awesome but unnecessary
|
|
field_0x8DB0 = 0;
|
|
}
|
|
|
|
dStage_c::GetInstance()->fn_801B3F20();
|
|
d2d::ResAccIf_c *resAcc = dLytMap_c::getResAcc();
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("map_00.brlyt", nullptr);
|
|
getGlobal()->setField_0x28(mLyt.getDrawInfo().GetLocationAdjustScale());
|
|
|
|
for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].init(sMapMainBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapMainBrlanMap[i].mName);
|
|
}
|
|
|
|
mFloorBtnMgr.build(resAcc);
|
|
mSubpane.mpLytPane = &mFloorBtnMgr;
|
|
mSubpaneList.PushBack(&mSubpane);
|
|
|
|
d2d::dSubPane::linkMeters(mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName), &mSubpaneList);
|
|
mFootPrints.build(resAcc);
|
|
mMarkers.build(resAcc);
|
|
|
|
mPinIconAggregate.build(resAcc);
|
|
mPutIcon.build(resAcc);
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) {
|
|
mSaveObjs[i].build(resAcc);
|
|
}
|
|
|
|
mSaveCaption.build(resAcc);
|
|
mSavePopup.build(resAcc);
|
|
mPopupInfo.build(resAcc);
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_IN].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_IN].setToEnd();
|
|
mLyt.calc();
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) {
|
|
nw4r::lyt::Bounding *b = mLyt.findBounding(sBoundingNames[i]);
|
|
b->SetVisible(false);
|
|
// TODO - bird statues
|
|
if (i >= 5 && i < 15) {
|
|
mpSaveObjBoundingsFaron[i - 5] = b;
|
|
} else if (i >= 15 && i < 21) {
|
|
mpSaveObjBoundingsEldin[i - 15] = b;
|
|
} else if (i >= 21 && i < 33) {
|
|
mpSaveObjBoundingsLanayru[i - 21] = b;
|
|
}
|
|
|
|
mHitChecks[i].init(b, 0x02, 2, 0);
|
|
dCsMgr_c::GetInstance()->registCursorTarget(&mHitChecks[i]);
|
|
}
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) {
|
|
mHitChecks[i].resetCachedHitboxes();
|
|
mHitChecks[i].execute();
|
|
}
|
|
|
|
mpMapBounding = mLyt.findBounding("B_map_00");
|
|
nw4r::lyt::Size t(1.0f, 1.0f);
|
|
mpMapBounding->SetSize(t);
|
|
mVec3_c boundingPos = mpMapBounding->GetTranslate();
|
|
mVec2_c boundingPos2 = mVec2_c(boundingPos.x, boundingPos.y);
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
global->setField_0x20(boundingPos2);
|
|
|
|
mMapCapture.setPicture(mLyt.findPicture("P_map_00"));
|
|
nw4r::lyt::Pane *limitBounding = mLyt.findPane("B_limit_00");
|
|
const nw4r::lyt::Size &sz = limitBounding->GetSize();
|
|
field_0x8D30.x = sz.width - 1.0f;
|
|
field_0x8D30.y = sz.height - 1.0f;
|
|
field_0x8D38.x = sz.width;
|
|
field_0x8D38.y = sz.height;
|
|
field_0x8D38.x *= mLyt.getDrawInfo().GetLocationAdjustScale().x;
|
|
mpAllPane = mLyt.findPane("N_all_00");
|
|
mpNoroshiPane = mLyt.findPane("N_noroshi_00");
|
|
mpScaleFramePane = mLyt.findPane("N_scaleFlame_00");
|
|
mpWakuWindow = mLyt.getWindow("W_waku_01");
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sPaneNames); i++) {
|
|
if (sPaneNames[i] != nullptr) {
|
|
mpPanes[i] = mLyt.findPane(sPaneNames[i]);
|
|
} else {
|
|
mpPanes[i] = nullptr;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sDungeonPaneNames); i++) {
|
|
if (sDungeonPaneNames[i] != nullptr) {
|
|
mpDungeonPanes[i] = mLyt.findPane(sDungeonPaneNames[i]);
|
|
} else {
|
|
mpDungeonPanes[i] = nullptr;
|
|
}
|
|
|
|
if (sDungeonPicNames[i] != nullptr) {
|
|
mpDungeonPics[i] = mLyt.findPane(sDungeonPicNames[i]);
|
|
} else {
|
|
mpDungeonPics[i] = nullptr;
|
|
}
|
|
}
|
|
|
|
mpNumberTextBox = mLyt.getTextBox("T_number_00");
|
|
mpNumberTextBoxS = mLyt.getTextBox("T_numberS_00");
|
|
mpZoomInOutPane = mLyt.findPane("N_zoomInOut_00");
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sPriorityGroupNames); i++) {
|
|
mpPriorityGroups[i] = mLyt.findGroupByName(sPriorityGroupNames[i]);
|
|
}
|
|
|
|
mMarkers.setField_0x6F4(boundingPos2);
|
|
|
|
mPinIconAggregate.setUnk(&field_0xF1C);
|
|
|
|
mpPaneBgAll01 = mLyt.findPane("N_mapBgAll_01");
|
|
mpPaneBgAll02 = mLyt.findPane("N_mapBgAll_02");
|
|
mpPaneAll01 = mLyt.findPane("N_mapAll_01");
|
|
mpPaneAll02 = mLyt.findPane("N_mapAll_02");
|
|
field_0x8928.x = mpPaneBgAll01->GetGlobalMtx()._03;
|
|
field_0x8928.y = mpPaneBgAll01->GetGlobalMtx()._13;
|
|
mpPaneRotate00 = mLyt.findPane("N_rotateP_00");
|
|
mpPaneRotate01 = mLyt.findPane("N_rotateP_01");
|
|
|
|
nw4r::lyt::Pane *bgAll = mLyt.findPane("N_mapBgAll_00");
|
|
|
|
mVec2_c v1(bgAll->GetGlobalMtx()._03, bgAll->GetGlobalMtx()._13);
|
|
mVec2_c tmp = v1 - global->getField_0x20();
|
|
global->setField_0x0C(tmp);
|
|
|
|
field_0x8C88 = mAnmGroups[MAP_MAIN_ANIM_IN].getFrameCtrl()->mEndFrame - 1.0f;
|
|
mAnmGroups[MAP_MAIN_ANIM_IN].unbind();
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false);
|
|
field_0x8C8C = mAnmGroups[MAP_MAIN_ANIM_OUT].getLastFrame();
|
|
mAnmGroups[MAP_MAIN_ANIM_OUT].unbind();
|
|
field_0x8CAC = 0;
|
|
mDisplayedBeaconCount = getMaxBeaconCount();
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
getGlobal()->setFloor(0);
|
|
mNavEnabled = false;
|
|
field_0x8D58 = 0;
|
|
field_0x8D5C = 1;
|
|
field_0x8D60 = 0;
|
|
field_0x8D64 = 0;
|
|
fn_80143300();
|
|
}
|
|
|
|
void dLytMapMain_c::loadStageProperties() {
|
|
mAreaGroup = getAreaGroup(dStageMgr_c::GetInstance()->getSTIFArea());
|
|
mRoomType = getRoomType();
|
|
|
|
// Yes, it does need to be written this way, otherwise the catch-all else
|
|
// branch is collapsed with the other ones.
|
|
|
|
if (mRoomType == ROOMTYPE_FIELD) {
|
|
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM;
|
|
return;
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_DUNGEON) {
|
|
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
return;
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_SKYLOFT) {
|
|
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
return;
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_BOSS_HOUSE) {
|
|
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
return;
|
|
}
|
|
|
|
mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
}
|
|
|
|
void dLytMapMain_c::setupStage() {
|
|
loadStageProperties();
|
|
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
mLyt.findPane("N_skyloft_00")->SetVisible(false);
|
|
}
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].bind(false);
|
|
if (dAcPy_c::getCurrentTunicType() == 1) {
|
|
mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(1.0f);
|
|
} else {
|
|
mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(0.0f);
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_SKYLOFT ||
|
|
(mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR ||
|
|
mRoomType == ROOMTYPE_DUNGEON))) {
|
|
mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].bind(false);
|
|
}
|
|
|
|
s32 type = 0;
|
|
mAnmGroups[MAP_MAIN_ANIM_TYPE].bind(false);
|
|
if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
|
|
type = 8;
|
|
} else if (mAreaGroup == AREAGROUP_FARON || mAreaGroup == AREAGROUP_SEALED_GROUNDS) {
|
|
if (dStageMgr_c::GetInstance()->getSTIFArea() == dStageMgr_c::STIF_AREA_SEALED_GROUNDS) {
|
|
type = 7;
|
|
} else if (mRoomType == ROOMTYPE_FIELD) {
|
|
type = 1;
|
|
} else {
|
|
type = 2;
|
|
}
|
|
} else if (mAreaGroup == AREAGROUP_ELDIN) {
|
|
if (mRoomType == ROOMTYPE_FIELD) {
|
|
type = 3;
|
|
} else {
|
|
type = 4;
|
|
}
|
|
} else if (mAreaGroup == AREAGROUP_LANAYRU) {
|
|
if (mRoomType == ROOMTYPE_FIELD) {
|
|
type = 5;
|
|
} else {
|
|
type = 6;
|
|
}
|
|
} else if (mAreaGroup == AREAGROUP_SKY) {
|
|
if (dStageMgr_c::GetInstance()->getSTIFRoomType() == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) {
|
|
type = 11;
|
|
} else {
|
|
// TODO - probably an enum but this matches too
|
|
type = 9;
|
|
if (dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT) {
|
|
type = 10;
|
|
}
|
|
}
|
|
}
|
|
mAnmGroups[MAP_MAIN_ANIM_TYPE].setFrame(type);
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_MAIN_ANIM_TYPE].unbind();
|
|
|
|
field_0x8C7C = 0.0f;
|
|
field_0x8C80 = 0.0f;
|
|
mAnmGroups[MAP_MAIN_ANIM_IN].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_IN].setFrame(0.0f);
|
|
mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false);
|
|
fn_801431E0();
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_MAIN_ANIM_MAP_V].unbind();
|
|
mAnmGroups[MAP_MAIN_ANIM_IN].unbind();
|
|
if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) {
|
|
mLyt.findPane("N_houkoul_00")->SetVisible(false);
|
|
}
|
|
if (mMapEvent != MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
loadTextboxes();
|
|
}
|
|
fn_8013AD50();
|
|
}
|
|
|
|
void dLytMapMain_c::remove() {
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) {
|
|
dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]);
|
|
}
|
|
|
|
for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) {
|
|
d2d::dSubPane *subPane = it->mpLytPane;
|
|
if (subPane != nullptr) {
|
|
nw4r::lyt::Pane *parent = subPane->getPane()->GetParent();
|
|
parent->RemoveChild(subPane->getPane());
|
|
}
|
|
}
|
|
mPopupInfo.remove();
|
|
mSavePopup.remove();
|
|
mSaveCaption.remove();
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) {
|
|
mSaveObjs[i].remove();
|
|
}
|
|
mFloorBtnMgr.remove();
|
|
mFootPrints.remove();
|
|
mMarkers.remove();
|
|
mPinIconAggregate.remove();
|
|
mPutIcon.remove();
|
|
for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) {
|
|
mAnmGroups[i].remove();
|
|
}
|
|
dStage_c::GetInstance()->fn_801B3F30();
|
|
}
|
|
|
|
void dLytMapMain_c::execute() {
|
|
if ((*mStateMgr.getStateID() == StateID_Invisible)) {
|
|
return;
|
|
}
|
|
|
|
if ((*mStateMgr.getStateID() == StateID_RenderingWait)) {
|
|
mStateMgr.executeState();
|
|
mMapCapture.execute();
|
|
return;
|
|
}
|
|
|
|
field_0xF1C.field_0x05 = 0;
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
mDrawScaleFrame = false;
|
|
mPointerOnMap = false;
|
|
mPointerCanPlaceBeacon = false;
|
|
checkCursorPointedAtMap();
|
|
|
|
if (dPad::getDownTrigDown() && canCenterCursor(mCurrentMapMode) && canCenterCursor(mNextMapMode)) {
|
|
dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true);
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_DUNGEON && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mFloorBtnMgr.setForceNoNav(true);
|
|
} else {
|
|
mFloorBtnMgr.setForceNoNav(false);
|
|
}
|
|
|
|
mFloorBtnMgr.checkPointedAtBtn();
|
|
mStateMgr.executeState();
|
|
if (*mStateMgr.getStateID() != StateID_ResetPosWithFloorChange) {
|
|
mFloorBtnMgr.execute();
|
|
}
|
|
|
|
s32 beaconId = -1;
|
|
field_0x8DBD = false;
|
|
if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) &&
|
|
canPlaceBeacons(mNextMapMode)) {
|
|
bool exhaustedPins = mPinIconAggregate.getNumSetPins() >= getMaxBeaconCount();
|
|
if (!exhaustedPins && mPointerCanPlaceBeacon &&
|
|
*mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select &&
|
|
isPointingAtMainMap()) {
|
|
mPinIconAggregate.findNewBeaconId(&beaconId);
|
|
if (beaconId >= 0) {
|
|
field_0x8DBD = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (field_0x8DBD) {
|
|
mPutIcon.setPosition(dCsGame_c::GetInstance()->getCursorIf()->getCursorPos());
|
|
mPutIcon.setScale(1.0f);
|
|
mPutIcon.setVisible(true);
|
|
} else {
|
|
mPutIcon.setVisible(false);
|
|
}
|
|
|
|
static SizedWString<0x20> buf;
|
|
buf.sprintf(L"%ld", (mDisplayedBeaconCount - mPinIconAggregate.getNumSetPins()) % 10);
|
|
mpNumberTextBox->setTextWithGlobalTextProcessor(buf, nullptr);
|
|
mpNumberTextBoxS->setTextWithGlobalTextProcessor(buf, nullptr);
|
|
|
|
if (canChangeFloor(mCurrentMapMode) && canChangeFloor(mNextMapMode)) {
|
|
const sStateIDIf_c *state = mStateMgr.getStateID();
|
|
if (*state != StateID_FloorChange && *state != StateID_RenderingWait &&
|
|
*state != StateID_ResetPosWithFloorChange) {
|
|
mMapCapture.renderRequest();
|
|
}
|
|
}
|
|
|
|
mMapCapture.execute();
|
|
fn_80143360();
|
|
global->setCurrentMapMode(mCurrentMapMode);
|
|
global->setNextMapMode(mNextMapMode);
|
|
mFootPrints.setVisible(shouldDrawFootprints());
|
|
|
|
f32 f1 = 1.0f;
|
|
if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR) {
|
|
// why does everyone clamp things differently ???
|
|
f32 tmp = global->getField_0x58();
|
|
if (tmp < 0.0f) {
|
|
tmp = 0.0f;
|
|
} else if (tmp > 1.0f) {
|
|
tmp = 1.0f;
|
|
}
|
|
f1 = tmp;
|
|
}
|
|
f32 f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM);
|
|
if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) {
|
|
f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE);
|
|
}
|
|
mFootPrints.setField_0x198(f2);
|
|
mFootPrints.setField_0x19C(f1);
|
|
mFootPrints.execute();
|
|
setCursorType();
|
|
|
|
if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) &&
|
|
(field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) {
|
|
global->setField_0x4D(1);
|
|
} else {
|
|
global->setField_0x4D(0);
|
|
}
|
|
|
|
if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 ||
|
|
mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE || mMapEvent == MAP_EVENT_SW_BANK_SMALL) {
|
|
clearButtonMessages();
|
|
} else {
|
|
setButtonMessages(mCurrentMapMode, mMapUpDirection, mNextMapMode, mNextMapUpDirection);
|
|
}
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY && mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].play();
|
|
}
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY ||
|
|
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].play();
|
|
}
|
|
mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].play();
|
|
}
|
|
|
|
switch (mCurrentMapMode) {
|
|
case dLytMapGlobal_c::MAPMODE_PROVINCE: {
|
|
if (mpRegionPane1 != nullptr) {
|
|
mpRegionPane1->SetVisible(true);
|
|
}
|
|
if (mpRegionPane2 != nullptr) {
|
|
mpRegionPane2->SetVisible(true);
|
|
}
|
|
|
|
if (mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].play();
|
|
}
|
|
break;
|
|
}
|
|
case dLytMapGlobal_c::MAPMODE_WORLD: {
|
|
if (mpRegionPane1 != nullptr) {
|
|
mpRegionPane1->SetVisible(false);
|
|
}
|
|
if (mpRegionPane2 != nullptr) {
|
|
mpRegionPane2->SetVisible(false);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
|
|
if (mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].play();
|
|
}
|
|
if (mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].play();
|
|
}
|
|
}
|
|
|
|
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
bool visible =
|
|
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
setSaveObjsVisible(visible);
|
|
mPopupInfo.executeState_Invisible();
|
|
}
|
|
mSaveCaption.execute();
|
|
mPutIcon.execute();
|
|
|
|
mLyt.calc();
|
|
|
|
u8 alpha = 0;
|
|
if (mpAllPane->IsVisible()) {
|
|
alpha = mpAllPane->GetAlpha();
|
|
}
|
|
global->setAlpha(alpha);
|
|
fn_80143300();
|
|
mPinIconAggregate.setScale(global->getZoomFrame());
|
|
mMarkers.execute();
|
|
|
|
if (mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 || mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) {
|
|
mStateMgr.changeState(StateID_EventFieldMapChange_Step1);
|
|
mMapEvent = mNextMapEvent;
|
|
mNextMapEvent = 0;
|
|
}
|
|
mMaxBeaconCount = 0;
|
|
}
|
|
|
|
void dLytMapMain_c::draw() {
|
|
if (!field_0x8DBF) {
|
|
return;
|
|
}
|
|
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
fn_80143120(1);
|
|
mLyt.draw();
|
|
if (shouldDrawFootprints() && field_0x8D58 == global->getFloor()) {
|
|
mFootPrints.draw();
|
|
}
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM ||
|
|
mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mMarkers.draw();
|
|
}
|
|
|
|
if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR &&
|
|
mMapEvent != MAP_EVENT_SW_BANK_SMALL) {
|
|
mPinIconAggregate.draw();
|
|
}
|
|
|
|
fn_80143120(0);
|
|
|
|
if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) &&
|
|
(mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) {
|
|
mpZoomInOutPane->SetVisible(false);
|
|
} else {
|
|
mpZoomInOutPane->SetVisible(true);
|
|
}
|
|
|
|
mpScaleFramePane->SetVisible(mDrawScaleFrame ? true : false);
|
|
mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo());
|
|
if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) &&
|
|
mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
fn_80138D80();
|
|
}
|
|
fn_80143120(-2);
|
|
mMarkers.drawPopups();
|
|
mPutIcon.draw();
|
|
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
mPopupInfo.draw();
|
|
}
|
|
|
|
if (*mStateMgr.getStateID() == StateID_EventSaveObjSelect) {
|
|
mSavePopup.draw();
|
|
}
|
|
mSaveCaption.draw();
|
|
}
|
|
|
|
s32 dLytMapMain_c::getSelectedSaveObjIdx() const {
|
|
bool has = false;
|
|
s32 start;
|
|
s32 end;
|
|
if (mAreaGroup == AREAGROUP_FARON) {
|
|
start = 5;
|
|
end = 14;
|
|
has = true;
|
|
} else if (mAreaGroup == AREAGROUP_ELDIN) {
|
|
start = 15;
|
|
end = 20;
|
|
has = true;
|
|
} else if (mAreaGroup == AREAGROUP_LANAYRU) {
|
|
start = 21;
|
|
end = 32;
|
|
has = true;
|
|
}
|
|
|
|
if (!has) {
|
|
// @bug this should probably return -1 but it doesn't matter
|
|
return 0;
|
|
}
|
|
|
|
s32 idx = -1;
|
|
dCursorHitCheck_c *d = dCsGame_c::GetInstance()->getCursorHit();
|
|
if (d != nullptr && d->getType() == 'lyt ') {
|
|
for (int i = start; i <= end; i++) {
|
|
if (d == &mHitChecks[i]) {
|
|
idx = i - start;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return idx;
|
|
}
|
|
|
|
bool dLytMapMain_c::isPaneVisible(nw4r::lyt::Pane *pane) const {
|
|
bool ret = true;
|
|
while (pane != nullptr) {
|
|
if (!pane->IsVisible() || pane->GetAlpha() == 0) {
|
|
ret = false;
|
|
break;
|
|
}
|
|
pane = pane->GetParent();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void dLytMapMain_c::setSaveObjsVisible(bool visible) {
|
|
nw4r::lyt::Pane *p;
|
|
nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings;
|
|
for (int i = 0; i < mNumSaveObjs; i++) {
|
|
p = ptrs[i];
|
|
if (visible) {
|
|
// This makes like no sense - the isPaneVisible check ensures
|
|
// that the pane is already visible when we enter the branch...
|
|
if (p != nullptr && p != nullptr && isPaneVisible(p)) {
|
|
p->SetVisible(true);
|
|
}
|
|
} else {
|
|
p->SetVisible(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::setSaveObjPanePtrs() {
|
|
nw4r::lyt::Bounding **p = nullptr;
|
|
u32 count = 0;
|
|
if (mSurfaceProvince == SURFACE_PROVINCE_FARON) {
|
|
p = mpSaveObjBoundingsFaron;
|
|
count = ARRAY_LENGTH(mpSaveObjBoundingsFaron);
|
|
} else if (mSurfaceProvince == SURFACE_PROVINCE_ELDIN) {
|
|
p = mpSaveObjBoundingsEldin;
|
|
count = ARRAY_LENGTH(mpSaveObjBoundingsEldin);
|
|
} else if (mSurfaceProvince == SURFACE_PROVINCE_LANAYRU) {
|
|
p = mpSaveObjBoundingsLanayru;
|
|
count = ARRAY_LENGTH(mpSaveObjBoundingsLanayru);
|
|
}
|
|
mNumSaveObjs = count;
|
|
mpCurrentSaveObjBoundings = p;
|
|
mSavePopup.set(mpCurrentSaveObjBoundings, mNumSaveObjs);
|
|
}
|
|
|
|
void dLytMapMain_c::initSaveObjs() {
|
|
nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings;
|
|
nw4r::lyt::Bounding *p;
|
|
for (u32 i = 0; i < mNumSaveObjs; i++) {
|
|
p = *ptrs;
|
|
if (p->IsVisible()) {
|
|
mVec3_c pos(p->GetGlobalMtx()._03, p->GetGlobalMtx()._13, 0.0f);
|
|
mSaveObjs[i].setPosition(pos);
|
|
mSaveObjs[i].setAlpha(p->GetGlobalAlpha());
|
|
mSaveObjs[i].draw();
|
|
}
|
|
ptrs++;
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::saveUnkMapData() {
|
|
dMapSavedDataEntry &data = sSavedMapData.entries[mRoomType];
|
|
data.field_0x06 = 1;
|
|
data.mapMode = mCurrentMapMode;
|
|
data.mapUpDirection = mMapUpDirection;
|
|
data.mapUpDirectionAfterZoomToDetail = mMapUpDirectionAfterZoomToDetail;
|
|
sSavedMapData.showIslandNames = mShowIslandNames;
|
|
}
|
|
|
|
void dLytMapMain_c::initUnkMapData() {
|
|
for (int i = 0; i < 6; i++) {
|
|
sSavedMapData.entries[i].field_0x06 = sDefaultMapData.entries[i].field_0x06;
|
|
sSavedMapData.entries[i].mapMode = sDefaultMapData.entries[i].mapMode;
|
|
sSavedMapData.entries[i].mapUpDirection = sDefaultMapData.entries[i].mapUpDirection;
|
|
sSavedMapData.entries[i].mapUpDirectionAfterZoomToDetail =
|
|
sDefaultMapData.entries[i].mapUpDirectionAfterZoomToDetail;
|
|
}
|
|
sSavedMapData.showIslandNames = sDefaultMapData.showIslandNames;
|
|
}
|
|
|
|
void dLytMapMain_c::loadUnkMapData() {
|
|
mCurrentMapMode = sSavedMapData.entries[mRoomType].mapMode;
|
|
mMapUpDirection = sSavedMapData.entries[mRoomType].mapUpDirection;
|
|
mMapUpDirectionAfterZoomToDetail = sSavedMapData.entries[mRoomType].mapUpDirectionAfterZoomToDetail;
|
|
mShowIslandNames = sSavedMapData.showIslandNames;
|
|
}
|
|
|
|
void dLytMapMain_c::clearButtonMessages() {
|
|
// @bug this clears flags 16k times
|
|
for (int i = 0; i <= METER_BTN_0x4000; i++) {
|
|
dLytMeter_c::GetInstance()->clearFlags(i);
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::setButtonMessages(
|
|
s32 currentMapMode, bool currentUpDirection, s32 nextMapMode, bool nextUpDirection
|
|
) {
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_NONE);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_NONE);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_BG, LytDoButtonRelated::ACT_IE_NONE);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE);
|
|
|
|
if (canCenterCursor(currentMapMode) || canCenterCursor(nextMapMode)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_DOWN);
|
|
LytDoButtonRelated::setCrossDown(LytDoButtonRelated::ACT_IE_ETC_CENTER, true);
|
|
}
|
|
|
|
// TODO - some of these parts directly access members instead of using function args...
|
|
|
|
// TODO - canCenterCursor1 looks like an inline that somehow failed to get inlined (it's emitted right after this
|
|
// function...)
|
|
if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) &&
|
|
canPlaceBeacons(mNextMapMode)) {
|
|
if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_C);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_ADD_BEACON);
|
|
} else if (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_C);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_REMOVE_BEACON);
|
|
} else if (!(*mStateMgr.getStateID() == StateID_In) && !(*mStateMgr.getStateID() == StateID_Out)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE);
|
|
}
|
|
}
|
|
|
|
if (canZoomOut(currentMapMode) && canZoomOut(nextMapMode)) {
|
|
if ((mRoomType == ROOMTYPE_FIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) ||
|
|
(mRoomType == ROOMTYPE_SKYLOFT && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) ||
|
|
(mRoomType == ROOMTYPE_SKYFIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) ||
|
|
(mRoomType == ROOMTYPE_BOSS_HOUSE && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) ||
|
|
(mRoomType == ROOMTYPE_SKYFIELD_INTERIOR && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) ||
|
|
(mRoomType == ROOMTYPE_DUNGEON && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_WORLD_MAP);
|
|
} else {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT);
|
|
|
|
if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (canZoomIn(currentMapMode) && canZoomIn(nextMapMode)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_RIGHT);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_R, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN);
|
|
|
|
if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && nextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN);
|
|
}
|
|
}
|
|
|
|
// Directly accessing members instead of using function args...
|
|
if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SELECT_FLOOR);
|
|
|
|
if (mFloorBtnMgr.hasPointedAtABtnIdx() && mFloorBtnMgr.canDecideFloor()) {
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY);
|
|
}
|
|
}
|
|
|
|
if (canChangeUpDirection(currentMapMode, currentUpDirection) &&
|
|
canChangeUpDirection(nextMapMode, nextUpDirection)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z);
|
|
|
|
if (!currentUpDirection) {
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP);
|
|
} else {
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP_2);
|
|
}
|
|
}
|
|
|
|
switch (mRoomType) {
|
|
case ROOMTYPE_SKYLOFT: {
|
|
if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP);
|
|
LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000);
|
|
} else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (canResetPosition(mCurrentMapMode, mMapUpDirection)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(
|
|
LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL
|
|
);
|
|
} else {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE);
|
|
}
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000);
|
|
}
|
|
break;
|
|
}
|
|
case ROOMTYPE_FIELD:
|
|
case ROOMTYPE_SKYFIELD: {
|
|
if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP);
|
|
LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000);
|
|
} else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (canResetPosition(mCurrentMapMode, mMapUpDirection)) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP);
|
|
LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(
|
|
LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL
|
|
);
|
|
} else {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE);
|
|
}
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000);
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE &&
|
|
mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z);
|
|
if (mShowIslandNames) {
|
|
LytDoButtonRelated::set(
|
|
LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_HIDE_ISLAND_NAME
|
|
);
|
|
} else {
|
|
LytDoButtonRelated::set(
|
|
LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_SHOW_ISLAND_NAME
|
|
);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ROOMTYPE_DUNGEON: {
|
|
if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP);
|
|
LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true);
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000);
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL);
|
|
|
|
if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) {
|
|
if (mFloorBtnMgr.canDecideFloor()) {
|
|
LytDoButtonRelated::set(
|
|
LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY
|
|
);
|
|
} else {
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE);
|
|
}
|
|
}
|
|
|
|
dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000);
|
|
|
|
} else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) {
|
|
if (mFloorBtnMgr.canDecideFloor()) {
|
|
LytDoButtonRelated::set(
|
|
LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY
|
|
);
|
|
} else {
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::setCursorType() {
|
|
if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) {
|
|
if ((mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW ||
|
|
((mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON) && mPointerOnMap)) ||
|
|
(mPointerCanPlaceBeacon && isPointingAtMainMap()) ||
|
|
(*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) ||
|
|
(needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx())) {
|
|
dCsGame_c::GetInstance()->pointerDefSet();
|
|
} else {
|
|
dCsGame_c::GetInstance()->pointerCatSet();
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::calculateBoundingWorldHitboxes() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
f32 sc = global->getField_0x28().x;
|
|
f32 f1 = field_0x8D40 * global->getField_0x44();
|
|
f32 f2 = f1 * sc;
|
|
mAng rot = global->getField_0x56();
|
|
|
|
for (int i = 0; i <= MAP_MAIN_NUM_BOUNDINGS_NORMAL - 1; i++) {
|
|
mVec3_c v1;
|
|
mVec3_c v2;
|
|
|
|
f32 v1x = (f32)mHitChecks[i].getBoundingData()->mMinX;
|
|
f32 v2x = (f32)mHitChecks[i].getBoundingData()->mMaxX;
|
|
f32 v1z = (f32)mHitChecks[i].getBoundingData()->mMaxY;
|
|
f32 v2z = (f32)mHitChecks[i].getBoundingData()->mMinY;
|
|
|
|
v1.x = v1x / f2;
|
|
v1.y = 0.0f;
|
|
v1.z = -v1z / f1;
|
|
|
|
v2.x = v2x / f2;
|
|
v2.y = 0.0f;
|
|
v2.z = -v2z / f1;
|
|
|
|
v1.rotY(rot);
|
|
v2.rotY(rot);
|
|
|
|
// Looks like this is manually unprojecting the UI element
|
|
// hitbox corners?
|
|
s16 v = rot.mVal;
|
|
if (v == 0) {
|
|
// 0° rotation
|
|
mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x;
|
|
mBoundingWorldBounds[i].min.y = 0.0f;
|
|
mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v1.z;
|
|
|
|
mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x;
|
|
mBoundingWorldBounds[i].max.y = 0.0f;
|
|
mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v2.z;
|
|
} else if (v == 0x4000) {
|
|
// 90° rotation
|
|
mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x;
|
|
mBoundingWorldBounds[i].min.y = 0.0f;
|
|
mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z;
|
|
|
|
mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x;
|
|
mBoundingWorldBounds[i].max.y = 0.0f;
|
|
mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z;
|
|
} else if (v == -0x8000) {
|
|
// 180° rotation
|
|
mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v2.x;
|
|
mBoundingWorldBounds[i].min.y = 0.0f;
|
|
mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z;
|
|
|
|
mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v1.x;
|
|
mBoundingWorldBounds[i].max.y = 0.0f;
|
|
mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z;
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_Invisible() {}
|
|
void dLytMapMain_c::executeState_Invisible() {}
|
|
void dLytMapMain_c::finalizeState_Invisible() {}
|
|
|
|
void dLytMapMain_c::initializeState_RenderingWait() {}
|
|
void dLytMapMain_c::executeState_RenderingWait() {}
|
|
void dLytMapMain_c::finalizeState_RenderingWait() {}
|
|
|
|
struct dLytMapStoryflagPaneMapping {
|
|
/* 0x00 */ s32 storyFlag;
|
|
/* 0x04 */ const char *paneName;
|
|
};
|
|
|
|
static const dLytMapStoryflagPaneMapping sStoryflagPaneMap[] = {
|
|
{ STORYFLAG_FARON_PILLAR_OPENED, "N_forestP_00"},
|
|
{ STORYFLAG_ELDIN_PILLAR_OPENED, "N_volcanoP_00"},
|
|
{ STORYFLAG_LANAYRU_PILLAR_OPENED, "N_desertP_00"},
|
|
{ STORYFLAG_FARON_DISCOVERED, "N_toForest_00"},
|
|
{ STORYFLAG_ELDIN_DISCOVERED, "N_toVolcano_00"},
|
|
{ STORYFLAG_LANAYRU_DISCOVERED, "N_toDesert_00"},
|
|
{ STORYFLAG_ISLE_OF_SONGS_DISCOVERED, "N_utaN_00"},
|
|
{STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, "N_ruretouN_00"},
|
|
{ STORYFLAG_LUMPY_PUMPKIN_DISCOVERED, "N_pampkinN_00"},
|
|
{ STORYFLAG_BEEDLE_ISLAND_DISCOVERED, "N_teryN_00"},
|
|
{ STORYFLAG_BAMBOO_ISLAND_DISCOVERED, "N_tikurinN_00"},
|
|
{ STORYFLAG_BUG_HAVEN_DISCOVERED, "N_musiN_00"},
|
|
{ STORYFLAG_ISLE_OF_SONGS_DISCOVERED, "N_utaI_00"},
|
|
{STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, "N_ruretouI_00"},
|
|
{ STORYFLAG_LUMPY_PUMPKIN_DISCOVERED, "N_pampkinI_00"},
|
|
{ STORYFLAG_BEEDLE_ISLAND_DISCOVERED, "N_teryI_00"},
|
|
{ STORYFLAG_BAMBOO_ISLAND_DISCOVERED, "N_tikurinI_00"},
|
|
{ STORYFLAG_BUG_HAVEN_DISCOVERED, "N_musiI_00"},
|
|
{STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED, "N_nushi_00"},
|
|
};
|
|
|
|
// 255 is a placeholder for "no flag", despite it corresponding to an actual story flag...
|
|
static const s32 sFlagsRenameMe[] = {
|
|
255, STORYFLAG_FARON_PILLAR_OPENED, STORYFLAG_ELDIN_PILLAR_OPENED, STORYFLAG_LANAYRU_PILLAR_OPENED,
|
|
STORYFLAG_THUNDERHEAD_ENTERED
|
|
};
|
|
|
|
// Not sure what the second number means
|
|
static const s32 sFlags2RenameMe[][2] = {
|
|
{ STORYFLAG_FARON_DISCOVERED, 5},
|
|
{ STORYFLAG_FARON_WOODS_DISCOVERED, 2},
|
|
{ STORYFLAG_DEEP_WOODS_DISCOVERED, 2},
|
|
{ STORYFLAG_ELDIN_DISCOVERED, 3},
|
|
{ STORYFLAG_LANAYRU_DISCOVERED, 4},
|
|
{STORYFLAG_LANAYRU_DESERT_DISCOVERED, 4},
|
|
{ STORYFLAG_LAKE_FLORIA_DISCOVERED, 2},
|
|
{ STORYFLAG_LANAYRU_CAVES_DISCOVERED, 4},
|
|
{STORYFLAG_ANCIENT_HARBOR_DISCOVERED, 4},
|
|
{STORYFLAG_VOLCANO_SUMMIT_DISCOVERED, 3},
|
|
{ STORYFLAG_LANAYRU_GORGE_DISCOVERED, 4},
|
|
};
|
|
|
|
static const s32 sDungeonDiscoveredFlags[] = {
|
|
STORYFLAG_SKYVIEW_DISCOVERED, STORYFLAG_EARTH_TEMPLE_DISCOVERED, STORYFLAG_LMF_DISCOVERED,
|
|
STORYFLAG_ANCIENT_CISTERN_DISCOVERED, STORYFLAG_SANDSHIP_DISCOVERED, STORYFLAG_FIRE_SANCTUARY_DISCOVERED,
|
|
STORYFLAG_SKY_KEEP_DISCOVERED,
|
|
};
|
|
|
|
static const char *sAreaPicNamesL[] = {
|
|
"P_plainL_00", "P_forestL_00", "P_nForestL_00", "P_sVolcanoL_00", "P_mineL_00", "P_desertL_00",
|
|
"P_lakeL_00", "P_glenL_00", "P_seaL_00", "P_nVolcanoL_00", "P_skyloftL_00", "P_glenL_01",
|
|
};
|
|
|
|
static const char *sAreaPicNamesLink[] = {
|
|
"P_plainLink_00", "P_forestLink_00", "P_nForestLink_00", "P_sVolLink_00", "P_mineLink_00", "P_desertLink_00",
|
|
"P_lakeLink_00", "P_glenLink_00", "P_seaLink_00", "P_nVolLink_00", "P_skyloftLink_00", "P_glenLink_01",
|
|
};
|
|
|
|
#define MAP_MAIN_AREA_PIC_PLAIN 0
|
|
#define MAP_MAIN_AREA_PIC_FOREST 1
|
|
#define MAP_MAIN_AREA_PIC_N_FOREST 2
|
|
#define MAP_MAIN_AREA_PIC_S_VOLCANO 3
|
|
#define MAP_MAIN_AREA_PIC_MINE 4
|
|
#define MAP_MAIN_AREA_PIC_DESERT 5
|
|
#define MAP_MAIN_AREA_PIC_LACE 6
|
|
#define MAP_MAIN_AREA_PIC_GLEN_00 7
|
|
#define MAP_MAIN_AREA_PIC_SEA 8
|
|
#define MAP_MAIN_AREA_PIC_N_VOLCANO 9
|
|
#define MAP_MAIN_AREA_PIC_SKYLOFT 10
|
|
#define MAP_MAIN_AREA_PIC_GLEN_01 11
|
|
|
|
#define MAP_MAIN_NUM_AREA_PICS 12
|
|
|
|
void dLytMapMain_c::setupFlags() {
|
|
if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE) {
|
|
field_0x8DBE = 0;
|
|
} else {
|
|
field_0x8DBE = -1;
|
|
}
|
|
field_0x8D6B = 0;
|
|
field_0x8D6A = 0;
|
|
|
|
mpAllPane->SetVisible(true);
|
|
s32 currentRegion;
|
|
switch (dStageMgr_c::GetInstance()->getSTIFArea()) {
|
|
default: currentRegion = MAP_MAIN_AREA_PIC_SKYLOFT; break;
|
|
case dStageMgr_c::STIF_AREA_SEALED_GROUNDS: currentRegion = MAP_MAIN_AREA_PIC_PLAIN; break;
|
|
case dStageMgr_c::STIF_AREA_FARON_WOODS: currentRegion = MAP_MAIN_AREA_PIC_FOREST; break;
|
|
case dStageMgr_c::STIF_AREA_DEEP_WOODS: currentRegion = MAP_MAIN_AREA_PIC_N_FOREST; break;
|
|
case dStageMgr_c::STIF_AREA_LAKE_FLORIA: currentRegion = MAP_MAIN_AREA_PIC_LACE; break;
|
|
case dStageMgr_c::STIF_AREA_VOLCANO_SOUTH: currentRegion = MAP_MAIN_AREA_PIC_S_VOLCANO; break;
|
|
case dStageMgr_c::STIF_AREA_VOLCANO_NORTH: currentRegion = MAP_MAIN_AREA_PIC_N_VOLCANO; break;
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_MINE: currentRegion = MAP_MAIN_AREA_PIC_MINE; break;
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_DESERT: currentRegion = MAP_MAIN_AREA_PIC_DESERT; break;
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_SAND_SEA: currentRegion = MAP_MAIN_AREA_PIC_SEA; break;
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_CAVES: currentRegion = MAP_MAIN_AREA_PIC_GLEN_00; break;
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_GORGE: currentRegion = MAP_MAIN_AREA_PIC_GLEN_01; break;
|
|
}
|
|
// TODO - regswap between i and ok
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sStoryflagPaneMap); i++) {
|
|
nw4r::lyt::Pane *p = mLyt.findPane(sStoryflagPaneMap[i].paneName);
|
|
bool ok = StoryflagManager::sInstance->getFlag(sStoryflagPaneMap[i].storyFlag) != 0;
|
|
if (i >= 0 && i < 6 && (dScGame_c::isCurrentStage("F403") || dScGame_c::isCurrentStage("F404"))) {
|
|
// If we're in the past, light pillars aren't a thing
|
|
ok = false;
|
|
}
|
|
if (ok) {
|
|
p->SetVisible(true);
|
|
} else {
|
|
p->SetVisible(false);
|
|
}
|
|
}
|
|
|
|
if (StoryflagManager::sInstance->getFlag(STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED)) {
|
|
mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].bind(false);
|
|
}
|
|
mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].bind(false);
|
|
|
|
f32 titleLineFrame = 4.0f;
|
|
// TODO - lots of regswaps
|
|
for (int i = ARRAY_LENGTH(sFlagsRenameMe) - 1; i >= 0; i--) {
|
|
s32 flag = sFlagsRenameMe[i];
|
|
// This might be an inline...
|
|
bool doBreak = true;
|
|
bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag);
|
|
if (!flagSet && flag != 255) {
|
|
doBreak = false;
|
|
}
|
|
if (doBreak) {
|
|
break;
|
|
}
|
|
titleLineFrame -= 1.0f;
|
|
}
|
|
mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].setFrame(titleLineFrame);
|
|
mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false);
|
|
if (mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_BOSS_HOUSE) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mAnmGroups[MAP_MAIN_ANIM_MAP_V].setFrame(3.0f);
|
|
}
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
mAnmGroups[MAP_MAIN_ANIM_MAP_V].setFrame(2.0f);
|
|
}
|
|
}
|
|
|
|
field_0x8880[0] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_PLAIN];
|
|
field_0x8880[1] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_FOREST];
|
|
field_0x8880[2] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_N_FOREST];
|
|
field_0x8880[3] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_S_VOLCANO];
|
|
field_0x8880[4] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_MINE];
|
|
field_0x8880[5] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_DESERT];
|
|
field_0x8880[6] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_LAKE];
|
|
field_0x8880[7] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_GLEN_01];
|
|
field_0x8880[8] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_SEA];
|
|
field_0x8880[9] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_N_VOLCANO];
|
|
field_0x8880[10] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_GLEN_00];
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(field_0x8880); i++) {
|
|
if (field_0x8880[i] != nullptr) {
|
|
field_0x8880[i]->bind(false);
|
|
field_0x8880[i]->setToEnd();
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mpPanes); i++) {
|
|
if (mpPanes[i] != nullptr) {
|
|
mpPanes[i]->SetVisible(true);
|
|
}
|
|
}
|
|
|
|
field_0x88AC = -1;
|
|
|
|
for (int i = ARRAY_LENGTH(sFlags2RenameMe) - 1; i >= 0; i--) {
|
|
s32 flag = sFlags2RenameMe[i][0];
|
|
bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag);
|
|
if (flagSet) {
|
|
field_0x88AC = i;
|
|
break;
|
|
}
|
|
if (mpPanes[i] != nullptr) {
|
|
mpPanes[i]->SetVisible(false);
|
|
}
|
|
if (field_0x8880[i] != nullptr) {
|
|
field_0x8880[i]->setFrame(0.0f);
|
|
}
|
|
}
|
|
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
if (field_0x88AC < 0) {
|
|
field_0x88AC = 0;
|
|
}
|
|
if (field_0x88AC >= 0) {
|
|
if (mpPanes[field_0x88AC] != nullptr) {
|
|
mpPanes[field_0x88AC]->SetVisible(true);
|
|
}
|
|
if (field_0x8880[field_0x88AC] != nullptr) {
|
|
field_0x8880[field_0x88AC]->setFrame(0.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(sDungeonDiscoveredFlags); i++) {
|
|
if (mpDungeonPanes[i] != nullptr) {
|
|
mpDungeonPanes[i]->SetVisible(true);
|
|
}
|
|
if (mpDungeonPics[i] != nullptr) {
|
|
mpDungeonPics[i]->SetVisible(true);
|
|
}
|
|
}
|
|
|
|
for (int i = ARRAY_LENGTH(sDungeonDiscoveredFlags) - 1; i >= 0; i--) {
|
|
s32 flag = sDungeonDiscoveredFlags[i];
|
|
bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag);
|
|
if (flagSet) {
|
|
break;
|
|
}
|
|
if (mpDungeonPanes[i] != nullptr) {
|
|
mpDungeonPanes[i]->SetVisible(false);
|
|
}
|
|
if (mpDungeonPics[i] != nullptr) {
|
|
mpDungeonPics[i]->SetVisible(false);
|
|
}
|
|
}
|
|
|
|
if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE) &&
|
|
!dScGame_c::isCurrentStage("F403") && !dScGame_c::isCurrentStage("F404")) {
|
|
if (mpDungeonPanes[6] != nullptr) {
|
|
mpDungeonPanes[6]->SetVisible(false);
|
|
}
|
|
if (mpDungeonPics[6] != nullptr) {
|
|
mpDungeonPics[6]->SetVisible(false);
|
|
}
|
|
}
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].bind(false);
|
|
|
|
if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE) &&
|
|
!dScGame_c::isCurrentStage("F403") && !dScGame_c::isCurrentStage("F404")) {
|
|
mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].setFrame(1.0f);
|
|
} else {
|
|
mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].setFrame(0.0f);
|
|
}
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
|
|
if (mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].unbind();
|
|
}
|
|
|
|
for (int i = 0; i < 11; i++) {
|
|
if (field_0x8880[i] != nullptr) {
|
|
field_0x8880[i]->unbind();
|
|
}
|
|
}
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false);
|
|
|
|
d2d::AnmGroup_c *grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_FOREST];
|
|
d2d::AnmGroup_c *grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_FOREST];
|
|
d2d::AnmGroup_c *grpZWakuIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_WAKU_IN];
|
|
if (mAreaGroup == AREAGROUP_SEALED_GROUNDS) {
|
|
grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_PLANT];
|
|
grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_PLANT];
|
|
} else if (mAreaGroup == AREAGROUP_ELDIN) {
|
|
grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_VOLCANO];
|
|
grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_VOLCANO];
|
|
} else if (mAreaGroup == AREAGROUP_LANAYRU) {
|
|
grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_DESERT];
|
|
grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_DESERT];
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_SKYLOFT ||
|
|
(mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) {
|
|
grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2];
|
|
grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE];
|
|
}
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].bind(false);
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
grpZAIn->bind(false);
|
|
grpZAIn->setFrame(0.0f);
|
|
grpZWakuIn->bind(false);
|
|
grpZWakuIn->setToEnd();
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE ||
|
|
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
|
|
grpZAIn->bind(false);
|
|
grpZAIn->setToEnd();
|
|
// no group1->bind(false) ?
|
|
grpZIn->setToEnd();
|
|
grpZWakuIn->bind(false);
|
|
grpZWakuIn->setFrame(0.0f);
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) {
|
|
grpZIn->bind(false);
|
|
grpZIn->setFrame(0.0f);
|
|
grpZWakuIn->bind(false);
|
|
grpZWakuIn->setFrame(0.0f);
|
|
}
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f);
|
|
} else {
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd();
|
|
}
|
|
|
|
if (mMapEvent == MAP_EVENT_SW_BANK_SMALL) {
|
|
mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setToEnd();
|
|
} else {
|
|
mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].bind(false);
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setFrame(0.0f);
|
|
mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].setToEnd();
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD ||
|
|
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE ||
|
|
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
|
|
mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setToEnd();
|
|
mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].setFrame(0.0f);
|
|
}
|
|
}
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].setFrame(field_0x8D54 - 1);
|
|
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].unbind();
|
|
if (mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].unbind();
|
|
}
|
|
if (mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].unbind();
|
|
}
|
|
if (grpZIn->isBound()) {
|
|
grpZIn->unbind();
|
|
}
|
|
if (grpZAIn->isBound()) {
|
|
grpZAIn->unbind();
|
|
}
|
|
if (grpZWakuIn->isBound()) {
|
|
grpZWakuIn->unbind();
|
|
}
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind();
|
|
mpAllPane->SetVisible(false);
|
|
if (mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].isBound()) {
|
|
mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].unbind();
|
|
}
|
|
getGlobal()->setAlpha(0);
|
|
// we had JUST set this to invisible...
|
|
mpAllPane->SetVisible(true);
|
|
mpRegionPane1 = nullptr;
|
|
for (int i = 0; i < MAP_MAIN_NUM_AREA_PICS; i++) {
|
|
nw4r::lyt::Pane *p1 = mLyt.findPane(sAreaPicNamesL[i]);
|
|
nw4r::lyt::Pane *p2 = mLyt.findPane(sAreaPicNamesLink[i]);
|
|
if (i == currentRegion) {
|
|
p1->SetVisible(true);
|
|
p2->SetVisible(true);
|
|
mpRegionPane1 = p1;
|
|
// TODO - was this meant to be p2?
|
|
mpRegionPane2 = p1;
|
|
} else {
|
|
p1->SetVisible(false);
|
|
p2->SetVisible(false);
|
|
}
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) {
|
|
mLyt.findPane("P_skyloftLink_00")->SetVisible(false);
|
|
}
|
|
|
|
if (canPlaceBeacons(mCurrentMapMode) && canPlaceBeacons(mNextMapMode)) {
|
|
mPutIcon.setVisible(true);
|
|
mpNoroshiPane->SetVisible(true);
|
|
} else {
|
|
mpNoroshiPane->SetVisible(false);
|
|
mPutIcon.setVisible(false);
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_SKYFIELD) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
mMarkers.setIslandNamesOn(mShowIslandNames);
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mMarkers.setIslandNamesOn(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_In() {}
|
|
void dLytMapMain_c::executeState_In() {
|
|
field_0x8DBF = 1;
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
// TODO this should explain most of mMapEvent
|
|
}
|
|
void dLytMapMain_c::finalizeState_In() {}
|
|
|
|
s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const {
|
|
s32 ret = AREAGROUP_MAX;
|
|
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
switch (mSurfaceProvince) {
|
|
case SURFACE_PROVINCE_FARON: ret = AREAGROUP_FARON; break;
|
|
case SURFACE_PROVINCE_ELDIN: ret = AREAGROUP_ELDIN; break;
|
|
case SURFACE_PROVINCE_LANAYRU: ret = AREAGROUP_LANAYRU; break;
|
|
}
|
|
} else {
|
|
switch (stifArea) {
|
|
case dStageMgr_c::STIF_AREA_SKY: ret = AREAGROUP_SKY; break;
|
|
case dStageMgr_c::STIF_AREA_SEALED_GROUNDS: ret = AREAGROUP_SEALED_GROUNDS; break;
|
|
case dStageMgr_c::STIF_AREA_FARON_WOODS:
|
|
case dStageMgr_c::STIF_AREA_DEEP_WOODS:
|
|
case dStageMgr_c::STIF_AREA_LAKE_FLORIA: ret = AREAGROUP_FARON; break;
|
|
case dStageMgr_c::STIF_AREA_VOLCANO_SOUTH:
|
|
case dStageMgr_c::STIF_AREA_VOLCANO_NORTH: ret = AREAGROUP_ELDIN; break;
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_MINE:
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_DESERT:
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_SAND_SEA:
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_CAVES:
|
|
case dStageMgr_c::STIF_AREA_LANAYRU_GORGE: ret = AREAGROUP_LANAYRU; break;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
s32 dLytMapMain_c::getRoomType() const {
|
|
s32 ret = ROOMTYPE_FIELD;
|
|
s32 stifRoomType = dStageMgr_c::GetInstance()->getSTIFRoomType();
|
|
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
ret = ROOMTYPE_FIELD;
|
|
}
|
|
|
|
if (dScGame_c::isCurrentStage("F011r") ||
|
|
(dScGame_c::isCurrentStage("F002r") && dScGame_c::currentSpawnInfo.isNight()) ||
|
|
dScGame_c::isCurrentStage("F010r") || dScGame_c::isCurrentStage("F019r")) {
|
|
ret = ROOMTYPE_SKYFIELD_INTERIOR;
|
|
} else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_FIELD) {
|
|
ret = ROOMTYPE_FIELD;
|
|
} else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) {
|
|
ret = ROOMTYPE_DUNGEON;
|
|
} else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYLOFT) {
|
|
ret = ROOMTYPE_SKYLOFT;
|
|
} else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_BOSS_HOUSE) {
|
|
ret = ROOMTYPE_BOSS_HOUSE;
|
|
} else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYFIELD) {
|
|
ret = ROOMTYPE_SKYFIELD;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void dLytMapMain_c::zoomIn() {
|
|
if (mRoomType == ROOMTYPE_SKYLOFT ||
|
|
(mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
|
|
if (dPad::getDownTrigRight()) {
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE);
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigRight() || dPad::getDownTrigA()) {
|
|
mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL);
|
|
|
|
if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot);
|
|
} else {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigRight() || dPad::getDownTrigA()) {
|
|
mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL);
|
|
|
|
if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot);
|
|
} else {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_FIELD) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigRight() || dPad::getDownTrigA()) {
|
|
mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL);
|
|
|
|
if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot);
|
|
} else {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_DUNGEON) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigRight() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) {
|
|
mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL);
|
|
|
|
if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot);
|
|
} else {
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_BOSS_HOUSE) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigRight()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::zoomOut() {
|
|
if (mRoomType == ROOMTYPE_SKYLOFT ||
|
|
(mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD);
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) {
|
|
mMapUpDirectionAfterZoomToDetail = mMapUpDirection;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mNextMapUpDirection = true;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE);
|
|
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD);
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) {
|
|
mMapUpDirectionAfterZoomToDetail = mMapUpDirection;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mNextMapUpDirection = true;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE);
|
|
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_FIELD) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA);
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) {
|
|
mMapUpDirectionAfterZoomToDetail = mMapUpDirection;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mNextMapUpDirection = true;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE);
|
|
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_DUNGEON) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
if (dPad::getDownTrigLeft() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) {
|
|
mMapUpDirectionAfterZoomToDetail = mMapUpDirection;
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE;
|
|
mNextMapUpDirection = true;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE);
|
|
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot);
|
|
}
|
|
}
|
|
} else if (mRoomType == ROOMTYPE_BOSS_HOUSE) {
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
} else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
if (dPad::getDownTrigLeft()) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_Active() {}
|
|
void dLytMapMain_c::executeState_Active() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
if (dMessage_c::getInstance()->getField_0x328()) {
|
|
return;
|
|
}
|
|
|
|
if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE &&
|
|
mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) {
|
|
if (mShowIslandNames) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_OFF);
|
|
} else {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_ON);
|
|
}
|
|
mShowIslandNames = !mShowIslandNames;
|
|
mMarkers.setIslandNamesOn(mShowIslandNames);
|
|
}
|
|
checkScroll();
|
|
|
|
if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) {
|
|
if (!mNavEnabled) {
|
|
dPadNav::setNavEnabled(true, false);
|
|
mNavEnabled = true;
|
|
}
|
|
if (mFloorBtnMgr.canDecideFloor() && dPad::getDownTrigA()) {
|
|
mFloorBtnMgr.decideSelectedFloor();
|
|
field_0x8C64 = mFloorBtnMgr.getCurrentFloor();
|
|
global->setFloor(field_0x8C64);
|
|
mStateMgr.changeState(StateID_FloorChange);
|
|
}
|
|
} else {
|
|
if (mNavEnabled) {
|
|
dPadNav::setNavEnabled(false, false);
|
|
mNavEnabled = false;
|
|
}
|
|
}
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE &&
|
|
canZoomIn(dLytMapGlobal_c::MAPMODE_STAGE)) {
|
|
if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) {
|
|
// Can zoom in around cursor, use the cursor pos
|
|
getGlobal()->unprojectFromMap(field_0x8CF4, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos());
|
|
f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE);
|
|
fn_8013FB70(field_0x8CF4, getGlobal()->getField_0x44() / tmp);
|
|
mDrawScaleFrame = true;
|
|
} else {
|
|
// Cannot zoom in around cursor, use the player pos
|
|
f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE);
|
|
f32 val = getGlobal()->getField_0x44() / tmp;
|
|
fn_8013FB70(getGlobal()->getPlayerPos(), val);
|
|
mDrawScaleFrame = true;
|
|
}
|
|
}
|
|
|
|
if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select &&
|
|
dPad::getDownTrigC() && mPointerCanPlaceBeacon) {
|
|
s32 id = -1;
|
|
mPinIconAggregate.findNewBeaconId(&id);
|
|
if (id >= 0) {
|
|
mVec3_c pos3d;
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
global->unprojectFromMap(pos3d, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos());
|
|
mPinIconAggregate.setPosition(id, pos3d);
|
|
setBeaconPositionChecked(&pos3d, id);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_SET);
|
|
}
|
|
} else if ((dPad::getDownTrigLeft() && canZoomOut(mCurrentMapMode)) ||
|
|
(dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && canZoomOut(mCurrentMapMode)
|
|
)) {
|
|
zoomOut();
|
|
} else if ((dPad::getDownTrigRight() && canZoomIn(mCurrentMapMode)) ||
|
|
(dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(mCurrentMapMode)
|
|
)) {
|
|
zoomIn();
|
|
} else if ((mRoomType == ROOMTYPE_FIELD || mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_SKYLOFT ||
|
|
mRoomType == ROOMTYPE_SKYFIELD) &&
|
|
canResetPosition(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigUp()) {
|
|
mVec3_c pos;
|
|
fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56());
|
|
f32 distSq = global->getMapScroll().squareDistanceToXZ(pos);
|
|
if (field_0x8D58 != global->getFloor()) {
|
|
mFloorBtnMgr.resetFloor(-(field_0x8D58 - field_0x8D60));
|
|
global->setFloor(field_0x8D58);
|
|
mStateMgr.changeState(StateID_ResetPosWithFloorChange);
|
|
} else if (distSq >= 1.0f) {
|
|
mStateMgr.changeState(StateID_ResetPos);
|
|
} else {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_NOT_MOVE);
|
|
}
|
|
} else if (canChangeUpDirection(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigZ()) {
|
|
mStateMgr.changeState(StateID_ChgMapUpDirection);
|
|
}
|
|
|
|
if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) ||
|
|
(mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) {
|
|
field_0xF1C.field_0x05 = true;
|
|
}
|
|
|
|
mPinIconAggregate.execute();
|
|
|
|
for (int idx = 0; idx < (int)ARRAY_LENGTH(mHitChecks); idx++) {
|
|
mHitChecks[idx].resetCachedHitboxes();
|
|
mHitChecks[idx].execute();
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_Active() {
|
|
mDrawScaleFrame = false;
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_Out() {
|
|
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
|
|
mPopupInfo.mStateMgr.changeState(StateID_Out);
|
|
}
|
|
dLytMeter_c::GetInstance()->setMeterField_0x13750(0);
|
|
if (field_0x8CAD || mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT];
|
|
} else {
|
|
mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM];
|
|
}
|
|
|
|
mpOutAnmGroup->bind(false);
|
|
mpOutAnmGroup->setFrame(0.0f);
|
|
field_0x8C8C = mpOutAnmGroup->getLastFrame();
|
|
|
|
if (fn_80141530()) {
|
|
dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10;
|
|
}
|
|
|
|
dPadNav::setNavEnabled(false, false);
|
|
}
|
|
void dLytMapMain_c::executeState_Out() {
|
|
if (mpOutAnmGroup->isEndReached()) {
|
|
bool specialMode = isSomeFieldEq0Or1Or7Or9Or11();
|
|
// Kind of a weird way to write `specialMode || ... != 3 `
|
|
if ((specialMode && dScGame_c::getCamera(0)->getField_0xDA8() != 3) || !specialMode) {
|
|
dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10;
|
|
mLyt.calc();
|
|
mpOutAnmGroup->unbind();
|
|
field_0x8DBF = 0;
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
}
|
|
}
|
|
|
|
if (mpOutAnmGroup->isBound()) {
|
|
mpOutAnmGroup->play();
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_Out() {}
|
|
|
|
void dLytMapMain_c::initializeState_FloorChange() {
|
|
mMapCapture.renderRequest();
|
|
}
|
|
void dLytMapMain_c::executeState_FloorChange() {
|
|
if (!mMapCapture.isBusyRendering()) {
|
|
mStateMgr.changeState(StateID_Active);
|
|
dPadNav::stopFSStickNav();
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_FloorChange() {}
|
|
|
|
void dLytMapMain_c::initializeState_ChgMapUpDirection() {
|
|
mNextMapUpDirection = !mMapUpDirection;
|
|
field_0x8D44 = getGlobal()->getMapRotation();
|
|
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000);
|
|
mNextMapUpDirection = false;
|
|
} else {
|
|
fn_80142D10(mCurrentMapMode, mNextMapUpDirection, field_0x8D46);
|
|
}
|
|
(void)getGlobal();
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
mPlayerPos = global->getPlayerPos();
|
|
mVec2_c v(0.0f, 0.0f);
|
|
global->unprojectFromMap(mMapScroll, v, field_0x8D44);
|
|
global->setMapRotationCenter(mPlayerPos);
|
|
const mVec3_c ¢er = global->getMapRotationCenter();
|
|
fn_80143060(mPlayerPos, mPlayerPos, center, field_0x8D46);
|
|
fn_80143060(mMapScroll, mMapScroll, center, field_0x8D44);
|
|
global->setMapScroll(mMapScroll);
|
|
field_0x8C70 = 0;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_CHANGE_DIRECT);
|
|
}
|
|
void dLytMapMain_c::executeState_ChgMapUpDirection() {
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) {
|
|
fn_80140B90();
|
|
} else {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1B, 2.0f);
|
|
|
|
// Lerps
|
|
|
|
// TODO stack and reg swaps
|
|
global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44);
|
|
|
|
mVec3_c actualPos = (mPlayerPos - mMapScroll) * factor + mMapScroll;
|
|
global->setMapScroll(actualPos);
|
|
|
|
if (field_0x8C70 >= sHio.field_0x1B) {
|
|
mLyt.calc();
|
|
mMapUpDirection = mNextMapUpDirection;
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
mStateMgr.changeState(StateID_EventMapIntro_Step4);
|
|
} else {
|
|
mStateMgr.changeState(StateID_Active);
|
|
}
|
|
} else {
|
|
field_0x8C70++;
|
|
}
|
|
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
EventManager::execute();
|
|
}
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_ChgMapUpDirection() {}
|
|
|
|
void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
mMapScroll = global->getMapScroll();
|
|
field_0x8D50 = global->getField_0x44();
|
|
field_0x8D44 = global->getMapRotation();
|
|
|
|
field_0x8D4C = fn_80142D90(mNextMapMode);
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000);
|
|
mNextMapUpDirection = false;
|
|
} else {
|
|
mNextMapUpDirection = fn_80142D10(mNextMapMode, mNextMapUpDirection, field_0x8D46);
|
|
}
|
|
|
|
fn_80142F00(mPlayerPos, mNextMapMode, mNextMapUpDirection, global->getMapRotationCenter(), global->getField_0x56());
|
|
field_0x8C70 = 0;
|
|
|
|
if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
global->setZoomFrame(1.0f);
|
|
global->setField_0x58(field_0x8D50 / field_0x8D4C);
|
|
} else {
|
|
global->setZoomFrame(0.0f);
|
|
global->setField_0x58(1.0f);
|
|
}
|
|
|
|
if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && !mNextMapUpDirection) {
|
|
mVec2_c v(0.0f, 0.0f);
|
|
global->unprojectFromMap(mMapScroll, v, field_0x8D44);
|
|
mVec3_c v2 = mPlayerPos;
|
|
global->setMapRotationCenter(v2);
|
|
dLytMapGlobal_c *global2 = getGlobal();
|
|
const mVec3_c ¢er = global2->getMapRotationCenter();
|
|
fn_80143060(mPlayerPos, v2, center, field_0x8D46);
|
|
mVec3_c v3 = mMapScroll;
|
|
fn_80143060(mMapScroll, v3, center, field_0x8D44);
|
|
mVec3_c v4 = mMapScroll;
|
|
global2->setMapScroll(v4);
|
|
} else {
|
|
mVec2_c v(0.0f, 0.0f);
|
|
global->unprojectFromMap(mMapScroll, v, field_0x8D44);
|
|
if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
mPlayerPos = field_0x8CC4;
|
|
} else {
|
|
mPlayerPos = global->getPlayerPos();
|
|
}
|
|
|
|
global->setMapRotationCenter(mMapScroll);
|
|
mVec3_c v2 = mPlayerPos;
|
|
dLytMapGlobal_c *global2 = getGlobal();
|
|
const mVec3_c ¢er = global2->getMapRotationCenter();
|
|
fn_80143060(mPlayerPos, v2, center, field_0x8D46);
|
|
mVec3_c v3 = mMapScroll;
|
|
fn_80143060(mMapScroll, v3, center, field_0x8D44);
|
|
mVec3_c v4 = mMapScroll;
|
|
global2->setMapScroll(v4);
|
|
}
|
|
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false);
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f);
|
|
} else {
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd();
|
|
}
|
|
if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mMarkers.setIslandNamesOn(false);
|
|
}
|
|
if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
mMarkers.setIslandNamesOn(mShowIslandNames);
|
|
}
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
mVec2_c v(global->getField_0x20().x, global->getField_0x20().y);
|
|
global->unprojectFromMap(field_0x8CF4, v);
|
|
}
|
|
}
|
|
void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() {
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) {
|
|
fn_80140B90();
|
|
} else {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
f32 f1 = (f32)field_0x8C70 / sHio.field_0x1B;
|
|
f32 factor = cLib::easeInOut(f1, 2.0f);
|
|
|
|
f32 f2, f3;
|
|
if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
f32 ratio = field_0x8D50 / field_0x8D4C;
|
|
f1 = 1.0f - f1;
|
|
f2 = ratio + (1.0f - ratio) * factor;
|
|
f3 = 1.0f - factor;
|
|
} else {
|
|
f32 ratio = field_0x8D4C / field_0x8D50;
|
|
f2 = ratio + (1.0f - ratio) * (1.0f - factor);
|
|
f3 = factor;
|
|
}
|
|
global->setZoomFrame(f1);
|
|
global->setField_0x58(f2);
|
|
|
|
// TODO - there is tons of dead code here
|
|
|
|
// Lerps
|
|
f32 f4 = field_0x8D50 + factor * (field_0x8D4C - field_0x8D50);
|
|
global->setField_0x44(f4);
|
|
|
|
// TODO stack and reg swaps
|
|
global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44);
|
|
|
|
mVec3_c actualPos;
|
|
if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll;
|
|
} else {
|
|
actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll;
|
|
}
|
|
|
|
global->setMapScroll(actualPos);
|
|
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) {
|
|
fn_8013FB70(field_0x8CF4, f4 / field_0x8D50);
|
|
mDrawScaleFrame = true;
|
|
}
|
|
|
|
// TODO dead code
|
|
f32 length = mAnmGroups[MAP_MAIN_ANIM_ROTATE].getLastFrame();
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length);
|
|
|
|
if (field_0x8C70 >= sHio.field_0x1C) {
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x0108 > 0) {
|
|
field_0x0108--;
|
|
} else {
|
|
mDrawScaleFrame = false;
|
|
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd();
|
|
} else {
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f);
|
|
}
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind();
|
|
mDrawScaleFrame = false;
|
|
mMapUpDirection = mNextMapUpDirection;
|
|
global->setMapRotation(field_0x8D46);
|
|
global->setField_0x44(field_0x8D4C);
|
|
global->setMapScroll(mPlayerPos);
|
|
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
mStateMgr.changeState(StateID_EventMapIntro_Step4);
|
|
} else {
|
|
mStateMgr.changeState(StateID_Active);
|
|
mCurrentMapMode = mNextMapMode;
|
|
}
|
|
}
|
|
} else {
|
|
field_0x8C70++;
|
|
}
|
|
if (mMapEvent == MAP_EVENT_MAP_INTRO) {
|
|
EventManager::execute();
|
|
}
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_ChgDispAreaMode_MapRot() {}
|
|
|
|
void dLytMapMain_c::initializeState_ChgDispAreaMode_Map() {}
|
|
void dLytMapMain_c::executeState_ChgDispAreaMode_Map() {
|
|
// Won't attempt this until the dead code in executeState_ChgDispAreaMode_MapRot is solved
|
|
}
|
|
void dLytMapMain_c::finalizeState_ChgDispAreaMode_Map() {}
|
|
|
|
void dLytMapMain_c::initializeState_ChgDispAreaMode_WA() {}
|
|
void dLytMapMain_c::executeState_ChgDispAreaMode_WA() {}
|
|
void dLytMapMain_c::finalizeState_ChgDispAreaMode_WA() {}
|
|
|
|
void dLytMapMain_c::initializeState_ChgDispAreaMode_CsrRot() {}
|
|
void dLytMapMain_c::executeState_ChgDispAreaMode_CsrRot() {}
|
|
void dLytMapMain_c::finalizeState_ChgDispAreaMode_CsrRot() {}
|
|
|
|
void dLytMapMain_c::initializeState_ResetPos() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
field_0x8C70 = 0;
|
|
mMapScroll = global->getMapScroll();
|
|
fn_80142F00(mPlayerPos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56());
|
|
field_0x8C70 = 0;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_START);
|
|
}
|
|
void dLytMapMain_c::executeState_ResetPos() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1A, 2.0f);
|
|
mVec3_c pos = (mPlayerPos - mMapScroll) * factor + mMapScroll;
|
|
global->setMapScroll(pos);
|
|
dSndSmallEffectMgr_c::GetInstance()->holdSound(SE_S_MAP_RESET_LV);
|
|
if (field_0x8C70 >= sHio.field_0x1A) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_END);
|
|
mStateMgr.changeState(StateID_Active);
|
|
} else {
|
|
field_0x8C70++;
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_ResetPos() {}
|
|
|
|
void dLytMapMain_c::initializeState_ResetPosWithFloorChange() {
|
|
dPadNav::stopFSStickNav();
|
|
mMapCapture.renderRequest();
|
|
}
|
|
void dLytMapMain_c::executeState_ResetPosWithFloorChange() {
|
|
if (mMapCapture.isBusyRendering()) {
|
|
return;
|
|
}
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
mVec3_c pos;
|
|
fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56());
|
|
if (global->getMapScroll().squareDistanceToXZ(pos) >= 1.0f) {
|
|
mStateMgr.changeState(StateID_ResetPos);
|
|
} else {
|
|
mStateMgr.changeState(StateID_Active);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_ResetPosWithFloorChange() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() {
|
|
mEventTimer = sHio.field_0x1D;
|
|
field_0x8CB4 = 0;
|
|
}
|
|
void dLytMapMain_c::executeState_EventSwBankSmall_Step1() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
return;
|
|
}
|
|
|
|
mMarkers.setField_0x0703(1);
|
|
mStateMgr.changeState(StateID_EventSwBankSmall_Step2);
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSwBankSmall_Step1() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() {
|
|
mEventTimer = mMarkers.getField_0x0704();
|
|
}
|
|
void dLytMapMain_c::executeState_EventSwBankSmall_Step2() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
return;
|
|
}
|
|
mStateMgr.changeState(StateID_EventSwBankSmall_Step3);
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSwBankSmall_Step2() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() {
|
|
mEventTimer = sHio.field_0x1E;
|
|
}
|
|
void dLytMapMain_c::executeState_EventSwBankSmall_Step3() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
return;
|
|
}
|
|
|
|
field_0x8D6B = 1;
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventMapIntro_Step1() {
|
|
mEventTimer = sHio.field_0x1F;
|
|
}
|
|
void dLytMapMain_c::executeState_EventMapIntro_Step1() {
|
|
if (field_0x8D6A) {
|
|
fn_80140B90();
|
|
return;
|
|
}
|
|
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
mStateMgr.changeState(StateID_EventMapIntro_Step2);
|
|
}
|
|
EventManager::execute();
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventMapIntro_Step1() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventMapIntro_Step2() {
|
|
if (field_0x8880[field_0x88AC] != nullptr) {
|
|
field_0x8880[field_0x88AC]->bind(false);
|
|
field_0x8880[field_0x88AC]->setFrame(0.0f);
|
|
mLyt.calc();
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_WORLD_EXTEND);
|
|
}
|
|
}
|
|
void dLytMapMain_c::executeState_EventMapIntro_Step2() {
|
|
if (field_0x8D6A) {
|
|
fn_80140B90();
|
|
return;
|
|
}
|
|
|
|
if (field_0x8880[field_0x88AC] != nullptr) {
|
|
if (field_0x8880[field_0x88AC]->isEndReached()) {
|
|
field_0x8880[field_0x88AC]->unbind();
|
|
mStateMgr.changeState(StateID_EventMapIntro_Step3);
|
|
} else {
|
|
field_0x8880[field_0x88AC]->play();
|
|
}
|
|
} else {
|
|
mStateMgr.changeState(StateID_EventMapIntro_Step3);
|
|
}
|
|
|
|
EventManager::execute();
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventMapIntro_Step2() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventMapIntro_Step3() {
|
|
mEventTimer = 0;
|
|
}
|
|
void dLytMapMain_c::executeState_EventMapIntro_Step3() {
|
|
if (field_0x8D6A) {
|
|
fn_80140B90();
|
|
return;
|
|
}
|
|
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA);
|
|
mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE;
|
|
field_0x0108 = sHio.field_0x20;
|
|
mStateMgr.changeState(StateID_ChgDispAreaMode_WA);
|
|
}
|
|
EventManager::execute();
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventMapIntro_Step3() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventMapIntro_Step4() {
|
|
mEventTimer = sHio.field_0x21;
|
|
}
|
|
void dLytMapMain_c::executeState_EventMapIntro_Step4() {
|
|
if (field_0x8D6A) {
|
|
fn_80140B90();
|
|
return;
|
|
}
|
|
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
field_0x8D6B = 1;
|
|
}
|
|
EventManager::execute();
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventMapIntro_Step4() {}
|
|
|
|
void dLytMapMain_c::fn_80140B90() {
|
|
mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false);
|
|
mAnmGroups[MAP_MAIN_ANIM_OUT].setToEnd();
|
|
mLyt.calc();
|
|
mAnmGroups[MAP_MAIN_ANIM_OUT].unbind();
|
|
dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10;
|
|
dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10;
|
|
dScGame_c::getCamera(0)->doFn_80093360();
|
|
dScGame_c::getCamera(0)->fn_8019E430();
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_EventDungeonMapGet_Step1() {
|
|
mEventTimer = sHio.field_0x22;
|
|
}
|
|
void dLytMapMain_c::executeState_EventDungeonMapGet_Step1() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
mStateMgr.changeState(StateID_EventDungeonMapGet_Step2);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step1() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventDungeonMapGet_Step2() {
|
|
mEventTimer = sHio.field_0x23;
|
|
field_0x8CB4 = sHio.field_0x24;
|
|
field_0x8CB8 = mMarkers.getField_0x0704();
|
|
field_0x8DBE = 0;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND);
|
|
}
|
|
void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
}
|
|
u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f;
|
|
global->setField_0x4F(u1);
|
|
field_0x8DBE = u1;
|
|
if (field_0x8CB4 != 0) {
|
|
field_0x8CB4--;
|
|
} else {
|
|
mMarkers.setField_0x0702(1);
|
|
if (field_0x8CB8 != 0) {
|
|
field_0x8CB8--;
|
|
}
|
|
}
|
|
} else {
|
|
global->setField_0x4C(0);
|
|
mStateMgr.changeState(StateID_EventDungeonMapGet_Step3);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step2() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventDungeonMapGet_Step3() {
|
|
mEventTimer = sHio.field_0x25;
|
|
}
|
|
void dLytMapMain_c::executeState_EventDungeonMapGet_Step3() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
field_0x8D6B = 1;
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step3() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventFieldMapChange_Step1() {
|
|
mEventTimer = sHio.field_0x26;
|
|
}
|
|
void dLytMapMain_c::executeState_EventFieldMapChange_Step1() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
mStateMgr.changeState(StateID_EventFieldMapChange_Step2);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventFieldMapChange_Step1() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventFieldMapChange_Step2() {
|
|
mEventTimer = sHio.field_0x27;
|
|
field_0x8DBE = 0;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND);
|
|
}
|
|
void dLytMapMain_c::executeState_EventFieldMapChange_Step2() {
|
|
dStage_c *stage = dStage_c::GetInstance();
|
|
u32 duration = sHio.field_0x27;
|
|
if (mEventTimer != 0) {
|
|
u8 u1 = (f32)(duration - mEventTimer) / (f32)duration * 255.0f;
|
|
stage->getMapRelated()->setField_0x1E8(u1);
|
|
mEventTimer--;
|
|
} else {
|
|
stage->getMapRelated()->setField_0x1E8(0);
|
|
stage->getMapRelated()->setField_0x1EF(1);
|
|
mStateMgr.changeState(StateID_EventFieldMapChange_Step3);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventFieldMapChange_Step2() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventFieldMapChange_Step3() {
|
|
mEventTimer = sHio.field_0x28;
|
|
}
|
|
void dLytMapMain_c::executeState_EventFieldMapChange_Step3() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else if (mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) {
|
|
mStateMgr.changeState(StateID_Active);
|
|
} else {
|
|
mStateMgr.changeState(StateID_EventFieldMapChange_Step4);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventFieldMapChange_Step3() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventFieldMapChange_Step4() {}
|
|
void dLytMapMain_c::executeState_EventFieldMapChange_Step4() {}
|
|
void dLytMapMain_c::finalizeState_EventFieldMapChange_Step4() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventForestMapChange_Step1() {
|
|
mEventTimer = sHio.field_0x22;
|
|
}
|
|
void dLytMapMain_c::executeState_EventForestMapChange_Step1() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
mStateMgr.changeState(StateID_EventForestMapChange_Step2);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventForestMapChange_Step1() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventForestMapChange_Step2() {
|
|
mEventTimer = sHio.field_0x23;
|
|
field_0x8CB4 = sHio.field_0x24;
|
|
field_0x8CB8 = mMarkers.getField_0x0704();
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND);
|
|
field_0x8DBE = 0;
|
|
}
|
|
void dLytMapMain_c::executeState_EventForestMapChange_Step2() {
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
}
|
|
u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f;
|
|
global->setField_0x4F(u1);
|
|
field_0x8DBE = u1;
|
|
if (field_0x8CB4 != 0) {
|
|
field_0x8CB4--;
|
|
} else {
|
|
mMarkers.setField_0x0702(1);
|
|
if (field_0x8CB8 != 0) {
|
|
field_0x8CB8--;
|
|
}
|
|
}
|
|
} else {
|
|
global->setField_0x4C(0);
|
|
mStateMgr.changeState(StateID_EventForestMapChange_Step3);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventForestMapChange_Step2() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventForestMapChange_Step3() {
|
|
mEventTimer = sHio.field_0x25;
|
|
}
|
|
void dLytMapMain_c::executeState_EventForestMapChange_Step3() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
field_0x8D6B = 1;
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventForestMapChange_Step3() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventSignalAdd_Step1() {}
|
|
void dLytMapMain_c::executeState_EventSignalAdd_Step1() {
|
|
if (mDisplayedBeaconCount != getMaxBeaconCount()) {
|
|
mStateMgr.changeState(StateID_EventSignalAdd_Step2);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSignalAdd_Step1() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventSignalAdd_Step2() {
|
|
mEventTimer = sHio.field_0x29;
|
|
}
|
|
void dLytMapMain_c::executeState_EventSignalAdd_Step2() {
|
|
if (mDisplayedBeaconCount == getMaxBeaconCount()) {
|
|
mStateMgr.changeState(StateID_EventSignalAdd_Step3);
|
|
} else if (--mEventTimer == 0) {
|
|
mEventTimer = sHio.field_0x29;
|
|
mDisplayedBeaconCount++;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_COUNT_UP);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSignalAdd_Step2() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventSignalAdd_Step3() {
|
|
mEventTimer = sHio.field_0x25;
|
|
}
|
|
void dLytMapMain_c::executeState_EventSignalAdd_Step3() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
} else {
|
|
mStateMgr.changeState(StateID_Active);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSignalAdd_Step3() {}
|
|
|
|
bool dLytMapMain_c::fn_80141530() const {
|
|
return EventManager::isInEvent() && mMapEvent != MAP_EVENT_11;
|
|
}
|
|
|
|
dAcTbox_c *dLytMapMain_c::findGoddessChestForStoryflag(s32 flag) const {
|
|
dAcTbox_c *ret = nullptr;
|
|
fBase_c *it = nullptr;
|
|
while ((it = fManager_c::searchBaseByGroupType(fBase_c::ACTOR, it)) != nullptr) {
|
|
if (it->mProfileName == fProfile::TBOX) {
|
|
dAcTbox_c *box = static_cast<dAcTbox_c *>(it);
|
|
if (box->getVariant() == dAcTbox_c::GODDESS) {
|
|
u16 boxFlag = box->getParams2Lower();
|
|
if (flag == boxFlag) {
|
|
ret = box;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_EventGoddessCube_Step1() {
|
|
mEventTimer = 30;
|
|
}
|
|
void dLytMapMain_c::executeState_EventGoddessCube_Step1() {
|
|
if (mEventTimer != 0) {
|
|
mEventTimer--;
|
|
}
|
|
if (mEventTimer == 0) {
|
|
mStateMgr.changeState(StateID_Active);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventGoddessCube_Step1() {
|
|
mEventTimer = 50;
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_EventGoddessCube_Step2() {}
|
|
void dLytMapMain_c::executeState_EventGoddessCube_Step2() {}
|
|
void dLytMapMain_c::finalizeState_EventGoddessCube_Step2() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventGoddessCube_Step3() {}
|
|
void dLytMapMain_c::executeState_EventGoddessCube_Step3() {
|
|
mStateMgr.changeState(StateID_Active);
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventGoddessCube_Step3() {}
|
|
|
|
bool dLytMapMain_c::checkStoryflag(s32 flag) const {
|
|
return StoryflagManager::sInstance->getFlag(flag);
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() {
|
|
if (mSurfaceProvince == SURFACE_PROVINCE_FARON && checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) &&
|
|
!checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) {
|
|
// "A report, Master. An unusual phenomenon is taking place in Faron Woods, making it impossible to descend
|
|
// directly into them at the moment."
|
|
mFlowMgr.triggerEntryPoint(4, 18, 0, 0);
|
|
} else {
|
|
// "It is possible to descend to a specific..." / "Point to your preferred descent area..."
|
|
mFlowMgr.triggerEntryPoint(4, 19, 0, 0);
|
|
}
|
|
}
|
|
void dLytMapMain_c::executeState_EventSaveObjMsgWindow() {
|
|
if (mFlowMgr.checkFinished()) {
|
|
mStateMgr.changeState(StateID_EventSaveObjSelect);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSaveObjMsgWindow() {}
|
|
|
|
enum dLytMapSaveObjFlagKind {
|
|
SAVE_OBJ_FLAG_KIND_SCENEFLAG = 0,
|
|
SAVE_OBJ_FLAG_KIND_STORYFLAG = 1,
|
|
};
|
|
|
|
struct dLytMapSaveObjFlagDefinition {
|
|
/* 0x00 */ dLytMapSaveObjFlagKind flagType;
|
|
// I wanted designated initializers but MWCC doesn't have them...
|
|
/* 0x04 */ union {
|
|
struct {
|
|
/* 0x04 */ u16 flagArea;
|
|
/* 0x06 */ u16 sceneFlag;
|
|
};
|
|
struct {
|
|
/* 0x04 */ s16 storyFlag;
|
|
/* 0x06 */ u16 _padding;
|
|
};
|
|
};
|
|
};
|
|
|
|
static const dLytMapSaveObjFlagDefinition sSaveObjFlagsFaron[] = {
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 10, 31},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_800},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_801},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_802},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_803},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 104},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 103},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 32},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 33},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_FARON_DISCOVERED},
|
|
};
|
|
|
|
static const dLytMapSaveObjFlagDefinition sSaveObjFlagsEldin[] = {
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_804},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_805},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_806},
|
|
{SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_807},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 5, 101},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 15, 114},
|
|
};
|
|
|
|
static const dLytMapSaveObjFlagDefinition sSaveObjFlagsLanayru[] = {
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 68},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 66},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 51},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 67},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 2},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 77},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 78},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 10},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 28},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 85},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 84},
|
|
{SAVE_OBJ_FLAG_KIND_SCENEFLAG, 9, 12},
|
|
};
|
|
|
|
void dLytMapMain_c::displaySaveObjs() {
|
|
for (int i = 0; i < mNumSaveObjs; i++) {
|
|
mSaveObjs[i].init();
|
|
}
|
|
|
|
s32 numFlags = ARRAY_LENGTH(sSaveObjFlagsFaron);
|
|
nw4r::lyt::Bounding **pBoundings = mpSaveObjBoundingsFaron;
|
|
const dLytMapSaveObjFlagDefinition *flagSet = sSaveObjFlagsFaron;
|
|
switch (mSurfaceProvince) {
|
|
case SURFACE_PROVINCE_ELDIN: {
|
|
pBoundings = mpSaveObjBoundingsEldin;
|
|
flagSet = sSaveObjFlagsEldin;
|
|
numFlags = ARRAY_LENGTH(sSaveObjFlagsEldin);
|
|
break;
|
|
}
|
|
case SURFACE_PROVINCE_LANAYRU: {
|
|
pBoundings = mpSaveObjBoundingsLanayru;
|
|
flagSet = sSaveObjFlagsLanayru;
|
|
numFlags = ARRAY_LENGTH(sSaveObjFlagsLanayru);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool isInFaronSothMode = false;
|
|
bool isInFaronFloodedMode = false;
|
|
|
|
if (mSurfaceProvince == SURFACE_PROVINCE_FARON) {
|
|
if (checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) &&
|
|
!checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) {
|
|
isInFaronSothMode = true;
|
|
} else if (checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED) &&
|
|
!checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) {
|
|
isInFaronFloodedMode = true;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < numFlags; i++) {
|
|
bool visible = false;
|
|
if (isInFaronSothMode) {
|
|
if (i == 0 || i == 9) {
|
|
visible = true;
|
|
}
|
|
} else if (isInFaronFloodedMode) {
|
|
if (i == 0 || i == 4 || i == 9) {
|
|
visible = true;
|
|
}
|
|
} else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_SCENEFLAG) {
|
|
visible = SceneflagManager::sInstance->checkSceneflagGlobal(flagSet[i].flagArea, flagSet[i].sceneFlag);
|
|
} else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_STORYFLAG) {
|
|
visible = checkStoryflag(flagSet[i].storyFlag);
|
|
}
|
|
// TODO - SetVisible clrlwi
|
|
pBoundings[i]->SetVisible(visible);
|
|
}
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_EventSaveObjSelect() {}
|
|
void dLytMapMain_c::executeState_EventSaveObjSelect() {
|
|
mSavePopup.setCurrentStatue(-1);
|
|
s32 currentSelected = getSelectedSaveObjIdx();
|
|
|
|
bool anyDecide = false;
|
|
for (int i = 0; i < mNumSaveObjs; i++) {
|
|
if (mSaveObjs[i].mStateMgr.isState(dLytMapSaveObj_c::StateID_Decide)) {
|
|
anyDecide = true;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < mNumSaveObjs; i++) {
|
|
mSaveObjs[i].mSelectRequest = false;
|
|
if (currentSelected == i && !anyDecide) {
|
|
mSaveObjs[i].mSelectRequest = true;
|
|
if (!mSaveObjs[i].mDecideRequest) {
|
|
mSavePopup.setCurrentStatue(i);
|
|
}
|
|
}
|
|
mSaveObjs[i].execute();
|
|
bool select = false;
|
|
if (mSaveObjs[i].mSelectRequest) {
|
|
if (*mSaveObjs[i].mStateMgr.getStateID() == dLytMapSaveObj_c::StateID_Select) {
|
|
select = true;
|
|
}
|
|
}
|
|
|
|
if (select && dPad::getDownTrigA()) {
|
|
mSaveObjs[i].mDecideRequest = true;
|
|
mSavePopup.setCurrentStatue(-1);
|
|
mSavePopup.hide(i);
|
|
}
|
|
}
|
|
|
|
field_0x8DC0 = currentSelected;
|
|
|
|
bool found = false;
|
|
s32 statueIdx = 0;
|
|
for (int i = 0; i < mNumSaveObjs; i++) {
|
|
if (mSaveObjs[i].mDecideFinished) {
|
|
found = true;
|
|
statueIdx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (found) {
|
|
const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx);
|
|
mSaveCaption.setLabel(def->statueLabel);
|
|
mSaveCaption.setType(def->type);
|
|
mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_In);
|
|
mStateMgr.changeState(StateID_EventSaveObjConfirmMsgWindow);
|
|
} else {
|
|
mSavePopup.execute();
|
|
}
|
|
|
|
for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) {
|
|
mHitChecks[i].resetCachedHitboxes();
|
|
mHitChecks[i].execute();
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSaveObjSelect() {}
|
|
|
|
static const dMapSaveObjDefinition sFaronSaveObjs[] = {
|
|
{ "F400", 0, 0, 10, 4, "SAVEOBJ_NAME_00"},
|
|
{ "F100", 0, 0, 50, 1, "SAVEOBJ_NAME_01"},
|
|
{ "F100", 0, 0, 51, 1, "SAVEOBJ_NAME_02"},
|
|
{ "F100", 0, 0, 52, 1, "SAVEOBJ_NAME_03"},
|
|
{ "F100", 0, 0, 53, 1, "SAVEOBJ_NAME_04"},
|
|
{ "F101", 0, 0, 13, 1, "SAVEOBJ_NAME_05"},
|
|
{ "F101", 0, 0, 14, 1, "SAVEOBJ_NAME_06"},
|
|
{ "F102", 3, 0, 2, 1, "SAVEOBJ_NAME_07"},
|
|
{"F102_1", 0, 0, 5, 1, "SAVEOBJ_NAME_08"},
|
|
{ "F401", 1, 0, 8, 4, "SAVEOBJ_NAME_28"},
|
|
};
|
|
static const dMapSaveObjDefinition sFloodedFaronSaveObj = {"F103", 0, 0, 9, 1, "SAVEOBJ_NAME_09"};
|
|
static const dMapSaveObjDefinition sFaronLoweredGoddessStatueSaveObj = {"F406", 1, 0, 5, 4, "SAVEOBJ_NAME_29"};
|
|
static const dMapSaveObjDefinition sEldinSaveObjs[] = {
|
|
{ "F200", 0, 0, 2, 2, "SAVEOBJ_NAME_10"},
|
|
{ "F200", 2, 0, 6, 2, "SAVEOBJ_NAME_11"},
|
|
{ "F200", 2, 0, 7, 2, "SAVEOBJ_NAME_12"},
|
|
{ "F200", 4, 0, 7, 2, "SAVEOBJ_NAME_13"},
|
|
{"F201_3", 0, 0, 3, 2, "SAVEOBJ_NAME_14"},
|
|
{ "D201", 10, 0, 2, 2, "SAVEOBJ_NAME_15"},
|
|
};
|
|
|
|
static const dMapSaveObjDefinition sLanayruSaveObjs[] = {
|
|
{"F300_1", 0, 0, 2, 3, "SAVEOBJ_NAME_16"},
|
|
{ "F300", 0, 0, 15, 3, "SAVEOBJ_NAME_17"},
|
|
{ "F300", 0, 0, 16, 3, "SAVEOBJ_NAME_18"},
|
|
{ "F300", 0, 0, 17, 3, "SAVEOBJ_NAME_19"},
|
|
{ "F300", 0, 0, 18, 3, "SAVEOBJ_NAME_20"},
|
|
{"F300_4", 0, 0, 16, 3, "SAVEOBJ_NAME_21"},
|
|
{"F300_4", 0, 0, 17, 3, "SAVEOBJ_NAME_22"},
|
|
{ "F301", 0, 0, 10, 3, "SAVEOBJ_NAME_23"},
|
|
{"F301_3", 0, 0, 10, 3, "SAVEOBJ_NAME_24"},
|
|
{"F301_4", 0, 0, 10, 3, "SAVEOBJ_NAME_25"},
|
|
{"F301_6", 0, 0, 10, 3, "SAVEOBJ_NAME_26"},
|
|
{ "F302", 0, 0, 12, 3, "SAVEOBJ_NAME_27"},
|
|
};
|
|
|
|
const dMapSaveObjDefinition *dLytMapMain_c::getSaveObjDefinition(s32 province, s32 index) const {
|
|
const dMapSaveObjDefinition *ret = nullptr;
|
|
switch (province) {
|
|
case SURFACE_PROVINCE_FARON: {
|
|
if (index == 4 && checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED) &&
|
|
!checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) {
|
|
ret = &sFloodedFaronSaveObj;
|
|
} else if (index == 9 && checkStoryflag(STORYFLAG_GODDESS_STATUE_FALLEN)) {
|
|
ret = &sFaronLoweredGoddessStatueSaveObj;
|
|
} else {
|
|
ret = &sFaronSaveObjs[index];
|
|
}
|
|
break;
|
|
}
|
|
case SURFACE_PROVINCE_ELDIN: {
|
|
ret = &sEldinSaveObjs[index];
|
|
break;
|
|
}
|
|
case SURFACE_PROVINCE_LANAYRU: {
|
|
ret = &sLanayruSaveObjs[index];
|
|
break;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void dLytMapMain_c::initializeState_EventSaveObjConfirmMsgWindow() {
|
|
// "Descend into this area? [1]Yes.[2-]No."
|
|
mFlowMgr.triggerEntryPoint(4, 17, 0, 0);
|
|
}
|
|
void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() {
|
|
if (!mFlowMgr.checkFinished()) {
|
|
return;
|
|
}
|
|
|
|
if (dLytMsgWindow_c::getInstance()->getTextOptionSelection() == 0) {
|
|
// confirm
|
|
dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10;
|
|
dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10;
|
|
s32 idx = 0;
|
|
s32 statueIdx = -1;
|
|
for (int i = 0; i < mNumSaveObjs; i++) {
|
|
if (mSaveObjs[i].mDecideFinished) {
|
|
statueIdx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx);
|
|
dScGame_c::GetInstance()->triggerEntrance(
|
|
def->stageName, def->room, def->layer, def->entrance, SpawnInfo::RETAIN_TOD, SpawnInfo::RETAIN_TRIAL,
|
|
dFader_c::FADER_GREY
|
|
);
|
|
dScGame_c::GetInstance()->setTargetingScreenPrio(0x8B);
|
|
dLytMap_c::GetInstance()->fn_80143A30();
|
|
mStateMgr.changeState(StateID_EventSaveObjDecide);
|
|
mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out);
|
|
} else {
|
|
// cancel
|
|
for (int i = 0; i < mNumSaveObjs; i++) {
|
|
mSaveObjs[i].init();
|
|
}
|
|
mStateMgr.changeState(StateID_EventSaveObjSelect);
|
|
mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out);
|
|
}
|
|
}
|
|
void dLytMapMain_c::finalizeState_EventSaveObjConfirmMsgWindow() {}
|
|
|
|
void dLytMapMain_c::initializeState_EventSaveObjDecide() {}
|
|
void dLytMapMain_c::executeState_EventSaveObjDecide() {}
|
|
void dLytMapMain_c::finalizeState_EventSaveObjDecide() {}
|
|
|
|
void dLytMapMain_c::checkCursorPointedAtMap() {
|
|
const mVec2_c *pos2d;
|
|
dLytMapGlobal_c *global = getGlobal();
|
|
bool pointerOnMap = true;
|
|
bool canPlaceBeacon = true;
|
|
|
|
pos2d = &dCsGame_c::GetInstance()->getCursorIf()->getCursorPos();
|
|
mVec3_c pos3d(0.0f, 0.0f, 0.0f);
|
|
global->unprojectFromMap(pos3d, *pos2d, global->getMapRotation());
|
|
|
|
f32 tmp = global->getField_0x28().x * 368.0f;
|
|
f32 nTmp = -tmp;
|
|
if (pos2d->x > tmp || pos2d->x < nTmp || pos2d->y > 209.0f || pos2d->y < -193.0f) {
|
|
// Pointer off screen?
|
|
pointerOnMap = false;
|
|
canPlaceBeacon = false;
|
|
}
|
|
|
|
if (pointerOnMap && (pos3d.x < field_0x8930.x || pos3d.x > field_0x893C.x || pos3d.z < field_0x8930.z ||
|
|
pos3d.z > field_0x893C.z)) {
|
|
// Pointer too close to the edge?
|
|
canPlaceBeacon = false;
|
|
}
|
|
|
|
if (pointerOnMap) {
|
|
for (int i = 0; i < MAP_MAIN_NUM_BOUNDINGS_NORMAL; i++) {
|
|
if (pos3d.x >= mBoundingWorldBounds[i].min.x && pos3d.x <= mBoundingWorldBounds[i].max.x &&
|
|
pos3d.z >= mBoundingWorldBounds[i].min.z && pos3d.z <= mBoundingWorldBounds[i].max.z) {
|
|
// Cannot place beacon when hovering over UI element (remocon, ...)
|
|
canPlaceBeacon = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
mPointerOnMap = pointerOnMap;
|
|
mPointerCanPlaceBeacon = canPlaceBeacon;
|
|
}
|
|
|
|
void dLytMap_c::build() {
|
|
d2d::setLytAllocator();
|
|
void *data = LayoutArcManager::GetInstance()->getLoadedData("Map2D");
|
|
mResAcc.attach(data, "");
|
|
mMapMain.build();
|
|
m2d::setLytAllocator();
|
|
mMapMain.setPriority(0x86);
|
|
// TODO there's another thing here at 0x91C0
|
|
}
|