#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->header_pos != mBD_HEADER_POS_ON_NAME) { s16 len = editor_ovl->now_str_len; if ( board_ovl->mail.content.header_back_start == editor_ovl->cursor_idx && ((board_ovl->header_pos == mBD_HEADER_POS_PRE_NAME && editor_ovl->command == mED_COMMAND_CURSOL_RIGHT) || (board_ovl->header_pos == mBD_HEADER_POS_POST_NAME && (editor_ovl->command == mED_COMMAND_CURSOL_LEFT || editor_ovl->command == mED_COMMAND_BACKSPACE))) ) { board_ovl->header_pos = mBD_HEADER_POS_ON_NAME; editor_ovl->command_processed = TRUE; } else { mED_edit_func_single_line(submenu, menu_info); if (board_ovl->header_pos == mBD_HEADER_POS_PRE_NAME) { 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->header_pos == mBD_HEADER_POS_ON_NAME) { 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->header_pos = mBD_HEADER_POS_PRE_NAME; 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; }