launch option to load world
[carveJwlIkooP6JGAAIwe30JlM.git] / player_walk.h
index 42cd760d67825f71f5fd38afc2a8e24716600a79..28e38a4347825b18bd1c9670e53ea6a9c2b38f3a 100644 (file)
@@ -1,9 +1,12 @@
 #ifndef PLAYER_WALK_H
 #define PLAYER_WALK_H
 
+#include "player.h"
 #include "player_api.h"
 #include "rigidbody.h"
 
+#define PLAYER_JUMP_EPSILON 0.1     /* 100ms jump allowance */
+
 struct player_walk{
    rb_capsule collider;
 
@@ -21,7 +24,9 @@ struct player_walk{
          k_walk_activity_air,
          k_walk_activity_ground,
          k_walk_activity_sleep,
-         k_walk_activity_lockedmove
+         k_walk_activity_lockedmove,
+         k_walk_activity_sit,
+         k_walk_activity_sit_up
       }
       activity;
 
@@ -29,41 +34,64 @@ struct player_walk{
          k_walk_outro_none,
          k_walk_outro_jump_to_air,
          k_walk_outro_drop_in,
-         k_walk_outro_regular
+         k_walk_outro_regular,
+         k_walk_outro_max
       }
       outro_type;
-
-      struct skeleton_anim *outro_anim;
       double outro_start_time;
+
+      int jump_queued;
+      f64 jump_input_time;
+
+      f32 walk_timer;
+      f32 sit_t;
+      int step_phase;
    }
-   state,
-   state_gate_storage;
+   state;
+
+   f32 move_speed;
 
    enum mdl_surface_prop surface;
    struct skeleton_anim *anim_walk, *anim_run, *anim_idle, *anim_jump,
-                        *anim_jump_to_air, *anim_drop_in, *anim_intro;
+                        *anim_jump_to_air, *anim_drop_in, *anim_intro,
+                        *anim_sit;
+
+   struct player_walk_animator {
+      v3f root_co;
+      v4f root_q;
+      f32 fly,
+          run,
+          walk;
 
-   float blend_fly,
-         blend_run,
-         blend_walk,
+      f32 walk_timer, yaw, pitch;
 
-         move_speed,
-         walk_timer;
+      v3f foot_anchor;
+      enum walk_outro outro_type;
+      f32 outro_t,
+          commit_t,
+          sit_t;
+   }
+   animator;
+}
+static player_walk;
 
-   int step_phase;
+enum player_walk_soundeffect {
+   k_player_walk_soundeffect_splash
 };
 
-VG_STATIC float
+static f32
    k_walkspeed             = 10.0f,
    k_airspeed              = 1.2f,
    k_stopspeed             = 4.0f,
    k_walk_accel            = 10.0f,
    k_walk_air_accel        = 7.0f,
    k_walk_friction         = 10.0f,
-   k_walk_step_height      = 0.2f;
+   k_walk_step_height      = 0.2f,
+
+   k_sit_yaw_limit         = VG_PIf/1.7f,
+   k_sit_pitch_limit       = VG_PIf/4.0f;
 
-VG_STATIC void player__walk_register(void)
-{
+static void player__walk_register(void){
    VG_VAR_F32( k_walkspeed,      flags=VG_VAR_CHEAT );
    VG_VAR_F32( k_stopspeed,      flags=VG_VAR_CHEAT );
    VG_VAR_F32( k_airspeed,       flags=VG_VAR_CHEAT );
@@ -72,17 +100,34 @@ VG_STATIC void player__walk_register(void)
    VG_VAR_F32( k_walk_accel,     flags=VG_VAR_CHEAT );
 }
 
-VG_STATIC void player__walk_pre_update  ( player_instance *player );
-VG_STATIC void player__walk_update      ( player_instance *player );
-VG_STATIC void player__walk_post_update ( player_instance *player );
-VG_STATIC void player__walk_animate     ( player_instance *player, 
-                                          player_animation *anim );
-VG_STATIC void player__walk_post_animate( player_instance *player );
-VG_STATIC void player__walk_im_gui      ( player_instance *player );
-VG_STATIC void player__walk_bind        ( player_instance *player );
-VG_STATIC void player__walk_transition  ( player_instance *player, v3f angles );
-VG_STATIC void player__walk_reset       ( player_instance *player, 
-                                          ent_spawn *rp );
-VG_STATIC void player__walk_restore( player_instance *player );
+static void player__walk_pre_update  (void);
+static void player__walk_update      (void);
+static void player__walk_post_update (void);
+static void player__walk_animate     (void);
+static void player__walk_pose        (void *animator, player_pose *pose);
+static void player__walk_post_animate(void);
+static void player__walk_im_gui      (void);
+static void player__walk_bind        (void);
+static void player__walk_transition  (void);
+static void player__walk_reset       (void);
+static void player__walk_restore     (void);
+static void player__walk_animator_exchange( bitpack_ctx *ctx, void *data );
+
+struct player_subsystem_interface static player_subsystem_walk = {
+   .system_register = player__walk_register,
+   .bind = player__walk_bind,
+   .pre_update = player__walk_pre_update,
+   .update = player__walk_update,
+   .post_update = player__walk_post_update,
+   .im_gui = player__walk_im_gui,
+   .animate = player__walk_animate,
+   .post_animate = player__walk_post_animate,
+   .pose = player__walk_pose,
+   .network_animator_exchange = player__walk_animator_exchange,
+
+   .animator_data = &player_walk.animator,
+   .animator_size = sizeof(player_walk.animator),
+   .name = "Walk"
+};
 
 #endif /* PLAYER_WALK_H */