m3x3_mulv( player->basis, inf->v, inf->v );
inf->land_dist = d[0] / (cosf(a0)*m);
inf->gravity = gravity;
+
+ v3_copy( target, inf->log[inf->log_length ++] );
}
if( fabsf(a1-a) < max_angle_delta ){
m3x3_mulv( player->basis, inf->v, inf->v );
inf->land_dist = d[0] / (cosf(a1)*m);
inf->gravity = gravity;
+
+ v3_copy( target, inf->log[inf->log_length ++] );
}
}
v3_cross( v0, v1, inf->n );
v3_normalize( inf->n );
#endif
+ /* TODO:
+ * grind predictions, we want to FORCE it to land in the correct
+ * location, taking the cloest endpoint or midpoint to be the
+ * snapper.
+ */
inf->type = k_prediction_land;
int valid_count =
create_jumps_to_hit_target( player, grind_jumps, grind.co,
- 0.25f*VG_PIf, grind_located_gravity );
+ 0.175f*VG_PIf, grind_located_gravity );
+
+ /* knock out original landing points in the 1m area
+ * TODO: Make this a konstant */
+ for( u32 j=0; j<s->possible_jump_count; j++ ){
+ jump_info *jump = &s->possible_jumps[ j ];
+ float dist = v3_dist2( jump->log[jump->log_length-1], grind.co );
+ float descale = 1.0f-vg_minf(1.0f,dist);
+ jump->score += descale*3.0f;
+ }
for( int i=0; i<valid_count; i++ ){
jump_info *jump = &grind_jumps[i];
v3_muladds( co0, basis[1], -0.5f * jump->gravity * t*t, co0 );
v3_add( launch_co, co0, co0 );
+#if 0
/* rough scan to make sure we dont collide with anything */
for( int j=1; j<=16; j++ ){
t = (float)j*(1.0f/16.0f);
v3_copy( co1, co0 );
}
+#endif
v3_copy( grind.n, jump->n );
s->possible_jumps[ s->possible_jump_count ++ ] = *jump;
+#if 0
continue;
invalidated_grind:;
+#endif
}
}
v2_normalize_clamp( steer );
s->state.gravity_bias = best->gravity;
+ if( best->type == k_prediction_grind ){
+ s->state.activity = k_skate_activity_air_to_grind;
+ }
+
if( (fabsf(steer[1]) > 0.5f) && (s->land_dist >= 1.5f) ){
s->state.flip_rate = (1.0f/s->land_dist) * vg_signf(steer[1]) *
s->state.reverse ;
{
struct player_skate *s = &player->_skate;
- if( s->state.activity_prev != k_skate_activity_air )
+ if( s->state.activity_prev > k_skate_activity_air_to_grind )
player__approximate_best_trajectory( player );
float angle = v3_dot( player->rb.to_world[1], s->land_normal );
v3_muladds( s->board_trick_residuald, s->board_trick_residualv,
k_rb_delta, s->board_trick_residuald );
- if( s->state.activity == k_skate_activity_air ){
+ if( s->state.activity <= k_skate_activity_air_to_grind ){
if( v3_length2( s->state.trick_vel ) < 0.0001f )
return;
float rate = 26.0f,
top = 1.0f;
- if( s->state.activity == k_skate_activity_air ){
+ if( s->state.activity <= k_skate_activity_air_to_grind ){
rate = 6.0f * fabsf(steer);
top = 1.5f;
}
s->state.charging_jump = player->input_jump->button.value;
/* Cannot charge this in air */
- if( s->state.activity == k_skate_activity_air ){
+ if( s->state.activity <= k_skate_activity_air_to_grind ){
s->state.charging_jump = 0;
return;
}
v3_normalize( jumpdir );
}else{
v3_copy( s->state.up_dir, jumpdir );
+ s->state.activity = k_skate_activity_ground;
+ s->grind_cooldown = 0;
+
+ float tilt = player->input_js1h->axis.value * 0.3f;
+ tilt *= vg_signf(v3_dot( player->rb.v, s->grind_dir ));
+
+ v4f qtilt;
+ q_axis_angle( qtilt, s->grind_dir, tilt );
+ q_mulv( qtilt, jumpdir, jumpdir );
}
float force = k_jump_force*s->state.jump_charge;
v3_muladds( player->rb.v, jumpdir, force, player->rb.v );
s->state.jump_charge = 0.0f;
s->state.jump_time = vg.time;
- s->state.activity = k_skate_activity_air;
v2f steer = { player->input_js1h->axis.value,
player->input_js1v->axis.value };
v2_normalize_clamp( steer );
- skate_apply_air_model( player );
-
-#if 0
- float maxspin = k_steer_air * k_rb_delta * k_spin_boost;
- s->state.steery_s = -steer[0] * maxspin;
- s->state.steerx = s->state.steerx_s;
- s->state.lift_frames ++;
-#endif
audio_lock();
audio_oneshot_3d( &audio_jumps[rand()%2], player->rb.co, 40.0f, 1.0f );
}
int trick_id;
- if( (s->state.activity == k_skate_activity_air) &&
+ if( (s->state.activity <= k_skate_activity_air_to_grind) &&
(trick_id = player_skate_trick_input( player )) )
{
if( (vg.time - s->state.jump_time) < 0.1f ){
for( int i=0; i<s->possible_jump_count; i++ ){
jump_info *jump = &s->possible_jumps[i];
+
+ if( jump->log_length == 0 ){
+ vg_fatal_exit_loop( "assert: jump->log_length == 0\n" );
+ }
for( int j=0; j<jump->log_length - 1; j ++ ){
float brightness = jump->score*jump->score*jump->score;
audio_lock();
- float air = s->state.activity == k_skate_activity_air? 1.0f: 0.0f,
+ float air = s->state.activity <= k_skate_activity_air_to_grind? 1.0f: 0.0f,
speed = v3_length( player->rb.v ),
attn = vg_minf( 1.0f, speed*0.1f ),
slide = vg_clampf( fabsf(s->state.slip), 0.0f, 1.0f ),
v3_lerp( s->state.up_dir, target,
8.0f * s->substep_delta, s->state.up_dir );
}
- else if( s->state.activity == k_skate_activity_air )
- {
+ else if( s->state.activity <= k_skate_activity_air_to_grind ){
v3_lerp( s->state.up_dir, player->rb.to_world[1],
8.0f * s->substep_delta, s->state.up_dir );
}
- else
- {
+ else{
v3_lerp( s->state.up_dir, player->basis[1],
12.0f * s->substep_delta, s->state.up_dir );
}
if( (fabsf(local_co[2]) <= k_board_length) && /* within wood area */
(local_co[1] >= 0.0f) && /* at deck level */
- (fabsf(local_dir[0]) >= 0.5f) ) /* perpendicular to us */
+ (fabsf(local_dir[0]) >= 0.25f) ) /* perpendicular to us */
{
if( fabsf(v3_dot( player->rb.v, inf->dir )) < k_grind_axel_min_vel )
return 0;
struct player_skate *s = &player->_skate;
/* debounces this state manager a little bit */
- if( s->frames_since_activity_change < 10 )
- {
- s->frames_since_activity_change ++;
+ if( s->grind_cooldown < 20 ){
+ s->grind_cooldown ++;
return k_skate_activity_undefined;
}
res_front50 = 0,
res_slide = 0;
- if( s->state.activity == k_skate_activity_grind_boardslide )
- {
+ if( s->state.activity == k_skate_activity_grind_boardslide ){
res_slide = skate_boardslide_renew( player, &inf_slide );
}
- else if( s->state.activity == k_skate_activity_grind_back50 )
- {
+ else if( s->state.activity == k_skate_activity_grind_back50 ){
res_back50 = skate_grind_truck_renew( player, 1.0f, &inf_back50 );
res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
}
- else if( s->state.activity == k_skate_activity_grind_front50 )
- {
+ else if( s->state.activity == k_skate_activity_grind_front50 ){
res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
}
- else if( s->state.activity == k_skate_activity_grind_5050 )
- {
+ else if( s->state.activity == k_skate_activity_grind_5050 ){
res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
}
- else
- {
+ else{
res_slide = skate_boardslide_entry( player, &inf_slide );
res_back50 = skate_grind_truck_entry( player, 1.0f, &inf_back50 );
res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
- if( res_back50 != res_front50 )
- {
+ if( res_back50 != res_front50 ){
int wants_to_do_that = fabsf(player->input_js1v->axis.value) >= 0.25f;
res_back50 &= wants_to_do_that;
if( new_activity == k_skate_activity_undefined )
{
+#if 0
if( s->state.activity >= k_skate_activity_grind_any )
s->frames_since_activity_change = 0;
+#endif
}
else if( new_activity == k_skate_activity_grind_boardslide )
{
float slap = 0.0f;
- if( s->state.activity == k_skate_activity_air ){
+ if( s->state.activity <= k_skate_activity_air_to_grind ){
float min_dist = 0.6f;
for( int i=0; i<2; i++ ){
}
}
min_dist -= 0.2f;
- float o = vg_clampf( min_dist/0.5f, 0.0f, 1.0f );
+ float vy = v3_dot( player->basis[1], player->rb.v );
+ vy = vg_maxf( 0.0f, vy );
-#if 0
- float jump_t = vg.time - s->state.jump_time;
- jump_t = vg_minf( o, 1.0f );
-#endif
+ slap = vg_clampf( (min_dist/0.5f) + vy, 0.0f, 1.0f )*0.3f;
- slap = o*0.3f;//vg_minf((1.0f-fabsf(2.0f*jump_t-1.0f))*8.0f,1.0f) * 0.3f;
wheels[0].pos[1] = slap;
wheels[1].pos[1] = slap;
}
skate_weight_distribute( player );
}
else{
- s->state.activity = k_skate_activity_air;
+ if( s->state.activity > k_skate_activity_air_to_grind )
+ s->state.activity = k_skate_activity_air;
+
v3_zero( s->weight_distribution );
skate_apply_air_model( player );
}
const char *activity_txt[] =
{
"air",
+ "air_to_grind",
"ground",
"undefined (INVALID)",
"grind_any (INVALID)",
/* movement information */
{
- int iair = s->state.activity == k_skate_activity_air;
+ int iair = s->state.activity <= k_skate_activity_air_to_grind;
float dirz = s->state.reverse > 0.0f? 0.0f: 1.0f,
dirx = s->state.slip < 0.0f? 0.0f: 1.0f,
float substep = vg_clampf( vg.accumulator / VG_TIMESTEP_FIXED, 0.0f, 1.0f );
v4f qflip;
- if( (s->state.activity == k_skate_activity_air) &&
+ if( (s->state.activity <= k_skate_activity_air_to_grind) &&
(fabsf(s->state.flip_rate) > 0.01f) )
{
float t = s->state.flip_time;
{
struct player_skate *s = &player->_skate;
- if( s->state.activity == k_skate_activity_air )
+ if( s->state.activity <= k_skate_activity_air_to_grind )
s->blend_fly = 1.0f;
else
s->blend_fly = 0.0f;