Merge pull request #96 from Cuyler36/m_banti

Implement & link m_banti
This commit is contained in:
Cuyler36
2023-07-29 18:20:20 -04:00
committed by GitHub
8 changed files with 789 additions and 9 deletions
+5
View File
@@ -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:
+8
View File
@@ -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;
+64
View File
@@ -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
+1
View File
@@ -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
}
+9
View File
@@ -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;
+1
View File
@@ -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
}
+9 -9
View File
@@ -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;
+692
View File
@@ -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);
}
}