Merge pull request #250 from robojumper/select-btn

d_lyt_msg_window_select_btn mostly OK
This commit is contained in:
robojumper
2025-10-02 05:14:40 +02:00
committed by GitHub
28 changed files with 1282 additions and 372 deletions
@@ -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
+16 -16
View File
@@ -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
+28
View File
@@ -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;
}
+50 -28
View File
@@ -38,9 +38,9 @@ public:
void somethingWithScrapperAndMusic(wchar_t* src);
void changeScale(nw4r::ut::Rect *rect, nw4r::ut::PrintContext<wchar_t> *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<wchar_t> *ctx, u8 cmdLen, wchar_t *ptr);
void drawIcon(nw4r::ut::Rect *rect, nw4r::ut::PrintContext<wchar_t> *ctx, u8 cmdLen, wchar_t *ptr);
void calcRectIcon(nw4r::ut::Rect *rect, nw4r::ut::PrintContext<wchar_t> *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<wchar_t> *, nw4r::ut::PrintContext<wchar_t> *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;
+4
View File
@@ -29,6 +29,10 @@ public:
mShouldBeOn = value;
}
static dLytCursorStick_c *GetInstance() {
return sInstance;
}
private:
bool build_();
bool remove_();
+1
View File
@@ -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;
+3 -3
View File
@@ -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;
+25
View File
@@ -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;
}
@@ -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);
@@ -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();
@@ -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();
+5 -1
View File
@@ -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;
@@ -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;
};
+4
View File
@@ -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));
}
+7 -1
View File
@@ -46,7 +46,13 @@
#define STATE_MGR_DEFINE_UTIL_GETOLDSTATEID(class_name) \
const sFStateID_c<class_name> &getOldStateID() const { \
return (sFStateID_c<class_name> &)*mStateMgr.getOldStateID(); \
return (sFStateID_c<class_name> &)*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<class_name> &value) const { \
return value.isNull(); \
}
// TODO this is probably not the whole solution.
+145 -132
View File
@@ -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<wchar_t> *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 {
+9 -9
View File
@@ -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);
+11 -11
View File
@@ -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);
}
}
+6 -6
View File
@@ -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);
+11 -11
View File
@@ -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) {
@@ -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;
@@ -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;
@@ -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;
File diff suppressed because it is too large Load Diff
@@ -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;
@@ -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;
@@ -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;
@@ -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;