diff --git a/config/rel_slices.yml b/config/rel_slices.yml index fb3b57de..0daa7ee2 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -21,6 +21,11 @@ m_actor_dlftbls.c: .text: [0x8037619C, 0x803761BC] .data: [0x8064D628, 0x8064F4E8] .bss: [0x8125A828, 0x8125A830] +m_banti.c: + .text: [0x80377114, 0x80378858] + .rodata: [0x80641388, 0x806413E0] + .data: [0x8064F548, 0x8064F658] + .bss: [0x8125A830, 0x8125AC80] m_cockroach.c: .text: [0x80385430, 0x80385A80] m_common_data.c: diff --git a/include/c_keyframe.h b/include/c_keyframe.h index fee2dbbd..c2080052 100644 --- a/include/c_keyframe.h +++ b/include/c_keyframe.h @@ -10,6 +10,14 @@ extern "C" { #endif +enum { + cKF_STATE_NONE, + cKF_STATE_STOPPED, + cKF_STATE_CONTINUE, + + cKF_STATE_NUM +}; + typedef struct joint_s { Gfx* model; u8 child; diff --git a/include/m_banti.h b/include/m_banti.h new file mode 100644 index 00000000..3dd10dd8 --- /dev/null +++ b/include/m_banti.h @@ -0,0 +1,64 @@ +#ifndef M_BANTI_H +#define M_BANTI_H + +#include "types.h" +#include "m_play_h.h" +#include "c_keyframe.h" +#include "m_time.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define banti_JOINT_MAX 5 + +enum { + banti_ANIM_STATE_STOPPED, + banti_ANIM_STATE_PLAYING, + + banti_ANIM_STATE_NUM +}; + +typedef struct banti_anim_s { + cKF_SkeletonInfo_R_c keyframe; + s_xyz work[banti_JOINT_MAX]; + s_xyz morph[banti_JOINT_MAX]; + int state; +} Banti_anim_c; + +typedef struct banti_callback_s { + Gfx** gfx_pp; + Mtx* mtx; + int state; +} Banti_callback_c; + +typedef struct banti_s { + int addressable_type; + int disabled; + int timer; + f32 alpha; + int disp_left; + int move_left; + f32 move_timer; + + Banti_anim_c month_anim; + Banti_anim_c day_anim; + Banti_anim_c hour_upper_anim; + Banti_anim_c hour_lower_anim; + Banti_anim_c min_upper_anim; + Banti_anim_c min_lower_anim; + + lbRTC_time_c displayed_time; + lbRTC_time_c next_time; /* displayed during transition animation for any animations */ +} Banti_c; + +extern void banti_ct(); +extern void banti_dt(); +extern void banti_move(GAME_PLAY* play); +extern void banti_draw(GAME_PLAY* play); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_demo.h b/include/m_demo.h index 05f5e5b0..accdac37 100644 --- a/include/m_demo.h +++ b/include/m_demo.h @@ -74,6 +74,7 @@ extern void mDemo_Set_talk_turn(u8 value); extern void mDemo_Set_talk_display_name(u8 value); extern void mDemo_Set_camera(u8 value); extern void mDemo_Set_talk_window_color(rgba_t* color); +extern int mDemo_CheckDemo(); #ifdef __cplusplus } diff --git a/include/m_player.h b/include/m_player.h index 7d6186ba..278f0293 100644 --- a/include/m_player.h +++ b/include/m_player.h @@ -20,6 +20,15 @@ typedef struct player_actor_s PLAYER_ACTOR; #define mPlayer_FORCE_POSITION_ANGLE_ROTY (1 << 5) #define mPlayer_FORCE_POSITION_ANGLE_ROTZ (1 << 6) +enum { + mPlayer_ADDRESSABLE_TRUE, + mPlayer_ADDRESSABLE_FALSE_MOVEMENT, + mPlayer_ADDRESSABLE_FALSE_TALKING, + mPlayer_ADDRESSABLE_FALSE_USING_TOOL, + + mPlayer_ADDRESSABLE_NUM +}; + /* sizeof(struct player_actor_s) == 0x13A8 */ struct player_actor_s { /* 0x0000 */ ACTOR actor_class; diff --git a/include/m_player_lib.h b/include/m_player_lib.h index 392f1c45..18ce0144 100644 --- a/include/m_player_lib.h +++ b/include/m_player_lib.h @@ -22,6 +22,7 @@ extern int mPlib_request_main_demo_walk_type1(GAME* game, f32 goal_x, f32 goal_z extern void mPlib_Set_goal_player_demo_walk(f32 goal_x, f32 goal_z, f32 speed); extern void mPlib_Set_able_hand_all_item_in_demo(s8 enable); extern void mPlib_change_player_cloth_info_lv2(Private_c* priv, mActor_name_t cloth_name); +extern int mPlib_Get_address_able_display(); #ifdef __cplusplus } diff --git a/rel/c_keyframe.c b/rel/c_keyframe.c index cfc0836a..7a967136 100644 --- a/rel/c_keyframe.c +++ b/rel/c_keyframe.c @@ -79,17 +79,17 @@ extern int cKF_FrameControl_stop_proc(cKF_FrameControl_c* fc) { f32 out; if (fc->current_frame == fc->end_frame) { - return 1; + return cKF_STATE_STOPPED; } if (cKF_FrameControl_passCheck(fc, fc->end_frame, &out)) { fc->current_frame = fc->end_frame; - return 1; + return cKF_STATE_STOPPED; } if (cKF_FrameControl_passCheck(fc, fc->start_frame, &out)) { fc->current_frame = fc->end_frame; - return 1; + return cKF_STATE_STOPPED; } - return 0; + return cKF_STATE_NONE; } static int cKF_FrameControl_repeat_proc(cKF_FrameControl_c* fc) { @@ -97,13 +97,13 @@ static int cKF_FrameControl_repeat_proc(cKF_FrameControl_c* fc) { if (cKF_FrameControl_passCheck(fc, fc->end_frame, &out)) { fc->current_frame = fc->start_frame + out; - return 2; + return cKF_STATE_CONTINUE; } if (cKF_FrameControl_passCheck(fc, fc->start_frame, &out)) { fc->current_frame = fc->end_frame + out; - return 2; + return cKF_STATE_CONTINUE; } - return 0; + return cKF_STATE_NONE; } static int cKF_FrameControl_play(cKF_FrameControl_c* fc) { @@ -116,7 +116,7 @@ static int cKF_FrameControl_play(cKF_FrameControl_c* fc) { rec = cKF_FrameControl_repeat_proc(fc); } - if (rec == 0) { + if (rec == cKF_STATE_NONE) { frame = (fc->start_frame < fc->end_frame) ? fc->speed : -fc->speed; fc->current_frame += frame; } @@ -447,7 +447,7 @@ extern int cKF_SkeletonInfo_R_play(cKF_SkeletonInfo_R_c* keyframe) { if (keyframe->morph_counter <= 0.0f) { keyframe->morph_counter = 0.0f; } - ret = 0; + ret = cKF_STATE_NONE; } else { cKF_SkeletonInfo_R_morphJoint(keyframe); keyframe->morph_counter += 0.5f; diff --git a/rel/m_banti.c b/rel/m_banti.c new file mode 100644 index 00000000..0929813e --- /dev/null +++ b/rel/m_banti.c @@ -0,0 +1,692 @@ +#include "m_banti.h" + +#include "m_play.h" +#include "libultra/libultra.h" +#include "m_player_lib.h" +#include "m_demo.h" +#include "sys_matrix.h" +#include "m_font.h" +#include "m_common_data.h" + +static Banti_c banti; + +static void banti_animation_init_hiduke(Banti_anim_c* anim); +static void banti_animation_init_jikan(Banti_anim_c* anim); + +extern cKF_Skeleton_R_c cKF_bs_r_clk_hiniti; +extern cKF_Skeleton_R_c cKF_bs_r_clk_jikan; + +extern void banti_ct() { + bzero(&banti, sizeof(Banti_c)); + + banti.addressable_type = 0; + banti.disabled = 0; + banti.timer = 0; + banti.alpha = 0.0f; + banti.disp_left = 0; + banti.move_left = 0; + banti.move_timer = 0.0f; + + cKF_SkeletonInfo_R_ct(&banti.month_anim.keyframe, &cKF_bs_r_clk_hiniti, NULL, banti.month_anim.work, banti.month_anim.morph); + banti_animation_init_hiduke(&banti.month_anim); + banti.month_anim.keyframe.frame_control.speed = 0.0f; + + cKF_SkeletonInfo_R_ct(&banti.day_anim.keyframe, &cKF_bs_r_clk_hiniti, NULL, banti.day_anim.work, banti.day_anim.morph); + banti_animation_init_hiduke(&banti.day_anim); + banti.day_anim.keyframe.frame_control.speed = 0.0f; + + cKF_SkeletonInfo_R_ct(&banti.hour_upper_anim.keyframe, &cKF_bs_r_clk_jikan, NULL, banti.hour_upper_anim.work, banti.hour_upper_anim.morph); + banti_animation_init_jikan(&banti.hour_upper_anim); + banti.hour_upper_anim.keyframe.frame_control.speed = 0.0f; + + cKF_SkeletonInfo_R_ct(&banti.hour_lower_anim.keyframe, &cKF_bs_r_clk_jikan, NULL, banti.hour_lower_anim.work, banti.hour_lower_anim.morph); + banti_animation_init_jikan(&banti.hour_lower_anim); + banti.hour_lower_anim.keyframe.frame_control.speed = 0.0f; + + cKF_SkeletonInfo_R_ct(&banti.min_upper_anim.keyframe, &cKF_bs_r_clk_jikan, NULL, banti.min_upper_anim.work, banti.min_upper_anim.morph); + banti_animation_init_jikan(&banti.min_upper_anim); + banti.min_upper_anim.keyframe.frame_control.speed = 0.0f; + + cKF_SkeletonInfo_R_ct(&banti.min_lower_anim.keyframe, &cKF_bs_r_clk_jikan, NULL, banti.min_lower_anim.work, banti.min_lower_anim.morph); + banti_animation_init_jikan(&banti.min_lower_anim); + banti.min_lower_anim.keyframe.frame_control.speed = 0.0f; + + lbRTC_TimeCopy(&banti.next_time, Common_GetPointer(time.rtc_time)); + lbRTC_TimeCopy(&banti.displayed_time, Common_GetPointer(time.rtc_time)); +} + +extern void banti_dt() { + cKF_SkeletonInfo_R_dt(&banti.month_anim.keyframe); + cKF_SkeletonInfo_R_dt(&banti.day_anim.keyframe); + cKF_SkeletonInfo_R_dt(&banti.hour_upper_anim.keyframe); + cKF_SkeletonInfo_R_dt(&banti.hour_lower_anim.keyframe); + cKF_SkeletonInfo_R_dt(&banti.min_upper_anim.keyframe); + cKF_SkeletonInfo_R_dt(&banti.min_lower_anim.keyframe); +} + +static void banti_chk_disp_left(GAME_PLAY* play) { + xyz_t player_pos_screen; + + Game_play_Projection_Trans(play, &get_player_actor_withoutCheck(play)->actor_class.world.position, &player_pos_screen); + + if (player_pos_screen.x >= 180.0f && player_pos_screen.y >= 150.0f) { + if (banti.move_left == FALSE) { + banti.move_left = TRUE; + banti.move_timer = 0.0f; + } + + banti.move_timer += 1.0f; + + if (banti.move_timer > 10.0f) { + banti.move_timer = 10.0f; + + if (banti.alpha < 0.01f) { + banti.disp_left = TRUE; + banti.disabled = FALSE; + } + else if (banti.disp_left == FALSE) { + banti.disabled = TRUE; + } + } + } + else { + if (banti.move_left == TRUE) { + banti.move_left = FALSE; + banti.move_timer = 0.0f; + } + + banti.move_timer += 1.0f; + + if (banti.move_timer > 10.0f) { + banti.move_timer = 10.0f; + + if (banti.alpha < 0.01f) { + banti.disp_left = FALSE; + banti.disabled = FALSE; + } + else if (banti.disp_left == TRUE) { + banti.disabled = TRUE; + } + } + } +} + +static f32 banti_calc_disp_alpha_rate(GAME_PLAY* play) { + if (mDemo_CheckDemo() || mEv_CheckTitleDemo() > 0 || banti.disabled) { + banti.addressable_type = mPlayer_ADDRESSABLE_FALSE_MOVEMENT; + add_calc(&banti.alpha, 0.0f, 1.0f - sqrtf(0.8), 0.1f, 0.005f); /* quickly fade out on demo screen or title or force disabled */ + } + else if (banti.addressable_type == mPlayer_ADDRESSABLE_TRUE && play->submenu.process_status == mSM_PROCESS_WAIT) { + add_calc(&banti.alpha, 1.0f, 1.0f - sqrtf(0.8), 0.0425f, 0.0005f); /* fade in */ + } + else { + add_calc(&banti.alpha, 0.0f, 1.0f - sqrtf(0.8), 0.0425f, 0.0005f); /* fade out */ + } +} + +extern cKF_Animation_R_c cKF_ba_r_clk_hiniti; + +static void banti_animation_init_hiduke(Banti_anim_c* anim) { + cKF_SkeletonInfo_R_init(&anim->keyframe, anim->keyframe.skeleton, &cKF_ba_r_clk_hiniti, 1.0f, 15.0f, 1.0f, 0.5f, 0.0f, cKF_FRAMECONTROL_STOP, NULL); +} + +extern cKF_Animation_R_c cKF_ba_r_clk_jikan; + +static void banti_animation_init_jikan(Banti_anim_c* anim) { + cKF_SkeletonInfo_R_init(&anim->keyframe, anim->keyframe.skeleton, &cKF_ba_r_clk_jikan, 1.0f, 15.0f, 1.0f, 0.5f, 0.0f, cKF_FRAMECONTROL_STOP, NULL); +} + +static void banti_anime_proc() { + if (cKF_SkeletonInfo_R_play(&banti.month_anim.keyframe) == cKF_STATE_STOPPED) { + banti.month_anim.keyframe.frame_control.current_frame = 1.0f; + banti.month_anim.keyframe.frame_control.speed = 0.0f; + banti.month_anim.state = banti_ANIM_STATE_STOPPED; + } + + if (cKF_SkeletonInfo_R_play(&banti.day_anim.keyframe) == cKF_STATE_STOPPED) { + banti.day_anim.keyframe.frame_control.current_frame = 1.0f; + banti.day_anim.keyframe.frame_control.speed = 0.0f; + banti.day_anim.state = banti_ANIM_STATE_STOPPED; + } + + if (cKF_SkeletonInfo_R_play(&banti.hour_upper_anim.keyframe) == cKF_STATE_STOPPED) { + banti.hour_upper_anim.keyframe.frame_control.current_frame = 1.0f; + banti.hour_upper_anim.keyframe.frame_control.speed = 0.0f; + banti.hour_upper_anim.state = banti_ANIM_STATE_STOPPED; + } + + if (cKF_SkeletonInfo_R_play(&banti.hour_lower_anim.keyframe) == cKF_STATE_STOPPED) { + banti.hour_lower_anim.keyframe.frame_control.current_frame = 1.0f; + banti.hour_lower_anim.keyframe.frame_control.speed = 0.0f; + banti.hour_lower_anim.state = banti_ANIM_STATE_STOPPED; + } + + if (cKF_SkeletonInfo_R_play(&banti.min_upper_anim.keyframe) == cKF_STATE_STOPPED) { + banti.min_upper_anim.keyframe.frame_control.current_frame = 1.0f; + banti.min_upper_anim.keyframe.frame_control.speed = 0.0f; + banti.min_upper_anim.state = banti_ANIM_STATE_STOPPED; + } + + if (cKF_SkeletonInfo_R_play(&banti.min_lower_anim.keyframe) == cKF_STATE_STOPPED) { + banti.min_lower_anim.keyframe.frame_control.current_frame = 1.0f; + banti.min_lower_anim.keyframe.frame_control.speed = 0.0f; + banti.min_lower_anim.state = banti_ANIM_STATE_STOPPED; + } +} + +static void banti_chk_anime_start() { + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + u8 banti_hour; + u8 rtc_hour; + u8 banti_min; + u8 rtc_min; + + int work1; + int work0; + int disp0; + int disp1; + + if (banti.month_anim.state == banti_ANIM_STATE_STOPPED && banti.displayed_time.month != Common_GetPointer(time.rtc_time)->month) { + banti_animation_init_hiduke(&banti.month_anim); + banti.month_anim.state = banti_ANIM_STATE_PLAYING; + } + + if (banti.day_anim.state == banti_ANIM_STATE_STOPPED && banti.displayed_time.day != Common_GetPointer(time.rtc_time)->day) { + banti_animation_init_hiduke(&banti.day_anim); + banti.day_anim.state = banti_ANIM_STATE_PLAYING; + } + + banti_hour = banti.displayed_time.hour; + if (banti_hour == 0 || banti_hour == 12) { + work0 = 12; + } + else if (banti_hour > 11) { + work0 = banti_hour - 12; + } + else { + work0 = banti_hour; + } + + rtc_hour = Common_GetPointer(time.rtc_time)->hour; + if (rtc_hour == 0 || rtc_hour == 12) { + work1 = 12; + } + else if (rtc_hour > 11) { + work1 = rtc_hour - 12; + } + else { + work1 = rtc_hour; + } + + disp0 = work0 / 10; + disp1 = work1 / 10; + if (banti.hour_upper_anim.state == banti_ANIM_STATE_STOPPED && disp0 != disp1) { + banti_animation_init_jikan(&banti.hour_upper_anim); + banti.hour_upper_anim.state = banti_ANIM_STATE_PLAYING; + } + + disp0 = work0 % 10; + disp1 = work1 % 10; + if (banti.hour_lower_anim.state == banti_ANIM_STATE_STOPPED && disp0 != disp1) { + banti_animation_init_jikan(&banti.hour_lower_anim); + banti.hour_lower_anim.state = banti_ANIM_STATE_PLAYING; + } + + disp0 = banti.displayed_time.min / 10; + disp1 = Common_GetPointer(time.rtc_time)->min / 10; + if (banti.min_upper_anim.state == banti_ANIM_STATE_STOPPED && disp0 != disp1) { + banti_animation_init_jikan(&banti.min_upper_anim); + banti.min_upper_anim.state = banti_ANIM_STATE_PLAYING; + } + + disp0 = banti.displayed_time.min % 10; + disp1 = Common_GetPointer(time.rtc_time)->min % 10; + if (banti.min_lower_anim.state == banti_ANIM_STATE_STOPPED && disp0 != disp1) { + banti_animation_init_jikan(&banti.min_lower_anim); + banti.min_lower_anim.state = banti_ANIM_STATE_PLAYING; + } +} + +static void banti_time_check() { + int pre_state; + int post_state; + + pre_state = banti.month_anim.state | banti.day_anim.state | banti.hour_upper_anim.state | banti.hour_lower_anim.state | banti.min_upper_anim.state | banti.min_lower_anim.state; + + if (pre_state == banti_ANIM_STATE_STOPPED) { + banti_chk_anime_start(); + } + + banti_anime_proc(); + + post_state = banti.month_anim.state | banti.day_anim.state | banti.hour_upper_anim.state | banti.hour_lower_anim.state | banti.min_upper_anim.state | banti.min_lower_anim.state; + + if (pre_state != post_state) { + if (pre_state == banti_ANIM_STATE_STOPPED) { + lbRTC_TimeCopy(&banti.next_time, Common_GetPointer(time.rtc_time)); + } + else { + lbRTC_TimeCopy(&banti.displayed_time, &banti.next_time); + } + } +} + +extern void banti_move(GAME_PLAY* play) { + int addressable_type; + int update; + + banti_chk_disp_left(play); + + addressable_type = mPlib_Get_address_able_display(); + + if (banti.addressable_type != addressable_type) { + update = FALSE; + banti.timer++; + + if (addressable_type == mPlayer_ADDRESSABLE_FALSE_USING_TOOL) { + if (banti.timer > 50) { + update = TRUE; + } + } + else if (banti.addressable_type != mPlayer_ADDRESSABLE_TRUE) { + if (banti.timer > 30 || addressable_type == mPlayer_ADDRESSABLE_FALSE_TALKING) { + update = TRUE; + } + } + else if (banti.timer > 50 || addressable_type == mPlayer_ADDRESSABLE_FALSE_TALKING) { + update = TRUE; + } + + if (update == TRUE) { + banti.timer = 0; + banti.addressable_type = addressable_type; + } + } + else { + banti.timer = 0; + } + + banti_calc_disp_alpha_rate(play); + banti_time_check(); +} + +static int banti_draw_before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape, u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) { + Gfx** gfx_pp; + Mtx* mtx; + Banti_callback_c* callback_data = (Banti_callback_c*)arg; + + gfx_pp = callback_data->gfx_pp; + mtx = callback_data->mtx; + + Matrix_softcv3_mult(joint_pos, joint_rot); + if (*joint_shape != NULL) { + _Matrix_to_Mtx(mtx); + + gSPMatrix(gfx_pp[0]++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (callback_data->state == banti_ANIM_STATE_STOPPED) { + if (joint_idx != 2) { + gSPDisplayList(gfx_pp[0]++, *joint_shape); + } + } + else { + gSPDisplayList(gfx_pp[0]++, *joint_shape); + } + + callback_data->mtx++; + } + + return 0; +} + +extern u8 clk_win_suuji1_TA_tex_txt[]; +extern u8 clk_win_suuji2_TA_tex_txt[]; +extern u8 clk_win_suuji3_TA_tex_txt[]; +extern u8 clk_win_suuji4_TA_tex_txt[]; +extern u8 clk_win_suuji5_TA_tex_txt[]; +extern u8 clk_win_suuji6_TA_tex_txt[]; +extern u8 clk_win_suuji7_TA_tex_txt[]; +extern u8 clk_win_suuji8_TA_tex_txt[]; +extern u8 clk_win_suuji9_TA_tex_txt[]; +extern u8 clk_win_suuji10_TA_tex_txt[]; +extern u8 clk_win_suuji11_TA_tex_txt[]; +extern u8 clk_win_suuji12_TA_tex_txt[]; +extern u8 clk_win_suuji13_TA_tex_txt[]; +extern u8 clk_win_suuji14_TA_tex_txt[]; +extern u8 clk_win_suuji15_TA_tex_txt[]; +extern u8 clk_win_suuji16_TA_tex_txt[]; +extern u8 clk_win_suuji17_TA_tex_txt[]; +extern u8 clk_win_suuji18_TA_tex_txt[]; +extern u8 clk_win_suuji19_TA_tex_txt[]; +extern u8 clk_win_suuji20_TA_tex_txt[]; +extern u8 clk_win_suuji21_TA_tex_txt[]; +extern u8 clk_win_suuji22_TA_tex_txt[]; +extern u8 clk_win_suuji23_TA_tex_txt[]; +extern u8 clk_win_suuji24_TA_tex_txt[]; +extern u8 clk_win_suuji25_TA_tex_txt[]; +extern u8 clk_win_suuji26_TA_tex_txt[]; +extern u8 clk_win_suuji27_TA_tex_txt[]; +extern u8 clk_win_suuji28_TA_tex_txt[]; +extern u8 clk_win_suuji29_TA_tex_txt[]; +extern u8 clk_win_suuji30_TA_tex_txt[]; +extern u8 clk_win_suuji31_TA_tex_txt[]; + +static void banti_draw_hiduke_sub(Gfx** gfx_pp, GAME* game, Banti_anim_c* anim, int tex0_idx, int tex1_idx, int pos_idx) { + static u8* hiniti_tex_table[31] = { + clk_win_suuji1_TA_tex_txt, + clk_win_suuji2_TA_tex_txt, + clk_win_suuji3_TA_tex_txt, + clk_win_suuji4_TA_tex_txt, + clk_win_suuji5_TA_tex_txt, + clk_win_suuji6_TA_tex_txt, + clk_win_suuji7_TA_tex_txt, + clk_win_suuji8_TA_tex_txt, + clk_win_suuji9_TA_tex_txt, + clk_win_suuji10_TA_tex_txt, + clk_win_suuji11_TA_tex_txt, + clk_win_suuji12_TA_tex_txt, + clk_win_suuji13_TA_tex_txt, + clk_win_suuji14_TA_tex_txt, + clk_win_suuji15_TA_tex_txt, + clk_win_suuji16_TA_tex_txt, + clk_win_suuji17_TA_tex_txt, + clk_win_suuji18_TA_tex_txt, + clk_win_suuji19_TA_tex_txt, + clk_win_suuji20_TA_tex_txt, + clk_win_suuji21_TA_tex_txt, + clk_win_suuji22_TA_tex_txt, + clk_win_suuji23_TA_tex_txt, + clk_win_suuji24_TA_tex_txt, + clk_win_suuji25_TA_tex_txt, + clk_win_suuji26_TA_tex_txt, + clk_win_suuji27_TA_tex_txt, + clk_win_suuji28_TA_tex_txt, + clk_win_suuji29_TA_tex_txt, + clk_win_suuji30_TA_tex_txt, + clk_win_suuji31_TA_tex_txt + }; + + static xyz_t set_pos_table[2] = { + { 64.0f, -70.0f, 0.0f }, + { 94.0f, -70.0f, 0.0f } + }; + + GRAPH* g = game->graph; + xyz_t* set_pos = &set_pos_table[pos_idx]; + Mtx* m; + int joint; + Banti_callback_c callback_data; + + Matrix_push(); + Matrix_translate(set_pos->x, set_pos->y, set_pos->z, 1); + + m = (Mtx*)GRAPH_ALLOC_TYPE(g, Mtx, anim->keyframe.skeleton->num_shown_joints); + callback_data.mtx = m; + + if (m != NULL) { + joint = 0; + callback_data.gfx_pp = gfx_pp; + callback_data.state = anim->state; + + gSPSegment(gfx_pp[0]++, G_MWO_SEGMENT_8, hiniti_tex_table[tex0_idx]); + gSPSegment(gfx_pp[0]++, G_MWO_SEGMENT_9, hiniti_tex_table[tex1_idx]); + + + cKF_Si3_draw_SV_R_child(game, &anim->keyframe, &joint, &banti_draw_before, NULL, &callback_data, NULL); + } + + Matrix_pull(); +} + +static void banti_draw_hiduke(Gfx** gfx_pp, GAME_PLAY* play, int alpha) { + u8 a = alpha; + + gDPSetPrimColor(gfx_pp[0]++, 0, a, 235, 255, 120, a); + gDPSetEnvColor(gfx_pp[0]++, 80, 40, 40, a); + + banti_draw_hiduke_sub(gfx_pp, (GAME*)play, &banti.month_anim, banti.displayed_time.month - 1, banti.next_time.month - 1, 0); + banti_draw_hiduke_sub(gfx_pp, (GAME*)play, &banti.day_anim, banti.displayed_time.day - 1, banti.next_time.day - 1, 1); +} + +extern u8 clk_win_jikan0_TA_tex_txt[]; +extern u8 clk_win_jikan1_TA_tex_txt[]; +extern u8 clk_win_jikan2_TA_tex_txt[]; +extern u8 clk_win_jikan3_TA_tex_txt[]; +extern u8 clk_win_jikan4_TA_tex_txt[]; +extern u8 clk_win_jikan5_TA_tex_txt[]; +extern u8 clk_win_jikan6_TA_tex_txt[]; +extern u8 clk_win_jikan7_TA_tex_txt[]; +extern u8 clk_win_jikan8_TA_tex_txt[]; +extern u8 clk_win_jikan9_TA_tex_txt[]; +extern u8 clk_win_jikan_TA_tex_txt[]; + +static void banti_draw_jikan_sub(Gfx** gfx_pp, GAME* game, Banti_anim_c* anim, int idx0, int idx1, int hide_zero, int pos_idx) { + static u8* jikan_tex_table[11] = { + clk_win_jikan0_TA_tex_txt, + clk_win_jikan1_TA_tex_txt, + clk_win_jikan2_TA_tex_txt, + clk_win_jikan3_TA_tex_txt, + clk_win_jikan4_TA_tex_txt, + clk_win_jikan5_TA_tex_txt, + clk_win_jikan6_TA_tex_txt, + clk_win_jikan7_TA_tex_txt, + clk_win_jikan8_TA_tex_txt, + clk_win_jikan9_TA_tex_txt, + clk_win_jikan_TA_tex_txt + }; + + static xyz_t set_pos_table[4] = { + { 60.0f, -91.0f, 0.0f }, + { 76.0f, -91.0f, 0.0f }, + { 98.0f, -91.0f, 0.0f }, + { 113.0f, -91.0f, 0.0f } + }; + + GRAPH* g = game->graph; + xyz_t* set_pos = &set_pos_table[pos_idx]; + Mtx* m; + int joint; + Banti_callback_c callback_data; + + Matrix_push(); + Matrix_translate(set_pos->x, set_pos->y, set_pos->z, 1); + + if (hide_zero == TRUE) { + if (idx0 == 0) { + idx0 = 10; + } + + if (idx1 == 0) { + idx1 = 10; + } + } + + m = (Mtx*)GRAPH_ALLOC_TYPE(g, Mtx, anim->keyframe.skeleton->num_shown_joints); + callback_data.mtx = m; + + if (m != NULL) { + joint = 0; + callback_data.gfx_pp = gfx_pp; + callback_data.state = anim->state; + + gSPSegment(gfx_pp[0]++, G_MWO_SEGMENT_8, jikan_tex_table[idx0]); + gSPSegment(gfx_pp[0]++, G_MWO_SEGMENT_9, jikan_tex_table[idx1]); + + + cKF_Si3_draw_SV_R_child(game, &anim->keyframe, &joint, &banti_draw_before, NULL, &callback_data, NULL); + } + + Matrix_pull(); +} + +static void banti_draw_jikan(Gfx** gfx_pp, GAME_PLAY* play, int alpha) { + u8 a = alpha; + int now_hour; + int next_hour; + + gDPSetPrimColor(gfx_pp[0]++, 0, a, 255, 255, 255, a); + gDPSetEnvColor(gfx_pp[0]++, 60, 25, 10, a); + + now_hour = banti.displayed_time.hour; + if (now_hour == 0 || now_hour == 12) { + now_hour = 12; + } + else if (now_hour > 11) { + now_hour -= 12; + } + + next_hour = banti.next_time.hour; + if (next_hour == 0 || next_hour == 12) { + next_hour = 12; + } + else if (next_hour > 11) { + next_hour -= 12; + } + + banti_draw_jikan_sub(gfx_pp, (GAME*)play, &banti.hour_upper_anim, now_hour / 10, next_hour / 10, TRUE, 0); + banti_draw_jikan_sub(gfx_pp, (GAME*)play, &banti.hour_lower_anim, now_hour % 10, next_hour % 10, FALSE, 1); + + banti_draw_jikan_sub(gfx_pp, (GAME*)play, &banti.min_upper_anim, banti.displayed_time.min / 10, banti.next_time.min / 10, FALSE, 2); + banti_draw_jikan_sub(gfx_pp, (GAME*)play, &banti.min_lower_anim, banti.displayed_time.min % 10, banti.next_time.min % 10, FALSE, 3); +} + +extern u8 clk_win_pm_tex_rgb_ia8[]; +extern u8 clk_win_am_tex_rgb_ia8[]; + +extern Gfx clk_win_mode[]; + +extern u8 clk_win_sun_tex_rgb_ia8[]; +extern u8 clk_win_mon_tex_rgb_ia8[]; +extern u8 clk_win_tue_tex_rgb_ia8[]; +extern u8 clk_win_wed_tex_rgb_ia8[]; +extern u8 clk_win_thu_tex_rgb_ia8[]; +extern u8 clk_win_fri_tex_rgb_ia8[]; +extern u8 clk_win_sat_tex_rgb_ia8[]; + +extern Gfx clk_win_youbiT_model[]; +extern Gfx clk_win_maruT_model[]; +extern Gfx clk_win_maru2T_model[]; +extern Gfx clk_win_ampmT_model[]; + +extern void banti_draw(GAME_PLAY* play) { + static u8* week_tex_table[lbRTC_WEEK] = { + clk_win_sun_tex_rgb_ia8, + clk_win_mon_tex_rgb_ia8, + clk_win_tue_tex_rgb_ia8, + clk_win_wed_tex_rgb_ia8, + clk_win_thu_tex_rgb_ia8, + clk_win_fri_tex_rgb_ia8, + clk_win_sat_tex_rgb_ia8 + }; + + if (mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELDTYPE_FG && mEv_CheckFirstIntro() != TRUE && banti.alpha > 0.01f) { + GRAPH* g = play->game.graph; + int poly_render = FALSE; + Mtx* m = (Mtx*)GRAPH_ALLOC_TYPE(g, Mtx, 1); + + /* TODO: submenu mode enums */ + if (play->submenu.process_status != mSM_PROCESS_WAIT && play->submenu.mode > 2) { + poly_render = TRUE; + } + + OPEN_DISP(g); + + if (m != NULL) { + mFont_CulcOrthoMatrix(m); + + if (poly_render == TRUE) { + gSPMatrix(NOW_POLY_OPA_DISP++, m, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + } + else { + gSPMatrix(NOW_FONT_DISP++, m, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + } + + } + + Matrix_scale(16.0f, 16.0f, 16.0f, 0); + + if (banti.disp_left == TRUE) { + Matrix_translate(-184.0f, 0.0f, 0.0f, 1); + } + + { + Gfx** gfx_pp; + u8* am_pm_tex = banti.displayed_time.hour < 12 ? clk_win_am_tex_rgb_ia8 : clk_win_pm_tex_rgb_ia8; + int alpha; + u8 a; + Gfx* gfx; + u32 rendermode0; + u32 rendermode1; + + if (poly_render == TRUE) { + gfx = NOW_POLY_OPA_DISP; + } + else { + gfx = NOW_FONT_DISP; + } + + gfx_pp = &gfx; + + gSPMatrix(gfx_pp[0]++, _Matrix_to_Mtx_new(g), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + alpha = banti.alpha * 255.0f; + if (banti.alpha >= 0.4f) { + rendermode0 = G_RM_PASS; + rendermode1 = G_RM_XLU_SURF2; + } + else { + rendermode0 = G_RM_PASS; + rendermode1 = G_RM_CLD_SURF2; + } + + gSPDisplayList(gfx_pp[0]++, clk_win_mode); + gDPSetRenderMode(gfx_pp[0]++, rendermode0, rendermode1); + + if (banti.displayed_time.weekday == lbRTC_SUNDAY) { + u8 a = alpha; + + gDPSetPrimColor(gfx_pp[0]++, 0, a, 255, 255, 225, a); + gDPSetEnvColor(gfx_pp[0]++, 165, 30, 30, a); + } + else { + u8 a = alpha; + + gDPSetPrimColor(gfx_pp[0]++, 0, a, 255, 255, 225, a); + gDPSetEnvColor(gfx_pp[0]++, 80, 40, 0, a); + } + + gSPSegment(gfx_pp[0]++, G_MWO_SEGMENT_9, week_tex_table[banti.displayed_time.weekday]); + gSPDisplayList(gfx_pp[0]++, clk_win_youbiT_model); + + if ((Common_Get(time.rtc_time).sec & 1) == 1) { + u8 a = alpha; + + gDPSetPrimColor(gfx_pp[0]++, 0, a, 215, 120, 0, a); + gDPSetEnvColor(gfx_pp[0]++, 70, 50, 50, a); + gSPDisplayList(gfx_pp[0]++, clk_win_maru2T_model); + } + + a = alpha; + gDPSetPrimColor(gfx_pp[0]++, 0, a, 255, 255, 120, a); + gDPSetEnvColor(gfx_pp[0]++, 70, 10, 10, a); + gSPSegment(gfx_pp[0]++, G_MWO_SEGMENT_A, am_pm_tex); + gSPDisplayList(gfx_pp[0]++, clk_win_ampmT_model); + + gDPSetPrimColor(gfx_pp[0]++, 0, a, 255, 255, 0, a); + gDPSetEnvColor(gfx_pp[0]++, 70, 50, 50, a); + gSPDisplayList(gfx_pp[0]++, clk_win_maruT_model); + + banti_draw_hiduke(&gfx, play, alpha); + banti_draw_jikan(&gfx, play, alpha); + + if (poly_render == TRUE) { + SET_POLY_OPA_DISP(*gfx_pp); + } + else { + SET_FONT_DISP(*gfx_pp); + } + } + + CLOSE_DISP(g); + } +}