mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-07-01 18:28:58 -04:00
119 lines
2.9 KiB
Plaintext
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);
|
|
}
|