X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_dead.c;h=7733c327e2b0668d9a6a7439fd7fda829cdf509b;hb=76315944e5a98838163e0aba8601ed3522f0724d;hp=78cce2fb76614b6698cf01ed03bcaf11c63e295e;hpb=3e59ac7081ea3005060b56449bc77c8f73cdc6b6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_dead.c b/player_dead.c index 78cce2f..7733c32 100644 --- a/player_dead.c +++ b/player_dead.c @@ -2,16 +2,16 @@ #define PLAYER_DEAD_C #include "player.h" +#include "gui.h" -VG_STATIC void player__dead_update ( player_instance *player ) -{ - player_ragdoll_iter( &player->ragdoll ); +static void player__dead_update(void){ + player_ragdoll_iter( &localplayer.ragdoll ); } -VG_STATIC void player__dead_post_update( player_instance *player ){ - struct player_dead *d = &player->_dead; - struct player_avatar *av = player->playeravatar; - struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ]; +static void player__dead_post_update(void){ + struct ragdoll_part *part = + &localplayer.ragdoll.parts[ localplayer.id_hip-1 ]; + struct player_dead *d = &player_dead; v3f ext_co; v4f ext_q; @@ -21,26 +21,40 @@ VG_STATIC void player__dead_post_update( player_instance *player ){ v3_lerp( d->v_lpf, part->obj.rb.v, vg.time_frame_delta*4.0f, d->v_lpf ); v3_lerp( d->w_lpf, part->obj.rb.w, vg.time_frame_delta*4.0f, d->w_lpf ); - v3_copy( d->co_lpf, player->rb.co ); - v3_zero( player->rb.v ); - v3_zero( player->rb.w ); + v3_copy( d->co_lpf, localplayer.rb.co ); + v3_zero( localplayer.rb.v ); + v3_zero( localplayer.rb.w ); + + if( (skaterift.activity == k_skaterift_default) && + button_down(k_srbind_dead_respawn) ){ + ent_spawn *spawn = world_find_closest_spawn( + world_current_instance(), localplayer.rb.co ); + + if( spawn ){ + v3_copy( spawn->transform.co, localplayer.rb.co ); + player__reset(); + srinput.state = k_input_state_resume; + } + else { + vg_error( "No spawns!\n" ); + } + } } -VG_STATIC void player__dead_animate( player_instance *player ){ - struct player_dead *d = &player->_dead; +static void player__dead_animate(void){ + struct player_dead *d = &player_dead; struct player_dead_animator *animator = &d->animator; - struct player_ragdoll *rd = &player->ragdoll; - struct player_avatar *av = player->playeravatar; - struct skeleton *sk = &av->sk; + struct player_ragdoll *rd = &localplayer.ragdoll; + struct skeleton *sk = &localplayer.skeleton; m4x3f transforms[ 32 ]; /* root transform */ - q_m3x3( player->rb.q, transforms[0] ); - v3_copy( player->rb.co, transforms[0][3] ); + q_m3x3( localplayer.rb.q, transforms[0] ); + v3_copy( localplayer.rb.co, transforms[0][3] ); - v4_copy( player->rb.q, animator->transforms[0].q ); - v3_copy( player->rb.co, animator->transforms[0].co ); + v4_copy( localplayer.rb.q, animator->transforms[0].q ); + v3_copy( localplayer.rb.co, animator->transforms[0].co ); /* colliders with bones transforms */ for( int i=0; ipart_count; i++ ){ @@ -99,12 +113,10 @@ VG_STATIC void player__dead_animate( player_instance *player ){ } } -VG_STATIC void player__dead_pose( player_instance *player, player_pose *pose ){ - struct player_dead *d = &player->_dead; - struct player_dead_animator *animator = &d->animator; - struct player_ragdoll *rd = &player->ragdoll; - struct player_avatar *av = player->playeravatar; - struct skeleton *sk = &av->sk; +static void player__dead_pose( void *_animator, player_pose *pose ){ + struct player_dead_animator *animator = _animator; + struct player_ragdoll *rd = &localplayer.ragdoll; + struct skeleton *sk = &localplayer.skeleton; pose->type = k_player_pose_type_fk_2; pose->board.lean = 0.0f; @@ -119,25 +131,50 @@ VG_STATIC void player__dead_pose( player_instance *player, player_pose *pose ){ } } -VG_STATIC void player__dead_post_animate( player_instance *player ){ - player->cam_velocity_influence = 1.0f; +static void player__dead_post_animate(void){ + localplayer.cam_velocity_influence = 1.0f; } -VG_STATIC void player__dead_im_gui ( player_instance *player ){ +static void player__dead_im_gui(void){ +} + +static void player__dead_transition( enum player_die_type type ){ + localplayer.subsystem = k_player_subsystem_dead; + copy_localplayer_to_ragdoll( &localplayer.ragdoll, type ); + + struct ragdoll_part *part = + &localplayer.ragdoll.parts[ localplayer.id_hip-1 ]; + v3_copy( part->obj.rb.co, player_dead.co_lpf ); + v3_copy( part->obj.rb.v, player_dead.v_lpf ); + v3_copy( part->obj.rb.w, player_dead.w_lpf ); + + gui_helper_clear(); + vg_str str; + struct gui_helper *h; + if( (h = gui_new_helper(input_button_list[k_srbind_reset], &str) )){ + vg_strcat( &str, "rewind" ); + + if( world_static.active_instance == k_world_purpose_hub ) + h->greyed = 1; + } + + if( gui_new_helper(input_button_list[k_srbind_dead_respawn], &str )) + vg_strcat( &str, "spawn" ); +} + +static void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ){ + struct player_dead_animator *animator = data; + + for( u32 i=0; itransforms[i].co ); + bitpack_qquat( ctx, animator->transforms[i].q ); + } } -VG_STATIC void player__dead_transition ( player_instance *player ){ - player->subsystem = k_player_subsystem_dead; - copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll, - player->rb.v ); - - struct player_avatar *av = player->playeravatar; - struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ]; - struct player_dead *d = &player->_dead; - v3_copy( part->obj.rb.co, d->co_lpf ); - v3_copy( part->obj.rb.v, d->v_lpf ); - v3_copy( part->obj.rb.w, d->w_lpf ); +static void player__dead_bind(void){ + struct skeleton *sk = &localplayer.skeleton; + player_dead.anim_bail = skeleton_get_anim( sk, "pose_bail_ball" ); } #endif /* PLAYER_DEAD_C */