This commit is contained in:
robojumper
2025-10-12 20:58:47 +02:00
parent 67dff946f2
commit 126e026bab
4 changed files with 152 additions and 28 deletions
+1 -1
View File
@@ -7993,7 +7993,7 @@ fn_80142B90 = .text:0x80142B90; // type:function size:0xEC
fn_80142C80 = .text:0x80142C80; // type:function size:0x8C
fn_80142D10__13dLytMapMain_cFlbR4mAng = .text:0x80142D10; // type:function size:0x80
fn_80142D90__13dLytMapMain_cFl = .text:0x80142D90; // type:function size:0x170
fn_80142F00__13dLytMapMain_cFR7mVec3_clUcRC7mVec3_cRC4mAng = .text:0x80142F00; // type:function size:0x158
fn_80142F00__13dLytMapMain_cFR7mVec3_clbRC7mVec3_cRC4mAng = .text:0x80142F00; // type:function size:0x158
fn_80143060__13dLytMapMain_cFR7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAng = .text:0x80143060; // type:function size:0xBC
fn_80143120__13dLytMapMain_cFl = .text:0x80143120; // type:function size:0xC0
fn_801431E0__13dLytMapMain_cFv = .text:0x801431E0; // type:function size:0x11C
+19
View File
@@ -75,6 +75,10 @@ public:
mpResAcc = resAcc;
}
void setPriorityDraw(u8 priority) {
mLyt.setPriority(priority);
}
private:
/* 0x0C */ m2d::ResAccIf_c *mpResAcc;
/* 0x10 */ d2d::LytBase_c mLyt;
@@ -96,6 +100,10 @@ public:
mpResAcc = resAcc;
}
void setPriorityDraw(u8 priority) {
mLyt.setPriority(priority);
}
private:
/* 0x0C */ m2d::ResAccIf_c *mpResAcc;
/* 0x10 */ d2d::LytBase_c mLyt;
@@ -344,6 +352,10 @@ public:
mpResAcc = resAcc;
}
void setPriorityDraw(u8 priority) {
mLyt.setPriority(priority);
}
void changeState(const sFStateID_c<lytItemCursor_c> &newState);
void pachinkoSetCharging(bool charging, f32 progress);
@@ -356,6 +368,7 @@ public:
void bowAimStart();
void bowReady();
private:
STATE_FUNC_DECLARE(lytItemCursor_c, Invisible);
STATE_FUNC_DECLARE(lytItemCursor_c, Bow);
@@ -439,6 +452,12 @@ public:
return &mCursorIf;
}
void setPriorityDraw(u8 priority) {
mLyt1.setPriorityDraw(priority);
mLyt2.setPriorityDraw(priority);
mCursor.setPriorityDraw(priority);
}
private:
static dCsGame_c *sInstance;
bool isForcedHidden() const;
+12 -6
View File
@@ -20,6 +20,10 @@
#include "s/s_State.hpp"
#include "toBeSorted/d_flow_mgr.h"
// TODO - this file uses a lot of `friend` classes because the necessary
// inlines might mess up weak function order. Let's get the order right
// first before introducing more problems...
class dAcTbox_c;
/** Bird Statue Definition (StatueSelectDestination) */
@@ -294,6 +298,8 @@ private:
};
class dLytMapFloorBtnMgr_c : public d2d::dSubPane {
friend class dLytMapMain_c;
public:
dLytMapFloorBtnMgr_c(dLytMapGlobal_c *global)
: mpGlobal(global), mpPane(nullptr), mStateMgr(*this, sStateID::null) {
@@ -342,8 +348,8 @@ public:
}
void checkPointedAtBtn();
private:
private:
/* 0x008 */ dLytMapGlobal_c *mpGlobal;
/* 0x00C */ UI_STATE_MGR_DECLARE(dLytMapFloorBtnMgr_c);
/* 0x048 */ d2d::dLytSub mLyt;
@@ -619,7 +625,7 @@ private:
MAP_EVENT_SIGNAL_ADD = 7,
MAP_EVENT_FIELD_MAP_CHANGE_8 = 8,
MAP_EVENT_GODDESS_CUBE = 9,
MAP_EVENT_SAVE_OBJ_MSG_WINDOW = 10,
MAP_EVENT_SAVE_OBJ = 10,
MAP_EVENT_11 = 11,
};
@@ -643,7 +649,7 @@ private:
s32 getSelectedSaveObjIdx() const;
f32 fn_80142D90(s32);
void fn_80142F00(mVec3_c &, s32 mapMode, u8, const mVec3_c &, const mAng &);
void fn_80142F00(mVec3_c &, s32 mapMode, bool, const mVec3_c &, const mAng &);
void fn_8013FB70(const mVec3_c &, f32);
bool fn_80141530() const;
bool fn_80142D10(s32, bool, mAng &);
@@ -723,7 +729,7 @@ private:
/* 0x8324 */ u8 _0x8324[0x8328 - 0x8324];
/* 0x8328 */ d2d::AnmGroup_c *mpOutAnmGroup;
/* 0x8328 */ d2d::AnmGroup_c *mpInOutAnmGroup;
// TODO - it appears the map abuses these hit check things
// to calculate Lyt bounding boxes, and it stores the
@@ -762,7 +768,7 @@ private:
/* 0x8C7C */ f32 field_0x8C7C;
/* 0x8C80 */ f32 field_0x8C80;
/* 0x8C84 */ u8 _0x8C84[0x8C88 - 0x8C84];
/* 0x8C84 */ u8 field_0x8C84;
/* 0x8C88 */ f32 field_0x8C88;
/* 0x8C8C */ f32 field_0x8C8C;
@@ -892,7 +898,7 @@ public:
}
bool isSomeMapFieldEq10() const {
return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SAVE_OBJ_MSG_WINDOW;
return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SAVE_OBJ;
}
void lightPillarRelated(s32 p1, s32 p2, s32 p3) {
+120 -21
View File
@@ -2400,7 +2400,7 @@ void dLytMapMain_c::loadStageProperties() {
void dLytMapMain_c::setupStage() {
loadStageProperties();
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
mLyt.findPane("N_skyloft_00")->SetVisible(false);
}
@@ -2468,7 +2468,7 @@ void dLytMapMain_c::setupStage() {
if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) {
mLyt.findPane("N_houkoul_00")->SetVisible(false);
}
if (mMapEvent != MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
if (mMapEvent != MAP_EVENT_SAVE_OBJ) {
loadTextboxes();
}
fn_8013AD50();
@@ -2659,7 +2659,7 @@ void dLytMapMain_c::execute() {
}
}
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
bool visible =
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE;
setSaveObjsVisible(visible);
@@ -2721,13 +2721,13 @@ void dLytMapMain_c::draw() {
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) {
mMapEvent == MAP_EVENT_SAVE_OBJ) {
initSaveObjs();
}
fn_80143120(-2);
mMarkers.drawPopups();
mPutIcon.draw();
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
mPopupInfo.draw();
}
@@ -3052,7 +3052,7 @@ void dLytMapMain_c::setButtonMessages(
void dLytMapMain_c::setCursorType() {
if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) {
if ((mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW ||
if ((mMapEvent == MAP_EVENT_SAVE_OBJ ||
((mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON) && mPointerOnMap)) ||
(mPointerCanPlaceBeacon && isPointingAtMainMap()) ||
(*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) ||
@@ -3530,17 +3530,116 @@ void dLytMapMain_c::setupFlags() {
}
}
void dLytMapMain_c::initializeState_In() {}
void dLytMapMain_c::initializeState_In() {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
displaySaveObjs();
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
mPopupInfo.mStateMgr.changeState(dLytMapPopupInfo_c::StateID_In);
}
}
if (field_0x8CAD != 0 || mMapEvent == MAP_EVENT_MAP_INTRO) {
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN];
} else {
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN_NO_CAM];
}
field_0x8C88 = mpInOutAnmGroup->getLastFrame();
mpInOutAnmGroup->bind(false);
mpInOutAnmGroup->setFrame(0.0f);
mPinIconAggregate.setScale(getGlobal()->getZoomFrame());
}
void dLytMapMain_c::executeState_In() {
field_0x8DBF = 1;
dLytMapGlobal_c *global = getGlobal();
// TODO this should explain most of mMapEvent
if ((!field_0x8CAD || !field_0x8C84) && field_0x8CAD) {
return;
}
f32 ratio = (mpInOutAnmGroup->getFrame() / mpInOutAnmGroup->getLastFrame());
f32 f1 = fn_80142D90(mCurrentMapMode) * 2.0f;
f32 f2 = fn_80142D90(mCurrentMapMode);
f32 f3 = cLib::easeOut(ratio, 3.0f);
global->setField_0x44(f1 + f3 * (f2 - f1));
mVec3_c v1;
if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE ||
mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) {
fn_80142F00(v1, mCurrentMapMode, true, global->getMapRotationCenter(), global->getField_0x56());
} else {
fn_80142F00(v1, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56());
}
global->setMapScroll(v1);
if (mpInOutAnmGroup->isEndReached()) {
dCsGame_c::GetInstance()->setPriorityDraw(0x8A);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnmGroups[MAP_MAIN_ANIM_IN].unbind();
mpInOutAnmGroup->unbind();
for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) {
mHitChecks[i].resetCachedHitboxes();
mHitChecks[i].execute();
}
switch (mMapEvent) {
default: {
mFloorBtnMgr.mStateMgr.changeState(dLytMapFloorBtnMgr_c::StateID_Wait);
mStateMgr.changeState(StateID_Active);
break;
}
case MAP_EVENT_SW_BANK_SMALL: {
mStateMgr.changeState(StateID_EventSwBankSmall_Step1);
break;
}
case MAP_EVENT_MAP_INTRO: {
mStateMgr.changeState(StateID_EventMapIntro_Step1);
break;
}
case MAP_EVENT_DUNGEON_MAP_GET: {
mStateMgr.changeState(StateID_EventDungeonMapGet_Step1);
break;
}
case MAP_EVENT_FIELD_MAP_CHANGE_5:
case MAP_EVENT_FIELD_MAP_CHANGE_8: {
mStateMgr.changeState(StateID_EventFieldMapChange_Step1);
break;
}
case MAP_EVENT_FOREST_MAP_CHANGE: {
mStateMgr.changeState(StateID_EventForestMapChange_Step1);
break;
}
case MAP_EVENT_SIGNAL_ADD: {
mStateMgr.changeState(StateID_EventSignalAdd_Step1);
break;
}
case MAP_EVENT_GODDESS_CUBE: {
mStateMgr.changeState(StateID_EventGoddessCube_Step1);
break;
}
case MAP_EVENT_SAVE_OBJ: {
displaySaveObjs();
mStateMgr.changeState(StateID_EventSaveObjMsgWindow);
break;
}
}
}
if (mpInOutAnmGroup->isBound()) {
mpInOutAnmGroup->play();
}
}
void dLytMapMain_c::finalizeState_In() {
if (fn_80141530()) {
dBase_c::s_NextExecuteControlFlags |= dBase_c::BASE_PROP_0x10;
}
dBase_c::s_DrawControlFlags |= dBase_c::BASE_PROP_0x10;
}
void dLytMapMain_c::finalizeState_In() {}
s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const {
s32 ret = AREAGROUP_MAX;
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
switch (mSurfaceProvince) {
case SURFACE_PROVINCE_FARON: ret = AREAGROUP_FARON; break;
case SURFACE_PROVINCE_ELDIN: ret = AREAGROUP_ELDIN; break;
@@ -3569,7 +3668,7 @@ s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const {
s32 dLytMapMain_c::getRoomType() const {
s32 ret = ROOMTYPE_FIELD;
s32 stifRoomType = dStageMgr_c::GetInstance()->getSTIFRoomType();
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
ret = ROOMTYPE_FIELD;
}
@@ -3935,19 +4034,19 @@ void dLytMapMain_c::finalizeState_Active() {
}
void dLytMapMain_c::initializeState_Out() {
if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) {
if (mMapEvent == MAP_EVENT_SAVE_OBJ) {
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];
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT];
} else {
mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM];
mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM];
}
mpOutAnmGroup->bind(false);
mpOutAnmGroup->setFrame(0.0f);
field_0x8C8C = mpOutAnmGroup->getLastFrame();
mpInOutAnmGroup->bind(false);
mpInOutAnmGroup->setFrame(0.0f);
field_0x8C8C = mpInOutAnmGroup->getLastFrame();
if (fn_80141530()) {
dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10;
@@ -3956,20 +4055,20 @@ void dLytMapMain_c::initializeState_Out() {
dPadNav::setNavEnabled(false, false);
}
void dLytMapMain_c::executeState_Out() {
if (mpOutAnmGroup->isEndReached()) {
if (mpInOutAnmGroup->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();
mpInOutAnmGroup->unbind();
field_0x8DBF = 0;
mStateMgr.changeState(StateID_Invisible);
}
}
if (mpOutAnmGroup->isBound()) {
mpOutAnmGroup->play();
if (mpInOutAnmGroup->isBound()) {
mpInOutAnmGroup->play();
}
}
void dLytMapMain_c::finalizeState_Out() {}