diff options
| author | robojumper <robojumper@gmail.com> | 2025-09-18 14:16:32 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-09-18 14:16:32 +0200 |
| commit | fd9b74877f5154042b770a4d1ae85733c5f9d492 (patch) | |
| tree | 6a1348485169d2635a7a59a43e095131db06cd1d /include | |
| parent | ab47abca11c18d7010c9c7b2d13782d22f86d118 (diff) | |
d_lyt_msg_window_select_btn mostly OK
Diffstat (limited to 'include')
| -rw-r--r-- | include/d/d_lyt_hio.h | 28 | ||||
| -rw-r--r-- | include/d/d_tag_processor.h | 76 | ||||
| -rw-r--r-- | include/d/lyt/d_lyt_cursor_stick.h | 4 | ||||
| -rw-r--r-- | include/d/lyt/d_lyt_system_window.h | 1 | ||||
| -rw-r--r-- | include/d/lyt/d_textbox.h | 6 | ||||
| -rw-r--r-- | include/d/lyt/meter/d_lyt_meter.h | 25 | ||||
| -rw-r--r-- | include/d/lyt/meter/d_lyt_meter_dowsing.h | 5 | ||||
| -rw-r--r-- | include/d/lyt/meter/d_lyt_meter_item_select.h | 13 | ||||
| -rw-r--r-- | include/d/lyt/meter/d_lyt_meter_minus_btn.h | 5 | ||||
| -rw-r--r-- | include/d/lyt/msg_window/d_lyt_msg_window.h | 6 | ||||
| -rw-r--r-- | include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h | 156 | ||||
| -rw-r--r-- | include/m/m_angle.h | 4 | ||||
| -rw-r--r-- | include/s/s_State.hpp | 8 |
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. |
