grind phys
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
index 61a1391261e758f913c77fe5b46bb8b0f45ebaab..0edbbdd44493b66ca2f29808c65edf1dcc68b90f 100644 (file)
--- a/player.h
+++ b/player.h
@@ -2,6 +2,10 @@
  * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
  */
 
+/*
+ * TODO: Tilt camera down to face borde when its behind you or out of vision
+ */
+
 #ifndef PLAYER_H
 #define PLAYER_H
 
@@ -14,7 +18,9 @@
 #include "bvh.h"
 
 VG_STATIC float 
-   k_walkspeed             = 12.0f,  /* no longer used */
+   k_walkspeed             = 12.0f,
+   k_air_accelerate        = 20.0f,
+
    k_runspeed              = 20.0f,
    k_board_radius          = 0.3f,
    k_board_length          = 0.45f,
@@ -29,7 +35,7 @@ VG_STATIC float
    k_steer_air             = 3.6f,
    k_steer_air_lerp        = 0.3f,
    k_pump_force            = 0.0f,
-   k_downforce             = 5.0f,
+   k_downforce             = 8.0f,
    k_walk_downforce        = 8.0f,
    k_jump_charge_speed     = (1.0f/1.0f),
    k_jump_force            = 5.0f,
@@ -62,14 +68,15 @@ VG_STATIC struct gplayer
       v3f a, v_last, m, bob, vl;
 
       /* Utility */
-      float vswitch, slip, slip_last,
-            reverse;
+      float vswitch, slip, slip_last, reverse;
 
       float grab, jump, pushing, push_time;
       v2f grab_mouse_delta;
 
+      int lift_frames;
+
       double start_push;
-      int in_air, on_board, jump_charge, jump_dir;
+      int in_air, on_board, jump_charge, jump_dir, grind;
 
       m3x3f vr,vr_pstep;
    }
@@ -97,6 +104,7 @@ VG_STATIC struct gplayer
                         *input_js2v,
                         *input_jump,
                         *input_push,
+                        *input_walk,
                         *input_walkh,
                         *input_walkv,
                         *input_switch_mode,
@@ -135,7 +143,8 @@ VG_STATIC struct gplayer
          walk_timer,
          fjump,
          fonboard,
-         frun;
+         frun,
+         fgrind;
 
    float walk;
    int step_phase;
@@ -226,7 +235,8 @@ VG_STATIC void player_init(void)                                            /* 1
    player.input_js2h = vg_create_named_input( "grab-h", k_input_type_axis );
    player.input_js2v = vg_create_named_input( "grab-v", k_input_type_axis );
    player.input_jump = vg_create_named_input( "jump", k_input_type_button );
-   player.input_push = vg_create_named_input( "push", k_input_type_axis_norm );
+   player.input_push = vg_create_named_input( "push", k_input_type_button );
+   player.input_walk = vg_create_named_input( "walk", k_input_type_button );
 
    player.input_walkh = vg_create_named_input( "walk-h", 
                                                k_input_type_axis );
@@ -256,8 +266,11 @@ VG_STATIC void player_init(void)                                            /* 1
       "bind jump space",
       "bind jump gp-a",
 
-      "bind  push gp-lt",
-      "bind +push w",
+      "bind push gp-b",
+      "bind push w",
+
+      "bind walk shift",
+      "bind walk gp-ls",
       
       "bind  walk-h  gp-ls-h",
       "bind  walk-v -gp-ls-v",
@@ -289,13 +302,21 @@ VG_STATIC void player_init(void)                                            /* 1
    });
 
    vg_convar_push( (struct vg_convar){
-      .name = "walk_speed",
+      .name = "gwalk_speed",
       .data = &k_walkspeed,
       .data_type = k_convar_dtype_f32,
       .opt_f32 = { .clamp = 0 },
       .persistent = 0
    });
 
+   vg_convar_push( (struct vg_convar){
+      .name = "air_accelerate",
+      .data = &k_air_accelerate,
+      .data_type = k_convar_dtype_f32,
+      .opt_f32 = { .clamp = 0 },
+      .persistent = 0
+   });
+
    vg_convar_push( (struct vg_convar){
       .name = "run_speed",
       .data = &k_runspeed,
@@ -365,15 +386,51 @@ VG_STATIC void player_save_rewind_frame(void)
    }
 }
 
+
+/* disaster */
+VG_STATIC int         menu_enabled(void);
+#include "menu.h"
+
 /*
  * Free camera movement
  */
 VG_STATIC void player_mouseview(void)
 {
-   if( ui_want_mouse() )
+   if( menu_enabled() )
       return;
 
    v2_muladds( player.angles, vg.mouse_delta, 0.0025f, player.angles );
+
+   if( vg_input.controller_should_use_trackpad_look )
+   {
+      static v2f last_input;
+      static v2f vel;
+      static v2f vel_smooth;
+
+      v2f input = { player.input_js2h->axis.value,
+                    player.input_js2v->axis.value };
+
+      if( (v2_length2(last_input) > 0.001f) && (v2_length2(input) > 0.001f) )
+      {
+         v2_sub( input, last_input, vel );
+         v2_muls( vel, 1.0f/vg.time_delta, vel );
+      }
+      else
+      {
+         v2_zero( vel );
+      }
+
+      v2_lerp( vel_smooth, vel, vg.time_delta*8.0f, vel_smooth );
+      
+      v2_muladds( player.angles, vel_smooth, vg.time_delta, player.angles );
+      v2_copy( input, last_input );
+   }
+   else
+   {
+      player.angles[0] += player.input_js2h->axis.value * vg.time_delta * 4.0f;
+      player.angles[1] += player.input_js2v->axis.value * vg.time_delta * 4.0f;
+   }
+
    player.angles[1] = vg_clampf( player.angles[1], -VG_PIf*0.5f, VG_PIf*0.5f );
 }
 
@@ -387,7 +444,7 @@ VG_STATIC void player_update_pre(void)
       return;
    }
 
-   if( vg_input_button_down( player.input_reset ) )
+   if( vg_input_button_down( player.input_reset ) && !menu_enabled() )
    {
       if( player.is_dead )
       {
@@ -451,7 +508,7 @@ VG_STATIC void player_update_pre(void)
       }
    }
 
-   if( vg_input_button_down( player.input_switch_mode ) )
+   if( vg_input_button_down( player.input_switch_mode ) && !menu_enabled() )
    {
       phys->on_board ^= 0x1;
 
@@ -473,7 +530,7 @@ VG_STATIC void player_update_pre(void)
       player_mouseview();
 }
 
-VG_STATIC void player_update_fixed(void)                                    /* 2 */
+VG_STATIC void player_update_fixed(void)                                 /* 2 */
 {
    if( player.rewinding )
       return;