wind_scale: bpy.props.FloatProperty(name="Wind Scale",default=0.5)
water_safe: bpy.props.BoolProperty(name="Water is Safe")
+ no_skating: bpy.props.BoolProperty(name="No Skating")
@staticmethod
def sr_inspector( layout, data ):
layout.prop( data[0], 'timezone' )
layout.prop( data[0], 'water_safe' )
+ layout.prop( data[0], 'no_skating' )
layout.prop( data[0], 'wind_scale' )
layout.prop( data[0], 'skybox' )
#}
if obj_data.water_safe:
flags |= 0x2
+ if obj_data.no_skating:
+ flags |= 0x4
+
worldinfo.flags = flags
worldinfo.pstr_skybox = _af_pack_string( obj_data.skybox )
worldinfo.wind_scale = obj_data.wind_scale
chit = { 1,0.5f,0.2f,0.8f };
if( condition )
+ {
if( press )
shader_model_menu_uColour( chit );
else
shader_model_menu_uColour( cnorm );
+ }
else
shader_model_menu_uColour( cdis );
}
}
else if( subsytem == k_player_subsystem_walk )
{
- colorize( press_y, player_walk.state.activity < k_walk_activity_inone );
+ bool allow = player_walk.state.activity < k_walk_activity_inone;
+ if( _world.main.info.flags & k_world_flag_no_skating )
+ allow = 0;
+ colorize( press_y, allow );
render_overlay_mesh( ov_text_y_skate );
}
else if( subsytem == k_player_subsystem_glide )
if( press_dpad_e )
render_overlay_mesh( ov_dpad_e );
- colorize( press_dpad_w, 1 );
+ colorize( press_dpad_w, !(_world.main.info.flags & k_world_flag_no_skating) );
render_overlay_mesh( ov_text_dw_rewind );
if( press_dpad_w )
render_overlay_mesh( ov_dpad_w );
}
else if( subsytem == k_player_subsystem_walk )
{
- colorize( press_e, player_walk.state.activity < k_walk_activity_inone );
+ bool allow = player_walk.state.activity < k_walk_activity_inone;
+ if( _world.main.info.flags & k_world_flag_no_skating )
+ allow = 0;
+ colorize( press_e, allow );
render_overlay_mesh( ov_text_skate );
}
shader_model_menu_uColour( cnorm );
shader_model_menu_uMdl( mmdl );
- colorize( press_r, 1 );
+ colorize( press_r, !(_world.main.info.flags & k_world_flag_no_skating) );
draw_key( press_r, 0 );
render_overlay_mesh( ov_text_rewind );
mmdl[3][2] = 1.0f - 0.125f;
- if( subsytem == k_player_subsystem_skate ||
- subsytem == k_player_subsystem_walk )
+ if( subsytem == k_player_subsystem_skate || subsytem == k_player_subsystem_walk )
{
shader_model_menu_uMdl( mmdl );
colorize( press_space, !in_air );
};
};
-struct ent_worldinfo{
+enum world_flag
+{
+ k_world_flag_fixed_time = 0x1,
+ k_world_flag_water_is_safe = 0x2,
+ k_world_flag_no_skating = 0x4
+};
+
+struct ent_worldinfo
+{
u32 pstr_name, pstr_author, pstr_desc;
f32 timezone;
u32 pstr_skybox;
/* capture the current resume frame at the very last point */
if( button_down( k_srbind_reset ) )
{
- if( skaterift.activity == k_skaterift_default )
+ if( _world.main.info.flags & k_world_flag_no_skating )
{
- localplayer.rewinded_since_last_gate = 1;
- skaterift.activity = k_skaterift_replay;
- skaterift_record_frame( &player_replay.local, 1 );
- if( player_replay.local.head )
+ gui_location_print_ccmd( 1, (const char *[]){ KRED "Rewind is not allowed here.." } );
+ }
+ else
+ {
+ if( skaterift.activity == k_skaterift_default )
{
- player_replay.local.cursor = player_replay.local.head->time;
- player_replay.local.cursor_frame = player_replay.local.head;
+ localplayer.rewinded_since_last_gate = 1;
+ skaterift.activity = k_skaterift_replay;
+ skaterift_record_frame( &player_replay.local, 1 );
+ if( player_replay.local.head )
+ {
+ player_replay.local.cursor = player_replay.local.head->time;
+ player_replay.local.cursor_frame = player_replay.local.head;
+ }
+ player_replay.replay_control = k_replay_control_scrub;
+ replay_show_helpers();
}
- player_replay.replay_control = k_replay_control_scrub;
- replay_show_helpers();
}
}
}
float t;
v3f n;
if( (v3_dist2( head_wp0, head_wp1 ) > 0.001f) &&
- (spherecast_world( world, head_wp0, head_wp1, 0.2f, &t, n,
- k_material_flag_walking ) != -1) )
+ (spherecast_world( world, head_wp0, head_wp1, 0.2f, &t, n, k_material_flag_walking ) != -1) )
{
v3_lerp( start_co, localplayer.rb.co, t, localplayer.rb.co );
rb_update_matrices( &localplayer.rb );
struct player_skate_animator *animator = _animator;
v3f vp0, vp1, vpc;
- if( board ){
+ if( board )
+ {
v3_copy((v3f){0.0f,0.02f, board->truck_positions[0][2]}, vp1 );
v3_copy((v3f){0.0f,0.02f, board->truck_positions[1][2]}, vp0 );
}
- else{
+ else
+ {
v3_zero( vp0 );
v3_zero( vp1 );
}
v3_add( vp0, vp1, vpc );
v3_muls( vpc, 0.5f, vpc );
- if( animator->surface == k_surface_prop_sand ){
- if( (animator->slide>0.4f) && (v3_length2(animator->root_v)>4.0f*4.0f) ){
+ if( animator->surface == k_surface_prop_sand )
+ {
+ if( (animator->slide>0.4f) && (v3_length2(animator->root_v)>4.0f*4.0f) )
+ {
v3f v, co;
v3_muls( animator->root_v, 0.5f, v );
v3_lerp( vp0, vp1, vg_randf64(&vg.rand), co );
}
}
- if( animator->grind > 0.5f ){
+ if( animator->grind > 0.5f )
+ {
int back = 0, front = 0, mid = 0;
- if( animator->activity == k_skate_activity_grind_5050 ){
+ if( animator->activity == k_skate_activity_grind_5050 )
+ {
back = 1;
front = 1;
}
- else if( animator->activity == k_skate_activity_grind_back50 ){
+ else if( animator->activity == k_skate_activity_grind_back50 )
back = 1;
- }
- else if( animator->activity == k_skate_activity_grind_front50 ){
+ else if( animator->activity == k_skate_activity_grind_front50 )
front = 1;
- }
- else if( animator->activity == k_skate_activity_grind_boardslide ){
+ else if( animator->activity == k_skate_activity_grind_boardslide )
mid = 1;
- }
- if( back ){
- effect_spark_apply( &effect_data->spark, vp0,
- animator->root_v, vg.time_delta );
- }
+ if( back )
+ effect_spark_apply( &effect_data->spark, vp0, animator->root_v, vg.time_delta );
- if( front ){
- effect_spark_apply( &effect_data->spark, vp1,
- animator->root_v, vg.time_delta );
- }
+ if( front )
+ effect_spark_apply( &effect_data->spark, vp1, animator->root_v, vg.time_delta );
- if( mid ){
- effect_spark_apply( &effect_data->spark, vpc,
- animator->root_v, vg.time_delta );
- }
+ if( mid )
+ effect_spark_apply( &effect_data->spark, vpc, animator->root_v, vg.time_delta );
}
}
-void player__skate_post_animate(void){
+void player__skate_post_animate(void)
+{
struct player_skate_state *state = &player_skate.state;
localplayer.cam_velocity_influence = 1.0f;
localplayer.cam_dist = 1.8f;
v3f head = { 0.0f, 1.8f, 0.0f };
- m4x3_mulv( localplayer.final_mtx[ localplayer.id_head ],
- head, state->head_position );
- m4x3_mulv( localplayer.rb.to_local,
- state->head_position, state->head_position );
+ m4x3_mulv( localplayer.final_mtx[ localplayer.id_head ], head, state->head_position );
+ m4x3_mulv( localplayer.rb.to_local, state->head_position, state->head_position );
}
-void player__skate_reset_animator(void){
+void player__skate_reset_animator(void)
+{
struct player_skate_state *state = &player_skate.state;
memset( &player_skate.animator, 0, sizeof(player_skate.animator) );
v3_zero( state->air_init_v );
v3_zero( state->air_init_co );
+ v3_copy( (v3f){0,0.8f,0}, state->head_position );
state->gravity_bias = k_gravity;
v3_copy( localplayer.rb.co, state->prev_pos );
#include "network_compression.h"
-void player__skate_animator_exchange( bitpack_ctx *ctx, void *data ){
+void player__skate_animator_exchange( bitpack_ctx *ctx, void *data )
+{
struct player_skate_animator *animator = data;
bitpack_qv3f( ctx, 24, -1024.0f, 1024.0f, animator->root_co );
bitpack_bytes( ctx, 1, &animator->activity );
}
-void player__skate_sfx_oneshot( u8 id, v3f pos, f32 volume ){
+void player__skate_sfx_oneshot( u8 id, v3f pos, f32 volume )
+{
audio_lock();
if( id == k_player_skate_soundeffect_jump ){
- audio_oneshot_3d( &audio_jumps[vg_randu32(&vg.rand)%2],
- pos, 40.0f, volume );
+ audio_oneshot_3d( &audio_jumps[vg_randu32(&vg.rand)%2], pos, 40.0f, volume );
}
else if( id == k_player_skate_soundeffect_tap ){
- audio_oneshot_3d( &audio_taps[vg_randu32(&vg.rand)%4],
- pos, 40.0f, volume );
+ audio_oneshot_3d( &audio_taps[vg_randu32(&vg.rand)%4], pos, 40.0f, volume );
}
else if( id == k_player_skate_soundeffect_land_good ){
- audio_oneshot_3d( &audio_lands[vg_randu32(&vg.rand)%3],
- pos, 40.0f, volume );
+ audio_oneshot_3d( &audio_lands[vg_randu32(&vg.rand)%3], pos, 40.0f, volume );
}
else if( id == k_player_skate_soundeffect_land_bad ){
- audio_oneshot_3d( &audio_lands[vg_randu32(&vg.rand)%2+3],
- pos, 40.0f, volume );
+ audio_oneshot_3d( &audio_lands[vg_randu32(&vg.rand)%2+3], pos, 40.0f, volume );
}
else if( id == k_player_skate_soundeffect_grind_metal ){
audio_oneshot_3d( &audio_board[3], pos, 40.0f, volume );
return v3_length2( (v3f){localplayer.rb.v[0], 0.0f, localplayer.rb.v[2]} );
}
-static void player_walk_generic_to_skate( enum skate_activity init, f32 yaw ){
+static void player_walk_generic_to_skate( enum skate_activity init, f32 yaw )
+{
localplayer.subsystem = k_player_subsystem_skate;
v3f v;
else return 0;
}
-static void player_walk_pre_sit(void){
+static void player_walk_pre_sit(void)
+{
struct player_walk *w = &player_walk;
v2f steer;
return;
}
-static void player_walk_pre_sit_up(void){
+static void player_walk_pre_sit_up(void)
+{
struct player_walk *w = &player_walk;
if( w->state.transition_t > 0.0f )
if( button_down( k_srbind_skate ) )
{
- if( player_walk_scan_for_drop_in() )
- w->state.activity = k_walk_activity_odrop_in;
+ if( _world.main.info.flags & k_world_flag_no_skating )
+ {
+ gui_location_print_ccmd( 1, (const char *[]){ KRED "Skating is not allowed here.." } );
+ }
else
- w->state.activity = k_walk_activity_oregular;
+ {
+ if( player_walk_scan_for_drop_in() )
+ w->state.activity = k_walk_activity_odrop_in;
+ else
+ w->state.activity = k_walk_activity_oregular;
- w->state.transition_t = 0.0f;
+ w->state.transition_t = 0.0f;
+ }
}
if( button_down( k_srbind_jump ) )
struct player_walk *w = &player_walk;
if( button_down( k_srbind_skate ) )
{
- w->state.activity = k_walk_activity_oair;
- w->state.transition_t = 0.0f;
+ if( _world.main.info.flags & k_world_flag_no_skating )
+ {
+ gui_location_print_ccmd( 1, (const char *[]){ KRED "Skating is not allowed here.." } );
+ }
+ else
+ {
+ w->state.activity = k_walk_activity_oair;
+ w->state.transition_t = 0.0f;
+ }
}
if( button_down( k_srbind_jump ) )
}
}
-static void player_walk_pre_drop_in(void){
+static void player_walk_pre_drop_in(void)
+{
struct player_walk *w = &player_walk;
bool finished = player__preupdate_anim( &w->anim_drop_in,
&w->state.transition_t, 1.0f );
player_walk_drop_in_to_skate();
}
-static void player_walk_pre_caveman(void){
+static void player_walk_pre_caveman(void)
+{
struct player_walk *w = &player_walk;
- bool finished = player__preupdate_anim( &w->anim_jump_to_air,
- &w->state.transition_t, 1.0f );
- if( finished ){
- player_walk_generic_to_skate( k_skate_activity_air,
- player_walk.animator.board_yaw );
+ bool finished = player__preupdate_anim( &w->anim_jump_to_air, &w->state.transition_t, 1.0f );
+ if( finished )
+ {
+ player_walk_generic_to_skate( k_skate_activity_air, player_walk.animator.board_yaw );
}
}
/*
* Render props attached to this material
*/
-static void world_render_props( world_instance *world, u32 material_id,
- struct world_pass *pass )
+static void world_render_props( world_instance *world, u32 material_id, struct world_pass *pass )
{
struct world_surface *mat = &world->surfaces[ material_id ];
if( !(mat->flags & WORLD_SURFACE_HAS_PROPS) ) return;
pass->fn_bind( world, mat );
- for( u32 j=0; j<af_arrcount( &world->ent_prop ); j++ ){
+ for( u32 j=0; j<af_arrcount( &world->ent_prop ); j++ )
+ {
ent_prop *prop = af_arritm( &world->ent_prop, j );
- if( prop->flags & 0x1 ) continue;
+ if( prop->flags & k_world_flag_fixed_time )
+ continue;
- world_render_submeshes( world, pass, &prop->transform,
- prop->submesh_start, prop->submesh_count, material_id );
+ world_render_submeshes( world, pass, &prop->transform, prop->submesh_start, prop->submesh_count, material_id );
}
}
/*
* Render traffic models attactched to this material
*/
-static void world_render_traffic( world_instance *world, u32 material_id,
- struct world_pass *pass )
+static void world_render_traffic( world_instance *world, u32 material_id,struct world_pass *pass )
{
struct world_surface *mat = &world->surfaces[ material_id ];
- if( !(mat->flags & WORLD_SURFACE_HAS_TRAFFIC) ) return;
+ if( !(mat->flags & WORLD_SURFACE_HAS_TRAFFIC) )
+ return;
pass->fn_bind( world, mat );
u32 objective_count = 0,
challenge_count = 0;
- u32 challenge_index = mdl_entity_id_id( _world.active_challenge_id );
- ent_challenge *challenge = af_arritm( &world->ent_challenge, challenge_index );
-
if( (_world.event == k_world_event_challenge) && (_world.challenge_state == k_challenge_state_running) )
{
+ u32 challenge_index = mdl_entity_id_id( _world.active_challenge_id );
+ ent_challenge *challenge = af_arritm( &world->ent_challenge, challenge_index );
+
shader_scene_fxglow_uUvOffset( (v2f){ 8.0f/256.0f, 0.0f } );
challenge_list[ challenge_count ++ ] = challenge_index;
bool world_water_player_safe( world_instance *world, f32 allowance )
{
- if( !world->water.enabled ) return 1;
- if( world->info.flags & 0x2 ) return 1;
+ if( !world->water.enabled )
+ return 1;
+ if( world->info.flags & k_world_flag_water_is_safe )
+ return 1;
if( localplayer.rb.co[1]+allowance < world->water.height )
{