diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 0f15472e..5640818f 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -409,10 +409,10 @@ d/lyt/d_lyt_msg_window_select_btn.cpp: .ctors start:0x804DB73C end:0x804DB740 d/lyt/d_lyt_msg_window_base.cpp: - .text start:0x80120A20 end:0x80120A98 + .text start:0x80120A20 end:0x80121068 d/lyt/d_lyt_msg_window_talk.cpp: - .text start:0x80120AA0 end:0x801223C8 + .text start:0x80121070 end:0x801223C8 .ctors start:0x804DB740 end:0x804DB744 d/lyt/d_lyt_msg_window_link.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 17c59398..a60350c6 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8190,11 +8190,11 @@ executeState_Out__10dLytNote_cFv = .text:0x80149260; // type:function size:0x100 finalizeState_Out__10dLytNote_cFv = .text:0x80149360; // type:function size:0x4 build__10dLytNote_cFPQ23d2d10ResAccIf_c = .text:0x80149370; // type:function size:0x144 remove__10dLytNote_cFv = .text:0x801494C0; // type:function size:0x50 -execute__10dLytNote_cFv = .text:0x80149510; // type:function size:0x124 -fn_80149640 = .text:0x80149640; // type:function size:0x10 -fn_80149650 = .text:0x80149650; // type:function size:0x10 +execute__10dLytNote_cFUc = .text:0x80149510; // type:function size:0x124 +getStateID__79sStateMgr_c<10dLytNote_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80149640; // type:function size:0x10 +executeState__79sStateMgr_c<10dLytNote_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80149650; // type:function size:0x10 draw__10dLytNote_cFv = .text:0x80149660; // type:function size:0x8 -fn_80149670 = .text:0x80149670; // type:function size:0x8C +setTransform__10dLytNote_cFRQ34nw4r3lyt4Pane = .text:0x80149670; // type:function size:0x8C getField0x260__10dLytNote_cCFv = .text:0x80149700; // type:function size:0x8 setFrame__10dLytNote_cFf = .text:0x80149710; // type:function size:0x58 finalizeState__25sFStateID_c<10dLytNote_c>CFR10dLytNote_c = .text:0x80149770; // type:function size:0x30 diff --git a/configure.py b/configure.py index d9a7592f..af990a33 100644 --- a/configure.py +++ b/configure.py @@ -417,7 +417,7 @@ config.libs = [ Object(NonMatching, "d/lyt/d_lyt_auto_explain.cpp"), Object(NonMatching, "d/lyt/d_lyt_map_capture.cpp"), Object(NonMatching, "d/lyt/d_lyt_map.cpp"), - Object(NonMatching, "d/lyt/d_lyt_note.cpp"), + Object(Matching, "d/lyt/d_lyt_note.cpp"), Object(Matching, "d/lyt/d_lyt_battery.cpp"), Object(NonMatching, "d/lyt/d_lyt_area_caption.cpp"), Object(NonMatching, "d/lyt/d_lyt_wipe.cpp"), diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index ec9c25ba..0bb7d45f 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -201,6 +201,10 @@ struct AnmGroupBase_c { syncAnmFrame(); } + inline f32 getEndFrameRaw() const { + return mpFrameCtrl->getEndFrameRaw(); + } + inline f32 getFrame() const { return mpFrameCtrl->getFrame(); } diff --git a/include/d/lyt/d_lyt_note.h b/include/d/lyt/d_lyt_note.h index f6e5978f..6f702fcb 100644 --- a/include/d/lyt/d_lyt_note.h +++ b/include/d/lyt/d_lyt_note.h @@ -3,7 +3,6 @@ #include "d/lyt/d2d.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" // size 0x27C class dLytNote_c { @@ -13,9 +12,11 @@ public: bool build(d2d::ResAccIf_c *); bool remove(); - void execute(); + void execute(u8 alpha); void draw(); + void setTransform(nw4r::lyt::Pane &p); + f32 getField0x260() const; void setFrame(f32); @@ -25,15 +26,15 @@ private: STATE_FUNC_DECLARE(dLytNote_c, Move); STATE_FUNC_DECLARE(dLytNote_c, Out); - /* 0x004 */ UI_STATE_MGR_DECLARE(dLytNote_c); + /* 0x004 */ STATE_MGR_DECLARE(dLytNote_c); /* 0x040 */ d2d::LytBase_c mLyt; /* 0x0D0 */ d2d::AnmGroup_c mAnmGroups[6]; /* 0x250 */ nw4r::lyt::Pane *mpPane; /* 0x254 */ mVec3_c mTranslate; /* 0x260 */ f32 field_0x260; - /* 0x264 */ u32 field_0x264; - /* 0x268 */ s32 field_0x268; - /* 0x26C */ u32 field_0x26C; + /* 0x264 */ s32 mOutAnim; + /* 0x268 */ s32 mInAnim; + /* 0x26C */ s32 field_0x26C; /* 0x270 */ u8 field_0x270; /* 0x271 */ u8 field_0x271; /* 0x272 */ u8 field_0x272; diff --git a/include/m/m2d.h b/include/m/m2d.h index 12d7ba31..4cb163bc 100644 --- a/include/m/m2d.h +++ b/include/m/m2d.h @@ -105,6 +105,10 @@ public: return f >= end ? 0.0f : f; } + inline f32 getEndFrameRaw() const { + return mEndFrame; + } + private: inline bool notLooping() const { return (mFlags & FLAG_NO_LOOP) != 0; diff --git a/include/nw4r/lyt/lyt_pane.h b/include/nw4r/lyt/lyt_pane.h index 2e1d63ae..a1fa6327 100644 --- a/include/nw4r/lyt/lyt_pane.h +++ b/include/nw4r/lyt/lyt_pane.h @@ -160,7 +160,7 @@ public: protected: Pane *mpParent; // at 0x0C ut::LinkList mChildList; // at 0x10 - ut::LinkList mAnimList; // at 0x1C; + ut::LinkList mAnimList; // at 0x1C Material *mpMaterial; // at 0x28 math::VEC3 mTranslate; // at 0x2C math::VEC3 mRotate; // at 0x38 diff --git a/src/d/lyt/d_lyt_note.cpp b/src/d/lyt/d_lyt_note.cpp index c9cc356a..e31767ed 100644 --- a/src/d/lyt/d_lyt_note.cpp +++ b/src/d/lyt/d_lyt_note.cpp @@ -1,34 +1,15 @@ #include "d/lyt/d_lyt_note.h" +#include "common.h" +#include "m/m_mtx.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/math/math_types.h" + STATE_DEFINE(dLytNote_c, Wait); STATE_DEFINE(dLytNote_c, In); STATE_DEFINE(dLytNote_c, Move); STATE_DEFINE(dLytNote_c, Out); -void dLytNote_c::initializeState_Wait() { - field_0x273 = 0; -} -void dLytNote_c::executeState_Wait() { - if (field_0x270 != 0) { - mStateMgr.changeState(StateID_In); - } -} -void dLytNote_c::finalizeState_Wait() {} - -void dLytNote_c::initializeState_In() {} -void dLytNote_c::executeState_In() {} -void dLytNote_c::finalizeState_In() {} - -void dLytNote_c::initializeState_Move() { - field_0x273 = 1; -} -void dLytNote_c::executeState_Move() {} -void dLytNote_c::finalizeState_Move() {} - -void dLytNote_c::initializeState_Out() {} -void dLytNote_c::executeState_Out() {} -void dLytNote_c::finalizeState_Out() {} - static const d2d::LytBrlanMapping brlanMap[] = { { "suiryuScore_00_noteGet.brlan", "G_mark_00"}, { "suiryuScore_00_noteGetLoop.brlan", "G_mark_00"}, @@ -44,6 +25,116 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define NOTE_ANIM_LOST 3 #define NOTE_ANIM_FIX 4 #define NOTE_ANIM_COLOR 5 +#define NOTE_ANIM_INVALID 6 + +void dLytNote_c::initializeState_Wait() { + field_0x273 = 0; +} + +void dLytNote_c::executeState_Wait() { + if (field_0x270 != 0) { + mStateMgr.changeState(StateID_In); + } +} + +void dLytNote_c::finalizeState_Wait() {} + +void dLytNote_c::initializeState_In() { + field_0x274 = 0; + mpPane->SetVisible(true); + mAnmGroups[NOTE_ANIM_GET].setAnimEnable(true); + mAnmGroups[NOTE_ANIM_GET].setFrame(0.0f); +} + +void dLytNote_c::executeState_In() { + if (field_0x270 == 0) { + mAnmGroups[NOTE_ANIM_GET].setToEnd(); + mAnmGroups[NOTE_ANIM_GET].setAnimEnable(false); + mStateMgr.changeState(StateID_Out); + } else if (mAnmGroups[NOTE_ANIM_GET].isEndReached()) { + mAnmGroups[NOTE_ANIM_GET].setAnimEnable(false); + field_0x260 = 0.0f; + mInAnim = NOTE_ANIM_GET_LOOP; + mAnmGroups[mInAnim].setAnimEnable(true); + mAnmGroups[mInAnim].setFrame(0.0f); + mStateMgr.changeState(StateID_Move); + } + + if (mAnmGroups[NOTE_ANIM_GET].isFlag2()) { + mAnmGroups[NOTE_ANIM_GET].play(); + } +} + +void dLytNote_c::finalizeState_In() {} + +void dLytNote_c::initializeState_Move() { + field_0x273 = 1; +} + +void dLytNote_c::executeState_Move() { + if (field_0x270 == 0) { + mAnmGroups[mInAnim].setAnimEnable(false); + mStateMgr.changeState(StateID_Out); + } else if (field_0x272 != 0 && mInAnim == NOTE_ANIM_GET_LOOP) { + mAnmGroups[mInAnim].setAnimEnable(false); + field_0x260 = 0.0f; + mInAnim = NOTE_ANIM_LOST_LOOP; + // Maybe an inline? + f32 progress = mAnmGroups[mInAnim].getEndFrameRaw(); + f32 nul = 0.0f; + if (nul >= progress) { + field_0x260 = nul - progress; + } + mAnmGroups[mInAnim].setFrame(field_0x260); + mAnmGroups[mInAnim].setAnimEnable(true); + } else { + if (field_0x272 == 0 && mInAnim == NOTE_ANIM_LOST_LOOP) { + mAnmGroups[mInAnim].setAnimEnable(false); + field_0x260 = 0.0f; + mInAnim = NOTE_ANIM_GET_LOOP; + // Maybe an inline? + f32 progress = mAnmGroups[mInAnim].getEndFrameRaw(); + f32 nul = 0.0f; + if (nul >= progress) { + field_0x260 = nul - progress; + } + mAnmGroups[mInAnim].setFrame(field_0x260); + mAnmGroups[mInAnim].setAnimEnable(true); + } + } +} + +void dLytNote_c::finalizeState_Move() {} + +void dLytNote_c::initializeState_Out() { + mInAnim = NOTE_ANIM_INVALID; + field_0x273 = 0; + if (field_0x271) { + mOutAnim = NOTE_ANIM_FIX; + } else { + mOutAnim = NOTE_ANIM_LOST; + } + mAnmGroups[mOutAnim].setAnimEnable(true); + mAnmGroups[mOutAnim].setFrame(0.0f); +} + +void dLytNote_c::executeState_Out() { + if (field_0x274 != 0) { + mAnmGroups[mOutAnim].setToEnd(); + } + + if (mAnmGroups[mOutAnim].isEndReached()) { + mAnmGroups[mOutAnim].setAnimEnable(false); + mpPane->SetVisible(false); + mStateMgr.changeState(StateID_Wait); + } + + if (mAnmGroups[mOutAnim].isFlag2()) { + mAnmGroups[mOutAnim].play(); + } +} + +void dLytNote_c::finalizeState_Out() {} bool dLytNote_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); @@ -59,11 +150,10 @@ bool dLytNote_c::build(d2d::ResAccIf_c *resAcc) { static const char *sPaneName = "N_inOutAll_00"; mpPane = mLyt.findPane(sPaneName); mpPane->SetVisible(false); - // FPR Regswap const nw4r::math::VEC3 &translate = mpPane->GetTranslate(); - mTranslate.set(translate.x, translate.y, translate.z); - field_0x268 = 6; - field_0x264 = 4; + mTranslate.copyFrom(translate); + mInAnim = NOTE_ANIM_INVALID; + mOutAnim = NOTE_ANIM_FIX; field_0x260 = 0.0f; field_0x270 = 0; field_0x271 = 0; @@ -83,22 +173,45 @@ bool dLytNote_c::remove() { return true; } -void dLytNote_c::execute() { - // TODO +void dLytNote_c::execute(u8 alpha) { + mStateMgr.executeState(); + if (*mStateMgr.getStateID() != StateID_Wait) { + mpPane->SetTranslate(mTranslate); + mAnmGroups[NOTE_ANIM_COLOR].setFrame(field_0x26C); + mpPane->SetAlpha(alpha); + mLyt.calc(); + } + + if (mInAnim != NOTE_ANIM_INVALID) { + field_0x260 += 1.0f; + f32 nextFrame = mAnmGroups[mInAnim].getEndFrameRaw(); + if (field_0x260 >= nextFrame) { + field_0x260 -= nextFrame; + } + } } void dLytNote_c::draw() { mLyt.addToDrawList(); } +void dLytNote_c::setTransform(nw4r::lyt::Pane &p) { + // Cool, full on struct copy here + nw4r::math::MTX34 myMtx = p.GetGlobalMtx(); + mTranslate.x = myMtx.m[0][3]; + mTranslate.y = myMtx.m[1][3]; + mTranslate.z = 0.0f; +} + f32 dLytNote_c::getField0x260() const { return field_0x260; } void dLytNote_c::setFrame(f32 arg) { - if (field_0x268 != 6) { - // mysterious frsp here + if (mInAnim != 6) { field_0x260 = arg; - mAnmGroups[field_0x268].setFrame(arg); + // ??? + f32 newArg = (f64)arg; + mAnmGroups[mInAnim].setFrame(newArg); } }