From 386ba4475da140a43fd35bb8ac346bfa90c92bb0 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Sun, 25 Aug 2024 22:19:25 +0200 Subject: [PATCH] match m_player_item_balloon --- src/m_player_item_balloon.c_inc | 293 ++++++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) diff --git a/src/m_player_item_balloon.c_inc b/src/m_player_item_balloon.c_inc index e69de29b..032effee 100644 --- a/src/m_player_item_balloon.c_inc +++ b/src/m_player_item_balloon.c_inc @@ -0,0 +1,293 @@ +s16 Player_actor_Item_Get_goal_balloon_lean_angle(ACTOR* actor){ + return -actor->shape_info.rotation.x; +} + +void Player_actor_Item_Setup_main_balloon_normal(ACTOR* actor, GAME* game, int kind){ + PLAYER_ACTOR* player = (PLAYER_ACTOR*)actor; + int check = FALSE; + + if(mPlayer_ITEM_IS_BALLOON(kind)){ + check = TRUE; + } + + if(check == FALSE){ + player->balloon_lean_angle = Player_actor_Item_Get_goal_balloon_lean_angle(actor); + player->balloon_angle = ZeroSVec; + player->balloon_anim_max_frame = player->item_keyframe.frame_control.max_frames; + player->balloon_anim_speed = 0.0f; + player->balloon_stop_movement_flag = TRUE; + player->balloon_add_rot_z = 30.0f; + player->ballon_add_rot_x = 0; + player->balloon_add_rot_x_counter = 0; + player->balloon_current_frame = 0.0f; + } + + player->item_keyframe.frame_control.current_frame = player->balloon_anim_max_frame; + player->item_keyframe.frame_control.speed = player->balloon_anim_speed; + +} + +void Player_actor_Item_set_balloon_lean_angle(ACTOR* actor){ + PLAYER_ACTOR* player = (PLAYER_ACTOR*)actor; + s16 angle = Player_actor_Item_Get_goal_balloon_lean_angle(actor); + add_calc_short_angle2(&player->balloon_lean_angle, angle, 1.0f - sqrtf(0.91f), 250, 0); +} + +void Player_actor_Item_CulcAnimation_balloon_normal(ACTOR* actor){ + PLAYER_ACTOR* player = (PLAYER_ACTOR*)actor; + f32 speed = player->item_keyframe.frame_control.speed; + f32 cur = player->item_keyframe.frame_control.current_frame; + f32 max = player->item_keyframe.frame_control.max_frames; + + player->balloon_anim_max_frame = cur; + cur += speed; + player->balloon_anim_speed = speed; + + if(cur > max){ + cur = max; + } + else if(cur < 0.5f * max){ + cur = 0.5f * max; + } + + player->item_keyframe.frame_control.current_frame = cur; +} + + +void Player_actor_Item_Movement_balloon_normal(ACTOR* actor) { + PLAYER_ACTOR* player = (PLAYER_ACTOR*)actor; + f32 max = player->item_keyframe.frame_control.max_frames; + int index; + + if (player->item_scale == 1.0f) { + f32 speed = (26.0f * (player->item_keyframe.frame_control.current_frame - 1.0f)) / (max - 1.0f); + xyz_t pos = ZeroVec; + + if (player->balloon_stop_movement_flag == FALSE) { + s16 ang = player->balloon_lean_angle; + s16 rot = actor->shape_info.rotation.y; + s16 target; + f32 cos = cos_s(ang); + xyz_t right_hand = player->right_hand_move; + + pos.y -= right_hand.y * cos; + + { + f32 cos = cos_s(DEG2SHORT_ANGLE2(90.0f) - ang); + f32 sin = sin_s(rot); + f32 cos2 = cos_s(rot); + f32 poscalc = ((sin * right_hand.x) + (cos2 * right_hand.z)); + + pos.y -= poscalc * cos; + } + + { + f32 balloon_add_rot_z = player->balloon_add_rot_z; + s16 add_z_angle; + + balloon_add_rot_z -= (0.0014f * player->balloon_angle.z); + add_z_angle = player->balloon_angle.z + (int)balloon_add_rot_z; + + if (add_z_angle > 0x800) { + add_z_angle = 0x800; + } else if (add_z_angle < -0x800) { + add_z_angle = -0x800; + } + + player->balloon_angle.z = add_z_angle; + player->balloon_add_rot_z = balloon_add_rot_z; + } + + { + f32 sin = sin_s(rot); + f32 cos2 = cos_s(rot); + s16 balloon_angle_z = (s16)(-1200.0f * ((sin * right_hand.x) + (cos2 * right_hand.z))); + s16 balloon_angle_x = player->balloon_angle.x; + int xang = ABS(balloon_angle_x); + int zang = ABS(balloon_angle_z); + + if (zang - xang < 0) { + add_calc_short_angle2(&player->balloon_angle.x, balloon_angle_z, 1.0f - sqrtf(0.9f), 2500, 0); + } else { + add_calc_short_angle2(&player->balloon_angle.x, balloon_angle_z, 1.0f - sqrtf(0.6f), 2500, 0); + } + } + + { + int index = player->now_main_index; + s16 add_x_angle = player->ballon_add_rot_x; + + if (index == mPlayer_INDEX_WALK || index == mPlayer_INDEX_RUN) { + s16 counter = player->balloon_add_rot_x_counter; + f32 sin; + + counter += (s16)(400.0f * actor->speed); + sin = sin_s(counter); + player->balloon_add_rot_x_counter = counter; + + target = (s16)(1000.0f * sin); + } else { + target = 0; + } + + add_calc_short_angle2(&add_x_angle, target, 1.0f - sqrtf(0.6f), 2500, 0); + player->ballon_add_rot_x = add_x_angle; + } + } + + speed += pos.y; + if (speed < 13.0f) { + speed = 13.0f; + } else if (speed > 26.0f) { + speed = 26.0f; + } + + player->item_keyframe.frame_control.current_frame = 1.0f + ((speed * (max - 1.0f)) / 26.0f); + } else { + player->balloon_angle.z = 0; + } + + { + f32 item_speed = player->item_keyframe.frame_control.speed; + f32 cur = player->item_keyframe.frame_control.current_frame; + f32 curmax = 0.7f * max; + + if (cur >= max) { + item_speed = -0.085f; + } else if (item_speed <= 0.0f && cur <= curmax) { + item_speed = 0.0f; + } else { + item_speed += 0.0039585f; + } + + player->item_keyframe.frame_control.speed = item_speed; + } +} + + +void Player_actor_Item_PlayAnimation_balloon_normal(ACTOR* actor){ + PLAYER_ACTOR* player = (PLAYER_ACTOR*)actor; + f32 cur = player->item_keyframe.frame_control.current_frame; + f32 max = player->item_keyframe.frame_control.max_frames; + + if(player->balloon_current_frame != cur){ + f32 cur_diff = cur - player->balloon_current_frame; + f32 old_speed = player->item_keyframe.frame_control.speed; + + if(cur_diff >= 0.0f){ + player->item_keyframe.frame_control.start_frame = 1.0f; + player->item_keyframe.frame_control.end_frame = max; + } + else { + player->item_keyframe.frame_control.end_frame = 1.0f; + player->item_keyframe.frame_control.start_frame = max; + } + + player->item_keyframe.frame_control.speed = cur_diff; + Player_actor_Item_CulcAnimation_Base(actor); + player->item_keyframe.frame_control.current_frame = cur; + player->balloon_current_frame= cur; + player->item_keyframe.frame_control.speed = old_speed; + } +} + +int Player_actor_Item_main_balloon_normal(ACTOR* actor, GAME* game){ + Player_actor_Item_set_balloon_lean_angle(actor); + Player_actor_Item_CulcAnimation_balloon_normal(actor); + return 0; +} + +int Player_actor_Item_draw_balloon_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){ + + switch(joint_idx){ + case 1: + case 2: + case 3: + + OPEN_POLY_OPA_DISP(game->graph); + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTexEdgeAlpha(POLY_OPA_DISP++,80); + + CLOSE_POLY_OPA_DISP(game->graph); + + break; + } + + return 1; +} + +int Player_actor_Item_draw_balloon_After(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){ + switch(joint_idx){ + case 1: + case 2: + case 3: + + OPEN_POLY_OPA_DISP(game->graph); + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetTexEdgeAlpha(POLY_OPA_DISP++,144); + + CLOSE_POLY_OPA_DISP(game->graph); + + break; + + } + + return 1; +} +void Player_actor_Item_draw_balloon(ACTOR* actor, GAME* game) { + PLAYER_ACTOR* player = (PLAYER_ACTOR*)actor; + Mtx* item_mtx; + GAME_PLAY* play = (GAME_PLAY*)game; + s16 angle; + s16 rot; + GRAPH* graph; + f32 scale; + s_xyz* angle_p = &player->balloon_angle; + + if (!_Game_play_isPause(play)) { + Player_actor_Item_Movement_balloon_normal(actor); + Player_actor_Item_PlayAnimation_balloon_normal(actor); + } + + item_mtx = player->item_work_mtx[play->game.frame_counter % 2]; + graph = play->game.graph; + + Matrix_push(); + + rot = actor->shape_info.rotation.y; + scale = player->item_scale; + angle = DEG2SHORT_ANGLE2(-90.0f) + player->balloon_lean_angle + angle_p->x + player->ballon_add_rot_x; + + Matrix_translate(player->right_hand_pos.x, player->right_hand_pos.y, player->right_hand_pos.z, 0); + Matrix_RotateY(rot, 1); + Matrix_RotateX(angle, 1); + Matrix_RotateZ(0x4000, 1); + Matrix_RotateX(player->balloon_angle.z, 1); + Matrix_scale(actor->scale.x * scale, actor->scale.y * scale, actor->scale.z * scale, 1); + + OPEN_POLY_OPA_DISP(graph); + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + CLOSE_POLY_OPA_DISP(graph); + + Setpos_HiliteReflect_init(&player->right_hand_pos, play); + + cKF_Si3_draw_R_SV(&play->game, &player->item_keyframe, item_mtx, Player_actor_Item_draw_balloon_Before, Player_actor_Item_draw_balloon_After, actor); + Matrix_pull(); + + player->update_item_rod_top_pos = FALSE; + + if(player->balloon_start_pos_set_flag == FALSE){ + player->other_item_start_pos = player->other_item_end_pos; + player->balloon_start_pos_set_flag = TRUE; + } + + if(player->balloon_stop_movement_flag != FALSE){ + player->balloon_stop_movement_flag = FALSE; + } +}