summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-09-18 14:16:32 +0200
committerrobojumper <robojumper@gmail.com>2025-09-18 14:16:32 +0200
commitfd9b74877f5154042b770a4d1ae85733c5f9d492 (patch)
tree6a1348485169d2635a7a59a43e095131db06cd1d /include
parentab47abca11c18d7010c9c7b2d13782d22f86d118 (diff)
d_lyt_msg_window_select_btn mostly OK
Diffstat (limited to 'include')
-rw-r--r--include/d/d_lyt_hio.h28
-rw-r--r--include/d/d_tag_processor.h76
-rw-r--r--include/d/lyt/d_lyt_cursor_stick.h4
-rw-r--r--include/d/lyt/d_lyt_system_window.h1
-rw-r--r--include/d/lyt/d_textbox.h6
-rw-r--r--include/d/lyt/meter/d_lyt_meter.h25
-rw-r--r--include/d/lyt/meter/d_lyt_meter_dowsing.h5
-rw-r--r--include/d/lyt/meter/d_lyt_meter_item_select.h13
-rw-r--r--include/d/lyt/meter/d_lyt_meter_minus_btn.h5
-rw-r--r--include/d/lyt/msg_window/d_lyt_msg_window.h6
-rw-r--r--include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h156
-rw-r--r--include/m/m_angle.h4
-rw-r--r--include/s/s_State.hpp8
13 files changed, 259 insertions, 78 deletions
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<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;
}
+ u8 getOptionSound(s32 idx) const {
+ return mOptionSound[idx];
+ }
+
private:
- wchar_t *getTmpBuffer() {
- return field_0x008[field_0x90E - 1];
+ 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 onWriteTmpBuffer() {
- if (field_0x90E - 1 < 4) {
- field_0x808[field_0x90E - 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();
+ /**
+ * 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,
+ };
+
+ 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 */ 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;
+ /* 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 field_0x50;
- /* 0x51 */ s8 field_0x51;
- /* 0x52 */ s8 field_0x52;
+ /* 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];
+ }
- f32 fn_8011D690(s32);
- void fn_8011C970();
- u8 fn_8011CAC0();
+ 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 6eddfc96..501c638d 100644
--- a/include/m/m_angle.h
+++ b/include/m/m_angle.h
@@ -94,6 +94,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<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.