diff --git a/config/rel_slices.yml b/config/rel_slices.yml index b1491a39..d7f54860 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -586,6 +586,11 @@ m_map_ovl.c: .rodata: [0x8064B628, 0x8064B6B0] .data: [0x806CD9C0, 0x806CE008] .bss: [0x81340468, 0x81340488] +m_timeIn_ovl.c: + .text: [0x805FF3C4, 0x80600370] + .rodata: [0x8064BA00, 0x8064BA58] + .data: [0x806D1320, 0x806D13E8] + .bss: [0x81341390, 0x813413B0] m_warning_ovl.c: .text: [0x80600370, 0x80600B00] .rodata: [0x8064BA58, 0x8064BA78] diff --git a/include/m_notice.h b/include/m_notice.h index 8f99fe5c..d51a5f53 100644 --- a/include/m_notice.h +++ b/include/m_notice.h @@ -17,6 +17,10 @@ typedef struct notice_board_post_s { /* 0xC0 */ lbRTC_time_c post_time; /* date-time of post */ } mNtc_board_post_c; +extern void mNtc_SetInitData(); +extern int mNtc_notice_write_num(); +extern void mNtc_notice_write(mNtc_board_post_c* new_post); +extern void mNtc_auto_nwrite_time_ct(); extern void mNtc_set_auto_nwrite_data(); #ifdef __cplusplus diff --git a/include/m_submenu_ovl.h b/include/m_submenu_ovl.h index 5f212419..4a0b37cc 100644 --- a/include/m_submenu_ovl.h +++ b/include/m_submenu_ovl.h @@ -20,6 +20,7 @@ #include "m_address_ovl_h.h" #include "m_editEndChk_h.h" #include "m_haniwaPortrait_ovl_h.h" +#include "m_timeIn_ovl_h.h" #ifdef __cplusplus extern "C" { @@ -127,7 +128,9 @@ struct submenu_overlay_s { /* 0x98C */ mED_Ovl_c* editor_ovl; /* 0x990 */ mBD_Ovl_c* board_ovl; /* 0x994 */ mAD_Ovl_c* address_ovl; - /* 0x998 */ u8 _998[0x9A4 - 0x998]; + /* 0x998 */ void* _998; + /* 0x99C */ void* _99C; + /* 0x9A0 */ mTI_Ovl_c* timeIn_ovl; /* 0x9A4 */ mEE_Ovl_c* editEndChk_ovl; /* 0x9A8 */ mWR_Ovl_c* warning_ovl; /* 0x9AC */ void* _9AC; diff --git a/include/m_timeIn_ovl.h b/include/m_timeIn_ovl.h new file mode 100644 index 00000000..03059fb7 --- /dev/null +++ b/include/m_timeIn_ovl.h @@ -0,0 +1,46 @@ +#ifndef M_TIMEIN_OVL_H +#define M_TIMEIN_OVL_H + +#include "types.h" +#include "m_timeIn_ovl_h.h" +#include "m_submenu_ovl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define mTI_MIN_YEAR 1 +#define mTI_MAX_YEAR 30 + +enum { + mTI_IDX_HOUR, + mTI_IDX_MIN, + mTI_IDX_MONTH, + mTI_IDX_DAY, + mTI_IDX_YEAR, + mTI_IDX_OK, + + mTI_IDX_NUM = mTI_IDX_OK +}; + +enum { + mTI_OVL_OPEN_NORMAL, + mTI_OVL_OPEN_INITIAL, + + mTI_OVL_OPEN_NUM +}; + +struct timeIn_ovl_s { + u16 values[mTI_IDX_NUM]; + int sel_idx; + u16 saved_min; + u16 input_disabled_flag; + lbRTC_time_c original_time; + int init_flag; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_timeIn_ovl_h.h b/include/m_timeIn_ovl_h.h new file mode 100644 index 00000000..b6ecd8e6 --- /dev/null +++ b/include/m_timeIn_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_TIMEIN_OVL_H_H +#define M_TIMEIN_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct timeIn_ovl_s mTI_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/rel/m_passwordChk_ovl.c b/rel/m_passwordChk_ovl.c index 5138550d..c4598ed1 100644 --- a/rel/m_passwordChk_ovl.c +++ b/rel/m_passwordChk_ovl.c @@ -50,7 +50,6 @@ extern Gfx pwd_win_model[]; static void mPC_set_frame_dl(Submenu* submenu, GRAPH* graph, f32 x, f32 y) { mPC_Ovl_c* passwordChk_ovl = submenu->overlay->passwordChk_ovl; Gfx* gfx; - Gfx* gfx2; u8 s; u8 t; @@ -62,7 +61,6 @@ static void mPC_set_frame_dl(Submenu* submenu, GRAPH* graph, f32 x, f32 y) { /* Setup RDP settings */ gSPDisplayList(gfx++, pwd_win_mode); - gfx2 = gfx; // setting this to gfx2 = gfx; causes the stwu to generate but breaks other stuff /* Initialize position matrix */ gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); diff --git a/rel/m_timeIn_ovl.c b/rel/m_timeIn_ovl.c new file mode 100644 index 00000000..b78acde3 --- /dev/null +++ b/rel/m_timeIn_ovl.c @@ -0,0 +1,561 @@ +#include "m_timeIn_ovl.h" + +#include "m_common_data.h" +#include "m_font.h" +#include "sys_matrix.h" + +static mTI_Ovl_c ti_ovl_data; + +static int mTI_col_type0[] = { 255, 0, 0 }; +static int mTI_col_type1[] = { 60, 90, 255 }; + +static void mTI_change_rtctime(lbRTC_time_c* time, u16* values) { + time->year = GAME_YEAR_MIN + values[mTI_IDX_YEAR]; + time->month = values[mTI_IDX_MONTH]; + time->day = values[mTI_IDX_DAY]; + time->weekday = lbRTC_Week(time->year, time->month, time->day); + time->hour = values[mTI_IDX_HOUR]; + time->min = values[mTI_IDX_MIN]; + time->sec = 0; +} + +static void mTI_copy_time(u16* dst, u16* src) { + int i; + + for (i = 0; i < mTI_IDX_NUM; i++) { + *dst = *src; + dst++; + src++; + } +} + +static int mTI_get_now_min(Submenu* submenu) { + mTI_Ovl_c* timeIn_ovl = submenu->overlay->timeIn_ovl; + int min; + + if (timeIn_ovl->values[mTI_IDX_HOUR] >= 12) { + min = timeIn_ovl->values[mTI_IDX_MIN] + (timeIn_ovl->values[mTI_IDX_HOUR] - 12) * lbRTC_MINUTES_PER_HOUR; + } + else { + min = timeIn_ovl->values[mTI_IDX_MIN] + timeIn_ovl->values[mTI_IDX_HOUR] * lbRTC_MINUTES_PER_HOUR; + } + + return min; +} + +static void mTI_set_time(Submenu* submenu) { + mTI_Ovl_c* timeIn_ovl = submenu->overlay->timeIn_ovl; + int min = mTI_get_now_min(submenu); + int now_min; + int old_min; + + old_min = timeIn_ovl->saved_min; + now_min = old_min + 12; + + if (now_min >= 12 * lbRTC_MINUTES_PER_HOUR) { + now_min -= (12 * lbRTC_MINUTES_PER_HOUR); + } + + if ( + (old_min < min && min <= now_min) || + (old_min > now_min && (old_min < min || min <= now_min)) + ) { + + if (timeIn_ovl->init_flag) { + now_min = min; + timeIn_ovl->input_disabled_flag = FALSE; + sAdo_SysLevStop(0xA); + sAdo_SysTrgStart(0x41B); + } + else { + now_min = old_min; + } + } + + if (timeIn_ovl->init_flag == FALSE) { + timeIn_ovl->init_flag = TRUE; + } + + timeIn_ovl->saved_min = now_min; +} + +static void mTI_window_close(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTI_Ovl_c* timeIn_ovl = submenu->overlay->timeIn_ovl; + lbRTC_time_c set_time; + + (*submenu->overlay->move_chg_base_proc)(menu_info, mSM_MOVE_OUT_TOP); + mTI_change_rtctime(&set_time, timeIn_ovl->values); + + if (menu_info->data0 == mTI_OVL_OPEN_INITIAL) { + lbRTC_SetTime(&set_time); + lbRTC_GetTime(Common_GetPointer(time.rtc_time)); + } + else { + if ( + set_time.year != timeIn_ovl->original_time.year || + set_time.month != timeIn_ovl->original_time.month || + set_time.day != timeIn_ovl->original_time.day || + set_time.hour != timeIn_ovl->original_time.hour || + set_time.min != timeIn_ovl->original_time.min + ) { + Save_Set(cheated_flag, TRUE); + } + + Common_Set(time_changed_flag, TRUE); + lbRTC_TimeCopy(Common_GetPointer(newly_set_time), &set_time); + lbRTC_GetTime(Common_GetPointer(old_time)); + } + + sAdo_SysTrgStart(2); +} + +static void mTI_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + (*submenu->overlay->move_Move_proc)(submenu, menu_info); +} + +static void mTI_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTI_Ovl_c* timeIn_ovl = submenu->overlay->timeIn_ovl; + u32 trigger = submenu->overlay->menu_control.trigger; + + if (timeIn_ovl->input_disabled_flag == TRUE) { + mTI_set_time(submenu); + } + else if ((trigger & BUTTON_START)) { + mTI_window_close(submenu, menu_info); + } + else if ((trigger & (BUTTON_B | BUTTON_CLEFT))) { + if (timeIn_ovl->sel_idx > 0) { + sAdo_SysTrgStart(0x1003); + timeIn_ovl->sel_idx--; + } + } + else if ((trigger & (BUTTON_A | BUTTON_CRIGHT))) { + if (timeIn_ovl->sel_idx == mTI_IDX_OK) { + if (!(trigger & BUTTON_CRIGHT)) { + mTI_window_close(submenu, menu_info); + } + } + else { + timeIn_ovl->sel_idx++; + + if (timeIn_ovl->sel_idx == mTI_IDX_OK) { + u16 now_min = mTI_get_now_min(submenu); + + if (timeIn_ovl->saved_min != now_min) { + timeIn_ovl->input_disabled_flag = TRUE; + sAdo_SysLevStart(0xA); + timeIn_ovl->init_flag = FALSE; + } + } + + sAdo_SysTrgStart(0xD); + } + } + else if ((trigger & (BUTTON_CDOWN | BUTTON_CUP))) { + if (timeIn_ovl->sel_idx != mTI_IDX_OK) { + lbRTC_time_c time; + u16 values[mTI_IDX_NUM]; + int sel_idx = timeIn_ovl->sel_idx; + + mTI_copy_time(values, timeIn_ovl->values); + + if ((trigger & BUTTON_CUP)) { + values[sel_idx]++; + + if (sel_idx == mTI_IDX_YEAR && values[mTI_IDX_YEAR] > mTI_MAX_YEAR) { + values[mTI_IDX_YEAR] = mTI_MIN_YEAR; + } + } + else if ((trigger & BUTTON_CDOWN)) { + if (values[sel_idx] != 0) { + values[sel_idx]--; + + if (sel_idx == mTI_IDX_YEAR && values[sel_idx] < mTI_MIN_YEAR) { + values[mTI_IDX_YEAR] = mTI_MAX_YEAR; + } + } + else if (sel_idx == mTI_IDX_HOUR) { + values[mTI_IDX_HOUR] = 23; + } + else if (sel_idx == mTI_IDX_MIN) { + values[mTI_IDX_MIN] = 59; + } + } + + mTI_change_rtctime(&time, values); + + if (lbRTC_IsValidTime(&time) == FALSE) { + if (sel_idx == mTI_IDX_YEAR) { + values[mTI_IDX_DAY] = 28; + } + else if ( + (sel_idx == mTI_IDX_MONTH && values[mTI_IDX_MONTH] > 0 && values[mTI_IDX_MONTH] < 13) || + ((trigger & BUTTON_CDOWN) && sel_idx == mTI_IDX_DAY) + ) { + time.day = 31; + + while (!lbRTC_IsValidTime(&time)) { + time.day--; + } + + values[mTI_IDX_DAY] = time.day; + } + else if ((trigger & BUTTON_CUP)) { + if (sel_idx == mTI_IDX_MONTH || sel_idx == mTI_IDX_DAY) { + values[sel_idx] = 1; + } + else { + values[sel_idx] = 0; + } + } + else if (sel_idx == mTI_IDX_MONTH) { + values[mTI_IDX_MONTH] = lbRTC_DECEMBER; + } + } + + mTI_copy_time(timeIn_ovl->values, values); + sAdo_SysTrgStart(0x1); + } + } +} + +static void mTI_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + if (menu_info->data0 == mTI_OVL_OPEN_INITIAL) { + mNtc_auto_nwrite_time_ct(); + } + + (*submenu->overlay->move_End_proc)(submenu, menu_info); +} + +static void mTI_timeIn_ovl_move(Submenu* submenu) { + static mSM_MOVE_PROC ovl_move_proc[mSM_OVL_PROC_NUM] = { + &mTI_move_Move, + &mTI_move_Play, + (mSM_MOVE_PROC)&none_proc1, + (mSM_MOVE_PROC)&none_proc1, + &mTI_move_End + }; + + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_TIMEIN]; + + (*menu_info->pre_move_func)(submenu); + (*ovl_move_proc[menu_info->proc_status])(submenu, menu_info); +} + +extern Gfx tim_win_mode[]; +extern Gfx tim_win_model[]; +extern Gfx tim_win_month_model[]; +extern Gfx tim_win_youbi_model[]; + +extern u8 tim_win_sun_tex_rgb_i4[]; +extern u8 tim_win_mon_tex_rgb_i4[]; +extern u8 tim_win_tue_tex_rgb_i4[]; +extern u8 tim_win_wed_tex_rgb_i4[]; +extern u8 tim_win_thu_tex_rgb_i4[]; +extern u8 tim_win_fri_tex_rgb_i4[]; +extern u8 tim_win_sat_tex_rgb_i4[]; + +extern u8 tim_win_january_tex_rgb_i4[]; +extern u8 tim_win_february_tex_rgb_i4[]; +extern u8 tim_win_march_tex_rgb_i4[]; +extern u8 tim_win_april_tex_rgb_i4[]; +extern u8 tim_win_may_tex_rgb_i4[]; +extern u8 tim_win_june_tex_rgb_i4[]; +extern u8 tim_win_july_tex_rgb_i4[]; +extern u8 tim_win_august_tex_rgb_i4[]; +extern u8 tim_win_september_tex_rgb_i4[]; +extern u8 tim_win_october_tex_rgb_i4[]; +extern u8 tim_win_november_tex_rgb_i4[]; +extern u8 tim_win_december_tex_rgb_i4[]; + +static void mTI_set_frame_dl(Submenu* submenu, GRAPH* graph, f32 x, f32 y) { + static u8* week_tex[lbRTC_WEEK] = { + tim_win_sun_tex_rgb_i4, + tim_win_mon_tex_rgb_i4, + tim_win_tue_tex_rgb_i4, + tim_win_wed_tex_rgb_i4, + tim_win_thu_tex_rgb_i4, + tim_win_fri_tex_rgb_i4, + tim_win_sat_tex_rgb_i4 + }; + + static u8* month_tex[lbRTC_MONTHS_MAX] = { + tim_win_january_tex_rgb_i4, + tim_win_february_tex_rgb_i4, + tim_win_march_tex_rgb_i4, + tim_win_april_tex_rgb_i4, + tim_win_may_tex_rgb_i4, + tim_win_june_tex_rgb_i4, + tim_win_july_tex_rgb_i4, + tim_win_august_tex_rgb_i4, + tim_win_september_tex_rgb_i4, + tim_win_october_tex_rgb_i4, + tim_win_november_tex_rgb_i4, + tim_win_december_tex_rgb_i4 + }; + + int week; + mTI_Ovl_c* timeIn_ovl = submenu->overlay->timeIn_ovl; + Gfx* gfx; + f32 tex_x; + f32 tex_y; + u8 s; + u8 t; + int* col; + + week = lbRTC_Week(GAME_YEAR_MIN + timeIn_ovl->values[mTI_IDX_YEAR], timeIn_ovl->values[mTI_IDX_MONTH], timeIn_ovl->values[mTI_IDX_DAY]); + + Matrix_translate(x * 16.0f, y * 16.0f, 140.0f, 0); + Matrix_scale(16.0f, 16.0f, 1.0f, 1); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + /* Initialize RDP settings */ + gSPDisplayList(gfx++, tim_win_mode); + + /* Setup matrix */ + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + /* Adjust scrolling background texture position */ + tex_x = -submenu->overlay->menu_control.texture_pos[0] * 4.0f; + tex_y = -submenu->overlay->menu_control.texture_pos[1] * 4.0f; + s = (int)tex_x; + t = (int)tex_y; + gDPSetTileSize_Dolphin(gfx++, G_TX_RENDERTILE, s, t, 32, 32); + + /* Draw window background */ + gSPDisplayList(gfx++, tim_win_model); + + /* Set text color */ + if (timeIn_ovl->sel_idx == mTI_IDX_MONTH) { + col = mTI_col_type0; + } + else { + col = mTI_col_type1; + } + + gDPSetPrimColor(gfx++, 0, 255, col[0], col[1], col[2], 255); + + /* Draw month text */ + gSPSegment(gfx++, G_MWO_SEGMENT_8, month_tex[timeIn_ovl->values[mTI_IDX_MONTH] - 1]); + gSPDisplayList(gfx++, tim_win_month_model); + + /* Draw weekday text */ + gSPSegment(gfx++, G_MWO_SEGMENT_8, week_tex[week]); + gSPDisplayList(gfx++, tim_win_youbi_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +extern Gfx tim_hari_mode[]; +extern Gfx tim_hari_b1T_model[]; +extern Gfx tim_hari_b2T_model[]; +extern Gfx tim_hari_b3T_model[]; + +static void mTI_set_clock(Submenu* submenu, GRAPH* graph, f32 x, f32 y) { + static Gfx* displayList_table[] = { + tim_hari_b2T_model, + tim_hari_b1T_model, + tim_hari_b3T_model + }; + + s16 r[3]; + int i; + u16 save_min = submenu->overlay->timeIn_ovl->saved_min; + Gfx* gfx; + + r[0] = -(((f32)(save_min % lbRTC_MINUTES_PER_HOUR) / (f32)lbRTC_MINUTES_PER_HOUR) * 65536.0f); // minute hand + r[1] = -(((f32)save_min / (f32)((lbRTC_MINUTES_PER_HOUR * lbRTC_HOURS_PER_DAY) / 2)) * 65536.0f); // hour hand + r[2] = 0; // second hand? + + Matrix_translate((x + -61.0f) * 16.0f, (y + 45.0f) * 16.0f, 140.0f, 0); + Matrix_scale(16.0f, 16.0f, 1.0f, 1); + Matrix_translate(-5.0f, -4.0f, 0.0f, 1); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + /* Initialize RDP settings */ + gSPDisplayList(gfx++, tim_hari_mode); + + for (i = 0; i < 3; i++) { + /* Rotate & draw the clock hand */ + Matrix_push(); + Matrix_RotateZ(r[i], 1); + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, displayList_table[i]); + Matrix_pull(); + } + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +static void mTI_set_character(Submenu* submenu, GAME* game, f32 x, f32 y) { + static u8 str_line_adjust[17] = "Adjust the clock."; + static u8 str_line_ok[2] = "OK"; + static f32 set_pos[mTI_IDX_NUM][2] = { + { 79.0f, 115.0f }, // mTI_IDX_HOUR + { 103.0f, 115.0f }, // mTI_IDX_MIN + { 0.0f, 0.0f }, // mTI_IDX_MONTH + { 151.0f, 141.0f }, // mTI_IDX_DAY + { 196.0f, 141.0f } // mTI_IDX_YEAR + }; + + u8 str[2]; + int* col; + mTI_Ovl_c* timeIn_ovl = submenu->overlay->timeIn_ovl; + f32* set_pos_p = &set_pos[0][0]; + int i; + + /* Draw 'Adjust the clock.' title text */ + mFont_SetLineStrings( + game, + str_line_adjust, sizeof(str_line_adjust), + x + 131.0f, -y + 82.0f, + 255, 255, 255, 255, + FALSE, + TRUE, + 0.875f, 0.875f, + mFont_MODE_POLY + ); + + /* Draw all numeric values */ + for (i = 0; i < mTI_IDX_NUM; set_pos_p += 2, i++) { + if (i != mTI_IDX_MONTH) { + if (i == timeIn_ovl->sel_idx) { + col = mTI_col_type0; + } + else { + col = mTI_col_type1; + } + + mFont_UnintToString(str, 2, timeIn_ovl->values[i], 2, FALSE, TRUE, TRUE); + mFont_SetLineStrings( + game, + str, 2, + x + set_pos_p[0], -y + set_pos_p[1], + col[0], col[1], col[2], 255, + FALSE, + TRUE, + 1.0f, 1.0f, + mFont_MODE_POLY + ); + } + } + + if (timeIn_ovl->sel_idx == mTI_IDX_OK) { + col = mTI_col_type0; + } + else { + col = mTI_col_type1; + } + + /* Draw 'OK' */ + mFont_SetLineStrings( + game, + str_line_ok, sizeof(str_line_ok), + x + 220.0f, -y + 141.0f, + col[0], col[1], col[2], 255, + FALSE, + TRUE, + 1.0f, 1.0f, + mFont_MODE_POLY + ); +} + +static void mTI_set_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info) { + f32 x = menu_info->position[0]; + f32 y = menu_info->position[1]; + GRAPH* graph = game->graph; + + mTI_set_frame_dl(submenu, graph, x, y); + mTI_set_clock(submenu, graph, x, y); + (*submenu->overlay->set_char_matrix_proc)(graph); + mTI_set_character(submenu, game, x, y); +} + +static void mTI_timeIn_ovl_draw(Submenu* submenu, GAME* game) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_TIMEIN]; + + (*menu_info->pre_draw_func)(submenu, game); + mTI_set_dl(submenu, game, menu_info); +} + +extern void mTI_timeIn_ovl_set_proc(Submenu* submenu) { + mSM_Control_c* control = &submenu->overlay->menu_control; + + control->menu_move_func = &mTI_timeIn_ovl_move; + control->menu_draw_func = &mTI_timeIn_ovl_draw; +} + +static void mTI_timeIn_ovl_init(Submenu* submenu) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_TIMEIN]; + mTI_Ovl_c* timeIn_ovl = submenu->overlay->timeIn_ovl; + + if (Common_Get(time_changed_flag)) { + lbRTC_time_c time; + + lbRTC_GetTime(&time); + lbRTC_Sub_ss(&time, Common_Get(old_time).sec); + lbRTC_Sub_mm(&time, Common_Get(old_time).min); + lbRTC_Sub_hh(&time, Common_Get(old_time).hour); + time.day = 0; + time.month = 0; + time.year = 0; + + lbRTC_TimeCopy(&timeIn_ovl->original_time, Common_GetPointer(newly_set_time)); + lbRTC_Add_Date(&timeIn_ovl->original_time, &time); + } + else { + lbRTC_GetTime(&timeIn_ovl->original_time); + } + + if (timeIn_ovl->original_time.year > (GAME_YEAR_MIN + mTI_MAX_YEAR)) { + timeIn_ovl->values[mTI_IDX_YEAR] = mTI_MAX_YEAR; + timeIn_ovl->original_time.year = GAME_YEAR_MIN + mTI_MAX_YEAR; + } + else if (timeIn_ovl->original_time.year < (GAME_YEAR_MIN + mTI_MIN_YEAR)) { + timeIn_ovl->values[mTI_IDX_YEAR] = mTI_MIN_YEAR; + timeIn_ovl->original_time.year = GAME_YEAR_MIN + mTI_MIN_YEAR; + } + else { + timeIn_ovl->values[mTI_IDX_YEAR] = timeIn_ovl->original_time.year % 100; + } + + timeIn_ovl->values[mTI_IDX_MONTH] = timeIn_ovl->original_time.month; + timeIn_ovl->values[mTI_IDX_DAY] = timeIn_ovl->original_time.day; + timeIn_ovl->values[mTI_IDX_HOUR] = timeIn_ovl->original_time.hour; + timeIn_ovl->values[mTI_IDX_MIN] = timeIn_ovl->original_time.min; + + timeIn_ovl->saved_min = timeIn_ovl->values[mTI_IDX_MIN] + timeIn_ovl->values[mTI_IDX_HOUR] * lbRTC_MINUTES_PER_HOUR; + if (timeIn_ovl->saved_min >= (12 * lbRTC_MINUTES_PER_HOUR)) { + timeIn_ovl->saved_min -= (12 * lbRTC_MINUTES_PER_HOUR); + } + + timeIn_ovl->sel_idx = mTI_IDX_HOUR; + timeIn_ovl->input_disabled_flag = FALSE; + + submenu->overlay->menu_control.animation_flag = FALSE; + menu_info->proc_status = mSM_OVL_PROC_MOVE; + menu_info->next_proc_status = mSM_OVL_PROC_PLAY; + menu_info->move_drt = mSM_MOVE_IN_TOP; +} + +extern void mTI_timeIn_ovl_construct(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + + if (overlay->timeIn_ovl == NULL) { + mem_clear((u8*)&ti_ovl_data, sizeof(mTI_Ovl_c), 0); + overlay->timeIn_ovl = &ti_ovl_data; + } + + mTI_timeIn_ovl_init(submenu); + mTI_timeIn_ovl_set_proc(submenu); +} + +extern void mTI_timeIn_ovl_destruct(Submenu* submenu) { + submenu->overlay->timeIn_ovl = NULL; +}