#ifndef D_MENU_D_MENU_OPTION_H
#define D_MENU_D_MENU_OPTION_H

#include "d/d_drawlist.h"

class CPaneMgr;
struct CSTControl;
class J2DTextBox;
class JUTFont;
class STControl;
class dFile_warning_c;
class dMenu_Calibration_c;
class mDoDvdThd_mountArchive_c;
class dMsgString_c;
class dMeterHaihai_c;
class dSelect_cursor_c;

class dMenu_Option_c : public dDlst_base_c {
public:
    dMenu_Option_c(JKRArchive*, STControl*);
    void _create();
    void _delete();
    void _move();
    void _draw();
    void drawHaihai();
    bool isSync();
    bool checkLeftTrigger();
    bool checkRightTrigger();
    void setAnimation();
    bool _open();
    bool _close();
    void atten_init();
    void atten_move();
#if VERSION == VERSION_GCN_JPN
    void ruby_init();
    void ruby_move();
#endif
    void vib_init();
    void vib_move();
    void sound_init();
    void sound_move();
    void change_init();
    void change_move();
    void confirm_open_init();
    void confirm_open_move();
    void confirm_move_init();
    void confirm_move_move();
    void confirm_select_init();
    void confirm_select_move();
    void confirm_close_init();
    void confirm_close_move();
    void tv_open1_move();
    void tv_open2_move();
    void tv_move_move();
    void tv_close1_move();
    void tv_close2_move();
    void calibration_open1_move();
    void calibration_open2_move();
    void calibration_move_move();
    void calibration_close1_move();
    void calibration_close2_move();
    void menuVisible();
    void menuShow(int);
    void menuHide(int);
    void screenSet();
    void setSoundMode(u32);
    void setAttenString();
    void setRubyString();
    void setVibString();
    void setSoundString();
    void setCursorPos(u8);
    void setSelectColor(u8, bool);
    u8 getSelectType();
    void changeBarColor(bool);
    void setHIO(bool);
    void cursorAnime(f32);
    void setZButtonString(u16);
    void changeTVCheck();
    void setAButtonString(u16);
    void setBButtonString(u16);
    bool isRumbleSupported();
    bool dpdMenuMove();
    void paneResize(u64);
    void initialize();
    void yesnoMenuMoveAnmInitSet(int, int);
    bool yesnoMenuMoveAnm();
    u8 yesnoSelectMoveAnm();
    void yesnoCursorShow();
    void yesNoSelectStart();
    void yesnoSelectAnmSet();
    void yesnoCancelAnmSet();
    void yesnoWakuAlpahAnmInit(u8, u8, u8, u8);
    u8 yesnoWakuAlpahAnm(u8);

    virtual void draw() { _draw(); }
    virtual ~dMenu_Option_c();

    u8 getQuitStatus() { return mQuitStatus; }
    bool isUseFlag(u8 i_flag) {
        return ((u8)mUseFlag & (u8)i_flag) != 0 ? true : false;
    }

private:
    /* 0x004 */ J2DScreen* mpBackScreen;
    /* 0x008 */ J2DScreen* mpScreen;
    /* 0x00C */ J2DScreen* mpClipScreen;
    /* 0x010 */ J2DScreen* mpShadowScreen;
    /* 0x014 */ J2DScreen* mpTVScreen;
    /* 0x018 */ J2DScreen* mpScreenIcon;
    /* 0x01C */ J2DScreen* mpSelectScreen;
    /* 0x020 */ J2DAnmTransform* field_0x20;
    /* 0x024 */ J2DAnmTransform* field_0x24;
    /* 0x028 */ J2DAnmTransform* field_0x28;
    /* 0x02C */ J2DAnmColor* field_0x2c;
    /* 0x030 */ J2DAnmTextureSRTKey* field_0x30;
    /* 0x034 */ dFile_warning_c* mpWarning;
    /* 0x038 */ J2DPicture* mpBlackTex;
    /* 0x03C */ dMenu_Calibration_c* mpCalibration;
    /* 0x040 */ mDoDvdThd_mountArchive_c* mpMount;
    /* 0x044 */ dSelect_cursor_c* mpDrawCursor;
    /* 0x048 */ dMsgString_c* mpString;
    /* 0x04C */ dMeterHaihai_c* mpMeterHaihai;
    /* 0x050 */ JKRArchive* mpArchive;
    /* 0x054 */ JUTFont* mpFont;
    /* 0x058 */ STControl* mpStick;
    /* 0x05C */ CPaneMgr* mpParent[5];
    /* 0x070 */ CPaneMgr* mpTitle;
    /* 0x074 */ CPaneMgr* mpMenuNull[6];
    /* 0x08C */ CPaneMgr* mpMenuPane[6];
    /* 0x0A4 */ CPaneMgr* mpMenuPaneC[6];
    /* 0x0BC */ CPaneMgr* mpMenuPane2[6];
    /* 0x0D4 */ CPaneMgr* mpMenuPane3[6];
    /* 0x0EC */ CPaneMgr* mpMenuPane32[6];
    /* 0x104 */ CPaneMgr* mpMenuText[6][6];
    /* 0x194 */ CPaneMgr* mpHaihaiPosL[5];
    /* 0x1A8 */ CPaneMgr* mpHaihaiPosR[5];
    /* 0x1BC */ u8 field_0x1bc[4];
    /* 0x1C0 */ CPaneMgr* field_0x1c0[4];
    /* 0x1D0 */ CPaneMgr* mpZButtonText[3];
    /* 0x1DC */ CPaneMgr* mpYesNoSelBase_c[2];
    /* 0x1E4 */ CPaneMgr* mpYesNoTxt_c[2];
    /* 0x1EC */ CPaneMgr* mpYesNoCurWaku_c[2];
    /* 0x1F4 */ CPaneMgr* mpYesNoCurWakuG0_c[2];
    /* 0x1FC */ CPaneMgr* mpYesNoCurWakuG1_c[2];
    /* 0x204 */ CPaneMgr* mpButtonAB[2];
    /* 0x20C */ CPaneMgr* mpButtonText[2];
    /* 0x214 */ CPaneMgr* mpTVButtonAB;
    /* 0x218 */ CPaneMgr* mpTVButtonText;
    /* 0x21C */ J2DTextBox* field_0x21c[6][2];
    /* 0x24C */ u8 field_0x24c[0x8];
    /* 0x254 */ J2DTextBox* field_0x254[2];
    /* 0x25C */ J2DTextBox* field_0x25c[5];
    /* 0x270 */ J2DTextBox* field_0x270[3];
    /* 0x27C */ J2DPane* field_0x27c;
    /* 0x280 */ J2DPicture* field_0x280[6];
    /* 0x298 */ J2DTextBox* field_0x298[6];
    /* 0x2B0 */ JUtility::TColor field_0x2b0[2];
    /* 0x2B8 */ JUtility::TColor field_0x2b8[2];
    /* 0x2C0 */ JUtility::TColor field_0x2c0[2];
    /* 0x2C8 */ JUtility::TColor field_0x2c8[2];
    /* 0x2D0 */ J2DPane* field_0x2d0[6][4];
    /* 0x330 */ f32 field_0x330;
    /* 0x334 */ f32 field_0x334;
    /* 0x338 */ f32 field_0x338;
    /* 0x33C */ f32 mBarScale[2];
    /* 0x344 */ f32 field_0x344[6];
    /* 0x35C */ f32 field_0x35c[6];
    /* 0x374 */ f32 field_0x374;
    /* 0x378 */ f32 field_0x378;
    /* 0x37C */ f32 field_0x37c;
    /* 0x380 */ f32 field_0x380;
    /* 0x384 */ f32 field_0x384[6];
    /* 0x39C */ f32 field_0x39c[6];
    /* 0x3B4 */ f32 field_0x3b4;
    /* 0x3B8 */ JUtility::TColor field_0x3b8;
    /* 0x3BC */ JUtility::TColor field_0x3bc;
    /* 0x3C0 */ int field_0x3c0;
    /* 0x3C4 */ int field_0x3c4;
    /* 0x3C8 */ int field_0x3c8[4];
    /* 0x3D8 */ s16 mFrame;
    /* 0x3DA */ s16 field_0x3da;
    /* 0x3DC */ u16 field_0x3dc;
    /* 0x3DE */ u16 field_0x3de;
    /* 0x3E0 */ u8 field_0x3e0;
    /* 0x3E1 */ u8 field_0x3e1;
    /* 0x3E2 */ u8 field_0x3e2;
    /* 0x3E3 */ u8 field_0x3e3;
    /* 0x3E4 */ u8 field_0x3e4;
#if VERSION == VERSION_GCN_JPN
    /* 0x3E5 */ u8 field_0x3e5_JPN;
#endif
    /* 0x3E5 */ u8 field_0x3e5;
    /* 0x3E6 */ u8 field_0x3e6;
    /* 0x3E7 */ u8 field_0x3e7;
    /* 0x3E8 */ u8 field_0x3e8;
    /* 0x3E9 */ u8 field_0x3e9;
    /* 0x3EA */ u8 field_0x3ea;
    /* 0x3EB */ u8 field_0x3eb;
    /* 0x3EC */ u8 mQuitStatus;
    /* 0x3ED */ u8 field_0x3ed;
    /* 0x3EE */ u8 mUseFlag;
    /* 0x3EF */ u8 field_0x3ef;
    /* 0x3F0 */ u8 field_0x3f0;
    /* 0x3F1 */ u8 field_0x3f1;
    /* 0x3F2 */ u8 field_0x3f2;
    /* 0x3F3 */ u8 field_0x3f3;
    /* 0x3F4 */ u8 field_0x3f4;
    /* 0x3F5 */ u8 field_0x3f5;
    /* 0x3F6 */ u8 field_0x3f6;
    /* 0x3F7 */ u8 field_0x3f7;
    /* 0x3F8 */ u8 field_0x3f8;
    /* 0x3F9 */ u8 field_0x3f9;
    /* 0x3FA */ u8 field_0x3fa;
    /* 0x3FB */ u8 field_0x3fb[2];
    /* 0x3FD */ u8 field_0x3fd[2];
    /* 0x3FF */ u8 field_0x3ff[2];
    /* 0x401 */ u8 field_0x401;
    /* 0x402 */ u8 field_0x402;
    /* 0x403 */ u8 field_0x403;
    /* 0x404 */ u8 field_0x404[4];
    /* 0x408 */ u8 field_0x408[4];
};

#endif /* D_MENU_D_MENU_OPTION_H */
