From fbfd799de986d5ccca2276d8dcd02ae60c456c3b Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Sat, 18 Nov 2023 20:34:42 -0500 Subject: [PATCH] Implement & link m_editor_ovl.c --- config/rel_slices.yml | 5 + config/symbols.yml | 1 + include/m_address_ovl.h | 38 + include/m_address_ovl_h.h | 16 + include/m_board_ovl.h | 42 + include/m_board_ovl_h.h | 16 + include/m_diary.h | 29 + include/m_diary_ovl.h | 52 + include/m_diary_ovl_h.h | 16 + include/m_editor_ovl.h | 144 ++ include/m_editor_ovl_h.h | 16 + include/m_msg.h | 1 + include/m_passwordChk_ovl.h | 27 + include/m_passwordChk_ovl_h.h | 16 + include/m_passwordMake_ovl.h | 31 + include/m_passwordMake_ovl_h.h | 16 + include/m_submenu.h | 16 + include/m_submenu_ovl.h | 28 +- include/m_warning_ovl.h | 36 + rel/m_bank_ovl.c | 4 +- rel/m_editor_ovl.c | 2720 ++++++++++++++++++++++++++++++++ rel/m_map_ovl.c | 4 +- 22 files changed, 3267 insertions(+), 7 deletions(-) create mode 100644 include/m_address_ovl.h create mode 100644 include/m_address_ovl_h.h create mode 100644 include/m_board_ovl.h create mode 100644 include/m_board_ovl_h.h create mode 100644 include/m_diary.h create mode 100644 include/m_diary_ovl.h create mode 100644 include/m_diary_ovl_h.h create mode 100644 include/m_editor_ovl.h create mode 100644 include/m_editor_ovl_h.h create mode 100644 include/m_passwordChk_ovl.h create mode 100644 include/m_passwordChk_ovl_h.h create mode 100644 include/m_passwordMake_ovl.h create mode 100644 include/m_passwordMake_ovl_h.h create mode 100644 rel/m_editor_ovl.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 5420e680..8096ae6c 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -562,6 +562,11 @@ m_bank_ovl.c: .rodata: [0x8064AE58, 0x8064AE90] .data: [0x806C7B90, 0x806C7BE0] .bss: [0x8133E0A8, 0x8133E0C0] +m_editor_ovl.c: + .text: [0x805D8498, 0x805DC3CC] + .rodata: [0x8064B300, 0x8064B368] + .data: [0x806CC9D8, 0x806CD068] + .bss: [0x8133F5C8, 0x8133F600] m_map_ovl.c: .text: [0x805E5EFC, 0x805E7A54] .rodata: [0x8064B628, 0x8064B6B0] diff --git a/config/symbols.yml b/config/symbols.yml index fb072735..4f9d7fbe 100644 --- a/config/symbols.yml +++ b/config/symbols.yml @@ -52651,6 +52651,7 @@ global: 0x8133EEE0: de_ovl_data 0x8133F5C0: ee_ovl_data 0x8133F5C8: edit_ovl_data + 0x8133F600: gb_ovl_change_flg 0x8133F608: hand_ovl_data 0x8133F980: hp_ovl_data 0x8133FAA0: haniwa_ovl_data diff --git a/include/m_address_ovl.h b/include/m_address_ovl.h new file mode 100644 index 00000000..93946d07 --- /dev/null +++ b/include/m_address_ovl.h @@ -0,0 +1,38 @@ +#ifndef M_ADDRESS_OVL_H +#define M_ADDRESS_OVL_H + +#include "types.h" +#include "m_address_ovl_h.h" +#include "m_submenu_ovl.h" +#include "m_mail.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define mAD_PAGE_NUM 3 + +struct address_ovl_s { + u8 _00; + u8 _01; + u8 command; + u8 _03; + u8 _04; + u8 selected_entry; + u8 show_museum_address; + u8 _07; + u8 page_entry_count[mAD_PAGE_NUM]; + f32 _0C; + f32 _10; + f32 _14[mAD_PAGE_NUM]; + f32 _20[mAD_PAGE_NUM]; + Mail_nm_c player_mail_name[PLAYER_NUM + 1]; // last entry is the museum name + Mail_nm_c animal_mail_name[ANIMAL_NUM_MAX]; + Gfx* display_list; // set to the beginning of the address display list data for drawing over editor etc +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_address_ovl_h.h b/include/m_address_ovl_h.h new file mode 100644 index 00000000..75f89803 --- /dev/null +++ b/include/m_address_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_ADDRESS_OVL_H_H +#define M_ADDRESS_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct address_ovl_s mAD_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_board_ovl.h b/include/m_board_ovl.h new file mode 100644 index 00000000..744a1f27 --- /dev/null +++ b/include/m_board_ovl.h @@ -0,0 +1,42 @@ +#ifndef M_BOARD_OVL_H +#define M_BOARD_OVL_H + +#include "types.h" +#include "m_board_ovl_h.h" +#include "m_submenu_ovl.h" +#include "m_mail.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define mBD_BODY_LINE_NUM 6 + +enum { + mBD_FIELD_HEADER, + mBD_FIELD_BODY, + mBD_FIELD_FOOTER, + + mBD_FIELD_NUM +}; + +struct board_ovl_s { + u8 field; + u8 _01; + u8 _02; + u8 _03; + u8 _04; + u8 lengths[mBD_FIELD_NUM]; + Mail_c mail; + Mail_c* dst_p; + f32 ofs_x; + f32 ofs_y; + int _140; + int _144; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_board_ovl_h.h b/include/m_board_ovl_h.h new file mode 100644 index 00000000..1194a552 --- /dev/null +++ b/include/m_board_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_BOARD_OVL_H_H +#define M_BOARD_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct board_ovl_s mBD_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_diary.h b/include/m_diary.h new file mode 100644 index 00000000..959ee767 --- /dev/null +++ b/include/m_diary.h @@ -0,0 +1,29 @@ +#ifndef M_DIARY_H +#define M_DIARY_H + +#include "types.h" +#include "m_personal_id.h" +#include "lb_rtc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define mDI_ENTRY_SIZE 992 + +typedef struct diary_entry_s { + u8 text[mDI_ENTRY_SIZE]; +} mDi_entry_c; + +typedef struct diary_data_s { + u16 checksum; + mDi_entry_c entries[PLAYER_NUM][lbRTC_MONTHS_MAX]; +} mDi_data_c; + +extern int mDi_strlen(u8* str, int max_len, u8 end_char); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_diary_ovl.h b/include/m_diary_ovl.h new file mode 100644 index 00000000..58f9d823 --- /dev/null +++ b/include/m_diary_ovl.h @@ -0,0 +1,52 @@ +#ifndef M_DIARY_OVL_H +#define M_DIARY_OVL_H + +#include "types.h" +#include "m_diary_ovl_h.h" +#include "m_diary.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + mDI_FIELD_BODY, + + mDI_FIELD_NUM +}; + +struct diary_ovl_s { + mDi_data_c* data; + u8 field; + u8 _05; + s16 entry_len[mDI_FIELD_NUM]; + mDi_entry_c* current_entry; + int _0C; + int _10; + int _14; + int _18; + s16 move_proc; + s16 _1E; + s16 _20; + s16 _22; + s16 _24; + f32 _28; + s16 _2C; + s16 _2E; + s16 _30; + s16 _32; + u32 trigger; + u32 button; + u32 last_button; + s16 _40; + s16 _42; + s16 cursor_idx; + s16 _46; + s16 _48; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_diary_ovl_h.h b/include/m_diary_ovl_h.h new file mode 100644 index 00000000..e1fde618 --- /dev/null +++ b/include/m_diary_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_DIARY_OVL_H_H +#define M_DIARY_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct diary_ovl_s mDI_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_editor_ovl.h b/include/m_editor_ovl.h new file mode 100644 index 00000000..ae545c3c --- /dev/null +++ b/include/m_editor_ovl.h @@ -0,0 +1,144 @@ +#ifndef M_EDITOR_OVL_H +#define M_EDITOR_OVL_H + +#include "types.h" +#include "m_editor_ovl_h.h" +#include "m_submenu_ovl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define mED_COLUMNS 10 +#define mED_ROWS 4 + +#define mED_NG_WORD_START 0x74A +#define mED_NG_WORD_NUM 14 + +enum { + mED_TYPE_BOARD, + mED_TYPE_HBOARD, + mED_TYPE_NOTICE, + mED_TYPE_LEDIT, + mED_TYPE_CP_TITLE, + mED_TYPE_DIARY, + mED_TYPE_PASSWORDMAKE, + mED_TYPE_PASSWORDCHK, + + mED_TYPE_NUM +}; + +enum { + mED_STICK_AREA_LEFT, + mED_STICK_AREA_TOP_LEFT, + mED_STICK_AREA_TOP, + mED_STICK_AREA_TOP_RIGHT, + mED_STICK_AREA_RIGHT, + mED_STICK_AREA_BOTTOM_RIGHT, + mED_STICK_AREA_BOTTOM, + mED_STICK_AREA_BOTTOM_LEFT, + mED_STICK_AREA_CENTER, + + mED_STICK_AREA_NUM +}; + +enum { + mED_COMMAND_NONE, + mED_COMMAND_CURSOL_RIGHT, + mED_COMMAND_CURSOL_LEFT, + mED_COMMAND_CURSOL_UPPER, + mED_COMMAND_CURSOL_LOWER, + mED_COMMAND_END_EDIT, + mED_COMMAND_BACKSPACE, + mED_COMMAND_EXCHANGE_CODE, + mED_COMMAND_OUTPUT_CODE, + mED_COMMAND_9, + + mED_COMMAND_NUM +}; + +enum { + mED_SHIFT_LOWER, + mED_SHIFT_UPPER, + + mED_SHIFT_NUM +}; + +enum { + mED_ARRANGE_QWERTY, + mED_ARRANGE_ALPHA, + + mED_ARRANGE_NUM +}; + +enum { + mED_INPUT_MODE_LETTER, + mED_INPUT_MODE_SIGN, + mED_INPUT_MODE_MARK, + + mED_INPUT_MODE_NUM +}; + +enum { + mED_LINETYPE_SINGLE, + mED_LINETYPE_MULTI, + mED_LINETYPE_PW, + + mED_LINETYPE_NUM +}; + +enum { + mED_LINE_OK, + mED_LINE_NEWLINE, + mED_LINE_WIDTH_OVER, + mED_LINE_NUM_OVER, + + mED_LINE_NUM +}; + +typedef void (*mED_ENDCODE_DRAW_PROC)(Submenu*, GAME*, f32, f32); +typedef void (*mED_CURSOL_DRAW_PROC)(Submenu*, GAME*, f32, f32); + +struct editor_ovl_s { + u8 stick_area; + u8 stick_area_changed; + u8 select_col; + u8 select_row; + u8 stick_area_held_frames; + u8 input_mode; + u8 shift_mode; + u8 arrange; + int last_buttons; + s16 cursol_opacity_step; + u8 _0E; + u8 _0F; + u8 _10; + u8 command; + u8 _12; + u8 now_code; + u8 _14; + u8 command_processed; + s16 cursor_idx; + s16 input_length; + s16 max_line_no; + s16 line_width; + s16 now_str_len; + s16 exchange_code; + s16 _22; + s16 _24; + s16 _26; + u8* input_str; + mED_ENDCODE_DRAW_PROC end_code_draw; + mED_CURSOL_DRAW_PROC cursol_draw; + u8 _34; +}; + +extern void mED_editor_ovl_set_proc(Submenu* submenu); +extern void mED_editor_ovl_construct(Submenu* submenu); +extern void mED_editor_ovl_destruct(Submenu* submenu); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_editor_ovl_h.h b/include/m_editor_ovl_h.h new file mode 100644 index 00000000..4d3aed29 --- /dev/null +++ b/include/m_editor_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_EDITOR_OVL_H_H +#define M_EDITOR_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct editor_ovl_s mED_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_msg.h b/include/m_msg.h index 7fa863d9..c08b1321 100644 --- a/include/m_msg.h +++ b/include/m_msg.h @@ -259,6 +259,7 @@ extern int mMsg_Get_msg_num(mMsg_Window_c* msg_win); extern int mMsg_Check_main_index(mMsg_Window_c* msg_win, int index); extern int mMsg_request_main_appear(mMsg_Window_c* msg_win, ACTOR* other_actor, int display_name, rgba_t* window_color_p, int msg_no, int request_priority); extern int mMsg_Check_main_hide(mMsg_Window_c* msg_win); +extern int mMsg_sound_voice_get_for_editor(int code); #ifdef __cplusplus } diff --git a/include/m_passwordChk_ovl.h b/include/m_passwordChk_ovl.h new file mode 100644 index 00000000..7662ed92 --- /dev/null +++ b/include/m_passwordChk_ovl.h @@ -0,0 +1,27 @@ +#ifndef M_PASSWORDCHK_OVL_H +#define M_PASSWORDCHK_OVL_H + +#include "types.h" +#include "m_passwordChk_ovl_h.h" +#include "m_submenu_ovl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define mPC_STR_SIZE 14 +#define mPC_LINE_COUNT 2 + +struct passwordChk_ovl_s { + int selected_line; + u8 _04; + u8 _05; + u8 line0[mPC_STR_SIZE]; + u8 line1[mPC_STR_SIZE]; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_passwordChk_ovl_h.h b/include/m_passwordChk_ovl_h.h new file mode 100644 index 00000000..73e3aec6 --- /dev/null +++ b/include/m_passwordChk_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_PASSWORD_CHECK_OVL_H_H +#define M_PASSWORD_CHECK_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct passwordChk_ovl_s mPC_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_passwordMake_ovl.h b/include/m_passwordMake_ovl.h new file mode 100644 index 00000000..b9e66b9a --- /dev/null +++ b/include/m_passwordMake_ovl.h @@ -0,0 +1,31 @@ +#ifndef M_PASSWORDMAKE_OVL_H +#define M_PASSWORDMAKE_OVL_H + +#include "types.h" +#include "m_passwordMake_ovl_h.h" +#include "m_submenu_ovl.h" +#include "m_personal_id.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + mPM_ENTRY_TOWN, + mPM_ENTRY_PLAYER, + + mPM_ENTRY_NUM +}; + +struct passwordMake_ovl_s { + int selected_idx; + u8 lengths[mPM_ENTRY_NUM]; + u8 town_name[LAND_NAME_SIZE]; + u8 player_name[PLAYER_NAME_LEN]; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_passwordMake_ovl_h.h b/include/m_passwordMake_ovl_h.h new file mode 100644 index 00000000..6aa3a51d --- /dev/null +++ b/include/m_passwordMake_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_PASSWORDMAKE_OVL_H_H +#define M_PASSWORDMAKE_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct passwordMake_ovl_s mPM_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_submenu.h b/include/m_submenu.h index dc76f102..0a583beb 100644 --- a/include/m_submenu.h +++ b/include/m_submenu.h @@ -24,6 +24,22 @@ enum { mSM_PROCESS_NUM }; +enum { + mSM_MOVE_OUT_RIGHT, + mSM_MOVE_IN_RIGHT, + + mSM_MOVE_OUT_LEFT, + mSM_MOVE_IN_LEFT, + + mSM_MOVE_OUT_TOP, + mSM_MOVE_IN_TOP, + + mSM_MOVE_OUT_BOTTOM, + mSM_MOVE_IN_BOTTOM, + + mSM_MOVE_NUM +}; + enum submenu_overlay { mSM_OVL_NONE, diff --git a/include/m_submenu_ovl.h b/include/m_submenu_ovl.h index 3315f549..6274c966 100644 --- a/include/m_submenu_ovl.h +++ b/include/m_submenu_ovl.h @@ -12,6 +12,12 @@ #include "m_bank_ovl_h.h" #include "m_music_ovl_h.h" #include "m_warning_ovl_h.h" +#include "m_editor_ovl_h.h" +#include "m_passwordChk_ovl_h.h" +#include "m_passwordMake_ovl_h.h" +#include "m_board_ovl_h.h" +#include "m_diary_ovl_h.h" +#include "m_address_ovl_h.h" #ifdef __cplusplus extern "C" { @@ -21,7 +27,7 @@ enum { mSM_OVL_PROC_MOVE, mSM_OVL_PROC_PLAY, mSM_OVL_PROC_WAIT, - mSM_OVL_PROC_3, + mSM_OVL_PROC_OBEY, mSM_OVL_PROC_END, mSM_OVL_PROC_NUM @@ -109,7 +115,11 @@ struct submenu_overlay_s { /* 0x964 */ mSM_SETUP_VIEW_PROC setup_view_proc; /* 0x968 */ void* unused_func_968; /* 0x96C */ mSM_CHANGE_VIEW_PROC change_view_proc; - /* 0x970 */ u8 _970[0x9A8 - 0x970]; + /* 0x970 */ u8 _970[0x98C - 0x970]; + /* 0x98C */ mED_Ovl_c* editor_ovl; + /* 0x990 */ mBD_Ovl_c* board_ovl; + /* 0x994 */ mAD_Ovl_c* address_ovl; + /* 0x998 */ u8 _998[0x9A8 - 0x998]; /* 0x9A8 */ mWR_Ovl_c* warning_ovl; /* 0x9AC */ void* _9AC; /* 0x9B0 */ void* _9B0; @@ -117,7 +127,19 @@ struct submenu_overlay_s { /* 0x9B8 */ u8 _9B8[0x9D0 - 0x9B8]; /* 0x9D0 */ mMU_Overlay_c* music_ovl; /* 0x9D4 */ mBN_Overlay_c* bank_ovl; - /* 0x9D8 */ u8 _9D8[0xA00 - 0x9D8]; + /* 0x9D8 */ void* _9D8; + /* 0x9DC */ void* _9DC; + /* 0x9E0 */ void* _9E0; + /* 0x9E4 */ void* _9E4; + /* 0x9E8 */ mDI_Ovl_c* diary_ovl; + /* 0x9EC */ void* _9EC; + /* 0x9F0 */ mPM_Ovl_c* passwordMake_ovl; + /* 0x9F4 */ mPC_Ovl_c* passwordChk_ovl; + /* 0x9F8 */ u8 hboard_exists; + /* 0x9F9 */ u8 le_exists; + /* 0x9FA */ u8 _9FA; + /* 0x9FB */ u8 _9FB; + /* 0x9FC */ int _9FC; /* 0xA00 */ Mtx* projection_matrix; }; diff --git a/include/m_warning_ovl.h b/include/m_warning_ovl.h index 29d6250a..a86f74ca 100644 --- a/include/m_warning_ovl.h +++ b/include/m_warning_ovl.h @@ -22,11 +22,47 @@ struct warning_ovl_s { f32 scale; }; +enum { + mWR_WARNING_MAILBOX, + mWR_WARNING_PR_LEAVE, + mWR_WARNING_MONEY, + mWR_WARNING_PR_FOOD, + mWR_WARNING_PR_QUEST, + mWR_WARNING_5, + mWR_WARNING_6, + mWR_WARNING_7, + mWR_WARNING_8, + mWR_WARNING_PUT_MAX_FURNITURE, + mWR_WARNING_PUT_FURNITURE, + mWR_WARNING_PUT_ITEM, + mWR_WARNING_PUT_PLANT, + mWR_WARNING_HUKUBUKURO_OPEN, + mWR_WARNING_PRESENT_MAIL, + mWR_WARNING_WRITE, + mWR_WARNING_MUSIC, + mWR_WARNING_MUSIC2, + mWR_WARNING_ORIGINAL, + mWR_WARNING_PUT_SIGN, + mWR_WARNING_PUT_SIGN_OTHER, + mWR_WARNING_PUT_SIGN_ISLAND, + mWR_WARNING_PR_CARD, + mWR_WARNING_LOCK_DIARY, + mWR_WARNING_PUT_FAMI, + mWR_WARNING_WORD_OVER, + mWR_WARNING_PW_CHK, + mWR_WARNING_PR_FORK, + + mWR_WARNING_NUM +}; + extern void mWR_warning_ovl_set_proc(Submenu* submenu); extern void mWR_warning_ovl_init(Submenu* submenu); extern void mWR_warning_ovl_construct(Submenu* submenu); extern void mWR_warning_ovl_destruct(Submenu* submenu); +#define mWR_SHOW_WARNING(submenu, warning) \ + mSM_open_submenu(submenu, mSM_OVL_WARNING, warning, 0) + #ifdef __cplusplus } #endif diff --git a/rel/m_bank_ovl.c b/rel/m_bank_ovl.c index ac905770..9999feb1 100644 --- a/rel/m_bank_ovl.c +++ b/rel/m_bank_ovl.c @@ -123,7 +123,7 @@ static void mBN_bank_ok(Submenu* submenu, mSM_MenuInfo_c* menu, mBN_Overlay_c* b } Common_Get(now_private)->inventory.wallet = bank_ovl->now_bell; - (*submenu->overlay->move_chg_base_proc)(menu, 4); + (*submenu->overlay->move_chg_base_proc)(menu, mSM_MOVE_OUT_TOP); sAdo_SysTrgStart(SE_MENU_EXIT); } } @@ -138,7 +138,7 @@ static void mBN_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu) { mBN_Overlay_c* bank_ovl = overlay->bank_ovl; if (trigger & BUTTON_B) { - (*overlay->move_chg_base_proc)(menu, 4); + (*overlay->move_chg_base_proc)(menu, mSM_MOVE_OUT_TOP); sAdo_SysTrgStart(SE_MENU_EXIT); } else if (trigger & BUTTON_START) { diff --git a/rel/m_editor_ovl.c b/rel/m_editor_ovl.c new file mode 100644 index 00000000..59ba35bb --- /dev/null +++ b/rel/m_editor_ovl.c @@ -0,0 +1,2720 @@ +#include "m_editor_ovl.h" + +#include "audio.h" +#include "m_warning_ovl.h" +#include "m_lib.h" +#include "m_font.h" +#include "m_msg.h" +#include "m_string.h" +#include "m_diary.h" +#include "m_passwordChk_ovl.h" +#include "m_passwordMake_ovl.h" +#include "m_board_ovl.h" +#include "m_diary_ovl.h" +#include "m_address_ovl.h" +#include "sys_matrix.h" +#include "m_rcp.h" +#include "m_lib.h" + +static u8 mED_ornament_table[] = { + 0x21, 0x3f, 0x03, 0x04, 0x05, 0x06, 0x07, 0x41, + 0x43, 0x0a, 0x0b, 0x0c, 0x45, 0x0e, 0x0f, 0x10, + 0x49, 0x44, 0x4e, 0x14, 0x15, 0x16, 0x17, 0x4f, + 0x8d, 0x1a, 0x1b, 0x1c, 0x55, 0x1d, 0x95, 0x23, + 0x20, 0x00, 0xa4, 0x24, 0x5b, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x18, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x01, + 0x40, 0x02, 0x42, 0x08, 0x11, 0x09, 0x46, 0x47, + 0x48, 0x0d, 0x4a, 0x4b, 0x4c, 0x4d, 0x12, 0x13, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x19, 0x56, 0x57, + 0x58, 0x96, 0x5a, 0x5d, 0x5c, 0x5e, 0x61, 0x5f, + 0x63, 0x1f, 0x62, 0x60, 0x64, 0x7b, 0x66, 0x67, + 0x68, 0x81, 0x6a, 0x6b, 0x6c, 0x6d, 0x87, 0x88, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x8e, 0x76, 0x77, + 0x78, 0x93, 0x7a, 0x7c, 0x7d, 0x7e, 0x65, 0x7f, + 0x80, 0x82, 0x83, 0x84, 0x69, 0x85, 0x86, 0x6e, + 0x89, 0x8a, 0x8b, 0x8c, 0x6f, 0x30, 0x8f, 0x91, + 0x90, 0x92, 0x75, 0x94, 0x79, 0x1e, 0x59, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa3, 0xa2, 0x22, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xff, 0xd2, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xd3 +}; + +static void mED_open_warning_window(Submenu* submenu, mSM_MenuInfo_c* menu_info, int warning) { + mWR_SHOW_WARNING(submenu, warning); + menu_info->proc_status = mSM_OVL_PROC_WAIT; + menu_info->next_proc_status = mSM_OVL_PROC_WAIT; + sAdo_SysTrgStart(0x1003); +} + +static int mED_get_code(mED_Ovl_c* editor_ovl, int col, int row) { + static u8 letterS_table[] = { + 0x21, 0x3f, 0x22, 0x2d, 0x2a, 0x90, 0x27, 0xd0, + 0x3a, 0xd4, 0x71, 0x77, 0x65, 0x72, 0x74, 0x79, + 0x75, 0x69, 0x6f, 0x70, 0x61, 0x73, 0x64, 0x66, + 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0xcd, 0x7a, 0x78, + 0x63, 0x76, 0x62, 0x6e, 0x6d, 0x2c, 0x2e, 0x20 + }; + + static u8 letterS_table2[] = { + 0x21, 0x3f, 0x22, 0x2d, 0x2a, 0x90, 0x27, 0xd0, + 0x3a, 0x85, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0xcd, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x2c, 0x2e, 0x20 + }; + + static u8 letterL_table[] = { + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x30, 0x51, 0x57, 0x45, 0x52, 0x54, 0x59, + 0x55, 0x49, 0x4f, 0x50, 0x41, 0x53, 0x44, 0x46, + 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0xcd, 0x5a, 0x58, + 0x43, 0x56, 0x42, 0x4e, 0x4d, 0x2c, 0x2e, 0x20 + }; + + static u8 letterL_table2[] = { + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x52, 0x53, 0xcd, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x2c, 0x2e, 0x20 + }; + + static u8 sign_table[] = { + 0xd1, 0x3f, 0x22, 0x2d, 0x2a, 0x90, 0x85, 0xd0, + 0x3a, 0xa2, 0x25, 0x26, 0x40, 0x5f, 0xa0, 0xae, + 0x97, 0xc0, 0xc1, 0x3d, 0x28, 0x29, 0x3c, 0x3e, + 0xa5, 0xa6, 0xac, 0xad, 0xb4, 0xcd, 0x1d, 0x1e, + 0x86, 0x98, 0x9b, 0x9c, 0xa1, 0x2c, 0x2e, 0x20 + }; + + static u8 mark_table[] = { + 0x2b, 0xb9, 0x2f, 0x3b, 0x5c, 0xb8, 0xc6, 0xb6, + 0xb7, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xba, 0xbb, + 0xbc, 0xbd, 0xbe, 0xbf, 0xa7, 0xa8, 0xa9, 0xab, + 0xaa, 0xb5, 0xc2, 0xc3, 0xc4, 0xcd, 0xc7, 0xc8, + 0xc9, 0xca, 0xcb, 0xcc, 0xc5, 0xce, 0xcf, 0x20 + }; + + static u8* dataS_table[] = { + letterS_table, + sign_table, + mark_table + }; + + static u8* dataS_table2[] = { + letterS_table2, + sign_table, + mark_table + }; + + static u8* dataL_table[] = { + letterL_table, + sign_table, + mark_table + }; + + static u8* dataL_table2[] = { + letterL_table2, + sign_table, + mark_table + }; + + static u8** data_table[2][2] = { + { dataS_table, dataL_table }, + { dataS_table2, dataL_table2 } + }; + + u8* table = data_table[editor_ovl->arrange][editor_ovl->shift_mode][editor_ovl->input_mode]; + int idx = col + row * mED_COLUMNS; + + return table[idx]; +} + +static void mED_set_stick_area(mED_Ovl_c* editor_ovl) { + u8 prev_stick_area = editor_ovl->stick_area; + + if (gamePT->mcon.adjusted_pR < 0.2f) { + /* Stick is in deadzone */ + editor_ovl->stick_area = mED_STICK_AREA_CENTER; + } + else { + s16 angle = gamePT->mcon.move_angle; + + /* [-180, -157.5) 22.5 degrees */ + if (angle < DEG2SHORT_ANGLE(-157.5f)) { + editor_ovl->stick_area = mED_STICK_AREA_LEFT; + } + /* [-157.5, -112.5) 45 degrees */ + else if (angle >= DEG2SHORT_ANGLE(-157.5f) && angle < DEG2SHORT_ANGLE(-112.5f)) { + editor_ovl->stick_area = prev_stick_area; + } + /* [-112.5, -67.5) 45 degrees */ + else if (angle < DEG2SHORT_ANGLE( -67.5f)) { + editor_ovl->stick_area = mED_STICK_AREA_BOTTOM; + } + /* [-67.5, -22.5) 45 degrees */ + else if (angle < DEG2SHORT_ANGLE( -22.5f)) { + editor_ovl->stick_area = prev_stick_area; + } + /* [-22.5, 22.5) 45 degrees */ + else if (angle < DEG2SHORT_ANGLE( 22.5f)) { + editor_ovl->stick_area = mED_STICK_AREA_RIGHT; + } + /* [22.5, 67.5) 45 degrees */ + else if (angle < DEG2SHORT_ANGLE( 67.5f)) { + editor_ovl->stick_area = prev_stick_area; + } + /* [67.5, 112.5) 45 degrees */ + else if (angle < DEG2SHORT_ANGLE( 112.5f)) { + editor_ovl->stick_area = mED_STICK_AREA_TOP; + } + /* [112.5, 157.5) 45 degrees */ + else if (angle < DEG2SHORT_ANGLE( 157.5f)) { + editor_ovl->stick_area = prev_stick_area; + } + /* [157.5, 180] 22.5 degrees */ + else { + editor_ovl->stick_area = mED_STICK_AREA_LEFT; + } + } + + if (editor_ovl->stick_area != prev_stick_area) { + editor_ovl->stick_area_changed = TRUE; + } + else { + editor_ovl->stick_area_changed = FALSE; + } +} + +static int mED_check_pw_usable_letter_sub(u8 letter) { + static u8 usable_str_table[] = { + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x7a, 0x25, 0x26, 0xd1, 0x40, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 + }; + + int res = FALSE; + u8* useable_p; + int i; + + switch (letter) { + case CHAR_ZERO: + letter = CHAR_O; + break; + case CHAR_ONE: + letter = CHAR_l; + break; + } + + useable_p = usable_str_table; + for (i = 0; i < ARRAY_COUNT(usable_str_table); i++) { + if (letter == *useable_p) { + res = TRUE; + break; + } + + useable_p++; + } + + return res; +} + +static int mED_check_pw_usable_letter(mPC_Ovl_c* passwordChk_ovl) { + u8* line; + int i; + int res = TRUE; + + line = passwordChk_ovl->line0; + for (i = 0; i < ARRAY_COUNT(passwordChk_ovl->line0); i++) { + if (mED_check_pw_usable_letter_sub(*line) == FALSE) { + res = FALSE; + break; + } + + line++; + } + + line = passwordChk_ovl->line1; + for (i = 0; i < ARRAY_COUNT(passwordChk_ovl->line1); i++) { + if (mED_check_pw_usable_letter_sub(*line) == FALSE) { + res = FALSE; + break; + } + + line++; + } + + return res; +} + +static void mED_move_keyboard_cursor(mED_Ovl_c* editor_ovl) { + static int add_w[mED_STICK_AREA_NUM] = { + -1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + }; + + static int add_h[mED_STICK_AREA_NUM] = { + 0, + 0, + -1, + 0, + 0, + 0, + 1, + 0, + 0 + }; + + int move = FALSE; + int stick_area = editor_ovl->stick_area; + + if (stick_area != mED_STICK_AREA_CENTER) { + if (editor_ovl->stick_area_changed == TRUE) { + editor_ovl->stick_area_held_frames = 0; + move = TRUE; + } + else { + editor_ovl->stick_area_held_frames++; + + if (editor_ovl->stick_area_held_frames >= 16) { + editor_ovl->stick_area_held_frames = 12; + move = TRUE; + } + } + } + + if (move == TRUE) { + int move2 = TRUE; + int next_col = editor_ovl->select_col + add_w[stick_area]; + int next_row = editor_ovl->select_row + add_h[stick_area]; + + if (next_col < 0) { + next_col = 0; + move2 = FALSE; + } + else if (next_col >= mED_COLUMNS) { + next_col = mED_COLUMNS - 1; + move2 = FALSE; + } + + if (next_row < 0) { + next_row = 0; + move2 = FALSE; + } + else if (next_row >= mED_ROWS) { + next_row = mED_ROWS - 1; + move2 = FALSE; + } + + editor_ovl->select_col = next_col; + editor_ovl->select_row = next_row; + + if (move2 == TRUE) { + sAdo_SysTrgStart(0x411); + } + } +} + +static int mED_check_move_cursol(mED_Ovl_c* editor_ovl) { + u32 buttons = (getButton() | getTrigger()) & (BUTTON_B | BUTTON_DRIGHT | BUTTON_DLEFT | BUTTON_DDOWN | BUTTON_DUP); + int res = 0; + + if (buttons == BUTTON_NONE) { + editor_ovl->last_buttons = 0; + editor_ovl->_10 = 30; + editor_ovl->_0F = 26; + editor_ovl->_0E = 0; + } + else { + if (buttons == editor_ovl->last_buttons) { + if (editor_ovl->_0E == 1 && editor_ovl->_0F != 0) { + editor_ovl->_0F--; + } + + if (editor_ovl->_10 != 0) { + editor_ovl->_10--; + return mED_COMMAND_9; + } + + if (editor_ovl->_0F == 0) { + editor_ovl->_10 = 2; + editor_ovl->_34 = 3; + } + else { + editor_ovl->_10 = 6; + editor_ovl->_0E = 1; + editor_ovl->_34 = 2; + } + } + else { + editor_ovl->last_buttons = buttons; + editor_ovl->_10 = 30; + editor_ovl->_0F = 26; + editor_ovl->_0E = 0; + } + + if ((buttons & BUTTON_B) != 0) { + res = mED_COMMAND_BACKSPACE; + } + else if ((buttons & BUTTON_DLEFT) != 0) { + res = mED_COMMAND_CURSOL_LEFT; + } + else if ((buttons & BUTTON_DDOWN) != 0) { + res = mED_COMMAND_CURSOL_LOWER; + } + else if ((buttons & BUTTON_DUP) != 0) { + res = mED_COMMAND_CURSOL_UPPER; + } + else if ((buttons & BUTTON_DRIGHT) != 0) { + res = mED_COMMAND_CURSOL_RIGHT; + } + } + + return res; +} + +static int mED_check_shift(mED_Ovl_c* editor_ovl) { + int res = FALSE; + + if (chkTrigger(BUTTON_L)) { + if (editor_ovl->shift_mode == mED_SHIFT_LOWER) { + editor_ovl->shift_mode = mED_SHIFT_UPPER; + } + else { + editor_ovl->shift_mode = mED_SHIFT_LOWER; + } + + res = TRUE; + } + + return res; +} + +static int mED_check_arrange(mED_Ovl_c* editor_ovl) { + int res = FALSE; + + if (chkTrigger(BUTTON_Z)) { + if (editor_ovl->arrange == mED_ARRANGE_QWERTY) { + editor_ovl->arrange = mED_ARRANGE_ALPHA; + } + else { + editor_ovl->arrange = mED_ARRANGE_QWERTY; + } + + res = TRUE; + } + + return res; +} + +static int mED_check_input_mode(mED_Ovl_c* editor_ovl) { + int res = FALSE; + + if (chkTrigger(BUTTON_Y)) { + editor_ovl->input_mode++; + editor_ovl->shift_mode = mED_SHIFT_LOWER; + + if (editor_ovl->input_mode >= mED_INPUT_MODE_NUM) { + editor_ovl->input_mode = mED_INPUT_MODE_LETTER; + } + + res = TRUE; + } + + return res; +} + +static int mED_check_now_code(mED_Ovl_c* editor_ovl) { + int res = FALSE; + + if (chkTrigger(BUTTON_A)) { + int code = mED_get_code(editor_ovl, editor_ovl->select_col, editor_ovl->select_row); + + if (code != CHAR_SPACE_3) { + editor_ovl->now_code = code; + res = TRUE; + } + } + else if (chkTrigger(BUTTON_R)) { + editor_ovl->now_code = CHAR_SPACE; + res = TRUE; + } + + return res; +} + +static int mED_check_output_code(mED_Ovl_c* editor_ovl) { + int res = mED_COMMAND_NONE; + + if (mED_check_shift(editor_ovl) == TRUE) { + if (editor_ovl->input_mode == mED_INPUT_MODE_LETTER) { + sAdo_SysTrgStart(0x37); + } + } + else if (mED_check_arrange(editor_ovl) == TRUE) { + sAdo_SysTrgStart(0x37); + } + else if (mED_check_input_mode(editor_ovl) == TRUE) { + sAdo_SysTrgStart(0x37); + } + else if (mED_check_now_code(editor_ovl) == TRUE) { + res = mED_COMMAND_OUTPUT_CODE; + } + + return res; +} + +static void mED_set_command(mED_Ovl_c* editor_ovl) { + if (chkTrigger(BUTTON_START)) { + editor_ovl->command = mED_COMMAND_END_EDIT; + } + else if (chkTrigger(BUTTON_X)) { + editor_ovl->command = mED_COMMAND_EXCHANGE_CODE; + } + else { + editor_ovl->command = mED_check_move_cursol(editor_ovl); + + if (editor_ovl->command == mED_COMMAND_NONE) { + editor_ovl->command = mED_check_output_code(editor_ovl); + } + } +} + +static int mED_get_col_line_width(mSM_MenuInfo_c* menu_info, mED_Ovl_c* editor_ovl, s16* param_3, s16* param_4, s16* param_5, int max) { + u8* str_p = editor_ovl->input_str; + int i; + s16 temp0; + s16 temp1; + int cut; + int res; + + temp0 = 0; + temp1 = 0; + + cut = TRUE; + param_4[0] = 0; + param_3[0] = 0; + param_5[0] = 0; + res = mED_LINE_OK; + + if (menu_info->data0 == mED_TYPE_PASSWORDCHK) { + cut = FALSE; + } + + for (i = 0; i < max; i++) { + int temp_res; + + if (*str_p == CHAR_NEW_LINE) { + temp0 = *param_3; + temp1 = *param_5; + param_3[0] = 0; + param_5[0] = 0; + param_4[0]++; + temp_res = mED_LINE_NEWLINE; + } + else { + s16 width = mFont_GetCodeWidth(*str_p, cut); + s16 t = *param_5; + + if (t + width > editor_ovl->line_width) { + temp0 = *param_3; + temp1 = t; + param_3[0] = 1; + param_5[0] = width; + param_4[0]++; + temp_res = mED_LINE_WIDTH_OVER; + } + else { + param_3[0]++; + param_5[0] += width; + temp_res = mED_LINE_OK; + } + } + + if (*param_4 >= editor_ovl->max_line_no) { + param_3[0] = temp0 + 1; + param_4[0] = editor_ovl->max_line_no - 1; + param_5[0] = temp1; + + if (temp_res == mED_LINE_OK) { + res = mED_LINE_NUM_OVER; + } + else { + res = temp_res; + } + + break; + } + + str_p++; + } + + return res; +} + +static void mED_check_line_over(mED_Ovl_c* editor_ovl) { + if ( + editor_ovl->max_line_no > 1 && + editor_ovl->_24 < (editor_ovl->max_line_no - 1) && + editor_ovl->input_str[editor_ovl->cursor_idx] != CHAR_NEW_LINE + ) { + s16 width = mFont_GetCodeWidth(editor_ovl->input_str[editor_ovl->cursor_idx], TRUE); + + if ((editor_ovl->_26 + width) > editor_ovl->line_width) { + editor_ovl->_22 = 0; + editor_ovl->_26 = 0; + editor_ovl->_24++; + } + } +} + +static void mED_set_idxcol_inLineWidth(mED_Ovl_c* editor_ovl) { + u8* str_p = editor_ovl->input_str; + int i; + int _22; + int _26; + int lines; + int r25; + int r24; + int r23; + int _24; + + _22 = 0; + lines = 0; + _26 = 0; + r25 = 0; + r23 = 0; + r24 = 0; + _24 = editor_ovl->_24; + + for (i = 0; i < editor_ovl->now_str_len; i++) { + if (*str_p == CHAR_NEW_LINE) { + _26 = 0; + _22 = 0; + lines++; + } + else { + int width = mFont_GetCodeWidth(*str_p, TRUE); + + if ((_26 + width) > editor_ovl->line_width) { + r23 = lines + 1; + _26 = width; + r25 = 0; + r24 = 0; + _22 = 1; + lines++; + } + else { + _26 += width; + } + } + + if (lines > _24) { + if (r23 == _24) { + _26 = r24; + _22 = r25; + } + + break; + } + else if (lines == _24) { + int temp = editor_ovl->_26; + + if (_26 >= temp) { + if (r23 == _24 && (temp - r24) < (_26 - temp)) { + _26 = r24; + _22 = r25; + i--; + } + + _22++; + i++; + break; + } + } + + r25 = _22; + r23 = lines; + r24 = _26; + str_p++; + _22++; + } + + editor_ovl->_26 = _26; + editor_ovl->cursor_idx = i; + editor_ovl->_22 = _22; +} + +static void mED_init(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + static s16 edit_line[mED_TYPE_NUM] = { + 6, + 4, + 6, + 1, + 1, + 31, + 1, + 1 + }; + + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + editor_ovl->stick_area = mED_STICK_AREA_CENTER; + editor_ovl->stick_area_changed = FALSE; + editor_ovl->input_mode = mED_INPUT_MODE_LETTER; + editor_ovl->shift_mode = mED_SHIFT_LOWER; + editor_ovl->arrange = mED_ARRANGE_QWERTY; + editor_ovl->select_col = 0; + editor_ovl->select_row = 0; + editor_ovl->stick_area_held_frames = 0; + editor_ovl->command = mED_COMMAND_NONE; + editor_ovl->now_code = 0; + editor_ovl->max_line_no = edit_line[menu_info->data0]; + editor_ovl->input_str = (u8*)menu_info->data2; + editor_ovl->line_width = menu_info->data3; + + if (menu_info->data1 > 0) { + editor_ovl->input_length = menu_info->data1; + + if (menu_info->data0 == mED_TYPE_DIARY) { + editor_ovl->now_str_len = mDi_strlen(editor_ovl->input_str, editor_ovl->input_length * editor_ovl->max_line_no, CHAR_SPACE); + } + else { + editor_ovl->now_str_len = mMl_strlen(editor_ovl->input_str, editor_ovl->input_length * editor_ovl->max_line_no, CHAR_SPACE); + } + } + else { + int type = menu_info->data0; + + if (type == mED_TYPE_BOARD) { + editor_ovl->input_length = 32; + editor_ovl->now_str_len = submenu->overlay->board_ovl->lengths[mBD_FIELD_BODY]; + } + else if (type == mED_TYPE_PASSWORDMAKE) { + editor_ovl->input_length = LAND_NAME_SIZE; + editor_ovl->now_str_len = submenu->overlay->passwordMake_ovl->lengths[mPM_ENTRY_TOWN]; + } + else if (type == mED_TYPE_PASSWORDCHK) { + editor_ovl->input_length = mPC_STR_SIZE; + editor_ovl->now_str_len = mPC_STR_SIZE; + } + } + + if (menu_info->data0 == mED_TYPE_DIARY) { + mDI_Ovl_c* diary_ovl = submenu->overlay->diary_ovl; + + if (menu_info->data1 > 0) { + editor_ovl->cursor_idx = editor_ovl->now_str_len; + mED_get_col_line_width(menu_info, editor_ovl, &editor_ovl->_22, &editor_ovl->_24, &editor_ovl->_26, editor_ovl->cursor_idx); + } + else { + editor_ovl->cursor_idx = diary_ovl->cursor_idx; + editor_ovl->_22 = diary_ovl->_48; + editor_ovl->_24 = diary_ovl->_46; + mED_set_idxcol_inLineWidth(editor_ovl); + } + } + else { + editor_ovl->cursor_idx = 0; + editor_ovl->_22 = 0; + editor_ovl->_24 = 0; + editor_ovl->_26 = 0; + } + + editor_ovl->exchange_code = -1; +} + +static void mED_set_se(Submenu* submenu) { + static u16 se_no[mED_COMMAND_NUM] = { + 0x0000, + 0x0035, + 0x0035, + 0x0035, + 0x0035, + 0x005F, + 0x1034, + 0x0036, + 0x0033, + 0x0000 + }; + + static u8 mED_exchange_se_list[TOTAL_CHARS] = { + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, + FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, + FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, + FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, + TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, + FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, + FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE + }; + + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + int command = editor_ovl->command; + + if (command == mED_COMMAND_OUTPUT_CODE) { + int voice = mMsg_sound_voice_get_for_editor(editor_ovl->now_code); + + if (voice == 0x85 || voice == 0x80 || voice == 0x81 || voice == 0x82 || voice == 0x83 || voice == -1) { + voice = 0x86; + } + + sAdo_VoiceSe(voice, 0xFF, 0xFF, 0, 32, 1); + } + else if (command == mED_COMMAND_EXCHANGE_CODE) { + int exchange_code = editor_ovl->exchange_code; + + if (exchange_code != -1 && mED_exchange_se_list[exchange_code] != FALSE) { + int voice = mMsg_sound_voice_get_for_editor(exchange_code); + + sAdo_VoiceSe(voice, 0xFF, 0xFF, 0, 32, 1); + } + else { + sAdo_SysTrgStart(0x36); + } + } + else { + sAdo_SysTrgStart(se_no[command]); + } +} + +static void mED_output_code(mED_Ovl_c* editor_ovl) { + int len = editor_ovl->now_str_len; + u8* output_p = editor_ovl->input_str + len; + int i; + + for (i = len; i > editor_ovl->cursor_idx; i--) { + output_p[0] = output_p[-1]; + output_p--; + } + + editor_ovl->cursor_idx++; + editor_ovl->now_str_len++; + output_p[0] = editor_ovl->now_code; + editor_ovl->command_processed = TRUE; +} + +static int mED_get_single_line_width(mED_Ovl_c* editor_ovl) { + u8* str_p = editor_ovl->input_str; + int i; + int width = 0; + + for (i = editor_ovl->now_str_len; i > 0; i--) { + width += mFont_GetCodeWidth(*str_p, TRUE); + + if (*str_p == CHAR_NEW_LINE) { + break; + } + + str_p++; + } + + return width; +} + +static void mED_input_single_line(Submenu* submenu, mED_Ovl_c* editor_ovl) { + if (editor_ovl->now_code != CHAR_NEW_LINE) { + int line_width = mED_get_single_line_width(editor_ovl); + int now_code_width = mFont_GetCodeWidth(editor_ovl->now_code, TRUE); + int width = line_width + now_code_width; + + if (editor_ovl->now_str_len < editor_ovl->input_length && width <= editor_ovl->line_width) { + mED_output_code(editor_ovl); + } + else { + mED_open_warning_window(submenu, &submenu->overlay->menu_info[mSM_OVL_EDITOR], mWR_WARNING_WORD_OVER); + } + } +} + +static void mED_input_multi_line_R(Submenu* submenu, mED_Ovl_c* editor_ovl, u8* buf) { + mSM_MenuInfo_c* menu_info; + u8* input_p; + u8* str_p; + u8* buf_p; + int i; + int res; + int total_characters; + s16 b; + s16 a; + s16 c; + + menu_info = &submenu->overlay->menu_info[mSM_OVL_EDITOR]; + total_characters = editor_ovl->input_length * editor_ovl->max_line_no; + + if (total_characters <= editor_ovl->now_str_len) { + mED_open_warning_window(submenu, menu_info, mWR_WARNING_WORD_OVER); + } + else { + str_p = editor_ovl->input_str; + buf_p = buf; + + /* Copy string up to cursor */ + for (i = 0; i < editor_ovl->cursor_idx; i++) { + *buf_p++ = *str_p++; + } + + *buf_p++ = editor_ovl->now_code; // insert character + + /* Copy the remaining string after the cursor */ + for (i; i < total_characters; i++) { + *buf_p++ = *str_p++; + } + + input_p = editor_ovl->input_str; // save pointer + editor_ovl->input_str = buf; + res = mED_get_col_line_width(menu_info, editor_ovl, &a, &b, &c, editor_ovl->now_str_len + 1); + editor_ovl->input_str = input_p; // restore pointer + + switch (res) { + case mED_LINE_OK: + mED_output_code(editor_ovl); + break; + case mED_LINE_WIDTH_OVER: + case mED_LINE_NUM_OVER: + mED_open_warning_window(submenu, menu_info, mWR_WARNING_WORD_OVER); + break; + case mED_LINE_NEWLINE: + if (editor_ovl->_24 != (editor_ovl->max_line_no - 1)) { + mED_open_warning_window(submenu, menu_info, mWR_WARNING_WORD_OVER); + } + break; + } + } +} + +static void mED_input_multi_line(Submenu* submenu, mED_Ovl_c* editor_ovl) { + u8 buf[1000]; + + mED_input_multi_line_R(submenu, editor_ovl, buf); +} + +static void mED_input_pw_make_line(Submenu* submenu, mED_Ovl_c* editor_ovl) { + if (editor_ovl->now_code != CHAR_NEW_LINE) { + int line_width = mED_get_single_line_width(editor_ovl); + int char_width = mFont_GetCodeWidth(editor_ovl->now_code, TRUE); + int width = line_width + char_width; + + if (editor_ovl->now_str_len < editor_ovl->input_length && width <= editor_ovl->line_width) { + mED_output_code(editor_ovl); + } + else { + mED_open_warning_window(submenu, &submenu->overlay->menu_info[mSM_OVL_EDITOR], mWR_WARNING_WORD_OVER); + } + } +} + +static void mED_input_pw_chk_line(Submenu* submenu, mED_Ovl_c* editor_ovl) { + if (editor_ovl->now_code != CHAR_NEW_LINE) { + u8* str_p; + u8* src_p; + u8* dst_p; + int cursor_idx; + int size; + int i; + int len; + + if (editor_ovl->input_str[editor_ovl->input_length - 1] == CHAR_SPACE) { + str_p = editor_ovl->input_str + editor_ovl->input_length; + cursor_idx = editor_ovl->cursor_idx; + + if (cursor_idx < editor_ovl->input_length) { + len = editor_ovl->input_length; + src_p = str_p - 2; + dst_p = str_p - 1; + + for (i = 0; i < (len - 1) - cursor_idx; i++) { + *dst_p-- = *src_p--; + } + + editor_ovl->input_str[editor_ovl->cursor_idx] = editor_ovl->now_code; + editor_ovl->cursor_idx++; + + if (editor_ovl->cursor_idx >= editor_ovl->input_length) { + mPC_Ovl_c* passwordChk_ovl = submenu->overlay->passwordChk_ovl; + + if (passwordChk_ovl->selected_line == 0) { + passwordChk_ovl->selected_line = 1; + editor_ovl->input_str = passwordChk_ovl->line1; + editor_ovl->cursor_idx = 0; + } + else { + editor_ovl->cursor_idx = editor_ovl->input_length; + } + } + + editor_ovl->command_processed = TRUE; + return; + } + } + + sAdo_SysTrgStart(0x1003); + } + else { + sAdo_SysTrgStart(0x1003); + } +} + +static void mED_move_cursol_right(Submenu* submenu, mED_Ovl_c* editor_ovl, int line_type) { + s16 now_str_len; + s16 cursor_idx; + + cursor_idx = editor_ovl->cursor_idx; + now_str_len = editor_ovl->now_str_len; + + if (cursor_idx < now_str_len && now_str_len > 0) { + editor_ovl->cursor_idx = cursor_idx + 1; + editor_ovl->command_processed = TRUE; + } + else if (cursor_idx == now_str_len) { + editor_ovl->now_code = CHAR_SPACE; + + switch (line_type) { + case mED_LINETYPE_MULTI: + mED_input_multi_line(submenu, editor_ovl); + break; + case mED_LINETYPE_SINGLE: + mED_input_single_line(submenu, editor_ovl); + break; + case mED_LINETYPE_PW: + mED_input_pw_make_line(submenu, editor_ovl); + break; + } + + if (editor_ovl->command_processed != FALSE) { + editor_ovl->command = mED_COMMAND_OUTPUT_CODE; + } + } +} + +static void mED_move_cursol_left(mED_Ovl_c* editor_ovl) { + if (editor_ovl->cursor_idx > 0) { + editor_ovl->cursor_idx--; + editor_ovl->command_processed = TRUE; + } +} + +static void mED_move_cursol_upper(mED_Ovl_c* editor_ovl) { + if (editor_ovl->_24 > 0) { + editor_ovl->_24--; + mED_set_idxcol_inLineWidth(editor_ovl); + editor_ovl->command_processed = TRUE; + } +} + +static void mED_move_cursol_lower(Submenu* submenu, mED_Ovl_c* editor_ovl) { + s16 a; + s16 b; + s16 c; + + mED_get_col_line_width(&submenu->overlay->menu_info[mSM_OVL_EDITOR], editor_ovl, &a, &b, &c, editor_ovl->now_str_len); + + if (editor_ovl->_24 < b) { + editor_ovl->_24++; + mED_set_idxcol_inLineWidth(editor_ovl); + editor_ovl->command_processed = TRUE; + } + else if (editor_ovl->cursor_idx == editor_ovl->now_str_len) { + editor_ovl->now_code = CHAR_NEW_LINE; + mED_input_multi_line(submenu, editor_ovl); + + if (editor_ovl->command_processed == TRUE) { + editor_ovl->command = mED_COMMAND_OUTPUT_CODE; + } + } +} + +static void mED_end_edit_func(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + (*submenu->overlay->move_chg_base_proc)(menu_info, mSM_MOVE_OUT_BOTTOM); // transition off the bottom of the screen + submenu->overlay->editor_ovl->command_processed = TRUE; +} + +static void mED_backspace_func(mED_Ovl_c* editor_ovl) { + u8* str_p; + int i; + + if (editor_ovl->cursor_idx != 0) { + editor_ovl->cursor_idx--; + editor_ovl->now_str_len--; + + str_p = editor_ovl->input_str + editor_ovl->cursor_idx; + + for (i = editor_ovl->cursor_idx; i < editor_ovl->now_str_len; i++) { + str_p[0] = str_p[1]; + str_p++; + } + + str_p[0] = CHAR_SPACE; + editor_ovl->command_processed = TRUE; + } +} + +static void mED_backspace_func_pw_chk(mED_Ovl_c* editor_ovl, mPC_Ovl_c* passwordChk_ovl) { + if (editor_ovl->cursor_idx != 0) { + editor_ovl->cursor_idx--; + mem_copy(editor_ovl->input_str + editor_ovl->cursor_idx, editor_ovl->input_str + editor_ovl->cursor_idx + 1, (editor_ovl->input_length - editor_ovl->cursor_idx) - 1); + editor_ovl->input_str[editor_ovl->input_length - 1] = CHAR_SPACE; + editor_ovl->command_processed = TRUE; + } + else if (passwordChk_ovl->selected_line == 1) { + passwordChk_ovl->selected_line = 0; + editor_ovl->input_str = passwordChk_ovl->line0; + editor_ovl->cursor_idx = editor_ovl->input_length - 1; + editor_ovl->input_str[editor_ovl->cursor_idx] = CHAR_SPACE; + editor_ovl->command_processed = TRUE; + } +} + +static int mED_get_exchange_code(mED_Ovl_c* editor_ovl) { + int exchange_code = -1; + + if (editor_ovl->cursor_idx != 0) { + int ornament = mED_ornament_table[editor_ovl->input_str[editor_ovl->cursor_idx - 1]]; + int exchange = editor_ovl->input_str[editor_ovl->cursor_idx - 1]; + + if (exchange != ornament) { + exchange_code = ornament; + } + } + + return exchange_code; +} + +static int mED_exchange_code_func(mED_Ovl_c* editor_ovl) { + if (editor_ovl->exchange_code != -1) { + editor_ovl->command_processed = TRUE; + editor_ovl->input_str[editor_ovl->cursor_idx - 1] = editor_ovl->exchange_code; + } + + return editor_ovl->command_processed; +} + +static void mED_clear_input_data(mED_Ovl_c* editor_ovl) { + u8* str_p = editor_ovl->input_str; + int i; + + for (i = 0; i < editor_ovl->input_length; i++) { + *str_p++ = CHAR_SPACE; + } + + editor_ovl->now_str_len = 0; + editor_ovl->_22 = 0; + editor_ovl->cursor_idx = 0; + editor_ovl->_26 = 0; +} + +static int mED_all_space_check(Submenu* submenu, mED_Ovl_c* editor_ovl, mSM_MenuInfo_c* menu_info) { + if (menu_info->data0 != mED_TYPE_LEDIT) { + return FALSE; + } + else { + u8* str_p = editor_ovl->input_str; + int res; + + if (submenu->overlay->menu_info[mSM_OVL_LEDIT].data0 == 2) { + if (mem_cmp(submenu->overlay->menu_info[mSM_OVL_LEDIT].data2, str_p, editor_ovl->input_length) == 0) { + res = FALSE; + } + else { + res = TRUE; + } + } + else { + res = FALSE; + } + + if (res == FALSE) { + u8* t_str_p = str_p; + int i; + + for (i = 0; i < editor_ovl->now_str_len; i++) { + if (*t_str_p != CHAR_SPACE) { + return FALSE; + } + + t_str_p++; + } + } + + mED_clear_input_data(editor_ovl); + return TRUE; + } +} + +static int mED_ng_word_check(mED_Ovl_c* editor_ovl, mSM_MenuInfo_c* menu_info) { + static int ng_word_length[mED_NG_WORD_NUM] = { + 4, 4, 4, 4, + 4, 5, 5, 7, + 7, 7, 7, 7, + 9, 10 + }; + + if (menu_info->data0 == mED_TYPE_LEDIT) { + u8 ng_word[10]; + int len; + u8* str_p; + int i; + int j; + int idx = mED_NG_WORD_START; + + for (i = 0; i < mED_NG_WORD_NUM; i++) { + len = ng_word_length[i]; + mString_Load_StringFromRom(ng_word, sizeof(ng_word), idx); + str_p = editor_ovl->input_str; + + for (j = (editor_ovl->input_length - len) + 1; j >= 0; j--) { + if (mem_cmp(str_p, ng_word, len) == TRUE) { + mED_clear_input_data(editor_ovl); + return TRUE; + } + + str_p++; + } + + idx++; + } + } + return FALSE; +} + +static void mED_edit_func_multi_line(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LEFT: + mED_move_cursol_left(editor_ovl); + break; + case mED_COMMAND_CURSOL_LOWER: + mED_move_cursol_lower(submenu, editor_ovl); + break; + case mED_COMMAND_CURSOL_UPPER: + mED_move_cursol_upper(editor_ovl); + break; + case mED_COMMAND_CURSOL_RIGHT: + mED_move_cursol_right(submenu, editor_ovl, mED_LINETYPE_MULTI); + break; + case mED_COMMAND_END_EDIT: + mED_end_edit_func(submenu, menu_info); + break; + case mED_COMMAND_BACKSPACE: + mED_backspace_func(editor_ovl); + break; + case mED_COMMAND_EXCHANGE_CODE: + mED_exchange_code_func(editor_ovl); + break; + case mED_COMMAND_OUTPUT_CODE: + mED_input_multi_line(submenu, editor_ovl); + break; + } +} + +static void mED_edit_func_single_line(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LEFT: + mED_move_cursol_left(editor_ovl); + break; + case mED_COMMAND_CURSOL_LOWER: + break; + case mED_COMMAND_CURSOL_UPPER: + break; + case mED_COMMAND_CURSOL_RIGHT: + mED_move_cursol_right(submenu, editor_ovl, mED_LINETYPE_SINGLE); + break; + case mED_COMMAND_END_EDIT: + if (mED_all_space_check(submenu, editor_ovl, menu_info) != FALSE) { + sAdo_SysTrgStart(0x1003); + } + else if (mED_ng_word_check(editor_ovl, menu_info) != FALSE) { + sAdo_SysTrgStart(0x1003); + } + else { + mED_end_edit_func(submenu, menu_info); + } + break; + case mED_COMMAND_BACKSPACE: + mED_backspace_func(editor_ovl); + break; + case mED_COMMAND_EXCHANGE_CODE: + mED_exchange_code_func(editor_ovl); + break; + case mED_COMMAND_OUTPUT_CODE: + mED_input_single_line(submenu, editor_ovl); + break; + } +} + +static void mED_edit_func_letter_header_kill_space(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + mED_Ovl_c* editor_ovl = overlay->editor_ovl; + mBD_Ovl_c* board_ovl = overlay->board_ovl; + + if (overlay->menu_info[mSM_OVL_BOARD].data0 == 3) { + s16 len = mMl_strlen(editor_ovl->input_str, editor_ovl->input_length, CHAR_SPACE); + s16 _22 = editor_ovl->_22; + + if (_22 > len) { + len = _22; + } + + editor_ovl->now_str_len = len; + } + else { + s16 len = mMl_strlen(editor_ovl->input_str, editor_ovl->input_length, CHAR_SPACE); + int header_back_start = board_ovl->mail.content.header_back_start; + int min_len = editor_ovl->_22; + int res; + + if (len > header_back_start) { + res = len; + } + else { + res = header_back_start; + } + + if (res > min_len) { + res = header_back_start; + + if (len > header_back_start) { + res = len; + } + } + else { + res = min_len; + } + + editor_ovl->now_str_len = res; + } +} + +static void mED_edit_func_letter_header(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + Submenu_Overlay_c* overlay = submenu->overlay; + mED_Ovl_c* editor_ovl = overlay->editor_ovl; + mBD_Ovl_c* board_ovl = overlay->board_ovl; + + if (overlay->menu_info[mSM_OVL_BOARD].data0 == 3) { + mED_edit_func_single_line(submenu, menu_info); + } + else if (board_ovl->_02 != 1) { + s16 len = editor_ovl->now_str_len; + + if ( + board_ovl->mail.content.header_back_start == editor_ovl->cursor_idx && + ((board_ovl->_02 == 0 && editor_ovl->command == mED_COMMAND_CURSOL_RIGHT) || + (board_ovl->_02 == 2 && (editor_ovl->command == mED_COMMAND_CURSOL_LEFT || editor_ovl->command == mED_COMMAND_BACKSPACE))) + ) { + board_ovl->_02 = 1; + editor_ovl->command_processed = TRUE; + } + else { + mED_edit_func_single_line(submenu, menu_info); + + if (board_ovl->_02 == 0) { + if (len > editor_ovl->now_str_len) { + board_ovl->mail.content.header_back_start --; + } + else if (len < editor_ovl->now_str_len) { + board_ovl->mail.content.header_back_start++; + } + } + } + } + + mED_edit_func_letter_header_kill_space(submenu); +} + +static void mED_break_space_code(u8* str) { + u8 buf[32]; + + mem_copy(buf, str + 1, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = CHAR_SPACE; + mem_copy(str, buf, sizeof(buf)); +} + +static void mED_input_footer_line_sub(Submenu* submenu, mSM_MenuInfo_c* menu_info, mED_Ovl_c* editor_ovl) { + int now_code_width = mFont_GetCodeWidth(editor_ovl->now_code, TRUE); + int str_width = mFont_GetStringWidth(editor_ovl->input_str, editor_ovl->now_str_len, TRUE); + int width = str_width + now_code_width; + + if ((editor_ovl->now_str_len + 1) <= editor_ovl->input_length) { + if (width <= editor_ovl->line_width) { + mED_output_code(editor_ovl); + } + else if (editor_ovl->input_str[0] == CHAR_SPACE && width - mFont_GetCodeWidth(CHAR_SPACE, TRUE) < editor_ovl->line_width) { + mED_break_space_code(editor_ovl->input_str); + editor_ovl->now_str_len--; + mED_output_code(editor_ovl); + } + else { + mED_open_warning_window(submenu, menu_info, mWR_WARNING_WORD_OVER); + } + } + else if (editor_ovl->input_str[0] == CHAR_SPACE && width - mFont_GetCodeWidth(CHAR_SPACE, TRUE) < editor_ovl->line_width) { + mED_break_space_code(editor_ovl->input_str); + editor_ovl->now_str_len--; + mED_output_code(editor_ovl); + } + else { + mED_open_warning_window(submenu, menu_info, mWR_WARNING_WORD_OVER); + } +} + +static void mED_input_footer_line(Submenu* submenu, mSM_MenuInfo_c* menu_info, mED_Ovl_c* editor_ovl) { + switch (editor_ovl->now_code) { + case CHAR_NEW_LINE: + break; + case CHAR_SPACE: + if (editor_ovl->cursor_idx != 0) { + mED_input_footer_line_sub(submenu, menu_info, editor_ovl); + } + break; + default: + mED_input_footer_line_sub(submenu, menu_info, editor_ovl); + break; + } +} + +static void mED_move_footer_cursol_right(Submenu* submenu, mSM_MenuInfo_c* menu_info, mED_Ovl_c* editor_ovl) { + s16 str_len; + s16 cursor_idx; + + cursor_idx = editor_ovl->cursor_idx; + str_len = editor_ovl->now_str_len; + + if (cursor_idx < str_len && str_len > 0) { + if (cursor_idx == 0 && editor_ovl->input_str[0] == CHAR_SPACE) { + u8* str_p = editor_ovl->input_str; + int i; + + editor_ovl->now_str_len = str_len - 1; + for (i = 0; i < editor_ovl->now_str_len; i++) { + str_p[0] = str_p[1]; + str_p++; + } + + str_p[0] = CHAR_SPACE; + editor_ovl->command_processed = TRUE; + } + else { + editor_ovl->cursor_idx++; + editor_ovl->command_processed = TRUE; + } + } + else if (cursor_idx == str_len) { + editor_ovl->now_code = CHAR_SPACE; + mED_input_footer_line(submenu, menu_info, editor_ovl); + + if (editor_ovl->command_processed) { + editor_ovl->command = mED_COMMAND_OUTPUT_CODE; + } + } +} + +static void mED_move_footer_cursol_left(Submenu* submenu, mSM_MenuInfo_c* menu_info, mED_Ovl_c* editor_ovl) { + if (editor_ovl->cursor_idx > 0) { + editor_ovl->cursor_idx--; + editor_ovl->command_processed = TRUE; + } + else if (editor_ovl->now_str_len < editor_ovl->input_length) { + editor_ovl->now_code = CHAR_SPACE; + mED_input_footer_line(submenu, menu_info, editor_ovl); + editor_ovl->cursor_idx = 0; + + if (editor_ovl->command_processed) { + editor_ovl->command = mED_COMMAND_OUTPUT_CODE; + } + } +} + +static void mED_edit_func_letter_footer(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LEFT: + mED_move_footer_cursol_left(submenu, menu_info, editor_ovl); + break; + case mED_COMMAND_CURSOL_RIGHT: + mED_move_footer_cursol_right(submenu, menu_info, editor_ovl); + break; + case mED_COMMAND_END_EDIT: + if (mED_all_space_check(submenu, editor_ovl, menu_info)) { + sAdo_SysTrgStart(0x1003); + } + else if (mED_ng_word_check(editor_ovl, menu_info)) { + sAdo_SysTrgStart(0x1003); + } + else { + mED_end_edit_func(submenu, menu_info); + } + break; + case mED_COMMAND_BACKSPACE: + mED_backspace_func(editor_ovl); + break; + case mED_COMMAND_EXCHANGE_CODE: + mED_exchange_code_func(editor_ovl); + break; + case mED_COMMAND_OUTPUT_CODE: + mED_input_footer_line(submenu, menu_info, editor_ovl); + break; + } +} + +static void mED_move_letter_table(mED_Ovl_c* editor_ovl, mBD_Ovl_c* board_ovl, Submenu* submenu) { + static s16 letter_table_col[mBD_FIELD_NUM] = { MAIL_HEADER_LEN, MAIL_BODY_LEN / mBD_BODY_LINE_NUM, MAIL_FOOTER_LEN }; + static s16 letter_table_width[mBD_FIELD_NUM] = { 112, 192, 192 }; + + u8 field = board_ovl->field; + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &overlay->menu_info[mSM_OVL_EDITOR]; + int next_field; + int upper; + + if (field == mBD_FIELD_HEADER && board_ovl->_02 == 1) { + return; + } + + if (editor_ovl->command == mED_COMMAND_CURSOL_UPPER) { + next_field = field - 1; + upper = TRUE; + } + else if (editor_ovl->command == mED_COMMAND_CURSOL_LOWER) { + next_field = field + 1; + upper = FALSE; + } + else { + return; + } + + if (next_field < 0 || next_field >= mBD_FIELD_NUM) { + return; + } + + editor_ovl->command_processed = TRUE; + board_ovl->field = next_field; + board_ovl->_02 = 0; + editor_ovl->input_length = letter_table_col[next_field]; + editor_ovl->line_width = letter_table_width[next_field]; + menu_info->data3 = letter_table_width[next_field]; + + if (next_field == mBD_FIELD_BODY) { + editor_ovl->max_line_no = mBD_BODY_LINE_NUM; + editor_ovl->input_str = board_ovl->mail.content.body; + + if (upper == TRUE) { + editor_ovl->cursor_idx = -1; + } + else { + editor_ovl->cursor_idx = 0; + } + } + else { + editor_ovl->max_line_no = 1; + editor_ovl->cursor_idx = 0; + + if (next_field == mBD_FIELD_HEADER) { + editor_ovl->input_str = board_ovl->mail.content.header; + } + else { + editor_ovl->input_str = board_ovl->mail.content.footer; + } + } + + editor_ovl->now_str_len = board_ovl->lengths[next_field]; + + if (editor_ovl->cursor_idx == -1) { + editor_ovl->cursor_idx = editor_ovl->now_str_len; + } +} + +typedef void (*mED_BASE_FUNC)(Submenu*, mSM_MenuInfo_c*); + +static void mED_edit_func_letter(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + static mED_BASE_FUNC letter_base_func[mBD_FIELD_NUM] = { + &mED_edit_func_letter_header, + &mED_edit_func_multi_line, + &mED_edit_func_letter_footer + }; + + mBD_Ovl_c* board_ovl = submenu->overlay->board_ovl; + int field = board_ovl->field; + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + (*letter_base_func[field])(submenu, menu_info); + board_ovl->lengths[field] = editor_ovl->now_str_len; + + if (editor_ovl->command_processed == FALSE) { + mED_move_letter_table(editor_ovl, board_ovl, submenu); + } +} + +static void mED_edit_func_diary(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + /* @unused */ + static mED_BASE_FUNC letter_base_func[mBD_FIELD_NUM] = { + &mED_edit_func_letter_header, + &mED_edit_func_multi_line, + &mED_edit_func_single_line + }; + + mDI_Ovl_c* diary_ovl = submenu->overlay->diary_ovl; + int field = diary_ovl->field; + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LEFT: + mED_move_cursol_left(editor_ovl); + break; + case mED_COMMAND_CURSOL_LOWER: + mED_move_cursol_lower(submenu, editor_ovl); + break; + case mED_COMMAND_CURSOL_UPPER: + mED_move_cursol_upper(editor_ovl); + break; + case mED_COMMAND_CURSOL_RIGHT: + mED_move_cursol_right(submenu, editor_ovl, mED_LINETYPE_MULTI); + break; + case mED_COMMAND_END_EDIT: + mED_end_edit_func(submenu, menu_info); + break; + case mED_COMMAND_BACKSPACE: + mED_backspace_func(editor_ovl); + break; + case mED_COMMAND_EXCHANGE_CODE: + mED_exchange_code_func(editor_ovl); + break; + case mED_COMMAND_OUTPUT_CODE: + mED_input_multi_line(submenu, editor_ovl); + break; + } + + diary_ovl->entry_len[field] = editor_ovl->now_str_len; +} + +static void mED_move_pw_make_table(mED_Ovl_c* editor_ovl, mPM_Ovl_c* passwordMake_ovl) { + static s16 pm_make_table_col[mPM_ENTRY_NUM] = { LAND_NAME_SIZE, PLAYER_NAME_LEN }; + int next_idx; + + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LOWER: + { + if (passwordMake_ovl->selected_idx == mPM_ENTRY_TOWN) { + editor_ovl->now_str_len = mMl_strlen(editor_ovl->input_str, editor_ovl->input_length, CHAR_SPACE); + editor_ovl->cursor_idx = editor_ovl->now_str_len; + passwordMake_ovl->lengths[mPM_ENTRY_TOWN] = editor_ovl->now_str_len; + + if (editor_ovl->now_str_len == 0) { + sAdo_SysTrgStart(0x1003); + return; + } + } + + next_idx = passwordMake_ovl->selected_idx + 1; + break; + } + + case mED_COMMAND_CURSOL_UPPER: + case mED_COMMAND_BACKSPACE: + next_idx = passwordMake_ovl->selected_idx - 1; + break; + + default: + return; + } + + if (next_idx < 0 || next_idx >= mPM_ENTRY_NUM) { + return; + } + + editor_ovl->command_processed = TRUE; + passwordMake_ovl->selected_idx = (u8)next_idx; + editor_ovl->input_length = pm_make_table_col[next_idx]; + editor_ovl->line_width = editor_ovl->input_length * 10; + + switch (next_idx) { + case mPM_ENTRY_TOWN: + editor_ovl->input_str = passwordMake_ovl->town_name; + break; + case mPM_ENTRY_PLAYER: + editor_ovl->input_str = passwordMake_ovl->player_name; + break; + } + + editor_ovl->max_line_no = 1; + editor_ovl->now_str_len = passwordMake_ovl->lengths[next_idx]; + + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_UPPER: + case mED_COMMAND_CURSOL_LOWER: + mED_set_idxcol_inLineWidth(editor_ovl); + break; + case mED_COMMAND_CURSOL_RIGHT: // ?? + editor_ovl->cursor_idx = 0; + break; + case mED_COMMAND_CURSOL_LEFT: // ?? + default: // ?? + editor_ovl->cursor_idx = editor_ovl->now_str_len; + break; + } +} + +static void mED_edit_func_pw_make(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int selected_idx; + mPM_Ovl_c* passwordMake_ovl = submenu->overlay->passwordMake_ovl; + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + selected_idx = passwordMake_ovl->selected_idx; + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LEFT: + mED_move_cursol_left(editor_ovl); + break; + case mED_COMMAND_CURSOL_RIGHT: + mED_move_cursol_right(submenu, editor_ovl, mED_LINETYPE_PW); + break; + case mED_COMMAND_END_EDIT: + if (selected_idx == mPM_ENTRY_TOWN) { + editor_ovl->command = mED_COMMAND_CURSOL_LOWER; + } + else if (mMl_strlen(editor_ovl->input_str, editor_ovl->input_length, CHAR_SPACE) == 0) { + editor_ovl->cursor_idx = 0; + editor_ovl->now_str_len = 0; + sAdo_SysTrgStart(0x1003); + } + else { + mED_end_edit_func(submenu, menu_info); + } + break; + case mED_COMMAND_BACKSPACE: + mED_backspace_func(editor_ovl); + break; + case mED_COMMAND_EXCHANGE_CODE: + mED_exchange_code_func(editor_ovl); + break; + case mED_COMMAND_OUTPUT_CODE: + mED_input_pw_make_line(submenu, editor_ovl); + break; + } + + passwordMake_ovl->lengths[selected_idx] = editor_ovl->now_str_len; + + if (editor_ovl->command_processed == FALSE) { + mED_move_pw_make_table(editor_ovl, passwordMake_ovl); + } +} + +static void mED_move_pw_chk_table(mED_Ovl_c* editor_ovl, mPC_Ovl_c* passwordChk_ovl) { + int next_line; + + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LOWER: + next_line = passwordChk_ovl->selected_line + 1; + break; + case mED_COMMAND_CURSOL_UPPER: + next_line = passwordChk_ovl->selected_line - 1; + break; + default: + return; + } + + if (next_line < 0 || next_line >= mPC_LINE_COUNT) { + return; + } + + editor_ovl->command_processed = TRUE; + passwordChk_ovl->selected_line = (u8)next_line; + + switch (next_line) { + case 0: + editor_ovl->input_str = passwordChk_ovl->line0; + break; + case 1: + editor_ovl->input_str = passwordChk_ovl->line1; + break; + } +} + +static void mED_edit_func_pw_chk(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int selected_idx; + mPC_Ovl_c* passwordChk_ovl = submenu->overlay->passwordChk_ovl; + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + selected_idx = passwordChk_ovl->selected_line; + switch (editor_ovl->command) { + case mED_COMMAND_CURSOL_LEFT: + if (editor_ovl->cursor_idx > 0) { + editor_ovl->cursor_idx--; + editor_ovl->command_processed = TRUE; + } + else { + sAdo_SysTrgStart(0x1003); + } + break; + case mED_COMMAND_CURSOL_RIGHT: + if (editor_ovl->cursor_idx < editor_ovl->input_length) { + editor_ovl->cursor_idx++; + editor_ovl->command_processed = TRUE; + } + else { + sAdo_SysTrgStart(0x1003); + } + break; + case mED_COMMAND_END_EDIT: + if (passwordChk_ovl->line1[mPC_STR_SIZE - 1] != CHAR_SPACE && mED_check_pw_usable_letter(passwordChk_ovl) == FALSE) { + mED_open_warning_window(submenu, menu_info, mWR_WARNING_PW_CHK); + } + else { + mED_end_edit_func(submenu, menu_info); + } + break; + case mED_COMMAND_BACKSPACE: + mED_backspace_func_pw_chk(editor_ovl, passwordChk_ovl); + break; + case mED_COMMAND_EXCHANGE_CODE: + mED_exchange_code_func(editor_ovl); + break; + case mED_COMMAND_OUTPUT_CODE: + mED_input_pw_chk_line(submenu, editor_ovl); + break; + } + + if (editor_ovl->command_processed == FALSE) { + mED_move_pw_chk_table(editor_ovl, passwordChk_ovl); + } +} + +static void mED_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + (*submenu->overlay->move_Move_proc)(submenu, menu_info); +} + +typedef void (*mED_EDIT_FUNC)(Submenu*, mSM_MenuInfo_c*); + +static void mED_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + static mED_EDIT_FUNC mED_edit_func[mED_TYPE_NUM] = { + &mED_edit_func_letter, + &mED_edit_func_multi_line, + &mED_edit_func_multi_line, + &mED_edit_func_single_line, + &mED_edit_func_single_line, + &mED_edit_func_diary, + &mED_edit_func_pw_make, + &mED_edit_func_pw_chk + }; + + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + mBD_Ovl_c* board_ovl; + + editor_ovl->command_processed = FALSE; + if (submenu->overlay->address_ovl != NULL && submenu->overlay->menu_info[mSM_OVL_ADDRESS].next_proc_status == mSM_OVL_PROC_WAIT) { + editor_ovl->stick_area = mED_STICK_AREA_CENTER; + editor_ovl->command = mED_COMMAND_NONE; + editor_ovl->last_buttons = (getButton() | getTrigger()) & (BUTTON_B | BUTTON_DRIGHT | BUTTON_DLEFT | BUTTON_DDOWN | BUTTON_DUP); + editor_ovl->_10 = 30; + editor_ovl->_0F = 26; + editor_ovl->_0E = 0; + + if (submenu->overlay->address_ovl->_07 != 0) { + board_ovl = submenu->overlay->board_ovl; + + if (board_ovl != NULL) { + submenu->overlay->address_ovl->_07 = FALSE; + editor_ovl->command = mED_COMMAND_CURSOL_LOWER; + mED_move_letter_table(editor_ovl, board_ovl, submenu); + editor_ovl->exchange_code = mED_get_exchange_code(editor_ovl); + } + } + } + else { + editor_ovl->cursol_opacity_step++; + + if (editor_ovl->cursol_opacity_step == 35) { + editor_ovl->cursol_opacity_step = 0; + } + + mED_set_stick_area(editor_ovl); + mED_move_keyboard_cursor(editor_ovl); + mED_set_command(editor_ovl); + (*mED_edit_func[menu_info->data0])(submenu, menu_info); + + if (editor_ovl->command_processed) { + mED_set_se(submenu); + editor_ovl->exchange_code = mED_get_exchange_code(editor_ovl); + + if ( + editor_ovl->command == mED_COMMAND_CURSOL_RIGHT || + editor_ovl->command == mED_COMMAND_CURSOL_LEFT || + editor_ovl->command == mED_COMMAND_CURSOL_UPPER || + editor_ovl->command == mED_COMMAND_CURSOL_LOWER || + editor_ovl->command == mED_COMMAND_BACKSPACE || + editor_ovl->command == mED_COMMAND_OUTPUT_CODE + ) { + editor_ovl->cursol_opacity_step = 0; + } + } + } + + mED_get_col_line_width(menu_info, editor_ovl, &editor_ovl->_22, &editor_ovl->_24, &editor_ovl->_26, editor_ovl->cursor_idx); + mED_check_line_over(editor_ovl); +} + +static void mED_move_Wait(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + if (submenu->menu_type != menu_info->next_menu_type) { + menu_info->proc_status = mSM_OVL_PROC_PLAY; + } +} + +static void mED_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->editor_ovl->_22 = 0; + (*submenu->overlay->move_End_proc)(submenu, menu_info); +} + +typedef void(*mED_OVL_MOVE_PROC)(Submenu*, mSM_MenuInfo_c*); + +static void mED_editor_ovl_move(Submenu* submenu) { + static mED_OVL_MOVE_PROC ovl_move_proc[mSM_OVL_PROC_NUM] = { + &mED_move_Move, + &mED_move_Play, + &mED_move_Wait, + (mED_OVL_MOVE_PROC)&none_proc1, + &mED_move_End + }; + + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &overlay->menu_info[mSM_OVL_EDITOR]; + + (*menu_info->pre_move_func)(submenu); + (*ovl_move_proc[menu_info->proc_status])(submenu, menu_info); +} + +extern u8 kai_sousa_button1a_tex_rgb_ia8[]; +extern u8 kai_sousa_button1b_tex_rgb_ia8[]; +extern Gfx kai_sousa_abuttonT_model[]; + +static void mED_KeyDraw_A_button(GRAPH* graph) { + static u8* tex[] = { + kai_sousa_button1a_tex_rgb_ia8, + kai_sousa_button1b_tex_rgb_ia8 + }; + + int key = 0; + Gfx* gfx; + + if (chkButton(BUTTON_A)) { + key = 1; + } + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPSegment(gfx++, G_MWO_SEGMENT_8, tex[key]); + gSPDisplayList(gfx++, kai_sousa_abuttonT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern u8 kai_sousa_button2a_tex_rgb_ia8[]; +extern u8 kai_sousa_button2b_tex_rgb_ia8[]; +extern Gfx kai_sousa_bbuttonT_model[]; +extern Gfx kai_sousa_cancelT_model[]; + +static void mED_KeyDraw_B_button(GRAPH* graph) { + static u8* tex[] = { + kai_sousa_button2a_tex_rgb_ia8, + kai_sousa_button2b_tex_rgb_ia8 + }; + + int key = 0; + Gfx* gfx; + + if (chkButton(BUTTON_B)) { + key = 1; + } + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPSegment(gfx++, G_MWO_SEGMENT_8, tex[key]); + gSPDisplayList(gfx++, kai_sousa_bbuttonT_model); + gSPDisplayList(gfx++, kai_sousa_cancelT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern u8 kai_sousa_xbutton_tex_rgb_ia8[]; +extern u8 kai_sousa_xbutton2_tex_rgb_ia8[]; +extern Gfx kai_sousa_xbuttonT_model[]; +extern Gfx kai_sousa_henkan_model[]; +extern Gfx kai_sousa_yajirushi_model[]; + +static void mED_KeyDraw_X_button(GRAPH* graph, mED_Ovl_c* editor_ovl) { + static u8* tex[] = { + kai_sousa_xbutton_tex_rgb_ia8, + kai_sousa_xbutton2_tex_rgb_ia8 + }; + + int key = 0; + Gfx* gfx; + + if (chkButton(BUTTON_X)) { + key = 1; + } + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPSegment(gfx++, G_MWO_SEGMENT_8, tex[key]); + gSPDisplayList(gfx++, kai_sousa_henkan_model); + + if (editor_ovl->exchange_code != -1) { + gSPDisplayList(gfx++, kai_sousa_yajirushi_model); + } + + gSPDisplayList(gfx++, kai_sousa_xbuttonT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern u8 kai_sousa_ybutton_tex_rgb_ia8[]; +extern u8 kai_sousa_ybutton2_tex_rgb_ia8[]; +extern Gfx kai_sousa_ybuttonT_model[]; +extern Gfx kai_sousa_kirikae_model[]; +extern Gfx kai_sousa_letter_model[]; +extern Gfx kai_sousa_sign_model[]; +extern Gfx kai_sousa_mark_model[]; + +static void mED_KeyDraw_Y_button(GRAPH* graph, mED_Ovl_c* editor_ovl) { + static u8* tex[] = { + kai_sousa_ybutton_tex_rgb_ia8, + kai_sousa_ybutton2_tex_rgb_ia8 + }; + + static Gfx* dl[mED_INPUT_MODE_NUM] = { + kai_sousa_letter_model, + kai_sousa_sign_model, + kai_sousa_mark_model + }; + + /* r, g, b, a, l */ + static u8 prim[2][5] = { + { 155, 155, 160, 255, 255 }, + { 225, 255, 255, 255, 255 } + }; + + int mode = editor_ovl->input_mode; + int key = 0; + Gfx* gfx; + int i; + + if (chkButton(BUTTON_Y)) { + key = 1; + } + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPSegment(gfx++, G_MWO_SEGMENT_8, tex[key]); + gSPDisplayList(gfx++, kai_sousa_kirikae_model); + + for (i = 0; i < mED_INPUT_MODE_NUM; i++) { + u8* col; + + if (i == mode) { + col = prim[1]; + } + else { + col = prim[0]; + } + + gDPSetPrimColor(gfx++, 0, col[4], col[0], col[1], col[2], col[3]); + gSPDisplayList(gfx++, dl[i]); + } + + gSPDisplayList(gfx++, kai_sousa_ybuttonT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern Gfx kai_sousa_startbuttonT_model[]; +extern Gfx kai_sousa_endT_model[]; + +static void mED_KeyDraw_START_button(GRAPH* graph) { + Gfx* gfx; + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPDisplayList(gfx++, kai_sousa_startbuttonT_model); + gSPDisplayList(gfx++, kai_sousa_endT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +typedef struct l_button_info_s { + u8* tex; + int prim; +} mED_L_button_info_c; + +extern u8 kai_sousa_caps_tex_rgb_i4[]; +extern u8 kai_sousa_small_tex_rgb_i4[]; +extern u8 kai_sousa_lbutton_tex_rgb_ia8[]; +extern u8 kai_sousa_lbutton2_tex_rgb_ia8[]; +extern Gfx kai_sousa_lwaku_model[]; +extern Gfx kai_sousa_lmoji_model[]; +extern Gfx kai_sousa_lbuttonT_model[]; + +static void mED_KeyDraw_L_button(GRAPH* graph, mED_Ovl_c* editor_ovl) { + static mED_L_button_info_c data[mED_INPUT_MODE_NUM][mED_SHIFT_NUM] = { + { + { kai_sousa_caps_tex_rgb_i4, 0 }, + { kai_sousa_small_tex_rgb_i4, 1 } + }, + { + { NULL, 0 }, + { NULL, 0 } + }, + { + { NULL, 0 }, + { NULL, 0 } + } + }; + + static u8* btn_tex[] = { + kai_sousa_lbutton_tex_rgb_ia8, + kai_sousa_lbutton2_tex_rgb_ia8 + }; + + /* r, g, b, a, l */ + static u8 prim[2][5] = { + { 30, 30, 215, 255, 255 }, + { 215, 30, 30, 255, 255 } + }; + + int key = 0; + Gfx* gfx; + int prim_idx; + u8* col; + int i; + int mode; + int shift; + mED_L_button_info_c* button_info; + + if (chkButton(BUTTON_L)) { + key = 1; + } + + mode = editor_ovl->input_mode; + shift = editor_ovl->shift_mode; + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + button_info = &data[mode][shift]; + col = prim[button_info->prim]; + + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, col[4], col[0], col[1], col[2], col[3]); + gSPDisplayList(gfx++, kai_sousa_lwaku_model); + + if (data[mode][shift].tex != NULL) { + gSPSegment(gfx++, G_MWO_SEGMENT_8, button_info->tex); + gSPDisplayList(gfx++, kai_sousa_lmoji_model); + } + + gSPSegment(gfx++, G_MWO_SEGMENT_8, btn_tex[key]); + gSPDisplayList(gfx++, kai_sousa_lbuttonT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern u8 kai_sousa_rbutton_tex_rgb_ia8[]; +extern u8 kai_sousa_rbutton2_tex_rgb_ia8[]; +extern Gfx kai_sousa_rbuttonT_model[]; +extern Gfx kai_sousa_spaceT_model[]; + +static void mED_KeyDraw_R_button(GRAPH* graph, mED_Ovl_c* editor_ovl) { + static u8* btn_tex[] = { + kai_sousa_rbutton_tex_rgb_ia8, + kai_sousa_rbutton2_tex_rgb_ia8 + }; + + int key = 0; + Gfx* gfx; + + if (chkButton(BUTTON_R)) { + key = 1; + } + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPSegment(gfx++, G_MWO_SEGMENT_8, btn_tex[key]); + gSPDisplayList(gfx++, kai_sousa_rbuttonT_model); + gSPDisplayList(gfx++, kai_sousa_spaceT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern Vtx kai_sousa2_v[]; +extern u8 testbutton[]; + +static void mED_KeyDraw_keyboard(GRAPH* graph, mED_Ovl_c* editor_ovl) { + static u8 model_type[mED_COLUMNS * mED_ROWS] = { + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 + }; + + static rgba_t sel_col[2] = { + { 205, 0, 0, 255 }, + { 0, 0, 205, 255 } + }; + + Vtx* vert = &kai_sousa2_v[0]; + u8* mtype = &model_type[0]; + int selected_col; + int selected_row; + rgba_t* color; + int selected = TRUE; + int col_idx = 0; + int col; + int row; + Gfx* gfx; + + if (editor_ovl->input_mode == mED_INPUT_MODE_LETTER && editor_ovl->shift_mode == mED_SHIFT_UPPER) { + col_idx = 1; + } + + selected_col = editor_ovl->select_col; + selected_row = editor_ovl->select_row; + color = &sel_col[col_idx]; + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPTexture(gfx++, 0, 0, 0, G_TX_RENDERTILE, G_ON); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, COMBINED, 0, 0, 0, COMBINED); + + for (row = 0; row < mED_ROWS; row++) { + for (col = 0; col < mED_COLUMNS; col++) { + if (col == selected_col && row == selected_row) { + gDPSetPrimColor(gfx++, 0, 255, color->r, color->g, color->b, 255); + selected = TRUE; + } + else if (selected == TRUE) { + gDPSetPrimColor(gfx++, 0, 255, 255, 255, 255, 255); + selected = FALSE; + } + + gDPSetTextureImage_Dolphin(gfx++, G_IM_FMT_I, G_IM_SIZ_4b, 16, 16, testbutton); + gDPSetTile_Dolphin(gfx++, G_DOLPHIN_TLUT_DEFAULT_MODE, G_TX_RENDERTILE, 15, GX_MIRROR, GX_MIRROR, GX_CLAMP, GX_CLAMP); + gSPVertex(gfx++, vert, 4, 0); + + if (*mtype != 0) { + gSPNTrianglesInit_5b( + gfx++, + 2, // tri count + 0, 1, 2, // tri0 + 3, 0, 2, // tri1 + 0, 0, 0 // tri2 + ); + } + else { + gSPNTrianglesInit_5b( + gfx++, + 2, // tri count + 0, 1, 2, // tri0 + 1, 3, 2, // tri1 + 0, 0, 0 // tri2 + ); + } + + vert += 4; + mtype++; + } + } + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern u8 kai_sousa_controllpad1_tex_rgb_ia8[]; +extern u8 kai_sousa_controllpad2_tex_rgb_ia8[]; +extern u8 kai_sousa_controllpad3_tex_rgb_ia8[]; +extern u8 kai_sousa_controllpad4_tex_rgb_ia8[]; +extern u8 kai_sousa_controllpad5_tex_rgb_ia8[]; + +extern Gfx kai_sousa_controllpadT_model[]; +extern Gfx kai_sousa_cursorT_model[]; + +static void mED_KeyDraw_J_key(GRAPH* graph) { + static u8* tex[5] = { + kai_sousa_controllpad1_tex_rgb_ia8, + kai_sousa_controllpad3_tex_rgb_ia8, + kai_sousa_controllpad4_tex_rgb_ia8, + kai_sousa_controllpad5_tex_rgb_ia8, + kai_sousa_controllpad2_tex_rgb_ia8 + }; + + int tex_idx = 0; + Gfx* gfx; + + if (chkButton(BUTTON_DLEFT)) { + tex_idx = 2; + } + else if (chkButton(BUTTON_DDOWN)) { + tex_idx = 1; + } + else if (chkButton(BUTTON_DUP)) { + tex_idx = 4; + } + else if (chkButton(BUTTON_DRIGHT)) { + tex_idx = 3; + } + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPSegment(gfx++, G_MWO_SEGMENT_8, tex[tex_idx]); + gSPDisplayList(gfx++, kai_sousa_controllpadT_model); + gSPDisplayList(gfx++, kai_sousa_cursorT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern u8 kai_sousa_3Dst_tex_rgb_ia8[]; +extern u8 kai_sousa_3Dst2_tex_rgb_ia8[]; +extern u8 kai_sousa_3Dst3_tex_rgb_ia8[]; +extern u8 kai_sousa_3Dst4_tex_rgb_ia8[]; +extern u8 kai_sousa_3Dst5_tex_rgb_ia8[]; +extern u8 kai_sousa_3Dst6_tex_rgb_ia8[]; + +extern Gfx kai_sousa_3DT_model[]; +extern Gfx kai_sousa_3DstT_model[]; + +static void mED_KeyDraw_3D_stick(GRAPH* graph, mED_Ovl_c* editor_ovl) { + static u8* tex[mED_STICK_AREA_NUM] = { + kai_sousa_3Dst4_tex_rgb_ia8, + kai_sousa_3Dst3_tex_rgb_ia8, + kai_sousa_3Dst2_tex_rgb_ia8, + kai_sousa_3Dst3_tex_rgb_ia8, + kai_sousa_3Dst4_tex_rgb_ia8, + kai_sousa_3Dst5_tex_rgb_ia8, + kai_sousa_3Dst6_tex_rgb_ia8, + kai_sousa_3Dst5_tex_rgb_ia8, + kai_sousa_3Dst_tex_rgb_ia8 + }; + + int stick_area = editor_ovl->stick_area; + Gfx* gfx; + + Matrix_push(); + + if (stick_area >= mED_STICK_AREA_TOP_RIGHT && stick_area <= mED_STICK_AREA_BOTTOM_RIGHT) { + Matrix_translate(-111.0f, -50.0f, 0.0f, 1); + Matrix_RotateY(DEG2SHORT_ANGLE(-180.0f), 1); + } + else { + Matrix_translate(-110.0f, -50.0f, 0.0f, 1); + } + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPDisplayList(gfx++, kai_sousa_3DT_model); + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPSegment(gfx++, G_MWO_SEGMENT_8, tex[stick_area]); + gSPDisplayList(gfx++, kai_sousa_3DstT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); + + Matrix_pull(); +} + +extern Gfx kai_sousa_mode[]; +extern Gfx kai_sousa_shitaT_model[]; +extern Gfx kai_sousa_controllerT_model[]; +extern Gfx kai_sousa_controller2T_model[]; +extern Gfx kai_sousa_mojibanT_model[]; + +static void mED_KeyDraw(mED_Ovl_c* editor_ovl, GRAPH* graph, f32 x, f32 y) { + Gfx* gfx; + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(x, y, 0.0f, 1); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, kai_sousa_mode); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); + + mED_KeyDraw_L_button(graph, editor_ovl); + mED_KeyDraw_R_button(graph, editor_ovl); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPDisplayList(gfx++, kai_sousa_shitaT_model); + gSPDisplayList(gfx++, kai_sousa_controllerT_model); + gSPDisplayList(gfx++, kai_sousa_controller2T_model); + gSPDisplayList(gfx++, kai_sousa_mojibanT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); + + mED_KeyDraw_A_button(graph); + mED_KeyDraw_B_button(graph); + mED_KeyDraw_X_button(graph, editor_ovl); + mED_KeyDraw_Y_button(graph, editor_ovl); + mED_KeyDraw_START_button(graph); + mED_KeyDraw_J_key(graph); + mED_KeyDraw_3D_stick(graph, editor_ovl); + mED_KeyDraw_keyboard(graph, editor_ovl); +} + +extern Gfx kai_sousa_ink_mode[]; +extern Gfx kai_sousa_ink_model[]; +extern Gfx kai_sousa_inktuboT_model[]; +extern Gfx kai_sousa_inkmojiT_model[]; + +static void mED_InkPotDraw(Submenu* submenu, mED_Ovl_c* editor_ovl, GRAPH* graph, f32 x, f32 y) { + f32 line_y; + f32 single_line_y; + Gfx* gfx; + Gfx* scroll_gfx; + + /* Filter out editors without the inkpot */ + switch (submenu->overlay->menu_info[mSM_OVL_EDITOR].data0) { + case mED_TYPE_BOARD: + break; + case mED_TYPE_NOTICE: + break; + case mED_TYPE_DIARY: + break; + default: + return; + } + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(x, y, 0.0f, 1); + single_line_y = 0.0f; + line_y = ((f32)editor_ovl->now_str_len * 15.0f) / (f32)(editor_ovl->input_length * editor_ovl->max_line_no); + + if (line_y > 15.0f) { + line_y = 15.0f; + } + + if (editor_ovl->max_line_no == 1) { + single_line_y = ((f32)mED_get_single_line_width(editor_ovl) * 15.0f) / (f32)editor_ovl->line_width; + + if (single_line_y > 15.0f) { + single_line_y = 15.0f; + } + } + + if (line_y < single_line_y) { + line_y = single_line_y; + } + + scroll_gfx = two_tex_scroll_dolphin( + graph, + 0, + 0, 0, 32, 32, + 1, + 0, line_y * 8.0f, 32, 32 + ); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPSegment(gfx++, G_MWO_SEGMENT_8, scroll_gfx); + gSPDisplayList(gfx++, kai_sousa_ink_mode); + gSPDisplayList(gfx++, kai_sousa_ink_model); + gSPDisplayList(gfx++, kai_sousa_inktuboT_model); + gSPDisplayList(gfx++, kai_sousa_inkmojiT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern Gfx lat_sousa_spT_model[]; + +static void mED_StringsDraw_spaceCode(GAME* game, rgba_t* color, f32 x, f32 y) { + GRAPH* graph = game->graph; + Gfx* gfx; + + x = 6.5f + (x - 160.0f); + y = -(8.5f + (y - 120.0f)); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(x, y, 0.0f, 1); + Matrix_scale(0.75f, 1.0f, 1.0f, 1); + + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(gfx++, 0, 255, color->r, color->g, color->b, 255); + gSPDisplayList(gfx++, lat_sousa_spT_model); + gSPMatrix(gfx++, &Mtx_clear, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(gfx); +} + +static void mED_StringsDraw_keyboard(mED_Ovl_c* editor_ovl, GAME* game, f32 x, f32 y) { + static f32 offset_posX[mED_COLUMNS] = { + 60.0f, + 76.0f, + 92.0f, + 108.0f, + 124.0f, + 140.0f, + 156.0f, + 172.0f, + 188.0f, + 204.0f + }; + + static f32 offset_posY[mED_ROWS] = { + 133.0f, + 149.0f, + 165.0f, + 181.0f + }; + + static f32 slide_posX[mED_ROWS] = { + 0.0f, + 3.0f, + 7.0f, + 10.0f + }; + + static rgba_t col[2] = { + { 35, 30, 55, 255 }, + { 255, 255, 255, 255 } + }; + + int column; + int row; + int sel_col = editor_ovl->select_col; + int sel_row = editor_ovl->select_row; + + for (row = 0; row < mED_ROWS; row++) { + for (column = 0; column < mED_COLUMNS; column++) { + u8 code = mED_get_code(editor_ovl, column, row); + + if (code != CHAR_SPACE_3) { + rgba_t* color; + f32 text_x; + f32 text_y; + + if (column == sel_col && row == sel_row) { + color = &col[1]; + } + else { + color = &col[0]; + } + + text_x = x + offset_posX[column] + slide_posX[row] + 2.0f; + text_y = -y + offset_posY[row]; + + switch (code) { + case CHAR_SPACE: + mED_StringsDraw_spaceCode(game, color, text_x, text_y); + break; + default: + mFont_SetLineStrings(game, &code, 1, text_x, text_y, color->r, color->g, color->b, 255, FALSE, FALSE, 1.0f, 1.0f, mFont_MODE_POLY); + break; + } + } + } + } +} + +static void mED_StringsDraw_select(mED_Ovl_c* editor_ovl, GAME* game, f32 x, f32 y) { + static rgba_t sp_color = { 255, 255, 255, 255 }; + u8 code = mED_get_code(editor_ovl, editor_ovl->select_col, editor_ovl->select_row); + + if (code != CHAR_SPACE_3) { + f32 text_x = (237.0f + x) + 5.0f; + f32 text_y = (177.0f - y) + 3.0f; + + if (chkButton(BUTTON_A)) { + text_y += 1.0f; + } + + switch (code) { + case CHAR_SPACE: + mED_StringsDraw_spaceCode(game, &sp_color, text_x, text_y); + break; + default: + mFont_SetLineStrings(game, &code, 1, text_x, text_y, 255, 255, 255, 255, FALSE, FALSE, 1.0f, 1.0f, mFont_MODE_POLY); + break; + } + } +} + +static void mED_StringsDraw_ornament(mED_Ovl_c* editor_ovl, GAME* game, f32 x, f32 y) { + if (editor_ovl->exchange_code != -1) { + u8 code = editor_ovl->exchange_code; + f32 text_x = 259.0f + x; + f32 text_y = 190.0f - y; + int cursor_idx = editor_ovl->cursor_idx; + u8* str_p = &editor_ovl->input_str[cursor_idx]; + + mFont_SetLineStrings(game, &str_p[-1], 1, text_x + 2.0f, text_y, 225, 195, 195, 255, FALSE, FALSE, 1.0f, 1.0f, mFont_MODE_POLY); + text_x = 281.0f + x; + mFont_SetLineStrings(game, &code, 1, text_x + 2.0f, text_y, 255, 255, 255, 255, FALSE, FALSE, 1.0f, 1.0f, mFont_MODE_POLY); + } +} + +static void mED_StringsDraw(Submenu* submenu, mED_Ovl_c* editor_ovl, GAME* game, f32 x, f32 y) { + (*submenu->overlay->set_char_matrix_proc)(game->graph); + mED_StringsDraw_keyboard(editor_ovl, game, x, y); + mED_StringsDraw_select(editor_ovl, game, x, y); + mED_StringsDraw_ornament(editor_ovl, game, x, y); +} + +static void mED_set_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game) { + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + GRAPH* graph = game->graph; + + mED_KeyDraw(editor_ovl, graph, menu_info->position[0], menu_info->position[1]); + mED_InkPotDraw(submenu, editor_ovl, graph, menu_info->position[0], menu_info->position[1]); + mED_StringsDraw(submenu, editor_ovl, game, menu_info->position[0], menu_info->position[1]); +} + +extern Gfx lat_end_cordT_model[]; + +static void mED_endCode_draw(Submenu* submenu, GAME* game, f32 x, f32 y) { + GRAPH* graph = game->graph; + Gfx* gfx; + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(x, y, 140.0f, 1); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, lat_end_cordT_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +static void mED_cursol_draw(Submenu* submenu, GAME* game, f32 x, f32 y) { + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + int cursol_opacity_step = editor_ovl->cursol_opacity_step; + int a; + + if (cursol_opacity_step > 17) { + cursol_opacity_step = 35 - cursol_opacity_step; + } + + a = ((17 - cursol_opacity_step) * 255) / 17; + mFont_SetMarkChar(game, mFont_MARKTYPE_CURSOR, x, y, 195, 80, 80, a, FALSE, 1.0f, 1.0f, mFont_MODE_POLY); +} + +static void mED_editor_ovl_draw(Submenu* submenu, GAME* game) { + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &overlay->menu_info[mSM_OVL_EDITOR]; + + (*menu_info->pre_draw_func)(submenu, game); + mED_set_dl(submenu, menu_info, game); + + if (menu_info->pre_menu_type == mSM_OVL_ADDRESS && submenu->overlay->address_ovl->display_list != NULL) { + OPEN_DISP(game->graph); + + gSPDisplayList(NOW_POLY_OPA_DISP++, submenu->overlay->address_ovl->display_list); + + CLOSE_DISP(game->graph); + } +} + +extern void mED_editor_ovl_set_proc(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + + overlay->menu_control.menu_move_func = &mED_editor_ovl_move; + overlay->menu_control.menu_draw_func = &mED_editor_ovl_draw; +} + +static void mED_editor_ovl_init(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &overlay->menu_info[mSM_OVL_EDITOR]; + + (*overlay->move_chg_base_proc)(menu_info, mSM_MOVE_IN_BOTTOM); + + if (menu_info->data0 == mED_TYPE_CP_TITLE || menu_info->data0 == mED_TYPE_LEDIT || menu_info->data0 == mED_TYPE_HBOARD) { + sAdo_SysTrgStart(0x59); + } +} + +static mED_Ovl_c edit_ovl_data; + +extern void mED_editor_ovl_construct(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &overlay->menu_info[mSM_OVL_EDITOR]; + + if (overlay->editor_ovl == NULL) { + mem_clear((u8*)&edit_ovl_data, sizeof(mED_Ovl_c), 0); + overlay->editor_ovl = &edit_ovl_data; + } + + mED_init(submenu, menu_info); + mED_editor_ovl_init(submenu); + mED_editor_ovl_set_proc(submenu); + submenu->overlay->editor_ovl->end_code_draw = &mED_endCode_draw; + submenu->overlay->editor_ovl->cursol_draw = &mED_cursol_draw; +} + +extern void mED_editor_ovl_destruct(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + + overlay->editor_ovl = NULL; +} diff --git a/rel/m_map_ovl.c b/rel/m_map_ovl.c index 29ab0efb..7bcad8a1 100644 --- a/rel/m_map_ovl.c +++ b/rel/m_map_ovl.c @@ -832,7 +832,7 @@ static void mMP_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu) { int cursor_moved = FALSE; if ((trigger & (BUTTON_A | BUTTON_B | BUTTON_START)) || (menu->data0 == 1 && (trigger & BUTTON_X))) { - (*ovl->move_chg_base_proc)(menu, 4); + (*ovl->move_chg_base_proc)(menu, mSM_MOVE_OUT_TOP); sAdo_SysTrgStart(0x17D); } else if (trigger & BUTTON_CLEFT) { @@ -1345,7 +1345,7 @@ static void mMP_map_ovl_init(Submenu* submenu) { mSM_MenuInfo_c* menu = &overlay->menu_info[mSM_OVL_MAP]; overlay->menu_control.animation_flag = FALSE; - (*submenu->overlay->move_chg_base_proc)(menu, 5); + (*submenu->overlay->move_chg_base_proc)(menu, mSM_MOVE_IN_TOP); sAdo_SysTrgStart(0x17C); mMP_set_init_data(submenu->overlay->map_ovl, menu);