Files
ac-decomp/src/m_msg_draw_font.c_inc
T
2024-01-16 00:28:59 -05:00

119 lines
2.9 KiB
Plaintext

static void mMsg_draw_font(mMsg_Window_c* msg_p, GAME* game) {
mFontSentence sentence;
u8* last_p = &msg_p->msg_data->text_buf.data[msg_p->end_text_cursor_idx];
u8* start_p = &msg_p->msg_data->text_buf.data[msg_p->start_text_cursor_idx];
int line_num;
u8* cur_p;
u8 code;
u8 cont_type;
int len;
int line_len;
int total_len;
xy_t scale;
xy_t pos;
Gfx* gfx;
int line_end_flag;
int sentence_finished_flag;
u32 sentence_flags;
int sentence_voice_idx = msg_p->voice_sfx_idx - msg_p->start_text_cursor_idx;
int voice = FALSE;
if (fabsf(msg_p->text_scale) < 0.001f) {
return;
}
OPEN_DISP(game->graph);
gfx = NOW_FONT_DISP;
scale.x = msg_p->text_scale;
scale.y = msg_p->text_scale;
pos.x = msg_p->center_x - (96.0f * scale.x);
pos.y = msg_p->center_y - (32.0f * scale.y);
if ((msg_p->status_flags & mMsg_STATUS_FLAG_VOICE_ENTRY)) {
if ((msg_p->status_flags & mMsg_STATUS_FLAG_18)) {
voice = TRUE;
}
else if (!F32_IS_ZERO(msg_p->cursor_timer) || msg_p->force_voice_enable_flag == TRUE) {
voice = TRUE;
}
}
line_num = 0;
sentence_finished_flag = FALSE;
total_len = 0;
while (line_num < msg_p->text_lines && sentence_finished_flag == FALSE) {
for (
line_len = 0, cur_p = start_p, line_end_flag = FALSE;
cur_p < last_p && line_end_flag == FALSE;
len = mFont_CodeSize_get(cur_p), cur_p += len, line_len += len
) {
code = cur_p[0];
if (code == CHAR_NEW_LINE) {
line_end_flag = TRUE;
}
else if (code == CHAR_CONTROL_CODE) {
cont_type = cur_p[1];
if (
cont_type == mFont_CONT_CODE_LAST ||
cont_type == mFont_CONT_CODE_CONTINUE ||
cont_type == mFont_CONT_CODE_MSG_TIME_END
) {
line_end_flag = TRUE;
sentence_finished_flag = TRUE;
}
}
}
if (cur_p >= last_p) {
sentence_finished_flag = TRUE;
}
if (line_num == 0) {
sentence_flags = mFont_SENTENCE_SKIP_DRAW_NEW_LINE | mFont_SENTENCE_FLAG_CUT;
}
else {
sentence_flags = mFont_SENTENCE_SKIP_DRAW_NEW_LINE | mFont_SENTENCE_FLAG_NO_COMBINE | mFont_SENTENCE_FLAG_3 | mFont_SENTENCE_FLAG_CUT;
}
if (
voice &&
sentence_voice_idx >= total_len &&
sentence_voice_idx < (total_len + line_len)
) {
sentence_flags |= mFont_SENTENCE_FLAG_VOICE_SE;
msg_p->status_flags &= ~(mMsg_STATUS_FLAG_18 | mMsg_STATUS_FLAG_VOICE_ENTRY);
}
mFontSentence_set(
&sentence,
start_p,
line_len,
sentence_flags,
&pos,
mFont_LineType_Top,
&scale,
&msg_p->font_color[line_num],
sentence_voice_idx - total_len,
msg_p->voice_idx,
msg_p->voice2_idx,
msg_p->voice3_idx,
msg_p->animal_voice_idx
);
mFontSentence_gppDraw(&sentence, game, &gfx);
pos.y += 16.0f * scale.y;
start_p = cur_p;
line_num++;
total_len += line_len;
}
SET_FONT_DISP(gfx);
CLOSE_DISP(game->graph);
}