diff --git a/config/SOUE01/rels/d_a_npc_saltalkNP/symbols.txt b/config/SOUE01/rels/d_a_npc_saltalkNP/symbols.txt index 163a0302..79d5f525 100644 --- a/config/SOUE01/rels/d_a_npc_saltalkNP/symbols.txt +++ b/config/SOUE01/rels/d_a_npc_saltalkNP/symbols.txt @@ -51,9 +51,9 @@ acNpc_vt_0xEC__8dAcNpc_cFv = .text:0x00000B60; // type:function size:0x8 getObjectListEntry__8dAcNpc_cFv = .text:0x00000B70; // type:function size:0x8 acNpc_vt_0xE4__8dAcNpc_cFv = .text:0x00000B80; // type:function size:0x8 acNpc_vt_0xE0__8dAcNpc_cFv = .text:0x00000B90; // type:function size:0x8 -eventFlowSwitch4__8dAcNpc_cFv = .text:0x00000BA0; // type:function size:0x8 -eventFlowSwitch3__8dAcNpc_cFv = .text:0x00000BB0; // type:function size:0x8 -eventFlowSwitch2__8dAcNpc_cFv = .text:0x00000BC0; // type:function size:0x8 +eventFlowSwitch3__8dAcNpc_cFUl = .text:0x00000BA0; // type:function size:0x8 +eventFlowSwitch2__8dAcNpc_cFUl = .text:0x00000BB0; // type:function size:0x8 +eventFlowSwitch1__8dAcNpc_cFUl = .text:0x00000BC0; // type:function size:0x8 acNpc_vt_0x98__8dAcNpc_cFv = .text:0x00000BD0; // type:function size:0x8 acNpc_vt_0x94__8dAcNpc_cFv = .text:0x00000BE0; // type:function size:0x8 acNpc_vt_0x90__8dAcNpc_cFv = .text:0x00000BF0; // type:function size:0x8 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f1ea4879..1aebfd41 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7046,17 +7046,17 @@ __dt__30sFStateID_c<15dLytMsgWindow_c>Fv = .text:0x8011C7E0; // type:function si isSameName__30sFStateID_c<15dLytMsgWindow_c>CFPCc = .text:0x8011C840; // type:function size:0x88 __ct__15SelectBtnHelperFv = .text:0x8011C8D0; // type:function size:0x60 __dt__15SelectBtnHelperFv = .text:0x8011C930; // type:function size:0x40 -fn_8011C970 = .text:0x8011C970; // type:function size:0x6C -fn_8011C9E0 = .text:0x8011C9E0; // type:function size:0x4 -fn_8011C9F0 = .text:0x8011C9F0; // type:function size:0xCC -fn_8011CAC0 = .text:0x8011CAC0; // type:function size:0x138 -fn_8011CC00 = .text:0x8011CC00; // type:function size:0x524 -fn_8011D130 = .text:0x8011D130; // type:function size:0x558 -fn_8011D690 = .text:0x8011D690; // type:function size:0xC4 -fn_8011D760 = .text:0x8011D760; // type:function size:0x37C -fn_8011DAE0 = .text:0x8011DAE0; // type:function size:0x5E0 -fn_8011E0C0 = .text:0x8011E0C0; // type:function size:0x50 -fn_8011E110 = .text:0x8011E110; // type:function size:0x38 +init__15SelectBtnHelperFv = .text:0x8011C970; // type:function size:0x6C +remove__15SelectBtnHelperFv = .text:0x8011C9E0; // type:function size:0x4 +resetCursor__15SelectBtnHelperFv = .text:0x8011C9F0; // type:function size:0xCC +execute__15SelectBtnHelperFv = .text:0x8011CAC0; // type:function size:0x138 +handleCursorInput__15SelectBtnHelperFv = .text:0x8011CC00; // type:function size:0x524 +handleButtonInput__15SelectBtnHelperFv = .text:0x8011D130; // type:function size:0x558 +getAngleForButtonIdx__15SelectBtnHelperCFl = .text:0x8011D690; // type:function size:0xC4 +hasNewFSStickButtonSelect__15SelectBtnHelperCFv = .text:0x8011D760; // type:function size:0x37C +calculatePointedAtButton__15SelectBtnHelperFff = .text:0x8011DAE0; // type:function size:0x5E0 +convertScreenPosToDpdPos__15SelectBtnHelperCFP7mVec2_cP7mVec2_c = .text:0x8011E0C0; // type:function size:0x50 +fn_8011E110__15SelectBtnHelperCF7mVec2_c = .text:0x8011E110; // type:function size:0x38 initializeState_Wait__29dLytMsgWindowSelectBtnParts_cFv = .text:0x8011E150; // type:function size:0x4 executeState_Wait__29dLytMsgWindowSelectBtnParts_cFv = .text:0x8011E160; // type:function size:0xA4 changeState__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8011E210; // type:function size:0x10 @@ -7073,7 +7073,7 @@ finalizeState_Off__29dLytMsgWindowSelectBtnParts_cFv = .text:0x8011E500; // type init__29dLytMsgWindowSelectBtnParts_cFv = .text:0x8011E510; // type:function size:0x54 execute__29dLytMsgWindowSelectBtnParts_cFv = .text:0x8011E570; // type:function size:0x4C executeState__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8011E5C0; // type:function size:0x10 -fn_8011E5D0__24dLytMsgWindowSelectBtn_cFUlb = .text:0x8011E5D0; // type:function size:0x138 +requestIn__24dLytMsgWindowSelectBtn_cFlb = .text:0x8011E5D0; // type:function size:0x138 changeState__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8011E710; // type:function size:0x10 initializeState_Wait__24dLytMsgWindowSelectBtn_cFv = .text:0x8011E720; // type:function size:0x2C executeState_Wait__24dLytMsgWindowSelectBtn_cFv = .text:0x8011E750; // type:function size:0x4 @@ -7101,7 +7101,7 @@ remove__24dLytMsgWindowSelectBtn_cFv = .text:0x8011F920; // type:function size:0 execute__24dLytMsgWindowSelectBtn_cFv = .text:0x8011F9B0; // type:function size:0x444 executeState__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8011FE00; // type:function size:0x10 draw__24dLytMsgWindowSelectBtn_cFv = .text:0x8011FE10; // type:function size:0x34 -fn_8011FE50 = .text:0x8011FE50; // type:function size:0x24 +getSelectBtnMode__24dLytMsgWindowSelectBtn_cFv = .text:0x8011FE50; // type:function size:0x24 getName__24dLytMsgWindowSelectBtn_cCFv = .text:0x8011FE80; // type:function size:0x8 getLyt__24dLytMsgWindowSelectBtn_cFv = .text:0x8011FE90; // type:function size:0x8 getPane__24dLytMsgWindowSelectBtn_cFv = .text:0x8011FEA0; // type:function size:0x8 @@ -8515,7 +8515,7 @@ fn_80152E20 = .text:0x80152E20; // type:function size:0xC8 fn_80152EF0 = .text:0x80152EF0; // type:function size:0x8 fn_80152F00 = .text:0x80152F00; // type:function size:0x8 fn_80152F10__18dLytSystemWindow_cFv = .text:0x80152F10; // type:function size:0x10 -fn_80152F20 = .text:0x80152F20; // type:function size:0x18 +setSelectBtn__18dLytSystemWindow_cFff = .text:0x80152F20; // type:function size:0x18 setProperties__18dLytSystemWindow_cFPCcbPCw = .text:0x80152F40; // type:function size:0x8 fn_80152F50__18dLytSystemWindow_cCFv = .text:0x80152F50; // type:function size:0x8 fn_80152F60__18dLytSystemWindow_cCFv = .text:0x80152F60; // type:function size:0x8 @@ -33101,9 +33101,9 @@ __vt__13dLytTextLight = .data:0x8051BCB4; // type:object size:0xC __vt__13dLytTextSword = .data:0x8051BCC0; // type:object size:0xC lbl_8051BCCC = .data:0x8051BCCC; // type:object size:0x600 __vt__30sFStateID_c<15dLytMsgWindow_c> = .data:0x8051C2CC; // type:object size:0x34 -lbl_8051C300 = .data:0x8051C300; // type:object size:0xC +lbl_8051C300 = .data:0x8051C300; // type:object size:0x9 data:string lbl_8051C30C = .data:0x8051C30C; // type:object size:0xC data:string -lbl_8051C318 = .data:0x8051C318; // type:object size:0x10 +lbl_8051C318 = .data:0x8051C318; // type:object size:0xD data:string lbl_8051C328 = .data:0x8051C328; // type:object size:0x18 lbl_8051C340 = .data:0x8051C340; // type:object size:0x10 lbl_8051C350 = .data:0x8051C350; // type:object size:0x20 data:string diff --git a/include/d/d_lyt_hio.h b/include/d/d_lyt_hio.h index cd9defb3..3a34f070 100644 --- a/include/d/d_lyt_hio.h +++ b/include/d/d_lyt_hio.h @@ -153,6 +153,34 @@ public: return sInstance; } + f32 getField0x770() const { + return field_0x770; + } + + f32 getField0x774() const { + return field_0x774; + } + + f32 getField0x778() const { + return field_0x778; + } + + f32 getField0x77C() const { + return field_0x77C; + } + + f32 getField0x780() const { + return field_0x780; + } + + f32 getField0x784() const { + return field_0x784; + } + + s32 getField0x796() const { + return field_0x796; + } + s16 getMsgWindowWaitDelay() const { return mMsgWindowWaitDelay; } diff --git a/include/d/d_tag_processor.h b/include/d/d_tag_processor.h index e8f44c16..e7a63110 100644 --- a/include/d/d_tag_processor.h +++ b/include/d/d_tag_processor.h @@ -38,9 +38,9 @@ public: void somethingWithScrapperAndMusic(wchar_t* src); void changeScale(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, bool); - wchar_t *writeItem(wchar_t *dest, wchar_t *src, s32 *, s32); - wchar_t *writeStringArg(wchar_t *dest, wchar_t *src, s32 *, s32); - wchar_t *writeNumericArg(wchar_t *dest, wchar_t *src, s32 *, s32); + wchar_t *writeItem(wchar_t *dest, wchar_t *src, s32 *, bool isProcessingOption); + wchar_t *writeStringArg(wchar_t *dest, wchar_t *src, s32 *, bool isProcessingOption); + wchar_t *writeNumericArg(wchar_t *dest, wchar_t *src, s32 *, bool isProcessingOption); void fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); void drawIcon(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); void calcRectIcon(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, wchar_t *ptr); @@ -72,9 +72,9 @@ public: static f32 fn_800B8040(s8, u32); wchar_t *writeSingleCharacter(wchar_t, wchar_t *, s32 *); - wchar_t *writeTextNormal(const wchar_t *src, wchar_t *dest, s32 *, u8 cmdLen, s32); - wchar_t *writeHeroname(wchar_t *dest, s32 *, s32); - wchar_t *writeSingularOrPluralWord(wchar_t *dest, wchar_t *src, s32 *, s32); + wchar_t *writeTextNormal(const wchar_t *src, wchar_t *dest, s32 *, u8 cmdLen, bool isProcessingOption); + wchar_t *writeHeroname(wchar_t *dest, s32 *, bool isProcessingOption); + wchar_t *writeSingularOrPluralWord(wchar_t *dest, wchar_t *src, s32 *, bool isProcessingOption); void fn_800B5520(wchar_t *src); void saveIconWidth(dTextBox_c *textBox, wchar_t *cmd, f32); void configureWriterForIcon(nw4r::ut::TextWriterBase *, nw4r::ut::PrintContext *ctx, u16 c, s32); @@ -116,15 +116,15 @@ public: } u8 getField_0x90E() const { - return field_0x90E; + return mCurrentOptionIdx; } s32 getField_0x824() const { return field_0x824; } - s32 getField_0x828() const { - return field_0x828; + s32 getCancelBtnIdx() const { + return mCancelBtnIdx; } s32 getField_0x82C() const { @@ -139,8 +139,8 @@ public: mMsgWindowSubtype = type; } - void setField_0x828(s32 val) { - field_0x828 = val; + void setCancelBtnIdx(s32 val) { + mCancelBtnIdx = val; } void setField_0x82C(s32 val) { @@ -165,15 +165,15 @@ public: } void setField_0x90E(u8 val) { - field_0x90E = val; + mCurrentOptionIdx = val; } void setField_0xEE0(u8 val) { field_0xEE0 = val; } - void setField_0xEE1(u8 val) { - field_0xEE1 = val; + void setIsShadowText(bool val) { + mIsShadowText = val; } void setField_0xEE2(u8 val) { @@ -184,35 +184,57 @@ public: field_0xEE3 = val; } - wchar_t *getBuf(s32 idx) { - return field_0x008[idx]; + wchar_t *getOptionString(s32 idx) { + return mOptionBufs[idx]; } LineData getLineData() const { return mLineData; } -private: - wchar_t *getTmpBuffer() { - return field_0x008[field_0x90E - 1]; + u8 getOptionSound(s32 idx) const { + return mOptionSound[idx]; } - void onWriteTmpBuffer() { - if (field_0x90E - 1 < 4) { - field_0x808[field_0x90E - 1]++; +private: + enum Cmd_e { + TAG_CMD_SCALE = 0x2, + TAG_CMD_COLOR = 0x3, + TAG_CMD_0x0F0F0F0E = 0x0F0F0F0E, + TAG_CMD_0x0F0F0F0F = 0x0F0F0F0F, + TAG_CMD_OPTION_0 = 0x10000, + TAG_CMD_OPTION_1 = 0x10001, + TAG_CMD_OPTION_2 = 0x10002, + TAG_CMD_OPTION_3 = 0x10003, + + TAG_CMD_WRITE_HERONAME = 0x20000, + TAG_CMD_WRITE_ITEM = 0x20001, + TAG_CMD_WRITE_STRING_ARG = 0x20002, + TAG_CMD_WRITE_NUMERIC_ARG = 0x20003, + + TAG_CMD_WRITE_WORD = 0x30004, + }; + + wchar_t *getOptionBuf() { + return mOptionBufs[mCurrentOptionIdx - 1]; + } + + void onWriteOptionBuf() { + if (mCurrentOptionIdx - 1 < 4) { + mOptionLengths[mCurrentOptionIdx - 1]++; } } /* 0x004 */ dTextBox_c *mpTextBox; - /* 0x008 */ wchar_t field_0x008[4][256]; - /* 0x808 */ wchar_t field_0x808[4]; + /* 0x008 */ wchar_t mOptionBufs[4][256]; + /* 0x808 */ u16 mOptionLengths[4]; /* 0x810 */ f32 field_0x810; /* 0x814 */ f32 field_0x814; /* 0x818 */ f32 field_0x818; /* 0x81C */ s32 field_0x81C; /* 0x820 */ s32 field_0x820; /* 0x824 */ u32 field_0x824; - /* 0x828 */ s32 field_0x828; + /* 0x828 */ s32 mCancelBtnIdx; /* 0x82C */ s32 field_0x82C; /* 0x830 */ s32 field_0x830; /* 0x834 */ s32 mPauseFramesLeft; @@ -252,13 +274,13 @@ private: /* 0x908 */ f32 field_0x908; /* 0x90C */ u8 mMsgWindowSubtype; /* 0x90D */ u8 field_0x90D; - /* 0x90E */ u8 field_0x90E; - /* 0x90F */ u8 field_0x90F[4]; + /* 0x90E */ u8 mCurrentOptionIdx; + /* 0x90F */ u8 mOptionSound[4]; /* 0x914 */ LineData mLineData; /* 0x9E0 */ wchar_t mStringArgs[8][64]; /* 0xDE0 */ u8 field_0xDE0[0xEE0 - 0xDE0]; /* 0xEE0 */ u8 field_0xEE0; - /* 0xEE1 */ u8 field_0xEE1; + /* 0xEE1 */ bool mIsShadowText; /* 0xEE2 */ u8 field_0xEE2; /* 0xEE3 */ u8 field_0xEE3; /* 0xEE4 */ u8 field_0xEE4; diff --git a/include/d/lyt/d_lyt_cursor_stick.h b/include/d/lyt/d_lyt_cursor_stick.h index ab8bdb6b..84f7293b 100644 --- a/include/d/lyt/d_lyt_cursor_stick.h +++ b/include/d/lyt/d_lyt_cursor_stick.h @@ -29,6 +29,10 @@ public: mShouldBeOn = value; } + static dLytCursorStick_c *GetInstance() { + return sInstance; + } + private: bool build_(); bool remove_(); diff --git a/include/d/lyt/d_lyt_system_window.h b/include/d/lyt/d_lyt_system_window.h index 6e1b1ab1..838edc69 100644 --- a/include/d/lyt/d_lyt_system_window.h +++ b/include/d/lyt/d_lyt_system_window.h @@ -85,6 +85,7 @@ public: bool fn_80152F60() const; bool fn_80152F70() const; bool fn_80152F80() const; + static void setSelectBtn(f32 angle, f32 length); private: static dLytSystemWindow_c *sInstance; diff --git a/include/d/lyt/d_textbox.h b/include/d/lyt/d_textbox.h index e92c39a8..35669923 100644 --- a/include/d/lyt/d_textbox.h +++ b/include/d/lyt/d_textbox.h @@ -36,8 +36,8 @@ public: nw4r::lyt::TextBox::SetFontSize(value); } - void set0x1F6(u8 val) { - field_0x1F6 = val; + void setIsShadow(bool val) { + mIsShadowTextBox = val; } void set0x1F8(u8 val) { @@ -109,7 +109,7 @@ private: /* 0x1C1 */ u8 mWindowSubtype; /* 0x1C4 */ f32 mLineWidths[10]; /* 0x1EC */ bool mbOvers[10]; - /* 0x1F6 */ u8 field_0x1F6; + /* 0x1F6 */ bool mIsShadowTextBox; /* 0x1F7 */ u8 field_0x1F7; /* 0x1F8 */ u8 field_0x1F8; /* 0x1F9 */ bool field_0x1F9; diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index a5826546..dcb5bd2f 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -482,6 +482,31 @@ public: } } + static void setSelectBtn(f32 angle, f32 length) { + if (sInstance != nullptr) { + dLytMeterMain_c *main = &sInstance->mMain; + main->mItemSelect.setSelectBtn(angle, length); + main->mMinusBtn.setSelectBtn(angle, length); + main->mDowsing.setSelectBtn(angle, length); + } + } + + static f32 getSelectBtnArrowAngle() { + if (sInstance != nullptr) { + return sInstance->mMain.mItemSelect.getArrowRotation(); + } else { + return 0.0f; + } + } + + static f32 getSelectBtnArrowLength() { + if (sInstance != nullptr) { + return sInstance->mMain.mItemSelect.getArrowLength(); + } else { + return 0.0f; + } + } + dLytMeterMain_c::BasicPosition_e getBasicPosition() const { return (dLytMeterMain_c::BasicPosition_e)mMain.mBasicPosition; } diff --git a/include/d/lyt/meter/d_lyt_meter_dowsing.h b/include/d/lyt/meter/d_lyt_meter_dowsing.h index 17659593..a95a3d29 100644 --- a/include/d/lyt/meter/d_lyt_meter_dowsing.h +++ b/include/d/lyt/meter/d_lyt_meter_dowsing.h @@ -164,6 +164,11 @@ public: field_0x54E0 = value; } + void setSelectBtn(f32 angle, f32 length) { + mArrowRotation = angle; + mArrowLength = length; + } + private: void setItemName(s32 id); void setMessage(s32 id); diff --git a/include/d/lyt/meter/d_lyt_meter_item_select.h b/include/d/lyt/meter/d_lyt_meter_item_select.h index 18390b1d..ffe3d591 100644 --- a/include/d/lyt/meter/d_lyt_meter_item_select.h +++ b/include/d/lyt/meter/d_lyt_meter_item_select.h @@ -207,6 +207,19 @@ public: return field_0x5794; } + void setSelectBtn(f32 angle, f32 length) { + mArrowRotation = angle; + mArrowLength = length; + } + + f32 getArrowRotation() const { + return mArrowRotation; + } + + f32 getArrowLength() const { + return mArrowLength; + } + private: void setBtnItem(s32 internalItem); void realizeSelectedWheelItem(); diff --git a/include/d/lyt/meter/d_lyt_meter_minus_btn.h b/include/d/lyt/meter/d_lyt_meter_minus_btn.h index 30fb1830..f55b863c 100644 --- a/include/d/lyt/meter/d_lyt_meter_minus_btn.h +++ b/include/d/lyt/meter/d_lyt_meter_minus_btn.h @@ -133,6 +133,11 @@ public: bool fn_800F75E0() const; bool fn_800F7600() const; + void setSelectBtn(f32 angle, f32 length) { + mArrowRotation = angle; + mArrowLength = length; + } + private: bool shouldCall() const; void fn_800F7300(); diff --git a/include/d/lyt/msg_window/d_lyt_msg_window.h b/include/d/lyt/msg_window/d_lyt_msg_window.h index ab6cc7af..74e34487 100644 --- a/include/d/lyt/msg_window/d_lyt_msg_window.h +++ b/include/d/lyt/msg_window/d_lyt_msg_window.h @@ -105,6 +105,10 @@ public: return field_0x815; } + u8 getField_0x81B() const { + return field_0x81B; + } + s32 getTextOptionSelection() const { return mTextOptionSelection; } @@ -195,7 +199,7 @@ private: /* 0x81E */ u8 field_0x81E; /* 0x820 */ u16 field_0x820; - /* 0x824 */ s32 field_0x824; + /* 0x824 */ s32 mNumOptions; /* 0x828 */ dLytMsgWindowCharData *field_0x828; /* 0x82C */ u32 mTextOptionSelection; diff --git a/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h b/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h index 3cdfd756..c692746a 100644 --- a/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h +++ b/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h @@ -5,6 +5,7 @@ #include "d/lyt/d2d.h" #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" +#include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" @@ -13,22 +14,83 @@ struct SelectBtnHelper { SelectBtnHelper(); ~SelectBtnHelper(); - /* 0x00 */ nw4r::lyt::Pane *panes[9]; - /* 0x24 */ u8 _0x24[0x34 - 0x24]; - /* 0x34 */ f32 field_0x34; - /* 0x38 */ f32 field_0x38; - /* 0x3C */ f32 field_0x3C; - /* 0x40 */ f32 field_0x40; - /* 0x44 */ s32 field_0x44; - /* 0x48 */ s32 field_0x48; - /* 0x4C */ s32 field_0x4C; - /* 0x50 */ s8 field_0x50; - /* 0x51 */ s8 field_0x51; - /* 0x52 */ s8 field_0x52; + /** + * Describes number of buttons and their layout. + */ + enum SelectMode_e { + /** Two buttons in the order right, left */ + MODE_2, + /** Three buttons in the order up, right, left */ + MODE_3_UP, + /** 4 buttons in an X formation in the order top right, bottom right, top left, bottom left */ + MODE_4, + /** Three buttons in the order right, down, left */ + MODE_3_DOWN, + }; - f32 fn_8011D690(s32); - void fn_8011C970(); - u8 fn_8011CAC0(); + enum ExecuteResult_e { + /** Nothing of interest happened */ + EXECUTE_NONE, + /** Selected a pane using the Wiimote motion / pointing */ + EXECUTE_SWITCH_CURSOR, + /** Selected a pane using the Nunchuk stick */ + EXECUTE_SWITCH_STICK, + /** Not sure, unreachable */ + EXECUTE_RESET_CURSOR, + }; + + /* 0x00 */ nw4r::lyt::Pane *panes[9]; + /* 0x24 */ mVec2_c field_0x24; + /* 0x2C */ mVec2_c field_0x2C; + /* 0x34 */ f32 mAngX; + /* 0x38 */ f32 mAngY; + /* 0x3C */ f32 mAngXCenter; + /* 0x40 */ f32 mAngYCenter; + /* 0x44 */ s32 mCursorSelectTimer; + /* 0x48 */ s32 mButtonMode; + /* 0x4C */ s32 field_0x4C; + /* 0x50 */ s8 mSelectedBtnIdx; + /* 0x51 */ bool mIsCursorActive; + /* 0x52 */ bool mIsNavEnabled; + + void init(); + void remove(); + void resetCursor(); + u8 execute(); + bool handleCursorInput(); + bool handleButtonInput(); + void fn_8011E110(mVec2_c screenPos) const; + void convertScreenPosToDpdPos(mVec2_c *pOutDpd, mVec2_c *screenPos) const; + + s8 calculatePointedAtButton(f32 x, f32 y); + + /** + * Checks whether the Nunchuk stick button has just been pushed in + * a direction that should cause a new pane to be selected. + */ + bool hasNewFSStickButtonSelect() const; + + /** + * Gets the angle of the button in degrees. 0° = up, counterclockwise. + */ + f32 getAngleForButtonIdx(s32 idx) const; + + const nw4r::lyt::Pane *getRootPane() const { + return panes[0]; + } + + const nw4r::lyt::Pane *getPosPane(s32 idx) const { + s32 paneIdx = 1 + idx; + return panes[paneIdx]; + } + + const nw4r::lyt::Pane *getBounding(s32 idx) const { + return panes[5 + idx]; + } + + s8 getSelectedtBtnIdx() const { + return mSelectedBtnIdx; + } }; class dLytMsgWindowSelectBtnParts_c { @@ -47,9 +109,11 @@ private: STATE_FUNC_DECLARE(dLytMsgWindowSelectBtnParts_c, Select); STATE_FUNC_DECLARE(dLytMsgWindowSelectBtnParts_c, Off); + STATE_MGR_DEFINE_UTIL_INSTANCIATE_STATE(dLytMsgWindowSelectBtnParts_c); + /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMsgWindowSelectBtnParts_c); /* 0x3C */ d2d::AnmGroup_c *mpAnms[3]; - /* 0x48 */ u32 field_0x48; + /* 0x48 */ u32 mShouldBeOn; /* 0x4C */ u32 field_0x4C; /* 0x50 */ u8 field_0x50; }; @@ -74,47 +138,47 @@ public: bool draw(); - u8 getField_0x9A4() const { - return field_0x9A4; + bool isVisible() const { + return mIsVisible; } - s32 getField_0x9B0() const { - return field_0x9B0; + s32 getConfirmedBtnIdx() const { + return mConfirmedBtnIdx; } - s32 getField_0x9B4() const { - return field_0x9B4; + s32 getDecidedBtnIdx() const { + return mDecidedBtnIdx; } void setField_0x9B8(s32 value) { field_0x9B8 = value; } - void setField_0x9BC(s32 value) { - field_0x9BC = value; + void setCancelBtnIdx(s32 value) { + mCancelBtnIdx = value; } - void setField_0x9C4(s32 value) { - field_0x9C4 = value; + void setFlipBtnLayout(s32 value) { + mFlipBtnLayout = value; } void setField_0x990(s32 value) { mBtnHelper.field_0x4C = value; } - void setField_0x9A0(s32 value) { - field_0x9A0 = value; + void setInSound(s32 value) { + mInSound = value; } void setTagProcessor(dTagProcessor_c *value) { mpTagProcessor = value; } - void setField_0x99C(s32 value) { - field_0x99C = value; + void setSkipOutAnim(s32 value) { + mSkipOutAnim = value; } - void fn_8011E5D0(u32, bool); + void requestIn(s32 numBtns, bool playSound); dTextBox_c *getSelectTextBox(s32 option, s32 idx) const { return mpSelectTextBoxes[option][idx]; @@ -125,7 +189,7 @@ public: } protected: - s32 fn_8011FE50(); + s32 getSelectBtnMode(); STATE_FUNC_DECLARE(dLytMsgWindowSelectBtn_c, Wait); STATE_FUNC_DECLARE(dLytMsgWindowSelectBtn_c, In); @@ -142,28 +206,28 @@ protected: /* 0x7B4 */ dTextBox_c *mpSelectTextBoxes[4][2]; /* 0x7D4 */ dTextBox_c *mpDecideTextBoxes[2]; /* 0x7DC */ nw4r::lyt::Pane *mpBoundings[4]; - /* 0x7EC */ dWindow_c *mpWindow; - /* 0x7F0 */ dTextBox_c *mpSizeBox; + /* 0x7EC */ dWindow_c *mpWindow[1]; + /* 0x7F0 */ dTextBox_c *mpSizeBox[1]; /* 0x7F4 */ dLytMsgWindowSelectBtnParts_c mParts[4]; /* 0x944 */ SelectBtnHelper mBtnHelper; /* 0x998 */ dTagProcessor_c *mpTagProcessor; - /* 0x99C */ s32 field_0x99C; - /* 0x9A0 */ s32 field_0x9A0; - /* 0x9A4 */ u8 field_0x9A4; - /* 0x9A8 */ s32 field_0x9A8; - /* 0x9AC */ void *field_0x9AC; - /* 0x9B0 */ s32 field_0x9B0; - /* 0x9B0 */ s32 field_0x9B4; + /* 0x99C */ s32 mSkipOutAnim; + /* 0x9A0 */ s32 mInSound; + /* 0x9A4 */ bool mIsVisible; + /* 0x9A8 */ s32 mNumBtns; + /* 0x9AC */ s32 field_0x9AC; + /* 0x9B0 */ s32 mConfirmedBtnIdx; + /* 0x9B0 */ s32 mDecidedBtnIdx; /* 0x9B8 */ s32 field_0x9B8; - /* 0x9BC */ s32 field_0x9BC; - /* 0x9C0 */ s32 field_0x9C0; - /* 0x9C4 */ s32 field_0x9C4; - /* 0x9C8 */ s32 field_0x9C8; - /* 0x9CC */ s8 field_0x9CC; + /* 0x9BC */ s32 mCancelBtnIdx; + /* 0x9C0 */ s32 mWaitCancelTimer; + /* 0x9C4 */ s32 mFlipBtnLayout; + /* 0x9C8 */ s32 mStep; + /* 0x9CC */ s8 mCanceledViaBBtnIdx; /* 0x9CD */ u8 field_0x9CD; /* 0x9CE */ u8 field_0x9CE; - /* 0x9CF */ u8 field_0x9CF; - /* 0x9D0 */ u8 field_0x9D0; + /* 0x9CF */ bool mPlayInSound; + /* 0x9D0 */ bool field_0x9D0; /* 0x9D1 */ u8 field_0x9D1; }; diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 1ef491a7..ab5e1997 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -98,6 +98,10 @@ struct mAng { return rad * sRadToAng; } + static f32 ang2deg_c(f32 rad) { + return rad * sAngToDeg; + } + static f32 rad2deg(f32 rad) { return rad * (360.f / (2.f * M_PI)); } diff --git a/include/s/s_State.hpp b/include/s/s_State.hpp index 03c90acd..d461f630 100644 --- a/include/s/s_State.hpp +++ b/include/s/s_State.hpp @@ -46,7 +46,13 @@ #define STATE_MGR_DEFINE_UTIL_GETOLDSTATEID(class_name) \ const sFStateID_c &getOldStateID() const { \ - return (sFStateID_c &)*mStateMgr.getOldStateID(); \ + return (sFStateID_c &)*mStateMgr.getOldStateID(); \ + } + +// Use this when you need need sFStateID_c vtables to appear in a different order +#define STATE_MGR_DEFINE_UTIL_INSTANCIATE_STATE(class_name) \ + bool dummy_need_state_instanciation(const sFStateID_c &value) const { \ + return value.isNull(); \ } // TODO this is probably not the whole solution. diff --git a/src/d/d_tag_processor.cpp b/src/d/d_tag_processor.cpp index af0c2be7..675c0e8b 100644 --- a/src/d/d_tag_processor.cpp +++ b/src/d/d_tag_processor.cpp @@ -252,14 +252,14 @@ const u16 sMsgWindowFlags[2050] = { dTagProcessor_c::dTagProcessor_c() { field_0x82C = -1; - field_0x828 = -1; - field_0x90E = 0; + mCancelBtnIdx = -1; + mCurrentOptionIdx = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 256; j++) { - field_0x008[i][j] = 0; + mOptionBufs[i][j] = 0; } - field_0x808[i] = 0; - field_0x90F[i] = 0; + mOptionLengths[i] = 0; + mOptionSound[i] = 0; } field_0x904 = 0.0f; @@ -327,7 +327,7 @@ dTagProcessor_c::dTagProcessor_c() { field_0xEEE = 0; field_0xEEF = 0; field_0xEE0 = 0; - field_0xEE1 = 0; + mIsShadowText = false; field_0xEE2 = 0; field_0xEE3 = 0; field_0xEE4 = 0; @@ -356,11 +356,11 @@ void dTagProcessor_c::format( void dTagProcessor_c::formatV( dTextBox_c *textBox, const wchar_t *src, wchar_t *dest, u32 destLen, u32 *pOutLen, void *unk, va_list list ) { - s32 state3 = 0; - s32 state4 = 0; + s32 optionIdx = 0; + bool isProcessingOption = false; s32 state1 = -1; - s32 state2 = -1; + s32 cancelBtnIdx = -1; f32 currScale, backupScale; backupScale = currScale = fn_800B8040(0, mMsgWindowSubtype); @@ -371,8 +371,9 @@ void dTagProcessor_c::formatV( textBox->set0x1F8(0); } - s32 local_b4 = 0; + s32 optionLength = 0; + // 0xE TAG_CMD_0x0F0F0F0F 0x00 0x02 StackThing x = {0x000E, 0x0F0F, 0x0F0F, 0x0002}; wchar_t *writePtr = dest; if (textBox != nullptr) { @@ -384,6 +385,7 @@ void dTagProcessor_c::formatV( dest[4] = mLineData.mNumLines; } + // 0xE TAG_CMD_0x0F0F0F0E 0x00 0x01 StackThing yTmp; StackThing y = {0x000E, 0x0F0F, 0x0F0E, 0x0001}; @@ -402,16 +404,16 @@ void dTagProcessor_c::formatV( s32 cmd = 0; wchar_t *endPtr = nullptr; getTextCommand(c, src + 1, &cmdLen, &cmd, &endPtr); - bool bVar3 = false; + bool processingOption = false; switch (cmd) { - case 0x0F0F0F0F: - if (state4 != 0 && field_0x90E != 0) { + case TAG_CMD_0x0F0F0F0F: + if (isProcessingOption && mCurrentOptionIdx != 0) { const wchar_t *t = src; u32 len = (cmdLen / 2) + 1; for (int i = 0; i < len; i++) { - getTmpBuffer()[local_b4] = *(t++); - onWriteTmpBuffer(); - local_b4++; + getOptionBuf()[optionLength] = *(t++); + onWriteOptionBuf(); + optionLength++; } } else { const wchar_t *t = src; @@ -421,67 +423,67 @@ void dTagProcessor_c::formatV( } } break; - case 0x10000: { + case TAG_CMD_OPTION_0: { u8 a = READ_U8(endPtr, 0); u8 b = READ_U8(endPtr, 1); switch (a) { - case 0: state2 = 0; break; + case 0: cancelBtnIdx = 0; break; case 1: state1 = 0; break; } - field_0x90F[0] = b; + mOptionSound[0] = b; yTmp = y; for (int i = 0; i < 4; i++) { for (int j = 0; j < 256; j++) { if (j < 4) { - field_0x008[i][j] = yTmp.us[j]; + mOptionBufs[i][j] = yTmp.us[j]; } else { - field_0x008[i][j] = 0; + mOptionBufs[i][j] = 0; } } - field_0x808[i] = 4; + mOptionLengths[i] = 4; } - state3 = 1; - bVar3 = true; + optionIdx = 1; + processingOption = true; } break; - case 0x10001: { + case TAG_CMD_OPTION_1: { u8 a = READ_U8(endPtr, 0); u8 b = READ_U8(endPtr, 1); switch (a) { - case 0: state2 = 1; break; + case 0: cancelBtnIdx = 1; break; case 1: state1 = 1; break; } - field_0x90F[1] = b; - state3 = 2; - bVar3 = true; + mOptionSound[1] = b; + optionIdx = 2; + processingOption = true; } break; - case 0x10002: { + case TAG_CMD_OPTION_2: { u8 a = READ_U8(endPtr, 0); u8 b = READ_U8(endPtr, 1); switch (a) { - case 0: state2 = 2; break; + case 0: cancelBtnIdx = 2; break; case 1: state1 = 2; break; } - field_0x90F[2] = b; - state3 = 3; - bVar3 = true; + mOptionSound[2] = b; + optionIdx = 3; + processingOption = true; } break; - case 0x10003: { + case TAG_CMD_OPTION_3: { u8 a = READ_U8(endPtr, 0); u8 b = READ_U8(endPtr, 1); switch (a) { - case 0: state2 = 3; break; + case 0: cancelBtnIdx = 3; break; case 1: state1 = 3; break; } - field_0x90F[3] = b; - state3 = 4; - bVar3 = true; + mOptionSound[3] = b; + optionIdx = 4; + processingOption = true; } break; case 0x10008: if (textBox != nullptr) { currScale = fn_800B8040(READ_U8(endPtr, 0), mMsgWindowSubtype); currScale *= textBox->getMyScale(); } - writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + writePtr = writeTextNormal(src, writePtr, &optionLength, cmdLen, isProcessingOption); break; case 0x30000: { if (textBox != nullptr) { @@ -489,35 +491,45 @@ void dTagProcessor_c::formatV( currScale *= dLyt_HIO_c::getField0x768(); currScale *= textBox->getMyScale(); } - writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + writePtr = writeTextNormal(src, writePtr, &optionLength, cmdLen, isProcessingOption); } break; case 0x10010: fn_800B5520(endPtr); break; case 0x20004: if (textBox != nullptr) { saveIconWidth(textBox, endPtr, currScale); } - writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + writePtr = writeTextNormal(src, writePtr, &optionLength, cmdLen, isProcessingOption); + break; + case TAG_CMD_WRITE_HERONAME: + writePtr = writeHeroname(writePtr, &optionLength, isProcessingOption); + break; + case TAG_CMD_WRITE_ITEM: + writePtr = writeItem(writePtr, endPtr, &optionLength, isProcessingOption); + break; + case TAG_CMD_WRITE_STRING_ARG: + writePtr = writeStringArg(writePtr, endPtr, &optionLength, isProcessingOption); + break; + case TAG_CMD_WRITE_NUMERIC_ARG: + writePtr = writeNumericArg(writePtr, endPtr, &optionLength, isProcessingOption); break; - case 0x20000: writePtr = writeHeroname(writePtr, &local_b4, state4); break; - case 0x20001: writePtr = writeItem(writePtr, endPtr, &local_b4, state4); break; - case 0x20002: writePtr = writeStringArg(writePtr, endPtr, &local_b4, state4); break; - case 0x20003: writePtr = writeNumericArg(writePtr, endPtr, &local_b4, state4); break; - case 0x30004: writePtr = writeSingularOrPluralWord(writePtr, endPtr, &local_b4, state4); break; + case TAG_CMD_WRITE_WORD: + writePtr = writeSingularOrPluralWord(writePtr, endPtr, &optionLength, isProcessingOption); + break; case 0x30001: field_0xEF1 = 1; - writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + writePtr = writeTextNormal(src, writePtr, &optionLength, cmdLen, isProcessingOption); break; - default: writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); break; + default: writePtr = writeTextNormal(src, writePtr, &optionLength, cmdLen, isProcessingOption); break; } - if (bVar3) { + if (processingOption) { field_0x82C = state1; - state4 = 1; - field_0x828 = state2; - field_0x90E = state3; - local_b4 = field_0x808[state3 - 1]; + isProcessingOption = 1; + mCancelBtnIdx = cancelBtnIdx; + mCurrentOptionIdx = optionIdx; + optionLength = mOptionLengths[optionIdx - 1]; } src += (cmdLen / 2) + 1; } else if (c == 0xF) { @@ -531,11 +543,11 @@ void dTagProcessor_c::formatV( writePtr[2] = src[2]; writePtr += 3; src += 3; - } else if (state4 != 0 && field_0x90E != 0) { + } else if (isProcessingOption != 0 && mCurrentOptionIdx != 0) { // Note: Return ignored here - writeSingleCharacter(c, &getTmpBuffer()[local_b4], &local_b4); + writeSingleCharacter(c, &getOptionBuf()[optionLength], &optionLength); src++; - onWriteTmpBuffer(); + onWriteOptionBuf(); } else { if (textBox != nullptr) { if (c == L'\n') { @@ -618,7 +630,7 @@ beginning: wchar_t *endPtr = nullptr; getTextCommand(c, src + 1, &cmdLen, &cmd, &endPtr); switch (cmd) { - case 0x0F0F0F0F: { + case TAG_CMD_0x0F0F0F0F: { if (lineNum / getMaxNumLines(mMsgWindowSubtype) == unkArg) { nw4r::lyt::Size fontSize = getTextBox()->GetFontSize(); posX = getMarginForCenteredLine(lineNum); @@ -658,11 +670,11 @@ beginning: } lineNum++; } break; - case 0x10000: - case 0x10001: - case 0x10002: - case 0x10003: b1 = true; break; - case 0x10008: { + case TAG_CMD_OPTION_0: + case TAG_CMD_OPTION_1: + case TAG_CMD_OPTION_2: + case TAG_CMD_OPTION_3: b1 = true; break; + case 0x10008: { if (b2) { f32 newScale = fn_800B8040(READ_U8(endPtr, 0), mMsgWindowSubtype); f32 baseScale = fn_800B8040(0, mMsgWindowSubtype); @@ -787,33 +799,33 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n wchar_t *endPtr = nullptr; getTextCommand(ch, ctx->str, &cmdLen, &cmd, &endPtr); switch (cmd) { - case 0x10000: + case TAG_CMD_OPTION_0: ctx->str += cmdLen / 2; - ctx->str += field_0x808[0]; + ctx->str += mOptionLengths[0]; return nw4r::ut::OPERATION_DEFAULT; - case 0x10001: + case TAG_CMD_OPTION_1: ctx->str += cmdLen / 2; - ctx->str += field_0x808[1]; + ctx->str += mOptionLengths[1]; return nw4r::ut::OPERATION_DEFAULT; - case 0x10002: + case TAG_CMD_OPTION_2: ctx->str += cmdLen / 2; - ctx->str += field_0x808[2]; + ctx->str += mOptionLengths[2]; return nw4r::ut::OPERATION_DEFAULT; - case 0x10003: + case TAG_CMD_OPTION_3: ctx->str += cmdLen / 2; - ctx->str += field_0x808[3]; + ctx->str += mOptionLengths[3]; return nw4r::ut::OPERATION_DEFAULT; - case 0x0F0F0F0F: fn_800B4FF0(rect, ctx, cmdLen, endPtr); break; - case 0x0F0F0F0E: field_0xEE2 = 1; break; - case 0x3: - if (field_0xEE1 == 0) { + case TAG_CMD_0x0F0F0F0F: fn_800B4FF0(rect, ctx, cmdLen, endPtr); break; + case TAG_CMD_0x0F0F0F0E: field_0xEE2 = 1; break; + case TAG_CMD_COLOR: + if (!mIsShadowText) { setColor(rect, ctx, cmdLen, endPtr); } break; - case 0x2: setScale(rect, ctx, cmdLen, endPtr); break; + case TAG_CMD_SCALE: setScale(rect, ctx, cmdLen, endPtr); break; case 0x10004: // Pause - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEED == 0 && mNumericArgsCopy[8] == field_0x838) { setFramesLeftOnPause(rect, ctx, cmdLen, endPtr); field_0xEED = 1; @@ -823,7 +835,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n } break; case 0x10005: - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEEE == 0 && mNumericArgsCopy[9] == field_0x83C) { fn_800B5500(cmdLen, endPtr); field_0xEEE = 1; @@ -833,7 +845,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n } break; case 0x10007: - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEE5 == 0 && mNumericArgsCopy[0] == field_0x87C) { fn_800B60E0(cmdLen, endPtr); field_0xEE5 = 1; @@ -845,7 +857,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n case 0x10008: fn_800B61D0(rect, ctx, cmdLen, endPtr); break; case 0x30000: changeScale(rect, ctx, false); break; case 0x10009: - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEE6 == 0 && mNumericArgsCopy[1] == field_0x880) { fn_800B6110(cmdLen, endPtr); field_0xEE6 = 1; @@ -855,7 +867,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n } break; case 0x1000A: - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEE7 == 0 && mNumericArgsCopy[2] == field_0x884) { fn_800B6140(cmdLen, endPtr); field_0xEE7 = 1; @@ -866,7 +878,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n break; case 0x1000B: // Sound - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEE8 == 0 && mNumericArgsCopy[3] == field_0x888) { playSound(cmdLen, endPtr); field_0xEE8 = 1; @@ -877,7 +889,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n break; case 0x1000C: // "entrypoint" - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEEA == 0 && mNumericArgsCopy[5] == field_0x890) { fn_800B6170(cmdLen, endPtr); field_0xEEA = 1; @@ -887,7 +899,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n } break; case 0x1000D: - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEEB == 0 && mNumericArgsCopy[6] == field_0x894) { fn_800B6190(cmdLen, endPtr); field_0xEEB = 1; @@ -897,7 +909,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n } break; case 0x1000E: - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEEC == 0 && mNumericArgsCopy[7] == field_0x898) { fn_800B61B0(cmdLen, endPtr); field_0xEEC = 1; @@ -916,7 +928,7 @@ nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, n } break; case 0x10011: - if (rect == nullptr && field_0xEE1 == 0) { + if (rect == nullptr && !mIsShadowText) { if (field_0xEEF == 0 && mNumericArgsCopy[10] == field_0x840) { fn_800B5540(endPtr); field_0xEEF = 1; @@ -1096,13 +1108,13 @@ void dTagProcessor_c::fn_800B5540(wchar_t *src) { dLytMsgWindow_c::getInstance()->onFlag0x820(sMsgWindowFlags[READ_U8(src, 0)]); } -wchar_t *dTagProcessor_c::writeHeroname(wchar_t *dest, s32 *outArg, s32 arg) { +wchar_t *dTagProcessor_c::writeHeroname(wchar_t *dest, s32 *outArg, bool isProcessingOption) { if (FileManager::GetInstance()->getHeroname()[0] != '\0') { for (int i = 0; FileManager::GetInstance()->getHeroname()[i] != '\0'; i++) { - if (arg != 0 && field_0x90E != 0) { + if (isProcessingOption && mCurrentOptionIdx != 0) { wchar_t *heroName = FileManager::GetInstance()->getHeroname(); - writeSingleCharacter(heroName[i], &getTmpBuffer()[*outArg], outArg); - onWriteTmpBuffer(); + writeSingleCharacter(heroName[i], &getOptionBuf()[*outArg], outArg); + onWriteOptionBuf(); } else { wchar_t *heroName = FileManager::GetInstance()->getHeroname(); dest = writeSingleCharacter(heroName[i], dest, nullptr); @@ -1112,7 +1124,7 @@ wchar_t *dTagProcessor_c::writeHeroname(wchar_t *dest, s32 *outArg, s32 arg) { return dest; } -wchar_t *dTagProcessor_c::writeItem(wchar_t *dest, wchar_t *src, s32 *outArg, s32 arg) { +wchar_t *dTagProcessor_c::writeItem(wchar_t *dest, wchar_t *src, s32 *outArg, bool isProcessingOption) { int itemIndex = READ_U16(src, 0); wchar_t c; @@ -1125,10 +1137,10 @@ wchar_t *dTagProcessor_c::writeItem(wchar_t *dest, wchar_t *src, s32 *outArg, s3 while ((c = text[i]) != 0) { if (c == 0xE) { int len = ((text[i + 3] / 2) & 0x7F) + 4; - if (arg != 0 && field_0x90E != 0) { + if (isProcessingOption && mCurrentOptionIdx != 0) { for (int j = 0; j < len; j++) { - writeSingleCharacter(text[i], &getTmpBuffer()[*outArg], outArg); - onWriteTmpBuffer(); + writeSingleCharacter(text[i], &getOptionBuf()[*outArg], outArg); + onWriteOptionBuf(); i++; } } else { @@ -1138,9 +1150,9 @@ wchar_t *dTagProcessor_c::writeItem(wchar_t *dest, wchar_t *src, s32 *outArg, s3 } } } else { - if (arg != 0 && field_0x90E != 0) { - writeSingleCharacter(c, &getTmpBuffer()[*outArg], outArg); - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + writeSingleCharacter(c, &getOptionBuf()[*outArg], outArg); + onWriteOptionBuf(); } else { dest = writeSingleCharacter(c, dest, nullptr); } @@ -1151,17 +1163,17 @@ wchar_t *dTagProcessor_c::writeItem(wchar_t *dest, wchar_t *src, s32 *outArg, s3 return dest; } -wchar_t *dTagProcessor_c::writeStringArg(wchar_t *dest, wchar_t *src, s32 *outArg, s32 arg) { +wchar_t *dTagProcessor_c::writeStringArg(wchar_t *dest, wchar_t *src, s32 *outArg, bool isProcessingOption) { s32 argIdx = READ_U32(src, 0); wchar_t c; int i = 0; while ((c = mStringArgs[argIdx][i]) != 0) { if (c == 0xE) { int len = ((mStringArgs[argIdx][i + 3] / 2) & 0x7F) + 4; - if (arg != 0 && field_0x90E != 0) { + if (isProcessingOption && mCurrentOptionIdx != 0) { for (int j = 0; j < len; j++) { - writeSingleCharacter(mStringArgs[argIdx][i], &getTmpBuffer()[*outArg], outArg); - onWriteTmpBuffer(); + writeSingleCharacter(mStringArgs[argIdx][i], &getOptionBuf()[*outArg], outArg); + onWriteOptionBuf(); i++; } } else { @@ -1171,9 +1183,9 @@ wchar_t *dTagProcessor_c::writeStringArg(wchar_t *dest, wchar_t *src, s32 *outAr } } } else { - if (arg != 0 && field_0x90E != 0) { - writeSingleCharacter(c, &getTmpBuffer()[*outArg], outArg); - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + writeSingleCharacter(c, &getOptionBuf()[*outArg], outArg); + onWriteOptionBuf(); } else { dest = writeSingleCharacter(c, dest, nullptr); } @@ -1188,7 +1200,7 @@ wchar_t *dTagProcessor_c::writeStringArg(wchar_t *dest, wchar_t *src, s32 *outAr return dest; } -wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outArg, s32 arg) { +wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outArg, bool isProcessingOption) { int numZeroDigits = READ_U8(src, 4); bool writeZeroDigits = false; s32 argIdx = READ_U32(src, 0); @@ -1204,9 +1216,9 @@ wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outA writeZeroDigits = true; } if (digit > 0 || writeZeroDigits) { - if (arg != 0 && field_0x90E != 0) { - getTmpBuffer()[*outArg] = '0' + digit; - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + getOptionBuf()[*outArg] = '0' + digit; + onWriteOptionBuf(); (*outArg)++; } else { *(dest++) = '0' + digit; @@ -1220,9 +1232,9 @@ wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outA writeZeroDigits = true; } if (digit > 0 || writeZeroDigits) { - if (arg != 0 && field_0x90E != 0) { - getTmpBuffer()[*outArg] = '0' + digit; - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + getOptionBuf()[*outArg] = '0' + digit; + onWriteOptionBuf(); (*outArg)++; } else { *(dest++) = '0' + digit; @@ -1236,9 +1248,9 @@ wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outA writeZeroDigits = true; } if (digit > 0 || writeZeroDigits) { - if (arg != 0 && field_0x90E != 0) { - getTmpBuffer()[*outArg] = '0' + digit; - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + getOptionBuf()[*outArg] = '0' + digit; + onWriteOptionBuf(); (*outArg)++; } else { *(dest++) = '0' + digit; @@ -1252,9 +1264,9 @@ wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outA writeZeroDigits = true; } if (digit > 0 || writeZeroDigits) { - if (arg != 0 && field_0x90E != 0) { - getTmpBuffer()[*outArg] = '0' + digit; - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + getOptionBuf()[*outArg] = '0' + digit; + onWriteOptionBuf(); (*outArg)++; } else { *(dest++) = '0' + digit; @@ -1263,9 +1275,9 @@ wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outA } digit = number; - if (arg != 0 && field_0x90E != 0) { - getTmpBuffer()[*outArg] = '0' + digit; - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + getOptionBuf()[*outArg] = '0' + digit; + onWriteOptionBuf(); (*outArg)++; } else { *(dest++) = '0' + digit; @@ -1273,7 +1285,7 @@ wchar_t *dTagProcessor_c::writeNumericArg(wchar_t *dest, wchar_t *src, s32 *outA return dest; } -wchar_t *dTagProcessor_c::writeSingularOrPluralWord(wchar_t *dest, wchar_t *src, s32 *outArg, s32 arg) { +wchar_t *dTagProcessor_c::writeSingularOrPluralWord(wchar_t *dest, wchar_t *src, s32 *outArg, bool isProcessingOption) { int itemIndex = READ_U8(src, 0); wchar_t c; @@ -1290,10 +1302,10 @@ wchar_t *dTagProcessor_c::writeSingularOrPluralWord(wchar_t *dest, wchar_t *src, while ((c = text[i]) != 0) { if (c == 0xE) { int len = ((text[i + 3] / 2) & 0x7F) + 4; - if (arg != 0 && field_0x90E != 0) { + if (isProcessingOption && mCurrentOptionIdx != 0) { for (int j = 0; j < len; j++) { - writeSingleCharacter(text[i], &getTmpBuffer()[*outArg], outArg); - onWriteTmpBuffer(); + writeSingleCharacter(text[i], &getOptionBuf()[*outArg], outArg); + onWriteOptionBuf(); i++; } } else { @@ -1303,9 +1315,9 @@ wchar_t *dTagProcessor_c::writeSingularOrPluralWord(wchar_t *dest, wchar_t *src, } } } else { - if (arg != 0 && field_0x90E != 0) { - writeSingleCharacter(c, &getTmpBuffer()[*outArg], outArg); - onWriteTmpBuffer(); + if (isProcessingOption && mCurrentOptionIdx != 0) { + writeSingleCharacter(c, &getOptionBuf()[*outArg], outArg); + onWriteOptionBuf(); } else { dest = writeSingleCharacter(c, dest, nullptr); } @@ -1498,7 +1510,7 @@ void dTagProcessor_c::drawPicture( mColor c2(0xF3, 0xEF, 0xE1, alpha); w->SetTextColor(c1, c2); } - if (field_0xEE1 != 0) { + if (mIsShadowText) { // #505050 mColor c1(0x50, 0x50, 0x50, 0); mColor c2(0x50, 0x50, 0x50, 0x50); @@ -1635,11 +1647,12 @@ void dTagProcessor_c::restoreColor(nw4r::ut::PrintContext *ctx, u8 wind ctx->writer->SetTextColor(c1, c2); } -wchar_t *dTagProcessor_c::writeTextNormal(const wchar_t *src, wchar_t *dest, s32 *pArg, u8 cmdLen, s32 arg) { - if (arg != 0 && field_0x90E != 0) { +wchar_t * +dTagProcessor_c::writeTextNormal(const wchar_t *src, wchar_t *dest, s32 *pArg, u8 cmdLen, bool isProcessingOption) { + if (isProcessingOption && mCurrentOptionIdx != 0) { for (u32 i = 0; i < (cmdLen / 2 + 1); i++) { - getTmpBuffer()[*pArg] = *(src++); - onWriteTmpBuffer(); + getOptionBuf()[*pArg] = *(src++); + onWriteOptionBuf(); (*pArg)++; } } else { diff --git a/src/d/lyt/d_lyt_game_over.cpp b/src/d/lyt/d_lyt_game_over.cpp index b3939590..1b7ae84a 100644 --- a/src/d/lyt/d_lyt_game_over.cpp +++ b/src/d/lyt/d_lyt_game_over.cpp @@ -129,9 +129,9 @@ bool dLytGameOver_c::build() { } } - mSelectBtn.setField_0x9C4(1); - mSelectBtn.setField_0x99C(1); - mSelectBtn.setField_0x9A0(2); + mSelectBtn.setFlipBtnLayout(1); + mSelectBtn.setSkipOutAnim(1); + mSelectBtn.setInSound(2); mStateMgr.changeState(StateID_Init); @@ -253,8 +253,8 @@ void dLytGameOver_c::executeState_Wait() { anm.play(); switch (mStep) { case 0: { - if (mSelectBtn.getField_0x9B4() >= 0) { - mSelectedOption = mSelectBtn.getField_0x9B4(); + if (mSelectBtn.getDecidedBtnIdx() >= 0) { + mSelectedOption = mSelectBtn.getDecidedBtnIdx(); mStep += 1; mIsChangingState = true; } @@ -344,15 +344,15 @@ void dLytGameOver_c::setupButtons() { } for (int i = 0; i < numOptions; i++) { - const wchar_t *buf = dMessage_c::getGlobalTagProcessor()->getBuf(i); + const wchar_t *buf = dMessage_c::getGlobalTagProcessor()->getOptionString(i); mSelectBtn.getSelectTextBox(i, 0)->setTextWithGlobalTextProcessor(buf); mSelectBtn.getSelectTextBox(i, 1)->setTextWithGlobalTextProcessor(buf); } mSelectBtn.setTagProcessor(dMessage_c::getGlobalTagProcessor()); - u32 tmp = dMessage_c::getGlobalTagProcessor()->getField_0x828(); - mSelectBtn.setField_0x9BC(tmp); + u32 tmp = dMessage_c::getGlobalTagProcessor()->getCancelBtnIdx(); + mSelectBtn.setCancelBtnIdx(tmp); mSelectBtn.setField_0x990(tmp); - mSelectBtn.fn_8011E5D0(numOptions, true); + mSelectBtn.requestIn(numOptions, true); } SPECIAL_BASE_PROFILE(LYT_GAMEOVER_MGR, dLytGameOverMgr_c, fProfile::LYT_GAMEOVER_MGR, 0x02AC, 0x0201); diff --git a/src/d/lyt/d_lyt_save_msg_window.cpp b/src/d/lyt/d_lyt_save_msg_window.cpp index cc8fd0f0..7d493b82 100644 --- a/src/d/lyt/d_lyt_save_msg_window.cpp +++ b/src/d/lyt/d_lyt_save_msg_window.cpp @@ -67,11 +67,11 @@ bool dLytSaveMsgWindow_c::build(bool arg) { } } - mBtn.setField_0x9C4(1); + mBtn.setFlipBtnLayout(1); if (arg) { - mBtn.setField_0x99C(1); + mBtn.setSkipOutAnim(1); } - mBtn.setField_0x9A0(1); + mBtn.setInSound(1); mStateMgr.changeState(StateID_Init); mLineSpace = mLyt.getTextBox("T_text_00")->GetLineSpace(); @@ -222,8 +222,8 @@ void dLytSaveMsgWindow_c::initializeState_Wait() { } void dLytSaveMsgWindow_c::executeState_Wait() { if (field_0x10C0 == 0) { - field_0x10C4 = mBtn.getField_0x9B4(); - field_0x10C8 = mBtn.getField_0x9B0(); + field_0x10C4 = mBtn.getDecidedBtnIdx(); + field_0x10C8 = mBtn.getConfirmedBtnIdx(); } if (field_0x10DB == 1) { field_0x10DB = 0; @@ -279,7 +279,7 @@ void dLytSaveMsgWindow_c::executeState_Out() { } } void dLytSaveMsgWindow_c::finalizeState_Out() { - if (mBtn.getField_0x9A4() == 0) { + if (!mBtn.isVisible()) { mLyt.findPane("N_messageBtn_00")->SetVisible(false); } mWillFinishOut = 0; @@ -375,7 +375,7 @@ void dLytSaveMsgWindow_c::updateSaveText() { numOptions = 4; } for (s32 i = 0; i < numOptions; i++) { - const wchar_t *text = dMessage_c::getGlobalTagProcessor()->getBuf(i); + const wchar_t *text = dMessage_c::getGlobalTagProcessor()->getOptionString(i); mBtn.getSelectTextBox(i, 0)->setTextWithGlobalTextProcessor(text); mBtn.getSelectTextBox(i, 1)->setTextWithGlobalTextProcessor(text); } @@ -383,10 +383,10 @@ void dLytSaveMsgWindow_c::updateSaveText() { if (field_0x10B0 != 0) { mBtn.setTagProcessor(dMessage_c::getGlobalTagProcessor()); static const u32 sInts[] = {0, 2, 3, 4}; - u32 unkInt = sInts[field_0x10B0]; - s32 f = dMessage_c::getGlobalTagProcessor()->getField_0x828(); - mBtn.setField_0x9BC(f); + u32 numOptions = sInts[field_0x10B0]; + s32 f = dMessage_c::getGlobalTagProcessor()->getCancelBtnIdx(); + mBtn.setCancelBtnIdx(f); mBtn.setField_0x990(f); - mBtn.fn_8011E5D0(unkInt, true); + mBtn.requestIn(numOptions, true); } } diff --git a/src/d/lyt/d_textbox.cpp b/src/d/lyt/d_textbox.cpp index 7f77feb6..abc1ecaf 100644 --- a/src/d/lyt/d_textbox.cpp +++ b/src/d/lyt/d_textbox.cpp @@ -261,7 +261,7 @@ void dTextBox_c::setTextWithGlobalTextProcessorV(const wchar_t *str, void *unk, mpMyTagProcessor = dMessage_c::getGlobalTagProcessor(); u32 outLen = 0; mWindowSubtype = mpMyTagProcessor->getMsgWindowSubtype(); - mpMyTagProcessor->setField_0xEE1(field_0x1F6); + mpMyTagProcessor->setIsShadowText(mIsShadowTextBox); mpMyTagProcessor->setField_0xEE2(0); mpMyTagProcessor->setField_0xEE3(1); @@ -283,7 +283,7 @@ void dTextBox_c::setTextWithTextProcessorV(const wchar_t *str, dTagProcessor_c * u32 outLen = 0; mpMyTagProcessor = tagProcessor; mWindowSubtype = mpMyTagProcessor->getMsgWindowSubtype(); - mpMyTagProcessor->setField_0xEE1(field_0x1F6); + mpMyTagProcessor->setIsShadowText(mIsShadowTextBox); mpMyTagProcessor->setField_0xEE2(0); mpMyTagProcessor->setField_0xEE3(1); @@ -325,7 +325,7 @@ void dTextBox_c::setMessageWithGlobalTextProcessorAndMsbtInfo( mpMyTagProcessor = dMessage_c::getGlobalTagProcessor(); mpMyTagProcessor->setMsgWindowSubtype(dLytMsgWindow_c::MSG_WINDOW_34); mWindowSubtype = mpMyTagProcessor->getMsgWindowSubtype(); - mpMyTagProcessor->setField_0xEE1(field_0x1F6); + mpMyTagProcessor->setIsShadowText(mIsShadowTextBox); mpMyTagProcessor->setField_0xEE2(0); mpMyTagProcessor->setField_0xEE3(1); @@ -472,7 +472,7 @@ void dTextBox_c::init() { mIsWidthFixed = false; mFixedWidth = 0.0f; mHasTextWriter = true; - field_0x1F6 = 0; + mIsShadowTextBox = false; field_0x1F7 = 0; field_0x1F9 = false; field_0x1FA = 0; @@ -522,7 +522,7 @@ bool dTextBox_c::hasDynamicText() { } if (userDatName == "copy" && myList->GetType() == nw4r::lyt::res::TYPE_STRING) { - field_0x1F6 = true; + mIsShadowTextBox = true; dTextBox_c *other = mpLytBase->getTextBox(myList->GetString()); if (other != nullptr) { u16 otherNum = other->GetExtUserDataNum(); @@ -607,7 +607,7 @@ void dTextBox_c::DrawSelf(const nw4r::lyt::DrawInfo &drawInfo) { if (mpMyTagProcessor != nullptr) { mpMyTagProcessor->setMsgWindowSubtype(mWindowSubtype); - mpMyTagProcessor->setField_0xEE1(field_0x1F6); + mpMyTagProcessor->setIsShadowText(mIsShadowTextBox); mpMyTagProcessor->setField_0xEE2(0); if (mAlpha != 0) { mpMyTagProcessor->setField_0xEE3(1); diff --git a/src/d/lyt/msg_window/d_lyt_msg_window.cpp b/src/d/lyt/msg_window/d_lyt_msg_window.cpp index 4e08a12a..35d987f9 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window.cpp @@ -142,7 +142,7 @@ bool dLytMsgWindow_c::build() { field_0x81C = 0; field_0x81D = 0; - field_0x824 = 0; + mNumOptions = 0; field_0x820 = 0; field_0x81E = 0; @@ -161,7 +161,7 @@ bool dLytMsgWindow_c::remove() { mpTagProcessor = nullptr; mSelectBtn.remove(); removeSubMsgManagers(); - field_0x824 = 0; + mNumOptions = 0; mResAcc1.detach(); mResAcc2.detach(); return true; @@ -494,36 +494,36 @@ static wchar_t *sBufs[4]; void dLytMsgWindow_c::initializeState_WaitKeySelectQuestion() { // TODO regswaps - field_0x824 = mpTagProcessor->getField_0x90E(); + mNumOptions = mpTagProcessor->getField_0x90E(); mSelectBtn.setField_0x9B8(mpTagProcessor->getField_0x82C()); - s32 tmp = mpTagProcessor->getField_0x828(); - mSelectBtn.setField_0x9BC(tmp); + s32 tmp = mpTagProcessor->getCancelBtnIdx(); + mSelectBtn.setCancelBtnIdx(tmp); mSelectBtn.setField_0x990(tmp); mSelectBtn.setTagProcessor(mpTagProcessor); for (s32 i = 0; i < 4; i++) { - sBufs[i] = mpTagProcessor->getBuf(i); + sBufs[i] = mpTagProcessor->getOptionString(i); } - mSelectBtn.fn_8011E5D0(field_0x824, true); + mSelectBtn.requestIn(mNumOptions, true); - for (s32 i = 0, option = 0; i < field_0x824; option++, i++) { + for (s32 i = 0, option = 0; i < mNumOptions; option++, i++) { for (s32 j = 0; j < 2; j++) { mSelectBtn.getSelectTextBox(option, j)->setTextWithGlobalTextProcessor(sBufs[i]); } } } void dLytMsgWindow_c::executeState_WaitKeySelectQuestion() { - s32 selection = mSelectBtn.getField_0x9B4(); + s32 selection = mSelectBtn.getDecidedBtnIdx(); if (selection >= 0) { if (mSelectBtn.isStateWait()) { bool doFiThing = false; mpTagProcessor->setField_0x90E(0); mpTagProcessor->setField_0x82C(-1); - mpTagProcessor->setField_0x828(-1); + mpTagProcessor->setCancelBtnIdx(-1); mSelectBtn.setTagProcessor(nullptr); - field_0x824 = 0; + mNumOptions = 0; mTextOptionSelection = selection; field_0x1220 = 0; if (FiContext::GetInstance() != nullptr) { diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_demo.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_demo.cpp index 2e15b7ce..8e740d14 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_demo.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_demo.cpp @@ -54,7 +54,7 @@ bool dLytMsgWindowDemo_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAc mpTextboxes[i] = mLyt.getTextBox(sTextBoxes[i]); } - mpTextboxes[1]->set0x1F6(1); + mpTextboxes[1]->setIsShadow(1); mpTagProcessor = tagProcessor; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp index d595badc..c878dab5 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp @@ -64,7 +64,7 @@ bool dLytMsgWindowGet_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAcc mpTextboxes[i]->SetTextPositionV(0); } - mpTextboxes[1]->set0x1F6(1); + mpTextboxes[1]->setIsShadow(1); for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane = &mBtn; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp index 7b03ef4b..12c9dc7b 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp @@ -68,7 +68,7 @@ bool dLytMsgWindowLink_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAc mpTextboxes[i]->SetTextPositionV(0); } - mpTextboxes[1]->set0x1F6(1); + mpTextboxes[1]->setIsShadow(1); for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane = &mBtn; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp index 23b4ce88..0dc84e66 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp @@ -1,11 +1,21 @@ #include "d/lyt/msg_window/d_lyt_msg_window_select_btn.h" #include "common.h" +#include "d/d_gfx.h" +#include "d/d_lyt_hio.h" #include "d/d_pad.h" #include "d/d_pad_nav.h" #include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_cursor_stick.h" +#include "d/lyt/d_lyt_system_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_player_mgr.h" #include "d/snd/d_snd_small_effect_mgr.h" +#include "m/m_angle.h" +#include "m/m_pad.h" +#include "m/m_vec.h" +#include "nw4r/math/math_types.h" STATE_DEFINE(dLytMsgWindowSelectBtnParts_c, Wait); STATE_DEFINE(dLytMsgWindowSelectBtnParts_c, On); @@ -22,28 +32,572 @@ STATE_DEFINE(dLytMsgWindowSelectBtn_c, Out); SelectBtnHelper::SelectBtnHelper() { field_0x4C = -1; - field_0x50 = -1; - field_0x44 = field_0x48 = 0; - field_0x34 = field_0x3C = 0.0f; - field_0x38 = field_0x40 = 0.0f; - field_0x52 = 0; - field_0x51 = 1; + mSelectedBtnIdx = -1; + mButtonMode = 0; + mCursorSelectTimer = 0; + mAngX = mAngXCenter = 0.0f; + mAngY = mAngYCenter = 0.0f; + mIsNavEnabled = false; + mIsCursorActive = true; - panes[0] = 0; - panes[1] = 0; - panes[2] = 0; - panes[3] = 0; - panes[4] = 0; - panes[5] = 0; - panes[6] = 0; - panes[7] = 0; - panes[8] = 0; + panes[0] = nullptr; + panes[1] = nullptr; + panes[2] = nullptr; + panes[3] = nullptr; + panes[4] = nullptr; + panes[5] = nullptr; + panes[6] = nullptr; + panes[7] = nullptr; + panes[8] = nullptr; } SelectBtnHelper::~SelectBtnHelper() {} +void SelectBtnHelper::init() { + field_0x24 = dPad::getDpdPosScreen(); + fn_8011E110(field_0x24); + field_0x2C = dPad::getDpdPosScreen(); + resetCursor(); +} + +void SelectBtnHelper::remove() { + // no-op +} + +void SelectBtnHelper::resetCursor() { + mAngX = mAngXCenter = mAng::ang2deg_c(dPad::ex_c::getInstance()->mMPLS.getHorizontalAngle()); + mAngY = mAngYCenter = mAng::ang2deg_c(dPad::ex_c::getInstance()->mMPLS.getVerticalAngle()); +} + +u8 SelectBtnHelper::execute() { + u8 ret = EXECUTE_NONE; + if (mIsCursorActive && hasNewFSStickButtonSelect() && !mIsNavEnabled) { + mIsNavEnabled = true; + dPadNav::setNavEnabled(true, false); + dPadNav::hidePointer(); + } + + if (mIsCursorActive != dPadNav::isPointerVisible()) { + mIsCursorActive = dPadNav::isPointerVisible(); + if (mIsCursorActive == true) { + if (mIsNavEnabled) { + mIsNavEnabled = false; + dPadNav::setNavEnabled(false, false); + } + resetCursor(); + } + ret = EXECUTE_SWITCH_CURSOR; + } + + s8 btn = mSelectedBtnIdx; + if (mIsCursorActive) { + if (handleCursorInput()) { + return EXECUTE_RESET_CURSOR; + } else if (btn == -1 && mSelectedBtnIdx != -1) { + ret = EXECUTE_SWITCH_CURSOR; + } + } else { + handleButtonInput(); + if (btn == -1 && mSelectedBtnIdx != -1) { + ret = EXECUTE_SWITCH_STICK; + } + } + + return ret; +} + +bool SelectBtnHelper::handleCursorInput() { + if (dPad::getDownTrigDown()) { + resetCursor(); + return true; + } + + mAngX = mAng::ang2deg_c(dPad::ex_c::getInstance()->mMPLS.getHorizontalAngle()); + mAngY = mAng::ang2deg_c(dPad::ex_c::getInstance()->mMPLS.getVerticalAngle()); + + mVec2_c screenPos = dPad::getDpdPosScreen(); + if (mCursorSelectTimer > 0) { + mCursorSelectTimer--; + if (mCursorSelectTimer == 0) { + fn_8011E110(screenPos); + field_0x2C = dPad::getDpdPosScreen(); + mAngXCenter = mAngX; + mAngYCenter = mAngY; + } + } else { + s32 btn = calculatePointedAtButton(mAngX - mAngXCenter, mAngY - mAngYCenter); + if (mSelectedBtnIdx != btn) { + mSelectedBtnIdx = btn; + mCursorSelectTimer = dLyt_HIO_c::getInstance()->getField0x796(); + if (mSelectedBtnIdx != -1) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR); + mPad::getCore()->startPatternRumble("**-*----", 0, false); + } + fn_8011E110(screenPos); + // TODO additional stack stores + field_0x2C = dPad::getDpdPosScreen(); + mAngXCenter = mAngX; + mAngYCenter = mAngY; + } + + f32 length = 0.0f; + f32 angle = 0.0f; + s32 selected = mSelectedBtnIdx; + mVec2_c v( + -(mAngX - mAngXCenter) / dLyt_HIO_c::getInstance()->getField0x778(), + (mAngY - mAngYCenter) / dLyt_HIO_c::getInstance()->getField0x780() + ); + + if (v.x > 1.0f) { + v.x = 1.0f; + } + if (v.x < -1.0f) { + v.x = -1.0f; + } + if (v.y > 1.0f) { + v.y = 1.0f; + } + if (v.y < -1.0f) { + v.y = -1.0f; + } + + if (selected != -1) { + nw4r::math::MTX34 mtx0 = getRootPane()->GetGlobalMtx(); + mVec2_c pos0 = mVec2_c(mtx0._03, mtx0._13); + nw4r::math::MTX34 mtxi = getPosPane(selected)->GetGlobalMtx(); + mVec2_c posi = mVec2_c(mtxi._03, mtxi._13); + mVec2_c d1 = posi - pos0; + s16 ang = d1.ang(); + + mVec2_c adj; + adj.x = v.x * dLyt_HIO_c::getInstance()->getField0x770(); + adj.y = v.y * dLyt_HIO_c::getInstance()->getField0x774(); + mVec2_c d2 = posi + adj - pos0; + s16 ang2 = d2.ang(); + + angle = mAng::ang2deg_c(ang2) - mAng::ang2deg_c(ang); + length = d2.length() / d1.length(); + } + if (length > 1.0f) { + length = 1.0f; + } + + if ((mButtonMode == MODE_3_UP && selected == 0) || (mButtonMode == MODE_3_DOWN && selected == 1)) { + // "middle" button + length *= 0.53f; + } + + dLytMeter_c::setSelectBtn(angle + getAngleForButtonIdx(selected), length); + dLytSystemWindow_c::setSelectBtn(angle + getAngleForButtonIdx(selected), length); + } + return false; +} + +bool SelectBtnHelper::handleButtonInput() { + if (dPad::getDownTrigDown()) { + resetCursor(); + } + + s8 btn = mSelectedBtnIdx; + if (btn != -1) { +#define IS(dir) (dPadNav::getFSStickNavDirection() == dPadNav::FS_STICK_##dir) + + switch (mButtonMode) { + case MODE_2: + if (btn == 0) { + if (IS(LEFT) || IS(UP_LEFT) || IS(DOWN_LEFT)) { + btn = 1; + } + } else if (btn == 1) { + if (IS(RIGHT) || IS(UP_RIGHT) || IS(DOWN_RIGHT)) { + btn = 0; + } + } + break; + case MODE_3_UP: + if (btn == 0) { + if (IS(RIGHT) || IS(DOWN_RIGHT)) { + btn = 1; + } else if (IS(LEFT) || IS(DOWN_LEFT)) { + btn = 2; + } + } else if (btn == 1) { + if (IS(UP) || IS(UP_LEFT)) { + btn = 0; + } else if (IS(DOWN_LEFT) || IS(LEFT)) { + btn = 2; + } + } else if (btn == 2) { + if (IS(UP) || IS(UP_RIGHT)) { + btn = 0; + } else if (IS(DOWN_RIGHT) || IS(RIGHT)) { + btn = 1; + } + } + break; + case MODE_4: + if (btn == 0) { + if (IS(DOWN) || IS(DOWN_RIGHT)) { + btn = 1; + } else if (IS(LEFT) || IS(UP_LEFT)) { + btn = 2; + } else if (IS(DOWN_LEFT)) { + btn = 3; + } + } else if (btn == 1) { + if (IS(UP) || IS(UP_RIGHT)) { + btn = 0; + } else if (IS(UP_LEFT)) { + btn = 2; + } else if (IS(LEFT) || IS(DOWN_LEFT)) { + btn = 3; + } + } else if (btn == 2) { + if (IS(RIGHT) || IS(UP_RIGHT)) { + btn = 0; + } else if (IS(DOWN_RIGHT)) { + btn = 1; + } else if (IS(DOWN) || IS(DOWN_LEFT)) { + btn = 3; + } + } else if (btn == 3) { + if (IS(UP_RIGHT)) { + btn = 0; + } else if (IS(RIGHT) || IS(DOWN_RIGHT)) { + btn = 1; + } else if (IS(UP) || IS(UP_LEFT)) { + btn = 2; + } + } + break; + case MODE_3_DOWN: + if (btn == 1) { + if (IS(RIGHT) || IS(UP_RIGHT)) { + btn = 0; + } else if (IS(LEFT) || IS(UP_LEFT)) { + btn = 2; + } + } else if (btn == 0) { + if (IS(DOWN) || IS(DOWN_LEFT)) { + btn = 1; + } else if (IS(UP_LEFT) || IS(LEFT)) { + btn = 2; + } + } else if (btn == 2) { + if (IS(DOWN) || IS(DOWN_RIGHT)) { + btn = 1; + } else if (IS(UP_RIGHT) || IS(RIGHT)) { + btn = 0; + } + } + break; + } + +#undef IS + } else { +#define IS(dir) (dPadNav::getFSStickDirectionTrig() == dPadNav::FS_STICK_##dir) + + switch (mButtonMode) { + case MODE_2: + if (IS(UP_RIGHT) || IS(RIGHT) || IS(DOWN_RIGHT)) { + btn = 0; + } else if (IS(UP_LEFT) || IS(LEFT) || IS(DOWN_LEFT)) { + btn = 1; + } + break; + case MODE_3_UP: + if (IS(UP_RIGHT) || IS(UP) || IS(UP_LEFT)) { + btn = 0; + } else if (IS(LEFT) || IS(DOWN_LEFT)) { + btn = 2; + } else if (IS(RIGHT) || IS(DOWN_RIGHT)) { + btn = 1; + } + break; + case MODE_4: + if (IS(UP_RIGHT) || IS(RIGHT)) { + btn = 0; + } else if (IS(DOWN_RIGHT)) { + btn = 1; + } else if (IS(DOWN_LEFT) || IS(LEFT)) { + btn = 3; + } else if (IS(UP_LEFT)) { + btn = 2; + } + break; + case MODE_3_DOWN: + if (IS(DOWN_RIGHT) || IS(DOWN) || IS(DOWN_LEFT)) { + btn = 1; + } else if (IS(LEFT) || IS(UP_LEFT)) { + btn = 2; + } else if (IS(RIGHT) || IS(UP_RIGHT)) { + btn = 0; + } + break; + } + +#undef IS + + if (btn == -1) { + // TODO + btn = field_0x4C != -1 ? field_0x4C : 0; + } + } + + if (mSelectedBtnIdx != btn) { + mSelectedBtnIdx = btn; + if (mSelectedBtnIdx != -1) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR); + mPad::getCore()->startPatternRumble("**-*----", 0, false); + // TODO - pane array + dLytCursorStick_c::GetInstance()->setTargetPane(getBounding(btn)); + } + } + + return false; +} + +f32 SelectBtnHelper::getAngleForButtonIdx(s32 idx) const { + f32 ret = 0.0f; + switch (mButtonMode) { + case MODE_2: + if (idx == 0) { + ret = -90.0f; + } else { + ret = 90.0f; + } + break; + case MODE_3_UP: + if (idx == 0) { + return 0.0f; + } else if (idx == 1) { + return -90.0f; + } else { + ret = 90.0f; + } + break; + case MODE_4: + if (idx == 0) { + return -75.0f; + } else if (idx == 1) { + return -105.0f; + } else if (idx == 2) { + return 75.0f; + } else { + ret = 105.0f; + } + break; + case MODE_3_DOWN: + if (idx == 1) { + return -180.0f; + } else if (idx == 0) { + return -90.0f; + } else { + ret = 90.0f; + } + break; + } + + return ret; +} + +bool SelectBtnHelper::hasNewFSStickButtonSelect() const { + if (dPadNav::getFSStickDirectionTrig() == dPadNav::FS_STICK_NONE) { + return false; + } + +#define TRIG(dir) (dPadNav::getFSStickDirectionTrig() == dPadNav::FS_STICK_##dir) + + switch (mButtonMode) { + case MODE_2: + if (TRIG(UP) || TRIG(DOWN) || + ((TRIG(RIGHT) || TRIG(UP_RIGHT) || TRIG(DOWN_RIGHT)) && mSelectedBtnIdx == 0) || + ((TRIG(LEFT) || TRIG(UP_LEFT) || TRIG(DOWN_LEFT)) && mSelectedBtnIdx == 1)) { + return false; + } + break; + case MODE_3_UP: + if (((TRIG(UP) || TRIG(UP_RIGHT) || TRIG(UP_LEFT)) && mSelectedBtnIdx == 0) || + ((TRIG(DOWN) || TRIG(DOWN_RIGHT) || TRIG(DOWN_LEFT)) && (mSelectedBtnIdx == 1 || mSelectedBtnIdx == 2) + ) || + ((TRIG(RIGHT) || TRIG(UP_RIGHT) || TRIG(DOWN_RIGHT)) && mSelectedBtnIdx == 1) || + ((TRIG(LEFT) || TRIG(UP_LEFT) || TRIG(DOWN_LEFT)) && mSelectedBtnIdx == 2)) { + return false; + } + break; + case MODE_3_DOWN: + if (((TRIG(UP) || TRIG(UP_LEFT) || TRIG(UP_RIGHT)) && (mSelectedBtnIdx == 0 || mSelectedBtnIdx == 2)) || + ((TRIG(DOWN) || TRIG(DOWN_RIGHT) || TRIG(DOWN_LEFT)) && mSelectedBtnIdx == 1) || + ((TRIG(RIGHT) || TRIG(UP_RIGHT) || TRIG(DOWN_RIGHT)) && mSelectedBtnIdx == 0) || + ((TRIG(LEFT) || TRIG(UP_LEFT) || TRIG(DOWN_LEFT)) && mSelectedBtnIdx == 2)) { + return false; + } + break; + case MODE_4: + if ((TRIG(UP) && (mSelectedBtnIdx == 0 || mSelectedBtnIdx == 2)) || + (TRIG(DOWN) && (mSelectedBtnIdx == 1 || mSelectedBtnIdx == 3)) || + (TRIG(RIGHT) && (mSelectedBtnIdx == 0 || mSelectedBtnIdx == 1)) || + (TRIG(LEFT) && (mSelectedBtnIdx == 2 || mSelectedBtnIdx == 3)) || + (TRIG(UP_RIGHT) && mSelectedBtnIdx == 0) || (TRIG(UP_LEFT) && mSelectedBtnIdx == 2) || + (TRIG(DOWN_RIGHT) && mSelectedBtnIdx == 1) || (TRIG(DOWN_LEFT) && mSelectedBtnIdx == 3)) { + return false; + } + break; + } + +#undef TRIG + + return true; +} + +s8 SelectBtnHelper::calculatePointedAtButton(f32 x, f32 y) { + s32 ret = mSelectedBtnIdx; + switch (mButtonMode) { + case MODE_2: + if (x <= -dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 0; + } else if (x >= dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 1; + } + if (mSelectedBtnIdx == 0 && x < 0) { + mAngXCenter = mAngX; + } else if (mSelectedBtnIdx == 1 && x > 0) { + mAngXCenter = mAngX; + } + break; + case MODE_3_UP: + if (y >= dLyt_HIO_c::getInstance()->getField0x780()) { + ret = 0; + } else if (x <= -dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 1; + } else if (x >= dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 2; + } else if (y <= -dLyt_HIO_c::getInstance()->getField0x780()) { + if (x < 0.0f) { + ret = 1; + } else { + ret = 2; + } + } + if (mSelectedBtnIdx == 0 && y > 0) { + mAngYCenter = mAngY; + } else if (mSelectedBtnIdx == 1 && x < 0) { + mAngXCenter = mAngX; + } else if (mSelectedBtnIdx == 2 && x > 0) { + mAngXCenter = mAngX; + } + break; + case MODE_4: + if (mSelectedBtnIdx == -1) { + if (y >= dLyt_HIO_c::getInstance()->getField0x780() && + x <= -dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 0; + } else if (y <= -dLyt_HIO_c::getInstance()->getField0x780() && + x <= -dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 1; + } else if (y >= dLyt_HIO_c::getInstance()->getField0x780() && + x >= dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 2; + } else if (y <= -dLyt_HIO_c::getInstance()->getField0x780() && + x >= dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 3; + } + } else if (mSelectedBtnIdx == 0) { + if (y <= -dLyt_HIO_c::getInstance()->getField0x784() && + x >= dLyt_HIO_c::getInstance()->getField0x77C()) { + ret = 3; + } else if (y <= -dLyt_HIO_c::getInstance()->getField0x780()) { + ret = 1; + } else if (x >= dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 2; + } + } else if (mSelectedBtnIdx == 1) { + if (y >= dLyt_HIO_c::getInstance()->getField0x784() && + x >= dLyt_HIO_c::getInstance()->getField0x77C()) { + ret = 2; + } else if (y >= dLyt_HIO_c::getInstance()->getField0x780()) { + ret = 0; + } else if (x >= dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 3; + } + } else if (mSelectedBtnIdx == 2) { + if (y <= -dLyt_HIO_c::getInstance()->getField0x784() && + x <= -dLyt_HIO_c::getInstance()->getField0x77C()) { + ret = 1; + } else if (y <= -dLyt_HIO_c::getInstance()->getField0x780()) { + ret = 3; + } else if (x <= -dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 0; + } + } else if (mSelectedBtnIdx == 3) { + if (y >= dLyt_HIO_c::getInstance()->getField0x784() && + x <= -dLyt_HIO_c::getInstance()->getField0x77C()) { + ret = 0; + } else if (y >= dLyt_HIO_c::getInstance()->getField0x780()) { + ret = 2; + } else if (x <= -dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 1; + } + } + + if (mSelectedBtnIdx == 0 && y > 0.0f) { + mAngYCenter = mAngY; + } else if (mSelectedBtnIdx == 0 && x < 0.0f) { + mAngXCenter = mAngX; + } else if (mSelectedBtnIdx == 1 && y < 0.0f) { + mAngYCenter = mAngY; + } else if (mSelectedBtnIdx == 1 && x < 0.0f) { + mAngXCenter = mAngX; + } else if (mSelectedBtnIdx == 2 && y > 0.0f) { + mAngYCenter = mAngY; + } else if (mSelectedBtnIdx == 2 && x > 0.0f) { + mAngXCenter = mAngX; + } else if (mSelectedBtnIdx == 3 && y < 0.0f) { + mAngYCenter = mAngY; + } else if (mSelectedBtnIdx == 3 && x > 0.0f) { + mAngXCenter = mAngX; + } + break; + case MODE_3_DOWN: + if (y <= -dLyt_HIO_c::getInstance()->getField0x780()) { + ret = 1; + } else if (x <= -dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 0; + } else if (x >= dLyt_HIO_c::getInstance()->getField0x778()) { + ret = 2; + } else if (y >= dLyt_HIO_c::getInstance()->getField0x780()) { + if (x < 0.0f) { + ret = 0; + } else { + ret = 2; + } + } + if (mSelectedBtnIdx == 1 && y < 0) { + mAngYCenter = mAngY; + } else if (mSelectedBtnIdx == 0 && x < 0) { + mAngXCenter = mAngX; + } else if (mSelectedBtnIdx == 2 && x > 0) { + mAngXCenter = mAngX; + } + break; + } + + return ret; +} + +void SelectBtnHelper::convertScreenPosToDpdPos(mVec2_c *pOutDpd, mVec2_c *screenPos) const { + pOutDpd->x = (screenPos->x - dGfx_c::getWidth4x3LeftF()) / (dGfx_c::getWidth4x3F() * 0.5f) - 1.0f; + pOutDpd->y = (screenPos->y - dGfx_c::getCurrentScreenTopF()) / (dGfx_c::getCurrentScreenHeightF() * -0.5f) - 1.0f; +} + +void SelectBtnHelper::fn_8011E110(mVec2_c screenPos) const { + mVec2_c dpdPos; + convertScreenPosToDpdPos(&dpdPos, &screenPos); + dPad::ex_c::getInstance()->fn_80056580(mPad::getCurrentCoreID(), dpdPos); +} + void dLytMsgWindowSelectBtnParts_c::initializeState_Wait() {} void dLytMsgWindowSelectBtnParts_c::executeState_Wait() { - if (field_0x48 != 0) { + if (mShouldBeOn != 0) { for (int i = 0; i <= 1; i++) { mpAnms[i]->setForwardOnce(); mpAnms[i]->setFrame(0.0f); @@ -71,7 +625,7 @@ void dLytMsgWindowSelectBtnParts_c::finalizeState_On() {} void dLytMsgWindowSelectBtnParts_c::initializeState_Select() {} void dLytMsgWindowSelectBtnParts_c::executeState_Select() { - if (field_0x48 == 0) { + if (mShouldBeOn == 0) { for (int i = 0; i <= 1; i++) { mpAnms[i]->setBackwardsOnce(); mpAnms[i]->setToStart(); @@ -99,7 +653,7 @@ void dLytMsgWindowSelectBtnParts_c::finalizeState_Off() {} void dLytMsgWindowSelectBtnParts_c::init() { mStateMgr.changeState(StateID_Wait); - field_0x48 = 0; + mShouldBeOn = 0; field_0x50 = 0; field_0x4C = 3; } @@ -109,6 +663,14 @@ void dLytMsgWindowSelectBtnParts_c::execute() { mpAnms[2]->play(); } +const char *d_lyt_msg_window_select_btn_string_order_1() { + return "N_allBtn_00"; +} + +const char *d_lyt_msg_window_select_btn_string_order_2() { + return "N_arrowIn_00"; +} + #define SELECT_BTN_ANIM_IN 0 #define SELECT_BTN_ANIM_LOOP_REMOCON 1 #define SELECT_BTN_ANIM_INOUT_CURSOR 2 @@ -187,7 +749,7 @@ static const char *sDecideTextBoxes[2] = { "T_decideS_00", }; -static const char *sWindowName = "W_bgP_01"; +static const char *sWindowNames[] = {"W_bgP_01"}; static const char *sBoundings[SELECT_BTN_NUM_BTNS] = { "B_btn_00", @@ -201,40 +763,76 @@ static const char *sSelectPanes[7] = { "N_messageBtn_01", "N_messageBtn_02", "N_messageBtn_03", }; -void dLytMsgWindowSelectBtn_c::initializeState_Wait() { - field_0x9A4 = 0; - field_0x9B8 = -1; - field_0x9BC = -1; +#define SELECT_BTN_PANE_ITEM_ARROW_0 0 +#define SELECT_BTN_PANE_ARROW_HAND 1 +#define SELECT_BTN_PANE_BTN_0 2 - field_0x9CC = 0xFF; - field_0x9C0 = 10; +void dLytMsgWindowSelectBtn_c::requestIn(s32 numBtns, bool playSound) { + mPlayInSound = playSound; + mBtnHelper.mSelectedBtnIdx = -1; + + if (numBtns < 2) { + numBtns = 2; + } else if (numBtns > 4) { + numBtns = 4; + } + + mNumBtns = numBtns; + switch (numBtns) { + case 2: field_0x9AC = 2; break; + case 3: field_0x9AC = 1; break; + case 4: field_0x9AC = 0; break; + } + + mIsVisible = true; + if (mFlipBtnLayout == 1 && mNumBtns == 3) { + mAnm[SELECT_BTN_ANIM_MESSAGE_BTN].setFrame(3.0f); + } else { + mAnm[SELECT_BTN_ANIM_MESSAGE_BTN].setFrame(mNumBtns - 2); + } + mAnm[SELECT_BTN_ANIM_MESSAGE_BTN].setAnimEnable(true); + mAnm[SELECT_BTN_ANIM_IN].setAnimEnable(false); + mConfirmedBtnIdx = -1; + mStateMgr.changeState(StateID_In); +} + +void dLytMsgWindowSelectBtn_c::initializeState_Wait() { + mIsVisible = false; + field_0x9B8 = -1; + mCancelBtnIdx = -1; + + mCanceledViaBBtnIdx = 0xFF; + mWaitCancelTimer = 10; field_0x9CD = 1; } void dLytMsgWindowSelectBtn_c::executeState_Wait() {} void dLytMsgWindowSelectBtn_c::finalizeState_Wait() {} void dLytMsgWindowSelectBtn_c::initializeState_In() { - field_0x9A4 = 1; - field_0x9B4 = -1; + mIsVisible = true; + mDecidedBtnIdx = -1; for (int i = 0; i < 2; i++) { // "Select" mLyt.loadTextVariant(mpDecideTextBoxes[i], 1); } - mpWindow->UpdateSize(mpSizeBox, 32.0f); + mpWindow[0]->UpdateSize(mpSizeBox[0], 32.0f); for (int i = SELECT_BTN_ANIM_MESSAGE_BTN_CANCEL_0; i <= SELECT_BTN_ANIM_MESSAGE_BTN_CANCEL_3; i++) { - if (field_0x9BC == i - SELECT_BTN_ANIM_MESSAGE_BTN_CANCEL_0) { + if (mCancelBtnIdx == i - SELECT_BTN_ANIM_MESSAGE_BTN_CANCEL_0) { mAnm[i].setFrame(1.0f); } else { mAnm[i].setFrame(0.0f); } } - mBtnHelper.field_0x50 = -1; - mBtnHelper.field_0x51 = 1; - // ?????? - f32 v = mBtnHelper.fn_8011D690(mBtnHelper.field_0x50); + mBtnHelper.mSelectedBtnIdx = -1; + mBtnHelper.mIsCursorActive = true; + if (mBtnHelper.getSelectedtBtnIdx() != -1) { + // unreachable but the call isn't eliminated + dLytCursorStick_c::GetInstance()->setTargetPane(mBtnHelper.getBounding(mBtnHelper.getSelectedtBtnIdx())); + } + dLytMeter_c::setSelectBtn(mBtnHelper.getAngleForButtonIdx(mBtnHelper.getSelectedtBtnIdx()), 0.0f); mLyt.findPane("N_allBtn_00")->SetVisible(true); mLyt.findPane("N_arrowIn_00")->SetVisible(true); @@ -277,10 +875,10 @@ void dLytMsgWindowSelectBtn_c::initializeState_In() { mAnm[SELECT_BTN_ANIM_IN].setToEnd(); field_0x9D1 = false; } else { - if (field_0x9CF != 0) { - if (field_0x9A0 == 1) { + if (mPlayInSound) { + if (mInSound == 1) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CHOICE_START); - } else if (field_0x9A0 == 2) { + } else if (mInSound == 2) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CHOICE_START_GAMEOVER); } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CHOICE_START); @@ -300,65 +898,106 @@ void dLytMsgWindowSelectBtn_c::finalizeState_In() { } void dLytMsgWindowSelectBtn_c::initializeState_WaitSelect() { - if (field_0x9D0 == 0) { + if (!field_0x9D0) { field_0x9D0 = true; dSndPlayerMgr_c::GetInstance()->enterMsgWait(); } - mBtnHelper.fn_8011C970(); - mBtnHelper.field_0x48 = fn_8011FE50(); + mBtnHelper.init(); + mBtnHelper.mButtonMode = getSelectBtnMode(); } void dLytMsgWindowSelectBtn_c::executeState_WaitSelect() { - u8 v = mBtnHelper.fn_8011CAC0(); - if (v == 1) { + u8 v = mBtnHelper.execute(); + if (v == SelectBtnHelper::EXECUTE_SWITCH_CURSOR) { mStateMgr.changeState(StateID_CursorInOut); return; - } else if (v == 2) { - f32 f = mBtnHelper.fn_8011D690(mBtnHelper.field_0x50); - // TODO + } else if (v == SelectBtnHelper::EXECUTE_SWITCH_STICK) { + dLytMeter_c::setSelectBtn(mBtnHelper.getAngleForButtonIdx(mBtnHelper.getSelectedtBtnIdx()), 1.0f); for (int i = 0; i < 2; i++) { // "Confirm" mLyt.loadTextVariant(mpDecideTextBoxes[i], 0); } - mpWindow->UpdateSize(mpSizeBox, 32.0f); - } else if (v == 3) { + mpWindow[0]->UpdateSize(mpSizeBox[0], 32.0f); + } else if (v == SelectBtnHelper::EXECUTE_RESET_CURSOR) { field_0x9D1 = 1; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_POINTER_RESET); mStateMgr.changeState(StateID_In); return; } - if (mBtnHelper.field_0x50 >= 0 && dPad::getDownTrigA()) { - field_0x9D0 = 0; - field_0x9B0 = mBtnHelper.field_0x50; + if (mBtnHelper.getSelectedtBtnIdx() >= 0 && dPad::getDownTrigA()) { + mConfirmedBtnIdx = mBtnHelper.getSelectedtBtnIdx(); + field_0x9D0 = false; mStateMgr.changeState(StateID_WaitDecide); - // TODO if (mpTagProcessor != nullptr) { - dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_CANCEL); - } else { - dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_OK); + if (mpTagProcessor->getOptionSound(mBtnHelper.getSelectedtBtnIdx()) == 0) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_CANCEL); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_OK); + } } dSndPlayerMgr_c::GetInstance()->leaveMsgWait(); - } else if (dPad::getDownTrigB()) { - f32 f = mBtnHelper.fn_8011D690(field_0x9BC); - // TODO - field_0x9CC = field_0x9BC; - field_0x9D0 = 0; + } else if (mCancelBtnIdx >= 0 && dPad::getDownTrigB()) { + dLytMeter_c::setSelectBtn(mBtnHelper.getAngleForButtonIdx(mCancelBtnIdx), 1.0f); + mCanceledViaBBtnIdx = mCancelBtnIdx; + field_0x9D0 = false; mStateMgr.changeState(StateID_WaitCancel); - // TODO if (mpTagProcessor != nullptr) { - dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_CANCEL); - } else { - dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_OK); + if (mpTagProcessor->getOptionSound(mCanceledViaBBtnIdx) == 0) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_CANCEL); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TALK_CURSOR_OK); + } } dSndPlayerMgr_c::GetInstance()->leaveMsgWait(); } } -void dLytMsgWindowSelectBtn_c::finalizeState_WaitSelect() {} +void dLytMsgWindowSelectBtn_c::finalizeState_WaitSelect() { + mBtnHelper.remove(); + if (!field_0x9D0 && mBtnHelper.mIsNavEnabled) { + mBtnHelper.mIsNavEnabled = false; + dPadNav::setNavEnabled(false, false); + } +} -void dLytMsgWindowSelectBtn_c::initializeState_CursorInOut() {} +void dLytMsgWindowSelectBtn_c::initializeState_CursorInOut() { + for (int i = 0; i < 2; i++) { + // "Confirm" + mLyt.loadTextVariant(mpDecideTextBoxes[i], 0); + } + mpWindow[0]->UpdateSize(mpSizeBox[0], 32.0f); + + if (mBtnHelper.mIsCursorActive) { + mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setForwardOnce(); + if (mBtnHelper.getSelectedtBtnIdx() != -1) { + f32 length = 1.0f; + if ((mBtnHelper.mButtonMode == SelectBtnHelper::MODE_3_UP && mBtnHelper.getSelectedtBtnIdx() == 0) || + (mBtnHelper.mButtonMode == SelectBtnHelper::MODE_3_DOWN && mBtnHelper.getSelectedtBtnIdx() == 1)) { + // "middle" button + length *= 0.53f; + } + dLytMeter_c::setSelectBtn(mBtnHelper.getAngleForButtonIdx(mBtnHelper.getSelectedtBtnIdx()), length); + } else { + dLytMeter_c::setSelectBtn(mBtnHelper.getAngleForButtonIdx(mBtnHelper.getSelectedtBtnIdx()), 0.0f); + } + } else { + f32 length = 1.0f; + mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setBackwardsOnce(); + if (mBtnHelper.getSelectedtBtnIdx() != -1) { + dLytCursorStick_c::GetInstance()->setTargetPane(mpBoundings[mBtnHelper.getSelectedtBtnIdx()]); + if ((mBtnHelper.mButtonMode == SelectBtnHelper::MODE_3_UP && mBtnHelper.getSelectedtBtnIdx() == 0) || + (mBtnHelper.mButtonMode == SelectBtnHelper::MODE_3_DOWN && mBtnHelper.getSelectedtBtnIdx() == 1)) { + // "middle" button + length *= 0.53f; + } + } + dLytMeter_c::setSelectBtn(mBtnHelper.getAngleForButtonIdx(mBtnHelper.getSelectedtBtnIdx()), length); + } + mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setToStart(); + mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setAnimEnable(true); +} void dLytMsgWindowSelectBtn_c::executeState_CursorInOut() { if (mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].isStop2()) { mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setAnimEnable(false); @@ -371,18 +1010,18 @@ void dLytMsgWindowSelectBtn_c::executeState_CursorInOut() { void dLytMsgWindowSelectBtn_c::finalizeState_CursorInOut() {} void dLytMsgWindowSelectBtn_c::initializeState_WaitDecide() { - s32 decideAnm = field_0x9B0 + SELECT_BTN_ANIM_MESSAGE_BTN_DECIDE_OFFSET; + s32 decideAnm = mConfirmedBtnIdx + SELECT_BTN_ANIM_MESSAGE_BTN_DECIDE_OFFSET; mAnm[decideAnm].setAnimEnable(true); mAnm[decideAnm].setFrame(0.0f); mAnm[decideAnm].setForwardOnce(); } void dLytMsgWindowSelectBtn_c::executeState_WaitDecide() { - s32 decideAnm = field_0x9B0 + SELECT_BTN_ANIM_MESSAGE_BTN_DECIDE_OFFSET; + s32 decideAnm = mConfirmedBtnIdx + SELECT_BTN_ANIM_MESSAGE_BTN_DECIDE_OFFSET; mAnm[decideAnm].play(); if (mAnm[decideAnm].isStop2()) { mAnm[decideAnm].setAnimEnable(false); - field_0x9B4 = field_0x9B0; - if (field_0x99C == 1) { + mDecidedBtnIdx = mConfirmedBtnIdx; + if (mSkipOutAnim == 1) { mStateMgr.changeState(StateID_Wait); } else { mStateMgr.changeState(StateID_Out); @@ -392,7 +1031,7 @@ void dLytMsgWindowSelectBtn_c::executeState_WaitDecide() { void dLytMsgWindowSelectBtn_c::finalizeState_WaitDecide() {} void dLytMsgWindowSelectBtn_c::initializeState_WaitCancel() { - field_0x9C0 = 10; + mWaitCancelTimer = 10; mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setForwardOnce(); mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setToEnd2(); mAnm[SELECT_BTN_ANIM_INOUT_CURSOR].setAnimEnable(true); @@ -401,8 +1040,8 @@ void dLytMsgWindowSelectBtn_c::initializeState_WaitCancel() { mpSelectPanes[0]->SetAlpha(0xFF); } void dLytMsgWindowSelectBtn_c::executeState_WaitCancel() { - if (--field_0x9C0 <= 0) { - field_0x9B0 = field_0x9CC; + if (--mWaitCancelTimer <= 0) { + mConfirmedBtnIdx = mCanceledViaBBtnIdx; mStateMgr.changeState(StateID_WaitDecide); } } @@ -412,25 +1051,27 @@ void dLytMsgWindowSelectBtn_c::initializeState_Out() { mAnm[SELECT_BTN_ANIM_OUT].setAnimEnable(true); mAnm[SELECT_BTN_ANIM_OUT].setFrame(0.0f); mAnm[SELECT_BTN_ANIM_OUT].setForwardOnce(); - field_0x9C8 = 0; + mStep = 0; } void dLytMsgWindowSelectBtn_c::executeState_Out() { - switch (field_0x9C8) { + switch (mStep) { case 0: mAnm[SELECT_BTN_ANIM_OUT].play(); if (mAnm[SELECT_BTN_ANIM_OUT].isStop2()) { - field_0x9A4 = 0; - field_0x9C8 = 1; + mIsVisible = false; + mStep = 1; } break; case 1: mAnm[SELECT_BTN_ANIM_OUT].setAnimEnable(false); - field_0x9B4 = field_0x9B0; + mDecidedBtnIdx = mConfirmedBtnIdx; mStateMgr.changeState(StateID_Wait); break; } } -void dLytMsgWindowSelectBtn_c::finalizeState_Out() {} +void dLytMsgWindowSelectBtn_c::finalizeState_Out() { + mStep = 0; +} bool dLytMsgWindowSelectBtn_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); @@ -467,13 +1108,14 @@ bool dLytMsgWindowSelectBtn_c::build(d2d::ResAccIf_c *resAcc) { mpDecideTextBoxes[i] = mLyt.getTextBox(sDecideTextBoxes[i]); } - mpWindow = mLyt.getWindow(sWindowName); - mpSizeBox = mLyt.getSizeBoxInWindow(sWindowName); - - mpWindow->UpdateSize(mpSizeBox, 32.0f); + for (int i = 0; i < 1; i++) { + mpWindow[i] = mLyt.getWindow(sWindowNames[i]); + mpSizeBox[i] = mLyt.getSizeBoxInWindow(sWindowNames[i]); + mpWindow[i]->UpdateSize(mpSizeBox[i], 32.0f); + } for (int i = 0; i < SELECT_BTN_NUM_BTNS; i++) { - mpBoundings[i] = mLyt.findPane(sBoundings[i]); + mpBoundings[i] = mLyt.findBounding(sBoundings[i]); } mpTagProcessor = nullptr; @@ -492,7 +1134,7 @@ bool dLytMsgWindowSelectBtn_c::build(d2d::ResAccIf_c *resAcc) { mBtnHelper.panes[7] = mpBoundings[2]; mBtnHelper.panes[8] = mpBoundings[3]; - field_0x9C4 = 0; + mFlipBtnLayout = 0; mLyt.findPane("N_arrowIn_00")->SetVisible(true); @@ -514,15 +1156,15 @@ bool dLytMsgWindowSelectBtn_c::build(d2d::ResAccIf_c *resAcc) { mStateMgr.changeState(StateID_Wait); - field_0x9A8 = -1; - field_0x9B0 = -1; + mNumBtns = -1; + mConfirmedBtnIdx = -1; - field_0x9D0 = 0; + field_0x9D0 = false; field_0x9D1 = 0; - field_0x99C = 0; - field_0x9A0 = 0; + mSkipOutAnim = 0; + mInSound = 0; field_0x9CE = 0; - field_0x9CF = 1; + mPlayInSound = true; return true; } @@ -533,8 +1175,8 @@ bool dLytMsgWindowSelectBtn_c::remove() { mAnm[i].remove(); } - if (mBtnHelper.field_0x52 != 0) { - mBtnHelper.field_0x52 = 0; + if (mBtnHelper.mIsNavEnabled) { + mBtnHelper.mIsNavEnabled = false; dPadNav::setNavEnabled(false, false); } @@ -543,7 +1185,40 @@ bool dLytMsgWindowSelectBtn_c::remove() { bool dLytMsgWindowSelectBtn_c::execute() { if (*mStateMgr.getStateID() != StateID_Wait) { - // TODO + if (dLytMsgWindow_c::getInstance() != nullptr && dLytMsgWindow_c::getInstance()->getField_0x81B() != 0) { + mIsVisible = false; + mAnm[SELECT_BTN_ANIM_IN].setAnimEnable(true); + mAnm[SELECT_BTN_ANIM_IN].setFrame(0.0f); + mAnm[SELECT_BTN_ANIM_IN].setForwardOnce(); + mAnm[SELECT_BTN_ANIM_OUT].setAnimEnable(true); + mAnm[SELECT_BTN_ANIM_OUT].setToEnd(); + mAnm[SELECT_BTN_ANIM_OUT].setForwardOnce(); + mLyt.calc(); + mAnm[SELECT_BTN_ANIM_IN].setAnimEnable(false); + mAnm[SELECT_BTN_ANIM_OUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Wait); + return true; + } + + if (mCanceledViaBBtnIdx >= 0) { + for (int i = 0; i < SELECT_BTN_NUM_BTNS; i++) { + mParts[i].field_0x50 = 1; + if (mCanceledViaBBtnIdx == i) { + mParts[i].mShouldBeOn = 1; + } else { + mParts[i].mShouldBeOn = 0; + } + } + } else { + for (int i = 0; i < SELECT_BTN_NUM_BTNS; i++) { + mParts[i].field_0x50 = 0; + if (mBtnHelper.getSelectedtBtnIdx() == i) { + mParts[i].mShouldBeOn = 1; + } else { + mParts[i].mShouldBeOn = 0; + } + } + } } mStateMgr.executeState(); @@ -551,12 +1226,45 @@ bool dLytMsgWindowSelectBtn_c::execute() { mParts[i].execute(); } + f32 angle = dLytMeter_c::getSelectBtnArrowAngle(); + f32 length = dLytMeter_c::getSelectBtnArrowLength(); + + mVec3_c t1(0.0f, 0.0f, 0.0f); + t1.z = angle; + mpSelectPanes[SELECT_BTN_PANE_ITEM_ARROW_0]->SetRotate(t1); + // But rotate the button and the pointer back so that + // they point up + mVec3_c t2(0.0f, 0.0f, 0.0f); + t2.z = -angle; + mpSelectPanes[SELECT_BTN_PANE_ARROW_HAND]->SetRotate(t2); + mpSelectPanes[SELECT_BTN_PANE_BTN_0]->SetRotate(t2); + + f32 frame0 = mAnm[SELECT_BTN_ANIM_ITEM_ARROW_0].getAnimDuration(); + f32 frame1 = mAnm[SELECT_BTN_ANIM_ITEM_ARROW_1].getAnimDuration(); + + if (length < 0.0f) { + length = 0.0f; + } + if (length > 1.0f) { + length = 1.0f; + } + + if (length > 0.0f) { + if (!mAnm[SELECT_BTN_ANIM_ITEM_ARROW_0].isEnabled()) { + mAnm[SELECT_BTN_ANIM_ITEM_ARROW_0].setAnimEnable(true); + } + + if (field_0x9D0 == true && !mAnm[SELECT_BTN_ANIM_ITEM_ARROW_1].isEnabled()) { + mAnm[SELECT_BTN_ANIM_ITEM_ARROW_1].setAnimEnable(true); + } + } + if (mAnm[SELECT_BTN_ANIM_ITEM_ARROW_0].isEnabled()) { - mAnm[SELECT_BTN_ANIM_ITEM_ARROW_0].play(); + mAnm[SELECT_BTN_ANIM_ITEM_ARROW_0].setFrame(frame0 * length); } if (mAnm[SELECT_BTN_ANIM_ITEM_ARROW_1].isEnabled()) { - mAnm[SELECT_BTN_ANIM_ITEM_ARROW_1].play(); + mAnm[SELECT_BTN_ANIM_ITEM_ARROW_1].setFrame(frame1 * length); } if (mAnm[SELECT_BTN_ANIM_LOOP_REMOCON].isEnabled()) { @@ -569,8 +1277,16 @@ bool dLytMsgWindowSelectBtn_c::execute() { } bool dLytMsgWindowSelectBtn_c::draw() { - if (field_0x9A4 != 0) { + if (mIsVisible) { mLyt.addToDrawList(); } return true; } + +s32 dLytMsgWindowSelectBtn_c::getSelectBtnMode() { + s32 mode = mNumBtns - 2; + if (mFlipBtnLayout == 1 && mNumBtns == 3) { + mode = SelectBtnHelper::MODE_3_DOWN; + } + return mode; +} diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp index 33fc3702..c8ccc99a 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp @@ -65,8 +65,8 @@ bool dLytMsgWindowStone_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resA mpTextboxes[i]->SetTextPositionV(0); } - mpTextboxes[1]->set0x1F6(1); - mpTextboxes[2]->set0x1F6(1); + mpTextboxes[1]->setIsShadow(1); + mpTextboxes[2]->setIsShadow(1); for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane = &mBtn; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp index c4bd3d31..27e725f8 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp @@ -79,7 +79,7 @@ bool dLytMsgWindowSword_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resA mpTextboxes[i]->SetTextPositionV(0); } - mpTextboxes[1]->set0x1F6(1); + mpTextboxes[1]->setIsShadow(1); for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane = &mBtn; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp index 30adeeab..66e226ea 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp @@ -68,7 +68,7 @@ bool dLytMsgWindowTalk_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAc mpTextboxes[i]->SetTextPositionV(0); } - mpTextboxes[1]->set0x1F6(1); + mpTextboxes[1]->setIsShadow(1); for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane = &mBtn; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp index 95751633..d68e4201 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp @@ -64,7 +64,7 @@ bool dLytMsgWindowWood_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAc mpTextboxes[i]->SetTextPositionV(0); } - mpTextboxes[1]->set0x1F6(1); + mpTextboxes[1]->setIsShadow(1); for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane = &mBtn;