update helpers/location to 'frosted' ui
[carveJwlIkooP6JGAAIwe30JlM.git] / player_dead.c
index 7733c327e2b0668d9a6a7439fd7fda829cdf509b..72eba265f443c92512051b77b485e41b6e15b030 100644 (file)
@@ -1,25 +1,43 @@
-#ifndef PLAYER_DEAD_C
-#define PLAYER_DEAD_C
-
-#include "player.h"
+#include "skaterift.h"
+#include "player_dead.h"
 #include "gui.h"
 
-static void player__dead_update(void){
+struct player_dead player_dead;
+struct player_subsystem_interface player_subsystem_dead = {
+   .update = player__dead_update,
+   .post_update = player__dead_post_update,
+   .animate = player__dead_animate,
+   .pose = player__dead_pose,
+   .post_animate = player__dead_post_animate,
+   .im_gui = player__dead_im_gui,
+   .bind = player__dead_bind,
+
+   .animator_data = &player_dead.animator,
+   .animator_size = sizeof(player_dead.animator),
+   .network_animator_exchange = player__dead_animator_exchange,
+   .name = "Dead"
+};
+
+void player__dead_update(void)
+{
    player_ragdoll_iter( &localplayer.ragdoll );
+
+   world_instance *world = world_current_instance();
+   world_water_player_safe( world, 0.2f );
 }
 
-static void player__dead_post_update(void){
+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;
-   rb_extrapolate( &part->obj.rb, ext_co, ext_q );
+   rb_extrapolate( &part->rb, ext_co, ext_q );
 
    v3_lerp( d->co_lpf, ext_co, vg.time_frame_delta*4.0f, d->co_lpf );
-   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_lerp( d->v_lpf,  part->rb.v,  vg.time_frame_delta*4.0f, d->v_lpf );
+   v3_lerp( d->w_lpf,  part->rb.w,  vg.time_frame_delta*4.0f, d->w_lpf );
    
    v3_copy( d->co_lpf, localplayer.rb.co );
    v3_zero( localplayer.rb.v );
@@ -41,7 +59,7 @@ static void player__dead_post_update(void){
    }
 }
 
-static void player__dead_animate(void){
+void player__dead_animate(void){
    struct player_dead *d = &player_dead;
    struct player_dead_animator *animator = &d->animator;
    struct player_ragdoll *rd = &localplayer.ragdoll;
@@ -66,9 +84,9 @@ static void player__dead_animate(void){
       v3f co_int;
 
       float substep = vg.time_fixed_extrapolate;
-      v3_lerp( part->prev_co, part->obj.rb.co, substep, co_int );
-      q_nlerp( part->prev_q, part->obj.rb.q, substep, q_int );
-      v4_copy( part->obj.rb.q, q_int );
+      v3_lerp( part->prev_co, part->rb.co, substep, co_int );
+      q_nlerp( part->prev_q, part->rb.q, substep, q_int );
+      v4_copy( part->rb.q, q_int );
 
       q_m3x3( q_int, mtx );
       v3_copy( co_int, mtx[3] );
@@ -113,7 +131,8 @@ static void player__dead_animate(void){
    }
 }
 
-static void player__dead_pose( void *_animator, player_pose *pose ){
+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;
@@ -131,39 +150,46 @@ static void player__dead_pose( void *_animator, player_pose *pose ){
    }
 }
 
-static void player__dead_post_animate(void){
+void player__dead_post_animate(void)
+{
    localplayer.cam_velocity_influence = 1.0f;
 }
 
-static void player__dead_im_gui(void){
+void player__dead_im_gui(void)
+{
 }
 
-static void player__dead_transition( enum player_die_type type ){
+void player__dead_transition( enum player_die_type type )
+{
+   if( localplayer.subsystem == k_player_subsystem_dead )
+      return;
+
    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 );
+   v3_copy( part->rb.co, player_dead.co_lpf );
+   v3_copy( part->rb.v,  player_dead.v_lpf );
+   v3_copy( part->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" );
+      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" );
+      vg_strcat( &str, "Spawn" );
 }
 
-static void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ){
+void player__dead_animator_exchange( bitpack_ctx *ctx, void *data )
+{
    struct player_dead_animator *animator = data;
 
    for( u32 i=0; i<localplayer.skeleton.bone_count; i ++ ){
@@ -172,9 +198,8 @@ static void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ){
    }
 }
 
-static void player__dead_bind(void){
+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 */