+VG_STATIC int player_skate_event( player_device *dev, player_interface *player,
+ enum player_device_event_type ev,
+ void *data )
+{
+ struct player_device_skate *s = dev->storage;
+
+ if( ev == k_player_device_event_bind )
+ player_skate_bind( dev, player );
+ else if( ev == k_player_device_event_respawn )
+ player_skate_reset( dev, player, data );
+ else if( ev == k_player_device_event_pre_update )
+ {
+ if( vg_input_button_down( player->input_use ) )
+ {
+ struct device_transition_walk inf;
+ v3_copy( player->cam.angles, inf.angles );
+ inf.angles[2] = 0.0f;
+
+ player_transition_to_device( player, s->device_id_walk, &inf );
+ return 1;
+ }
+ }
+ else if( ev == k_player_device_event_custom_transition )
+ {
+ /* transition coming in from walking */
+ struct device_transition_skateboard *inf = data;
+
+ q_axis_angle( player->rb.q, (v3f){0.0f,1.0f,0.0f},
+ atan2f( inf->dir[0], inf->dir[2] ) );
+ v3_copy( player->cam.pos, s->state.posl );
+
+ m3x3f temp;
+ euler_m3x3( player->cam.angles, temp );
+ v3_muls( temp[2], -1.0f, s->state.dirl );
+
+ rb_update_transform( &player->rb );
+ v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
+ v3_copy( player->rb.v, s->state.cog_v );
+ }
+ else if( ev == k_player_device_event_update )
+ {
+ player_skate_update( dev, player );
+ }
+ else if( ev == k_player_device_event_post_update )
+ {
+ for( int i=0; i<s->prediction_count; i++ )
+ {
+ struct land_prediction *p = &s->predictions[i];
+
+ for( int j=0; j<p->log_length - 1; j ++ )
+ vg_line( p->log[j], p->log[j+1], p->colour );
+
+ vg_line_cross( p->log[p->log_length-1], p->colour, 0.25f );
+
+ v3f p1;
+ v3_add( p->log[p->log_length-1], p->n, p1 );
+ vg_line( p->log[p->log_length-1], p1, 0xffffffff );
+
+ vg_line_pt3( p->apex, 0.02f, 0xffffffff );
+ }
+
+ vg_line_pt3( s->state.apex, 0.200f, 0xff0000ff );
+ vg_line_pt3( s->state.apex, 0.201f, 0xff00ffff );
+ }
+ else if( ev == k_player_device_event_animate )
+ {
+ player_skate_animate( dev, player );
+ }
+ else if( ev == k_player_device_event_post_animate )
+ {
+ player_skate_post_animate( dev, player );
+ }
+ else if( ev == k_player_device_event_debug_ui )
+ {
+ player_skate_ui( dev, player );
+ }
+ else
+ return 0;
+
+ return 1;
+}
+