Files
ac-decomp/src/m_editor_ovl.c
T
2023-12-17 01:33:40 -05:00

2721 lines
73 KiB
C

#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;
}