X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_skate.c;h=6b5bdfb993b4dc0f16cab22400407dec183f311c;hb=73adac381b2c72f08293416a960942dc40db3c7f;hp=87c8cba7483e9ea22e07e042b967e34189eb4309;hpb=d43d7f62ff83799b6d99221d881179814cb239a6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_skate.c b/player_skate.c index 87c8cba..6b5bdfb 100644 --- a/player_skate.c +++ b/player_skate.c @@ -6,6 +6,7 @@ #include "vg/vg_perlin.h" #include "menu.h" #include "ent_skateshop.h" +#include "addon.h" VG_STATIC void player__skate_bind( player_instance *player ) { @@ -261,7 +262,7 @@ too_many_samples: v3_copy( average_normal, inf->n ); v3_copy( average_direction, inf->dir ); - vg_line_pt3( inf->co, 0.02f, VG__GREEN ); + vg_line_point( inf->co, 0.02f, VG__GREEN ); vg_line_arrow( inf->co, average_direction, 0.3f, VG__GREEN ); vg_line_arrow( inf->co, inf->n, 0.2f, VG__CYAN ); @@ -850,6 +851,10 @@ VG_STATIC void skate_apply_steering_model( player_instance *player ) rate = 35.0f; top = 1.5f; } + + if( grab < 0.5f ){ + top *= 1.0f+v3_length( s->state.throw_v )*k_mmthrow_steer; + } } float current = v3_dot( player->rb.to_world[1], player->rb.w ), @@ -977,7 +982,7 @@ VG_STATIC void skate_apply_jump_model( player_instance *player ) s->state.jump_time = vg.time; audio_lock(); - audio_oneshot_3d( &audio_jumps[vg_randu32()%2], player->rb.co, 40.0f, 1.0f ); + audio_oneshot_3d( &audio_jumps[vg_randu32()%2], player->rb.co,40.0f,1.0f); audio_unlock(); } } @@ -1175,7 +1180,7 @@ VG_STATIC void player__skate_post_update( player_instance *player ) v3_add( jump->log[jump->log_length-1], jump->n, p1 ); vg_line( jump->log[jump->log_length-1], p1, 0xffffffff ); - vg_line_pt3( jump->apex, 0.02f, 0xffffffff ); + vg_line_point( jump->apex, 0.02f, 0xffffffff ); } audio_lock(); @@ -2082,8 +2087,19 @@ VG_STATIC void player__skate_update( player_instance *player ) struct player_skate *s = &player->_skate; world_instance *world = world_current_instance(); + if( world->water.enabled ){ + if( player->rb.co[1]+0.25f < world->water.height ){ + audio_oneshot_3d( &audio_splash, player->rb.co, 40.0f, 1.0f ); + player__skate_kill_audio( player ); + player__dead_transition( player ); + return; + } + } + v3_copy( player->rb.co, s->state.prev_pos ); s->state.activity_prev = s->state.activity; + v3f normal_total; + v3_zero( normal_total ); struct board_collider { @@ -2117,7 +2133,6 @@ VG_STATIC void player__skate_update( player_instance *player ) float slap = 0.0f; if( s->state.activity <= k_skate_activity_air_to_grind ){ - float min_dist = 0.6f; for( int i=0; i<2; i++ ){ v3f wpos, closest; @@ -2139,9 +2154,6 @@ VG_STATIC void player__skate_update( player_instance *player ) wheels[1].pos[1] = s->state.slap; - - - const int k_wheel_count = 2; s->substep = k_rb_delta; @@ -2335,8 +2347,7 @@ begin_collision:; s->substep -= s->substep_delta; rb_ct manifold[128]; - int manifold_len = 0; - + int manifold_len = 0; /* * Phase -1: head detection * -------------------------------------------------------------------------- @@ -2404,7 +2415,7 @@ begin_collision:; manifold_len += l; if( vg_lines.draw ) - debug_capsule( mtx, capsule.radius, capsule.height, VG__WHITE ); + vg_line_capsule( mtx, capsule.radius, capsule.height, VG__WHITE ); /* add limits */ if( s->state.activity >= k_skate_activity_grind_any ){ @@ -2426,7 +2437,7 @@ begin_collision:; v3f world_cog; m4x3_mulv( player->rb.to_world, s->weight_distribution, world_cog ); - vg_line_pt3( world_cog, 0.02f, VG__BLACK ); + vg_line_point( world_cog, 0.02f, VG__BLACK ); for( int i=0; isubstep_delta ); @@ -2488,6 +2499,7 @@ begin_collision:; v3f impulse; v3_muls( ct->n, lambda, impulse ); + v3_muladds( normal_total, impulse, inv_mass, normal_total ); v3_muladds( player->rb.v, impulse, inv_mass, player->rb.v ); v3_cross( delta, impulse, impulse ); m3x3_mulv( iIw, impulse, impulse ); @@ -2514,6 +2526,24 @@ begin_collision:; * -------------------------------------------------------------------------- */ + f32 nforce = v3_length(normal_total); + if( nforce > 4.0f ){ + if( nforce > 17.6f ){ + v3_muladds( player->rb.v, normal_total, -1.0f, player->rb.v ); + player__dead_transition(player); + player__skate_kill_audio(player); + return; + } + + f32 amt = k_cam_punch; + if( player->camera_mode == k_cam_firstperson ){ + amt *= 0.25f; + } + + v3_muladds( player->cam_land_punch_v, normal_total, amt, + player->cam_land_punch_v ); + } + s->surface = k_surface_prop_concrete; for( int i=0; irb.to_world, mtx ); m4x3_mulv( player->rb.to_world, wheels[i].pos, mtx[3] ); - debug_sphere( mtx, wheels[i].radius, - (u32[]){ VG__WHITE, VG__BLACK, + vg_line_sphere( mtx, wheels[i].radius, + (u32[]){ VG__WHITE, VG__BLACK, wheels[i].colour }[ wheels[i].state ]); } skate_integrate( player ); - vg_line_pt3( s->state.cog, 0.02f, VG__WHITE ); + vg_line_point( s->state.cog, 0.02f, VG__WHITE ); ent_gate *gate = world_intersect_gates(world, player->rb.co, s->state.prev_pos ); @@ -2596,8 +2626,7 @@ begin_collision:; } } -VG_STATIC void player__skate_im_gui( player_instance *player ) -{ +VG_STATIC void player__skate_im_gui( player_instance *player ){ struct player_skate *s = &player->_skate; player__debugtext( 1, "V: %5.2f %5.2f %5.2f",player->rb.v[0], player->rb.v[1], @@ -2969,7 +2998,9 @@ VG_STATIC void player__skate_animate( player_instance *player, q_mul( kf_board->q, qtrick, kf_board->q ); q_normalize( kf_board->q ); - struct player_board *board = player_get_player_board( player ); + struct player_board *board = + addon_cache_item_if_loaded( k_addon_type_board, + player->board_view_slot ); if( board ){ /* foot weight distribution */