mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
984 lines
28 KiB
Plaintext
984 lines
28 KiB
Plaintext
static int mMsg_Set_SizeCode(mMsg_Window_c* msg_p, int idx) {
|
|
return mFont_CodeSize_idx_get(msg_p->msg_data->text_buf.data, idx);
|
|
}
|
|
|
|
static int mMsg_Count_SameCode(u8* data, int start, int length, u8 code) {
|
|
int res = 0;
|
|
int i = start;
|
|
u8* now_p;
|
|
u8 now_code;
|
|
|
|
while (i < length) {
|
|
now_p = &data[i];
|
|
now_code = *now_p;
|
|
|
|
if (now_code == CHAR_CONTROL_CODE) {
|
|
i += mFont_CodeSize_get(now_p);
|
|
}
|
|
else if (now_code == code) {
|
|
res++;
|
|
i++;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
static int mMsg_Check_LastCode_forData(u8* data, int idx) {
|
|
u8 code = data[idx];
|
|
|
|
if (code == CHAR_CONTROL_CODE) {
|
|
code = data[idx + 1];
|
|
|
|
if (code == mFont_CONT_CODE_LAST) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int mMsg_Check_LastCode(mMsg_Window_c* msg_p, int idx) {
|
|
return mMsg_Check_LastCode_forData(msg_p->msg_data->text_buf.data, idx);
|
|
}
|
|
|
|
static int mMsg_Check_ContinueCode_forData(u8* data, int idx) {
|
|
u8 code = data[idx];
|
|
|
|
if (code == CHAR_CONTROL_CODE) {
|
|
code = data[idx + 1];
|
|
|
|
if (code == mFont_CONT_CODE_CONTINUE) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int mMsg_Check_ContinueCode(mMsg_Window_c* msg_p, int idx) {
|
|
return mMsg_Check_ContinueCode_forData(msg_p->msg_data->text_buf.data, idx);
|
|
}
|
|
|
|
static int mMsg_Check_NextIndex_ContinueCode(mMsg_Window_c* msg_p) {
|
|
if (mMsg_Check_ContinueCode(msg_p, msg_p->end_text_cursor_idx)) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int mMsg_Check_NextIndex_LastCode(mMsg_Window_c* msg_p) {
|
|
if (mMsg_Check_LastCode(msg_p, msg_p->end_text_cursor_idx)) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int mMsg_Check_NextIndex_SetSelectWindowCode(mMsg_Window_c* msg_p) {
|
|
u8* data = msg_p->msg_data->text_buf.data;
|
|
int idx = msg_p->end_text_cursor_idx;
|
|
u8 code = data[idx];
|
|
|
|
if (code == CHAR_CONTROL_CODE) {
|
|
code = data[idx + 1];
|
|
|
|
if (code == mFont_CONT_CODE_SET_SELECT_WINDOW) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static f32 mMsg_Get_CursolSetTimeCode_forData(u8* data, int idx) {
|
|
u8 code = data[idx];
|
|
|
|
if (code == CHAR_CONTROL_CODE) {
|
|
code = data[idx + 1];
|
|
|
|
if (code == mFont_CONT_CODE_CURSOR_SET_TIME) {
|
|
code = data[idx + 2];
|
|
|
|
return (f32)(int)code * 2.0f; /* Multiply by two due to AC running at 60fps over 30fps */
|
|
}
|
|
}
|
|
|
|
return 0.0f;
|
|
}
|
|
|
|
static f32 mMsg_Get_CursolSetTimeCode(mMsg_Window_c* msg_p, int idx) {
|
|
return mMsg_Get_CursolSetTimeCode_forData(msg_p->msg_data->text_buf.data, idx);
|
|
}
|
|
|
|
static int mMsg_Get_ColorCode_forData(u8* data, int idx, u8* r, u8* g, u8* b) {
|
|
u8 code = data[idx];
|
|
|
|
if (code == CHAR_CONTROL_CODE) {
|
|
code = data[idx + 1];
|
|
|
|
if (code == mFont_CONT_CODE_COLOR) {
|
|
*r = data[idx + 2];
|
|
*g = data[idx + 3];
|
|
*b = data[idx + 4];
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int mMsg_Get_ColorCode(mMsg_Window_c* msg_p, int idx, u8* r, u8* g, u8* b) {
|
|
return mMsg_Get_ColorCode_forData(msg_p->msg_data->text_buf.data, idx, r, g, b);
|
|
}
|
|
|
|
static int mMsg_Get_OrderCode_forData(u8* data, int idx, int* order_idx, u16* order_val) {
|
|
u8 code = data[idx];
|
|
|
|
if (code == CHAR_CONTROL_CODE) {
|
|
code = data[idx + 1];
|
|
|
|
if (
|
|
code == mFont_CONT_CODE_SET_DEMO_ORDER_PLAYER ||
|
|
code == mFont_CONT_CODE_SET_DEMO_ORDER_NPC0 ||
|
|
code == mFont_CONT_CODE_SET_DEMO_ORDER_NPC1 ||
|
|
code == mFont_CONT_CODE_SET_DEMO_ORDER_NPC2 ||
|
|
code == mFont_CONT_CODE_SET_DEMO_ORDER_QUEST
|
|
) {
|
|
u16 val;
|
|
|
|
*order_idx = data[idx + 2];
|
|
val = (u16)(data[idx + 3]) << 8;
|
|
*order_val = val | ((data[idx + 4]) & 0xFF);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int mMsg_Get_OrderCode(mMsg_Window_c* msg_p, int idx, int* order_idx, u16* order_val) {
|
|
return mMsg_Get_OrderCode_forData(msg_p->msg_data->text_buf.data, idx, order_idx, order_val);
|
|
}
|
|
|
|
static int mMsg_Get_SoundCutCode_forData(u8* data, int idx) {
|
|
if (data[idx] == CHAR_CONTROL_CODE && data[idx + 1] == mFont_CONT_CODE_SOUND_CUT) {
|
|
return data[idx + 2];
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int mMsg_Get_SoundCutCode(mMsg_Window_c* msg_p, int idx) {
|
|
return mMsg_Get_SoundCutCode_forData(msg_p->msg_data->text_buf.data, idx);
|
|
}
|
|
|
|
static void mMsg_Get_bgm_make_forData(u8* data, int idx, int* bgm_type, int* stop_type) {
|
|
u8* code_p = &data[idx];
|
|
|
|
if (
|
|
code_p[0] == CHAR_CONTROL_CODE &&
|
|
code_p[1] == mFont_CONT_CODE_BGM_MAKE &&
|
|
code_p[2] < mFont_BGM_NUM &&
|
|
code_p[3] < mFont_BGM_STOP_TYPE_NUM
|
|
) {
|
|
*bgm_type = code_p[2];
|
|
*stop_type = code_p[3];
|
|
}
|
|
else {
|
|
*bgm_type = mFont_BGM_NUM;
|
|
*stop_type = mFont_BGM_STOP_TYPE_NUM;
|
|
}
|
|
}
|
|
|
|
static void mMsg_Get_bgm_make(mMsg_Window_c* msg_p, int idx, int* bgm_type, int* stop_type) {
|
|
mMsg_Get_bgm_make_forData(msg_p->msg_data->text_buf.data, idx, bgm_type, stop_type);
|
|
}
|
|
|
|
static void mMsg_Get_bgm_delete_forData(u8* data, int idx, int* bgm_type, int* stop_type) {
|
|
u8* code_p = &data[idx];
|
|
|
|
if (
|
|
code_p[0] == CHAR_CONTROL_CODE &&
|
|
code_p[1] == mFont_CONT_CODE_BGM_DELETE &&
|
|
code_p[2] < mFont_BGM_NUM &&
|
|
code_p[3] < mFont_BGM_STOP_TYPE_NUM
|
|
) {
|
|
*bgm_type = code_p[2];
|
|
*stop_type = code_p[3];
|
|
}
|
|
else {
|
|
*bgm_type = mFont_BGM_NUM;
|
|
*stop_type = mFont_BGM_STOP_TYPE_NUM;
|
|
}
|
|
}
|
|
|
|
static void mMsg_Get_bgm_delete(mMsg_Window_c* msg_p, int idx, int* bgm_type, int* stop_type) {
|
|
mMsg_Get_bgm_delete_forData(msg_p->msg_data->text_buf.data, idx, bgm_type, stop_type);
|
|
}
|
|
|
|
static int mMsg_Get_MsgTimeEnd_time_forData(u8* data, int idx) {
|
|
u8* code_p = &data[idx];
|
|
|
|
if (code_p[0] == CHAR_CONTROL_CODE && code_p[1] == mFont_CONT_CODE_MSG_TIME_END) {
|
|
return code_p[2];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int mMsg_Get_MsgTimeEnd_time(mMsg_Window_c* msg_p, int idx) {
|
|
return mMsg_Get_MsgTimeEnd_time_forData(msg_p->msg_data->text_buf.data, idx);
|
|
}
|
|
|
|
static int mMsg_Check_MsgTimeEndCode_forData(u8* data, int idx) {
|
|
u8* code_p = &data[idx];
|
|
|
|
return (code_p[0] == CHAR_CONTROL_CODE && code_p[1] == mFont_CONT_CODE_MSG_TIME_END);
|
|
}
|
|
|
|
static int mMsg_Check_MsgTimeEndCode(mMsg_Window_c* msg_p, int idx) {
|
|
return mMsg_Check_MsgTimeEndCode_forData(msg_p->msg_data->text_buf.data, idx);
|
|
}
|
|
|
|
static int mMsg_Check_NextIndex_MsgTimeEndCode(mMsg_Window_c* msg_p) {
|
|
return mMsg_Check_MsgTimeEndCode(msg_p, msg_p->end_text_cursor_idx);
|
|
}
|
|
|
|
static void mMsg_Get_sound_trg_sys_forData(u8* data, int idx, int* se_no) {
|
|
u8* code_p = &data[idx];
|
|
|
|
if (
|
|
code_p[0] == CHAR_CONTROL_CODE &&
|
|
code_p[1] == mFont_CONT_CODE_SOUND_TRG_SYS &&
|
|
code_p[2] < mFont_SE_NUM
|
|
) {
|
|
*se_no = code_p[2];
|
|
}
|
|
else {
|
|
*se_no = mFont_SE_NUM;
|
|
}
|
|
}
|
|
|
|
static void mMsg_Get_sound_trg_sys(mMsg_Window_c* msg_p, int idx, int* se_no) {
|
|
mMsg_Get_sound_trg_sys_forData(msg_p->msg_data->text_buf.data, idx, se_no);
|
|
}
|
|
|
|
static void mMsg_Set_LineFontColor(mMsg_Window_c* msg_p, int line_no, u8 r, u8 g, u8 b, u8 a) {
|
|
if (line_no >= 0 && line_no < mMsg_MAX_LINE) {
|
|
rgba_t* color = &msg_p->font_color[line_no];
|
|
|
|
color->r = r;
|
|
color->g = g;
|
|
color->b = b;
|
|
color->a = a;
|
|
}
|
|
}
|
|
|
|
static void mMsg_init_FontColor(mMsg_Window_c* msg_p) {
|
|
int i;
|
|
|
|
for (i = 0; i < mMsg_MAX_LINE; i++) {
|
|
mMsg_Set_LineFontColor(msg_p, i, 50, 60, 50, 255);
|
|
}
|
|
}
|
|
|
|
static void mMsg_init_NowDisplayLIne(mMsg_Window_c* msg_p) {
|
|
msg_p->now_display_line = 0;
|
|
}
|
|
|
|
static void mMsg_Clear_CursolIndex(mMsg_Window_c* msg_p) {
|
|
msg_p->start_text_cursor_idx = msg_p->end_text_cursor_idx;
|
|
mMsg_init_FontColor(msg_p);
|
|
mMsg_init_NowDisplayLIne(msg_p);
|
|
}
|
|
|
|
static void mMsg_SetTimer(mMsg_Window_c* msg_p, f32 timer) {
|
|
msg_p->cursor_timer = timer;
|
|
}
|
|
|
|
extern void mMsg_Get_BodyParam(u32 table_addr, u32 data_addr, int index, u32* addr, u32* size) {
|
|
static u32 tmp_buff[16] ATTRIBUTE_ALIGN(32);
|
|
int first_entry = index == 0;
|
|
u32 aligned_ofs = first_entry ? 0 : ALIGN_PREV((index - 1) * sizeof(u32), 32);
|
|
int ofs = first_entry ? 0 : (index - 1) & 7;
|
|
|
|
_JW_GetResourceAram(table_addr + aligned_ofs, (u8*)tmp_buff, sizeof(tmp_buff));
|
|
|
|
if (first_entry) {
|
|
*addr = data_addr;
|
|
*size = tmp_buff[ofs];
|
|
}
|
|
else {
|
|
*addr = data_addr + tmp_buff[ofs];
|
|
*size = tmp_buff[ofs + 1] - tmp_buff[ofs];
|
|
}
|
|
}
|
|
|
|
static void mMsg_Get_MsgDataAddressAndSize(int idx, u32* addr, u32* size) {
|
|
mMsg_Get_BodyParam(Msg_table_rom_start, Msg_rom_start, idx, addr, size);
|
|
}
|
|
|
|
static int mMsg_Count_MsgData(u8* data) {
|
|
int i = 0;
|
|
|
|
while (i < mMsg_MSG_BUF_MAX) {
|
|
if (
|
|
mMsg_Check_LastCode_forData(data, i) ||
|
|
mMsg_Check_ContinueCode_forData(data, i) ||
|
|
mMsg_Check_MsgTimeEndCode_forData(data, i)
|
|
) {
|
|
i += mFont_CodeSize_idx_get(data, i);
|
|
break;
|
|
}
|
|
|
|
i += mFont_CodeSize_idx_get(data, i);
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
static int mMsg_LoadMsgData(mMsg_Data_c* msg_data, int index, int cut) {
|
|
if (msg_data != NULL) {
|
|
u32 addr;
|
|
u32 size;
|
|
|
|
mFRm_set_msg_idx(index);
|
|
mMsg_Get_MsgDataAddressAndSize(index, &addr, &size);
|
|
|
|
if (addr != 0 && size != 0) {
|
|
u32 aligned_addr = ALIGN_PREV(addr, 32);
|
|
int ofs = addr - aligned_addr;
|
|
u8* dst_p;
|
|
u8* src_p;
|
|
int len;
|
|
int i;
|
|
|
|
/* DMA copy from ARAM */
|
|
_JW_GetResourceAram(aligned_addr, msg_data->text_buf.data, ALIGN_NEXT(ofs + size, 32));
|
|
|
|
/* Move text to beginning of buffer since we copied aligned to 32 bytes */
|
|
len = size;
|
|
dst_p = msg_data->text_buf.data;
|
|
src_p = msg_data->text_buf.data + ofs;
|
|
|
|
for (i = 0; i < len; i++) {
|
|
*dst_p++ = *src_p++;
|
|
}
|
|
|
|
msg_data->msg_no = index;
|
|
msg_data->data_loaded = TRUE;
|
|
msg_data->msg_len = mMsg_Count_MsgData(msg_data->text_buf.data);
|
|
msg_data->cut = cut;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
msg_data->data_loaded = FALSE;
|
|
return FALSE;
|
|
}
|
|
|
|
extern int mMsg_ChangeMsgData(mMsg_Window_c* msg_p, int index) {
|
|
if (index >= 0 && index < MSG_MAX && mMsg_LoadMsgData(msg_p->msg_data, index, FALSE)) {
|
|
msg_p->end_text_cursor_idx = 0;
|
|
mMsg_Clear_CursolIndex(msg_p);
|
|
mMsg_SetTimer(msg_p, 20.0f);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void mMsg_Unset_NowUtter(mMsg_Window_c* msg_p) {
|
|
msg_p->now_utter = FALSE;
|
|
}
|
|
|
|
static void mMsg_Set_NowUtter(mMsg_Window_c* msg_p) {
|
|
msg_p->now_utter = TRUE;
|
|
}
|
|
|
|
extern int mMsg_Check_NowUtter() {
|
|
return mMsg_Get_base_window_p()->now_utter;
|
|
}
|
|
|
|
static void mMsg_init(GAME* game) {
|
|
mMsg_data.data_loaded = FALSE;
|
|
mMsg_window.data_loaded = FALSE;
|
|
mMsg_window.msg_no = 0;
|
|
mMsg_window._008 = 0;
|
|
mMsg_window.msg_data = &mMsg_data;
|
|
mMsg_window.center_x = 160.0;
|
|
mMsg_window.center_y = 185.4;
|
|
mMsg_window.width = 245.0;
|
|
mMsg_window.height = 96.0;
|
|
mMsg_window.client_actor_p = NULL;
|
|
mMsg_window.client_name_len = 0;
|
|
mMsg_window.nameplate_x = 61.0;
|
|
mMsg_window.nameplate_y = 64.0;
|
|
mMsg_window.show_continue_button = FALSE;
|
|
mMsg_window.name_text_color.r = 0x32;
|
|
mMsg_window.name_text_color.g = 0x5a;
|
|
mMsg_window.name_text_color.b = 0;
|
|
mMsg_window.name_text_color.a = 0xff;
|
|
mMsg_window.name_background_color.r = 0xa0;
|
|
mMsg_window.name_background_color.g = 0xd7;
|
|
mMsg_window.name_background_color.b = 0x1e;
|
|
mMsg_window.name_background_color.a = 0xff;
|
|
mMsg_window.window_background_color.r = 0xeb;
|
|
mMsg_window.window_background_color.g = 0xff;
|
|
mMsg_window.window_background_color.b = 0xeb;
|
|
mMsg_window.window_background_color.a = 0xff;
|
|
mMsg_init_FontColor(&mMsg_window);
|
|
mMsg_init_NowDisplayLIne(&mMsg_window);
|
|
mMsg_window.continue_button_color.r = 0;
|
|
mMsg_window.continue_button_color.g = 0;
|
|
mMsg_window.continue_button_color.b = 0xff;
|
|
mMsg_window.continue_button_color.a = 0;
|
|
mMsg_window.font_scale_x = 1.0;
|
|
mMsg_window.font_scale_y = 1.0;
|
|
mMsg_window._2D8 = 196;
|
|
mMsg_window._2DC = 66;
|
|
mMsg_window.text_lines = mMsg_MAX_LINE;
|
|
mMsg_window.now_display_line = 0;
|
|
mMsg_window.timer = 0.0;
|
|
mMsg_SetTimer(&mMsg_window, 0.0);
|
|
mMsg_window.continue_button_timer = 0.0;
|
|
mMsg_window.start_text_cursor_idx = 0;
|
|
mMsg_window.end_text_cursor_idx = 0;
|
|
mMsg_window.window_scale = 0.0;
|
|
mMsg_window.text_scale = 1.0;
|
|
mMsg_window.requested_main_index = -1;
|
|
mMsg_window.requested_priority = 0;
|
|
mMsg_window.main_index = mMsg_INDEX_HIDE;
|
|
mMsg_window.draw_flag = 0;
|
|
mMsg_window.cancel_flag = 0;
|
|
mMsg_window.cancelable_flag = 0;
|
|
mMsg_window.continue_msg_no = 0xFFFF;
|
|
mMsg_Unset_CancelNormalContinue(&mMsg_window);
|
|
mMsg_Unset_ForceNext(&mMsg_window);
|
|
mMsg_Unset_LockContinue(&mMsg_window);
|
|
mMsg_sound_MessageSpeedForce(0.0f);
|
|
mMsg_sound_MessageStatus(0);
|
|
mMsg_window.status_flags &= ~(
|
|
mMsg_STATUS_FLAG_SOUND_CUT |
|
|
mMsg_STATUS_FLAG_IDLING_REQ |
|
|
mMsg_STATUS_FLAG_IDLING_NOW |
|
|
mMsg_STATUS_FLAG_NOT_PAUSE_FRAME |
|
|
mMsg_STATUS_FLAG_NO_ZOOMDOWN |
|
|
mMsg_STATUS_FLAG_VOICE_CLICK |
|
|
mMsg_STATUS_FLAG_VOICE_SILENT |
|
|
mMsg_STATUS_FLAG_CURSOL_JUST
|
|
); // ~7AC1
|
|
mMsg_window.free_str_color_idx[0] = 0;
|
|
mMsg_window.free_str_color_idx[1] = 0;
|
|
mMsg_window.free_str_color_idx[2] = 0;
|
|
}
|
|
|
|
extern int mMsg_Get_Length_String(u8* str, int str_len) {
|
|
int i;
|
|
|
|
for (i = str_len - 1; i >= 0; i--) {
|
|
if (str[i] != CHAR_SPACE) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return i + 1;
|
|
}
|
|
|
|
extern int mMsg_Check_MainNormalContinue(mMsg_Window_c* msg_p) {
|
|
if (msg_p->main_index == mMsg_INDEX_NORMAL) {
|
|
if (mMsg_Check_NextIndex_ContinueCode(msg_p)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
extern int mMsg_Check_MainNormal(mMsg_Window_c* msg_p) {
|
|
if (msg_p->main_index == mMsg_INDEX_NORMAL) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
extern int mMsg_Check_MainHide(mMsg_Window_c* msg_p) {
|
|
if (msg_p->main_index == mMsg_INDEX_HIDE) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
extern int mMsg_Check_MainDisappear(mMsg_Window_c* msg_p) {
|
|
if (msg_p->main_index == mMsg_INDEX_DISAPPEAR) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
extern void mMsg_Set_CancelNormalContinue(mMsg_Window_c* msg_p) {
|
|
msg_p->continue_cancel_flag = TRUE;
|
|
}
|
|
|
|
extern void mMsg_Unset_CancelNormalContinue(mMsg_Window_c* msg_p) {
|
|
msg_p->continue_cancel_flag = FALSE;
|
|
}
|
|
|
|
extern void mMsg_Set_ForceNext(mMsg_Window_c* msg_p) {
|
|
msg_p->force_next = TRUE;
|
|
}
|
|
|
|
extern void mMsg_Unset_ForceNext(mMsg_Window_c* msg_p) {
|
|
msg_p->force_next = FALSE;
|
|
}
|
|
|
|
/* @unused @fabricated */
|
|
// extern int mMsg_Get_LockContinue(mMsg_Window_c* msg_p) {
|
|
// return msg_p->lock_continue;
|
|
// }
|
|
|
|
extern void mMsg_Set_LockContinue(mMsg_Window_c* msg_p) {
|
|
msg_p->lock_continue = TRUE;
|
|
}
|
|
|
|
extern void mMsg_Unset_LockContinue(mMsg_Window_c* msg_p) {
|
|
msg_p->lock_continue = FALSE;
|
|
}
|
|
|
|
extern void mMsg_Set_idling_req(mMsg_Window_c* msg_p) {
|
|
msg_p->status_flags |= mMsg_STATUS_FLAG_IDLING_REQ;
|
|
}
|
|
|
|
extern int mMsg_Check_idling_now(mMsg_Window_c* msg_p) {
|
|
return (msg_p->status_flags & mMsg_STATUS_FLAG_IDLING_NOW) != 0;
|
|
}
|
|
|
|
extern int mMsg_MoveDataCut(u8* data, int dst_idx, int src_idx, int len, int space_flag) {
|
|
int new_len = len;
|
|
|
|
if (dst_idx < src_idx) {
|
|
while (src_idx < len) {
|
|
data[dst_idx] = data[src_idx];
|
|
dst_idx++;
|
|
src_idx++;
|
|
}
|
|
|
|
new_len -= src_idx - dst_idx;
|
|
|
|
if (space_flag) {
|
|
while (dst_idx < len) {
|
|
data[dst_idx] = CHAR_SPACE;
|
|
dst_idx++;
|
|
}
|
|
}
|
|
}
|
|
else if (dst_idx > src_idx) {
|
|
int move_size = len - src_idx;
|
|
|
|
new_len += dst_idx - src_idx;
|
|
if (new_len <= mMsg_MSG_BUF_MAX) {
|
|
int i;
|
|
u8* dst_p = data + new_len - 1;
|
|
u8* src_p = data + len - 1;
|
|
|
|
for (i = 0; i < move_size; i++) {
|
|
*dst_p-- = *src_p--;
|
|
}
|
|
}
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
|
|
static void mMsg_CopyString(u8* dst, u8* src, int len) {
|
|
int i;
|
|
|
|
for (i = 0; i < len; i++) {
|
|
*dst++ = *src++;
|
|
}
|
|
}
|
|
|
|
static int mMsg_Set_PlayerNameColor(u8* data, int* start_idx, int len) {
|
|
static u8 add_string[] = {
|
|
CHAR_CONTROL_CODE,
|
|
mFont_CONT_CODE_SET_COLOR_CHAR,
|
|
75,
|
|
95,
|
|
155,
|
|
0
|
|
};
|
|
|
|
u8* name = Common_Get(now_private)->player_ID.player_name;
|
|
int name_len = mMsg_Get_Length_String(name, PLAYER_NAME_LEN);
|
|
int hypen_count;
|
|
int new_len;
|
|
int initial_start_idx = *start_idx;
|
|
int command_len = mFont_CodeSize_idx_get(data, *start_idx);
|
|
|
|
if (name_len > 0) {
|
|
hypen_count = mMsg_Count_SameCode(data, (*start_idx) + command_len, len, CHAR_HYPHEN);
|
|
add_string[5] = name_len + hypen_count;
|
|
new_len = mMsg_MoveDataCut(data, initial_start_idx + sizeof(add_string), initial_start_idx, len, FALSE);
|
|
mMsg_CopyString(data + initial_start_idx, add_string, sizeof(add_string));
|
|
*start_idx += sizeof(add_string);
|
|
}
|
|
else {
|
|
new_len = len;
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyPlayerName(u8* data, int start_idx, int len, u32 capitalize) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* name = Common_Get(now_private)->player_ID.player_name;
|
|
int name_len = mMsg_Get_Length_String(name, PLAYER_NAME_LEN);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + name_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], name, name_len);
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyTalkName(ACTOR* actor_p, u8* data, int start_idx, int len, u32 capitalize) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 name[ANIMAL_NAME_LEN];
|
|
int name_len;
|
|
int new_len;
|
|
|
|
if (actor_p != NULL) {
|
|
mNpc_GetNpcWorldName(name, actor_p);
|
|
name_len = mMsg_Get_Length_String(name, sizeof(name));
|
|
}
|
|
else {
|
|
name_len = 0;
|
|
}
|
|
|
|
new_len = mMsg_MoveDataCut(data, start_idx + name_len, start_idx + command_len, len, FALSE);
|
|
mMsg_CopyString(&data[start_idx], name, name_len);
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyTail(ACTOR* actor_p, u8* data, int start_idx, int len, u32 capitalize) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* tail_p = actor_p != NULL ? mNpc_GetWordEnding(actor_p) : NULL;
|
|
int tail_len = actor_p != NULL ? mMsg_Get_Length_String(tail_p, ANIMAL_CATCHPHRASE_LEN) : 0;
|
|
int new_len;
|
|
|
|
new_len = mMsg_MoveDataCut(data, start_idx + tail_len, start_idx + command_len, len, FALSE);
|
|
mMsg_CopyString(&data[start_idx], tail_p, tail_len);
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyYear(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u16 year = Common_Get(time.rtc_time.year);
|
|
u8 year_str[6];
|
|
int year_len = mString_Load_YearStringFromRom(year_str, year);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + year_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], year_str, year_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyMonth(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 month = Common_Get(time.rtc_time.month);
|
|
u8 month_str[9];
|
|
int month_len = mString_Load_MonthStringFromRom(month_str, month);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + month_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], month_str, month_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyWeek(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 week = Common_Get(time.rtc_time.weekday);
|
|
u8 week_str[9];
|
|
int week_len = mString_Load_WeekStringFromRom(week_str, week);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + week_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], week_str, week_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyDay(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 day = Common_Get(time.rtc_time.day);
|
|
u8 day_str[4];
|
|
int day_len = mString_Load_DayStringFromRom(day_str, day);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + day_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], day_str, day_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyHour(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 hour = Common_Get(time.rtc_time.hour);
|
|
u8 hour_str[2];
|
|
int hour_len = mString_Load_HourStringFromRom2(hour_str, hour);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + hour_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], hour_str, hour_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyMin(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 min = Common_Get(time.rtc_time.min);
|
|
u8 min_str[2];
|
|
int min_len = mString_Load_MinStringFromRom(min_str, min);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + min_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], min_str, min_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopySec(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 sec = Common_Get(time.rtc_time.sec);
|
|
u8 sec_str[2];
|
|
int sec_len = mString_Load_SecStringFromRom(sec_str, sec);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + sec_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], sec_str, sec_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyFree(mMsg_Window_c* msg_p, int str_no, u8* data, int start_idx, int len, int article, u32 capitalize) {
|
|
if (str_no < 0 || str_no >= mMsg_FREE_STR_NUM) {
|
|
str_no = mMsg_FREE_STR0;
|
|
}
|
|
|
|
{
|
|
int new_len;
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* free_str_p = msg_p->free_str[str_no];
|
|
int free_str_len = mMsg_Get_Length_String(free_str_p, mMsg_FREE_STRING_LEN);
|
|
|
|
new_len = mMsg_MoveDataCut(data, start_idx + free_str_len, start_idx + command_len, len, FALSE);
|
|
mMsg_CopyString(&data[start_idx], free_str_p, free_str_len);
|
|
|
|
article = article != mIN_ARTICLE_NUM ? article : msg_p->free_str_article[str_no];
|
|
if (article != mIN_ARTICLE_NONE) {
|
|
u8 article_str[mIN_ITEM_NAME_LEN + 1];
|
|
int article_len;
|
|
|
|
mString_Load_StringFromRom(article_str, mIN_ITEM_NAME_LEN, mString_ARTICLE_START + article);
|
|
article_len = mMsg_Get_Length_String(article_str, mIN_ITEM_NAME_LEN);
|
|
article_str[article_len] = CHAR_SPACE;
|
|
new_len = mMsg_MoveDataCut(data, start_idx + article_len + 1, start_idx, new_len, FALSE);
|
|
mMsg_CopyString(&data[start_idx], article_str, article_len + 1);
|
|
}
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
}
|
|
|
|
static u8 MMSG_pf_cl[6][3] = {
|
|
{ 0, 0, 0 },
|
|
{ 145, 60, 145 },
|
|
{ 50, 130, 70 },
|
|
{ 75, 95, 155 },
|
|
{ 160, 50, 75 },
|
|
{ 50, 75, 225 }
|
|
};
|
|
|
|
static int mMsg_Set_PfColor(u8* data, int* start_idx, int len, u8* free_str, int pf_color_id, int article) {
|
|
static u8 add_string[] = { CHAR_CONTROL_CODE, mFont_CONT_CODE_SET_COLOR_CHAR, 0, 0, 0, 0 };
|
|
|
|
int free_str_len = mMsg_Get_Length_String(free_str, mMsg_FREE_STRING_LEN);
|
|
int article_len;
|
|
int src_idx = *start_idx;
|
|
int new_len;
|
|
u8* color_data = MMSG_pf_cl[pf_color_id];
|
|
|
|
add_string[2] = color_data[0];
|
|
add_string[3] = color_data[1];
|
|
add_string[4] = color_data[2];
|
|
|
|
if (article == mIN_ARTICLE_NONE) {
|
|
article_len = 0;
|
|
}
|
|
else {
|
|
u8 article_str[mIN_ITEM_NAME_LEN];
|
|
|
|
mString_Load_StringFromRom(article_str, mIN_ITEM_NAME_LEN, mString_ARTICLE_START + article);
|
|
article_len = mMsg_Get_Length_String(article_str, mIN_ITEM_NAME_LEN) + 1;
|
|
}
|
|
|
|
add_string[5] = free_str_len + article_len;
|
|
new_len = mMsg_MoveDataCut(data, src_idx + sizeof(add_string), src_idx, len, FALSE);
|
|
mMsg_CopyString(data + src_idx, add_string, sizeof(add_string));
|
|
(*start_idx) += sizeof(add_string);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyDetermination(mMsg_Window_c* msg_p, u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* str = msg_p->choice_window.data.determination_string;
|
|
int str_len = msg_p->choice_window.data.determination_len;
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + str_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], str, str_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyCountryName(u8 *data, int start_idx, int len, u32 capitalize) {
|
|
int new_len;
|
|
int new_start_idx;
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* land_name = mLd_GetLandName();
|
|
int land_name_len = mMsg_Get_Length_String(land_name, LAND_NAME_SIZE);
|
|
|
|
new_start_idx = start_idx + land_name_len;
|
|
new_len = mMsg_MoveDataCut(data, start_idx + land_name_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], land_name, land_name_len);
|
|
|
|
// This entire block can be removed in the English version
|
|
#ifndef IMPROVEMENTS
|
|
/* Leftover from JP to add 'むら' (mura) to the town name */
|
|
{
|
|
u8 mura_str[mMsg_FREE_STRING_LEN];
|
|
u8* mura_str_p = mura_str;
|
|
int mura_size;
|
|
|
|
mString_Load_StringFromRom(mura_str_p, sizeof(mura_str), 0x1E4);
|
|
mura_size = mMsg_Get_Length_String(mura_str_p, sizeof(mura_str));
|
|
new_len = mMsg_MoveDataCut(data, new_start_idx + mura_size, new_start_idx, new_len, FALSE);
|
|
mMsg_CopyString(&data[new_start_idx], mura_str_p, mura_size);
|
|
}
|
|
#endif
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyIslandName(u8* data, int start_idx, int len, u32 capitalize) {
|
|
int new_len;
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* str = Save_Get(island).name;
|
|
int str_len = mMsg_Get_Length_String(str, mISL_ISLAND_NAME_LEN);
|
|
|
|
new_len = mMsg_MoveDataCut(data, start_idx + str_len, start_idx + command_len, len, FALSE);
|
|
mMsg_CopyString(&data[start_idx], str, str_len);
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyAmPm(mMsg_Window_c* msg_p, u8* data, int start_idx, int len) {
|
|
int new_len;
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8 str[15];
|
|
int str_len;
|
|
|
|
mString_Load_StringFromRom(str, sizeof(str), (msg_p->status_flags & mMsg_STATUS_FLAG_USE_AM) ? 1 : 2);
|
|
str_len = mMsg_Get_Length_String(str, sizeof(str));
|
|
new_len = mMsg_MoveDataCut(data, start_idx + str_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], str, str_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyRamdomNumber2(u8* data, int start_idx, int len) {
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u16 rng = get_random_timer(0, 100) % 100;
|
|
u8 str[2];
|
|
u8* str_p = str;
|
|
int str_len = mFont_UnintToString(str_p, 2, rng, 2, TRUE, FALSE, TRUE);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + str_len, start_idx + command_len, len, FALSE);
|
|
|
|
mMsg_CopyString(&data[start_idx], str_p, str_len);
|
|
return new_len;
|
|
}
|
|
|
|
extern int mMsg_CopyItem(mMsg_Window_c* msg_p, int str_no, u8* data, int start_idx, int len, int article, u32 capitalize) {
|
|
if (str_no < 0 || str_no >= mMsg_ITEM_STR_NUM) {
|
|
str_no = mMsg_ITEM_STR0;
|
|
}
|
|
|
|
{
|
|
int new_len;
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* free_str_p = msg_p->item_str[str_no];
|
|
int free_str_len = mMsg_Get_Length_String(free_str_p, mMsg_FREE_STRING_LEN);
|
|
|
|
new_len = mMsg_MoveDataCut(data, start_idx + free_str_len, start_idx + command_len, len, FALSE);
|
|
mMsg_CopyString(&data[start_idx], free_str_p, free_str_len);
|
|
|
|
article = article != mIN_ARTICLE_NUM ? article : msg_p->item_str_article[str_no];
|
|
if (article != mIN_ARTICLE_NONE) {
|
|
u8 article_str[mIN_ITEM_NAME_LEN + 1];
|
|
|
|
mString_Load_StringFromRom(article_str, mIN_ITEM_NAME_LEN, mString_ARTICLE_START + article);
|
|
command_len = mMsg_Get_Length_String(article_str, mIN_ITEM_NAME_LEN);
|
|
article_str[command_len] = CHAR_SPACE;
|
|
new_len = mMsg_MoveDataCut(data, start_idx + command_len + 1, start_idx, new_len, FALSE);
|
|
mMsg_CopyString(&data[start_idx], article_str, command_len + 1);
|
|
}
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
}
|
|
|
|
extern int mMsg_CopyMail(mMsg_Window_c* msg_p, int str_no, u8* data, int start_idx, int len, u32 capitalize) {
|
|
if (str_no < 0 || str_no >= mMsg_MAIL_STR_NUM) {
|
|
str_no = mMsg_MAIL_STR0;
|
|
}
|
|
|
|
{
|
|
int command_len = mFont_CodeSize_idx_get(data, start_idx);
|
|
u8* free_str_p = msg_p->mail_str[str_no];
|
|
int free_str_len = mMsg_Get_Length_String(free_str_p, mMsg_MAIL_STRING_LEN);
|
|
int new_len = mMsg_MoveDataCut(data, start_idx + free_str_len, start_idx + command_len, len, TRUE);
|
|
|
|
mMsg_CopyString(&data[start_idx], free_str_p, free_str_len);
|
|
|
|
if (capitalize) {
|
|
data[start_idx] = mFont_small_to_capital(data[start_idx]);
|
|
}
|
|
|
|
return new_len;
|
|
}
|
|
}
|