#ifndef MSG_SCRN_D_MSG_SCRN_EXPLAIN_H
#define MSG_SCRN_D_MSG_SCRN_EXPLAIN_H

#include "d/d_msg_scrn_base.h"

class J2DOrthoGraph;
class STControl;
class dMsgScrnArrow_c;
class dMsgScrn3Select_c;
class dMsgString_c;

class dMsgScrnExplain_c {
public:
    enum Status_e {
        STATUS_WAIT_e,
        STATUS_OPEN_REQ_e,
        STATUS_OPEN_e,
        STATUS_MOVE_e,
        STATUS_MOVE_SELECT_e,
        STATUS_CLOSE_e,
    };

    dMsgScrnExplain_c(STControl*, u8, bool, u8);
    void move();
    void draw(J2DOrthoGraph*);
    void wait_init();
    void wait_proc();
    void open_request_init();
    void open_request_proc();
    void open_init();
    void open_proc();
    void move_init();
    void move_proc();
    void move_select_init();
    void move_select_proc();
    void close_init();
    void close_proc();
    bool openExplain(u32, u8, u8, u8, bool);
    f32 getAlphaRatio();
    bool checkTriggerA();
    bool checkTriggerB();

    typedef void (dMsgScrnExplain_c::*ProcFunc)(); 

    virtual ~dMsgScrnExplain_c();

    u8 getStatus() { return mStatus; }
    u8 getSelectCursor() { return mSelCursor; }
    void onForceSelect() { mForceSelect = 1; }
    void setKeyWaitTimer(s16 timer) { mKeyWaitTimer = timer; }

    /* 0x04 */ dMsgString_c* mpString_c;
    /* 0x08 */ CPaneMgr* mpTm_c[2];
    /* 0x10 */ CPaneMgr* mpTmr_c[2];
    /* 0x18 */ CPaneMgr* mpMg_c[2];
    /* 0x20 */ CPaneMgr* mpRoot_c[2];
    /* 0x28 */ CPaneMgr* mpArw_c;
    /* 0x2C */ J2DScreen* mpScreen;
    /* 0x30 */ J2DScreen* mpTxScreen;
    /* 0x34 */ dMsgScrnArrow_c* mpArrow_c;
    /* 0x38 */ dMsgScrn3Select_c* mpSelect_c;
    /* 0x3C */ COutFont_c* mpOutFont;
    /* 0x40 */ J2DPicture* mpBackTex;
    /* 0x44 */ STControl* mpStick;
    /* 0x48 */ f32 field_0x48;
    /* 0x4C */ f32 field_0x4c;
    /* 0x50 */ f32 field_0x50;
    /* 0x54 */ u32 mOpenMsgId;
    /* 0x58 */ bool field_0x58;
    /* 0x5A */ s16 field_0x5a;
    /* 0x5C */ s16 field_0x5c;
    /* 0x5E */ s16 mKeyWaitTimer;
    /* 0x60 */ u8 mStatus;
    /* 0x61 */ u8 mSelCursor;
    /* 0x62 */ u8 field_0x62;
    /* 0x63 */ u8 field_0x63;
    /* 0x64 */ u8 field_0x64;
    /* 0x65 */ u8 mForceSelect;
    /* 0x66 */ u8 field_0x66;
    /* 0x67 */ u8 field_0x67;
};  // Size: 0x68

#endif /* MSG_SCRN_D_MSG_SCRN_EXPLAIN_H */
