("first_objective_id",c_uint32),
("camera_id",c_uint32),
("status",c_uint32),
- ("visible_when_unlocked_id",c_uint32)]
+ ("reset_spawn_id",c_uint32)]
sr_functions = { 0: 'win',
1: 'view',
-1: 'unview' }
type=bpy.types.Object, name="Visibile when unlocked", \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_list']))
+ reset_spawn: bpy.props.PointerProperty( \
+ type=bpy.types.Object, name="Reset spawn", \
+ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_spawn']))
+
+
@staticmethod
def sr_inspector( layout, data ):
#{
layout.prop( data[0], 'alias' )
layout.prop( data[0], 'camera', text=("Camera" if not data[0].is_story else "Related Objective") )
layout.prop( data[0], 'first', text=("First Objective") )
- #layout.prop( data[0], 'visible_when_unlocked' )
+ layout.prop( data[0], 'reset_spawn' )
layout.prop( data[0], 'time_limit' )
- layout.prop( data[0], 'is_story' )
+ # layout.prop( data[0], 'is_story' )
SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target', text="On Activate" )
SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'complete', text="On Complete" )
#}
cv_draw_arrow( obj.location, data.complete.location, (0.1,0.9,0) )
if data.first:
cv_draw_arrow( obj.location, data.first.location, (1,0.6,0.2) )
+ if data.reset_spawn:
+ #{
+ cv_draw_line_dotted( obj.location, data.reset_spawn.location, (0,1,0) )
+ cv_draw_arrow( data.reset_spawn.location, data.reset_spawn.matrix_world @ Vector((0,3,0)), (0,1,0) )
+ #}
cc1 = (0.4,0.3,0.2)
info_cu = Vector((1.2,0.01,0.72))*0.5
challenge.first_objective_id = sr_entity_id( obj_data.first )
challenge.camera_id = sr_entity_id( obj_data.camera )
challenge.status = 0
- #challenge.visible_when_unlocked_id = sr_entity_id( obj_data.visible_when_unlocked )
+ challenge.reset_spawn_id = sr_entity_id( obj_data.reset_spawn )
sr_ent_push( challenge )
#}
elif ent_type == 'ent_list':
if( !control_overlay.enabled ) return;
if( skaterift.activity != k_skaterift_default ) return;
if( _cutscene.state != k_cutscene_state_none ) return;
+ if( localplayer.subsystem == k_player_subsystem_dead ) return;
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
return k_entity_call_result_OK;
}
- if( (_world.event == k_world_event_challenge) && (_world.challenge_state == k_challenge_state_running) )
+ if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) )
{
return k_entity_call_result_OK;
}
gui_helper_reset( 1 );
vg_str text;
if( gui_new_helper( input_button_list[k_srbind_maccept], &text ))
- vg_strcat( &text, (challenge->flags & k_ent_challenge_is_story)? "Play video": "View Challenge" );
+ vg_strcat( &text, "View Challenge" );
}
}
}
}
else if( call->function == -1 ) /* unview() */
{
- if( _world.challenge_state != k_challenge_state_running )
+ if( _world.challenge_state < k_challenge_state_running )
{
if( !(challenge->flags & k_ent_challenge_locked) )
{
}
}
+void _restart_active_challenge(void)
+{
+ world_instance *world = &_world.main;
+
+ u32 index = mdl_entity_id_id( _world.active_challenge_id );
+ ent_challenge *challenge = af_arritm( &world->ent_challenge, index );
+
+ srinput.state = k_input_state_resume;
+
+ u32 first_objective_index = mdl_entity_id_id( challenge->first_objective_id );
+ _world.challenge_state = k_challenge_state_running;
+ _world.challenge_target = af_arritm( &world->ent_objective, first_objective_index );
+ _world.challenge_timer = 0.0f;
+
+ u32 next = challenge->first_objective_id;
+ while( mdl_entity_id_type(next) == k_ent_objective )
+ {
+ u32 index = mdl_entity_id_id( next );
+ ent_objective *objective = af_arritm(&world->ent_objective,index);
+ objective->flags &= ~(k_ent_objective_passed|k_ent_objective_failed);
+ next = objective->id_next;
+ v3_fill( objective->transform.s, 1.0f );
+ }
+ vg_audio_lock();
+ vg_audio_oneshot( &audio_challenge[5], 1.0f, 0.0f, 0, 0 );
+ vg_audio_unlock();
+
+ if( challenge->reset_spawn_id )
+ {
+ if( mdl_entity_id_type( challenge->reset_spawn_id ) == k_ent_spawn )
+ {
+ ent_spawn *spawn = af_arritm( &world->ent_spawn, mdl_entity_id_id( challenge->reset_spawn_id ) );
+ v3f fwd = {0,0,-1}, angles;
+ q_mulv( spawn->transform.q, fwd, fwd );
+ v3_angles( fwd, angles );
+ localplayer.angles[0] = angles[0];
+ player__setpos( spawn->transform.co );
+ v3_zero( localplayer.rb.v );
+ v3_zero( localplayer.rb.w );
+
+ f32 l = v4_length( localplayer.rb.q );
+ if( (l < 0.9f) || (l > 1.1f) )
+ q_identity( localplayer.rb.q );
+
+ rb_update_matrices( &localplayer.rb );
+
+ localplayer.subsystem = k_player_subsystem_walk;
+ player__walk_reset();
+
+ localplayer.immobile = 0;
+ localplayer.gate_waiting = NULL;
+ localplayer.have_glider = 0;
+ localplayer.glider_orphan = 0;
+ localplayer.drowned = 0;
+
+ v3_copy( localplayer.rb.co, localplayer.cam_control.tpv_lpf );
+ }
+ }
+}
+
void ent_challenge_update(void)
{
world_instance *world = &_world.main;
_world.challenge_state = k_challenge_state_running;
localplayer.immobile = 0; /* TODO: Unify this probably after eating some potats */
menu.disable_open = 0;
- srinput.state = k_input_state_resume;
- u32 first_objective_index = mdl_entity_id_id( challenge->first_objective_id );
- _world.challenge_target = af_arritm( &world->ent_objective, first_objective_index );
- _world.challenge_timer = 0.0f;
-
- u32 next = challenge->first_objective_id;
- while( mdl_entity_id_type(next) == k_ent_objective )
- {
- u32 index = mdl_entity_id_id( next );
- ent_objective *objective = af_arritm(&world->ent_objective,index);
- objective->flags &= ~k_ent_objective_passed;
- next = objective->id_next;
- v3_fill( objective->transform.s, 1.0f );
- }
- vg_audio_lock();
- vg_audio_oneshot( &audio_challenge[5], 1.0f, 0.0f, 0, 0 );
- vg_audio_unlock();
+ _restart_active_challenge();
if( challenge->on_activate_id )
{
vg_audio_oneshot_3d( &audio_challenge[6], localplayer.rb.co, 30.0f, 1.0f, 0, 0 );
vg_audio_unlock();
vg_info( "Challenge expired due to player being out of range.\n" );
+ gui_helper_reset( k_gui_helper_mode_clear );
}
}
}
else if( _world.challenge_state == k_challenge_state_none )
{
- if( challenge->flags & k_ent_challenge_is_story )
+ if( button_down( k_srbind_maccept ) )
{
- if( button_down( k_srbind_maccept ) )
- {
- if( challenge->on_activate_id )
- {
- srinput.state = k_input_state_resume;
- gui_helper_reset( k_gui_helper_mode_clear );
- ent_call call;
- call.data = NULL;
- call.function = challenge->on_activate_event;
- call.id = challenge->on_activate_id;
- entity_call( &_world.main, &call );
+ srinput.state = k_input_state_resume;
+ gui_helper_reset( k_gui_helper_mode_clear );
+ vg_str text;
+ if( gui_new_helper( input_button_list[k_srbind_maccept], &text ))
+ vg_strcat( &text, "Start" );
+ if( gui_new_helper( input_button_list[k_srbind_mback], &text ))
+ vg_strcat( &text, "Exit" );
- if( world_clear_event( k_world_event_challenge ) )
- {
- _world.challenge_state = k_challenge_state_none;
- _world.active_challenge_id = 0;
- gui_helper_reset( k_gui_helper_mode_clear );
- }
- }
- }
- }
- else
- {
- if( button_down( k_srbind_maccept ) )
- {
- srinput.state = k_input_state_resume;
- gui_helper_reset( k_gui_helper_mode_clear );
- vg_str text;
- if( gui_new_helper( input_button_list[k_srbind_maccept], &text ))
- vg_strcat( &text, "Start" );
- if( gui_new_helper( input_button_list[k_srbind_mback], &text ))
- vg_strcat( &text, "Exit" );
-
- localplayer.immobile = 1;
- menu.disable_open = 1;
- srinput.state = k_input_state_resume;
- _world.challenge_state = k_challenge_state_viewing;
- }
+ localplayer.immobile = 1;
+ menu.disable_open = 1;
+ srinput.state = k_input_state_resume;
+ _world.challenge_state = k_challenge_state_viewing;
}
}
}
ui_rect description_box = { vg.window_x - (w + 8), 8, w, 32 };
ctx->font = &vgf_default_large;
- if( _world.challenge_state != k_challenge_state_running )
+ if( !(_world.challenge_state >= k_challenge_state_running) )
description_box[1] += 48;
u32 next = challenge->first_objective_id;
if( objective->pstr_description_ui )
{
- bool passed = (objective->flags & k_ent_objective_passed)? 1: 0;
- u32 colour = passed? ui_colour(ctx,k_ui_yellow): 0xffcccccc;
+ u32 colour = 0xffcccccc;
+ if( objective->flags & k_ent_objective_passed )
+ colour = ui_colour(ctx,k_ui_yellow);
+
+ if( objective->flags & k_ent_objective_failed )
+ colour = ui_colour(ctx,k_ui_red);
ui_fill( ctx, description_box, ui_opacity( GUI_COL_DARK, 0.36f ) );
ui_outline( ctx, description_box, 1, colour, 0 );
entity_call_result ent_challenge_call( world_instance *world, ent_call *call );
void _ent_challenge_ui( ui_context *ctx );
+void _restart_active_challenge(void);
if( call->function == 0 )
{
- if( objective->flags & (k_ent_objective_hidden|k_ent_objective_passed))
+ if( (_world.event == k_world_event_challenge) && (_world.challenge_state == k_challenge_state_running) )
{
- return k_entity_call_result_OK;
- }
-
- if( _world.challenge_target )
- {
- if( (_world.challenge_target == objective) && ent_objective_check_filter( objective ))
+ if( objective->flags & (k_ent_objective_hidden|k_ent_objective_passed|k_ent_objective_failed))
{
- ent_objective_pass( world, objective );
+ return k_entity_call_result_OK;
}
- else
- {
- vg_audio_lock();
- vg_audio_oneshot_3d( &audio_challenge[6], localplayer.rb.co, 30.0f, 1.0f, 0, 0 );
- vg_audio_unlock();
- vg_error( "challenge failed, filter was not met\n" );
- if( world_clear_event( k_world_event_challenge ) )
+ if( _world.challenge_target )
+ {
+ if( (_world.challenge_target == objective) && ent_objective_check_filter( objective ))
+ {
+ ent_objective_pass( world, objective );
+ }
+ else
{
- _world.active_challenge_id = 0;
- _world.challenge_target = NULL;
- _world.challenge_timer = 0.0f;
+ vg_audio_lock();
+ vg_audio_oneshot_3d( &audio_challenge[6], localplayer.rb.co, 30.0f, 1.0f, 0, 0 );
+ vg_audio_unlock();
+ vg_error( "challenge failed, filter was not met\n" );
+ objective->flags |= k_ent_objective_failed;
+ _world.challenge_state = k_challenge_state_fail;
+
+ gui_helper_reset( k_gui_helper_mode_black_bars );
+ vg_str str;
+ struct gui_helper *helper;
+ if( (helper = gui_new_helper(input_button_list[k_srbind_reset], &str)) )
+ {
+ vg_strcat( &str, "Retry" );
+ }
}
}
}
{
ent_challenge *challenge = af_arritm( &world->ent_challenge, index );
- if( challenge->flags & k_ent_challenge_is_story )
- continue;
-
u32 flags = 0x00;
if( challenge->status )
{
enum ent_objective_flag
{
k_ent_objective_hidden = 0x1,
- k_ent_objective_passed = 0x2
+ k_ent_objective_passed = 0x2,
+ k_ent_objective_failed = 0x4
};
struct ent_objective
enum ent_challenge_flag
{
k_ent_challenge_timelimit = 0x1,
- k_ent_challenge_is_story = 0x2,
+ //k_ent_challenge_is_story = 0x2,
k_ent_challenge_locked = 0x4,
};
u32 camera_id;
u32 status;
+ u32 reset_spawn_id;
};
struct ent_relay {
.q = { 0,0,0,1 },
.to_world = M4X3_IDENTITY,
.to_local = M4X3_IDENTITY
- }
+ },
+ .immunity = 1 /* just for one frame */
};
struct player_subsystem_interface *player_subsystems[] =
void player__spawn( ent_spawn *rp )
{
+ v3f fwd = {0,0,-1}, angles;
+ q_mulv( rp->transform.q, fwd, fwd );
+ v3_angles( fwd, angles );
+ localplayer.angles[0] = angles[0];
+
player__setpos( rp->transform.co );
player__reset();
}
int deferred_frame_record;
int immobile;
+ bool immunity;
int rewinded_since_last_gate;
/*
world_water_player_safe( world, 0.2f );
}
-void player__dead_post_update(void){
- struct ragdoll_part *part =
- &localplayer.ragdoll.parts[ localplayer.id_hip-1 ];
+void player__dead_post_update(void)
+{
+ struct ragdoll_part *part = &localplayer.ragdoll.parts[ localplayer.id_hip-1 ];
struct player_dead *d = &player_dead;
v3f ext_co;
v3_zero( localplayer.rb.v );
v3_zero( localplayer.rb.w );
- if( (skaterift.activity == k_skaterift_default) &&
- button_down(k_srbind_dead_respawn) ){
- ent_spawn *spawn = world_find_closest_spawn(
- &_world.main, localplayer.rb.co );
-
- if( spawn ){
- v3_copy( spawn->transform.co, localplayer.rb.co );
- player__reset();
- srinput.state = k_input_state_resume;
- }
- else {
- vg_error( "No spawns!\n" );
+ if( v3_length( d->v_lpf ) < 0.5f )
+ {
+ if( player_dead.helper_getup )
+ player_dead.helper_getup->greyed = 0;
+
+ if( button_down(k_srbind_skate) )
+ {
+ localplayer.subsystem = k_player_subsystem_walk;
+ player__walk_transition( 0, 0.0f );
+ player__walk_upright();
+
+ if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) )
+ {
+ vg_audio_lock();
+ vg_audio_oneshot_3d( &audio_challenge[6], localplayer.rb.co, 30.0f, 1.0f, 0, 0 );
+ vg_audio_unlock();
+ vg_error( "Challenge failed.\n" );
+
+ if( world_clear_event( k_world_event_challenge ) )
+ {
+ _world.active_challenge_id = 0;
+ _world.challenge_target = NULL;
+ _world.challenge_timer = 0.0f;
+ }
+ }
+
+ gui_helper_reset( k_gui_helper_mode_clear );
}
}
+ else
+ {
+ if( player_dead.helper_getup )
+ player_dead.helper_getup->greyed = 1;
+ }
}
-void player__dead_animate(void){
+void player__dead_animate(void)
+{
struct player_dead *d = &player_dead;
struct player_dead_animator *animator = &d->animator;
struct player_ragdoll *rd = &localplayer.ragdoll;
v3_copy( localplayer.rb.co, animator->transforms[0].co );
/* colliders with bones transforms */
- for( int i=0; i<rd->part_count; i++ ){
+ for( int i=0; i<rd->part_count; i++ )
+ {
struct ragdoll_part *part = &rd->parts[i];
m4x3f mtx;
}
/* bones without colliders transforms */
- for( u32 i=1; i<sk->bone_count; i++ ){
+ for( u32 i=1; i<sk->bone_count; i++ )
+ {
struct skeleton_bone *sb = &sk->bones[i];
- if( sb->parent && !sb->collider ){
+ if( sb->parent && !sb->collider )
+ {
v3f delta;
v3_sub( sk->bones[i].co, sk->bones[sb->parent].co, delta );
}
/* measurements */
- for( u32 i=1; i<sk->bone_count; i++ ){
+ for( u32 i=1; i<sk->bone_count; i++ )
+ {
struct skeleton_bone *sb = &sk->bones[i];
v3_zero( animator->transforms[i].co );
v3f _s;
m4x3_mul( inverse, transforms[i], local );
- m4x3_decompose( local, animator->transforms[i].co,
- animator->transforms[i].q, _s );
+ m4x3_decompose( local, animator->transforms[i].co, animator->transforms[i].q, _s );
}
}
v3_copy( animator->transforms[0].co, pose->root_co );
v4_copy( animator->transforms[0].q, pose->root_q );
- for( u32 i=1; i<sk->bone_count; i++ ){
+ for( u32 i=1; i<sk->bone_count; i++ )
+ {
v3_copy( animator->transforms[i].co, pose->keyframes[i-1].co );
v4_copy( animator->transforms[i].q, pose->keyframes[i-1].q );
v3_fill( pose->keyframes[i-1].s, 1.0f );
if( localplayer.subsystem == k_player_subsystem_dead )
return;
- static bool dont_ask = 1;
- if( dont_ask )
- {
- dont_ask = 0;
+ if( localplayer.immunity )
return;
- }
localplayer.subsystem = k_player_subsystem_dead;
copy_localplayer_to_ragdoll( &localplayer.ragdoll, type );
v3_copy( part->rb.w, player_dead.w_lpf );
gui_helper_reset( k_gui_helper_mode_black_bars );
+
vg_str str;
+ if( (player_dead.helper_getup = gui_new_helper(input_button_list[k_srbind_skate], &str) ))
+ {
+ vg_strcat( &str, "Get Up" );
- struct gui_helper *h;
- if( (h = gui_new_helper(input_button_list[k_srbind_reset], &str) ))
- vg_strcat( &str, "Rewind" );
+ if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) )
+ {
+ vg_strcat( &str, " (Exit challenge)" );
- if( gui_new_helper(input_button_list[k_srbind_dead_respawn], &str ))
- vg_strcat( &str, "Spawn" );
+ struct gui_helper *helper;
+ if( (helper = gui_new_helper(input_button_list[k_srbind_reset], &str)) )
+ {
+ vg_strcat( &str, "Retry" );
+ }
+ }
+
+ player_dead.helper_getup->greyed = 1;
+ }
+
+ //if( gui_new_helper(input_button_list[k_srbind_dead_respawn], &str ))
+ // vg_strcat( &str, "Spawn" );
}
void player__dead_animator_exchange( bitpack_ctx *ctx, void *data )
{
struct player_dead_animator *animator = data;
- for( u32 i=0; i<localplayer.skeleton.bone_count; i ++ ){
+ for( u32 i=0; i<localplayer.skeleton.bone_count; i ++ )
+ {
bitpack_qv3f( ctx, 24, -1024.0f, 1024.0f, animator->transforms[i].co );
bitpack_qquat( ctx, animator->transforms[i].q );
}
animator;
skeleton_anim anim_bail;
+ struct gui_helper *helper_getup;
}
extern player_dead;
extern struct player_subsystem_interface player_subsystem_dead;
return;
#endif
- /* capture the current resume frame at the very last point */
- if( button_down( k_srbind_reset ) )
+ if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) )
{
- if( _world.main.info.flags & k_world_flag_no_rewind )
+ if( button_press( k_srbind_reset ) )
{
- gui_location_print_ccmd( 1, (const char *[]){ KRED "Rewind is not allowed here.." } );
+ player_replay.reset_timer += vg.time_delta;
+
+ if( player_replay.reset_timer > 1.0f )
+ {
+ srinput.state = k_input_state_resume;
+ _restart_active_challenge();
+ player_replay.reset_timer = 0.0f;
+ gui_helper_reset( k_gui_helper_mode_clear );
+ }
}
else
{
- if( skaterift.activity == k_skaterift_default )
+ player_replay.reset_timer = 0.0f;
+ }
+ }
+ else
+ {
+ /* capture the current resume frame at the very last point */
+ if( button_down( k_srbind_reset ) )
+ {
+ if( _world.main.info.flags & k_world_flag_no_rewind )
+ {
+ gui_location_print_ccmd( 1, (const char *[]){ KRED "Rewind is not allowed here.." } );
+ }
+ else
{
- localplayer.rewinded_since_last_gate = 1;
- skaterift.activity = k_skaterift_replay;
- skaterift_record_frame( &player_replay.local, 1 );
- if( player_replay.local.head )
+ 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();
}
}
}
void skaterift_replay_imgui( ui_context *ctx )
{
+ if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) )
+ {
+ if( player_replay.reset_timer > 0.0f )
+ {
+ ui_rect box = { vg.window_x/2 - 200, vg.window_y - 200, 400, 100 };
+ ui_fill( ctx, box, ui_opacity( GUI_COL_DARK, 0.35f ) );
+ ui_outline( ctx, box, 1, GUI_COL_NORM, 0 );
+
+ ctx->font = &vgf_default_title;
+ ui_rect title = { box[0], box[1] + 16, box[2], box[3]-16 };
+ ui_text( ctx, box, "Retry?", 1, k_ui_align_center, 0 );
+
+ ui_rect bar = { box[0] + 8, (box[1] + box[3]) - (24+8), box[2] - 16, 24 };
+ ui_fill( ctx, bar, ui_opacity( GUI_COL_DARK, 0.8f ) );
+
+ ui_rect inner = { bar[0]+1, bar[1]+1, (f32)(bar[2]-2)*player_replay.reset_timer, bar[3]-2 };
+ ui_fill( ctx, inner, ui_colour( ctx, k_ui_yellow ) );
+
+ ctx->font = &vgf_default_small;
+ }
+ }
+
if( skaterift.activity != k_skaterift_replay ) return;
/* extra keys for entering editor */
replay_keyframe keyframes[32];
u32 keyframe_count;
i32 active_keyframe;
+
+ f32 reset_timer;
}
extern player_replay;
v3_add( newpos, (v3f){0.0f,-1.0f,0.0f}, newpos );
v3_sub( localplayer.rb.co, newpos, offset );
v3_copy( newpos, localplayer.rb.co );
- v3_muladds( localplayer.rb.co, localplayer.rb.to_world[1], -0.1f,
- localplayer.rb.co );
+ v3_muladds( localplayer.rb.co, localplayer.rb.to_world[1], -0.1f, localplayer.rb.co );
player__begin_holdout( offset );
- player__walk_transition( state->activity <= k_skate_activity_air_to_grind?
- 0: 1, state->trick_euler[0] );
-
+ player__walk_transition( state->activity <= k_skate_activity_air_to_grind? 0: 1, state->trick_euler[0] );
+ player__walk_upright();
return;
}
rb_update_matrices( &localplayer.rb );
}
+void player__walk_upright(void)
+{
+ v3f fwd = { 0.0f, 0.0f, 1.0f };
+ q_mulv( localplayer.rb.q, fwd, fwd );
+ q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, atan2f(fwd[0], fwd[2]) );
+ rb_update_matrices( &localplayer.rb );
+}
+
void player__walk_reset(void)
{
struct player_walk *w = &player_walk;
w->state.activity = k_walk_activity_air;
w->state.transition_t = 0.0f;
- v3f fwd = { 0.0f, 0.0f, 1.0f };
- q_mulv( localplayer.rb.q, fwd, fwd );
- q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f},
- atan2f(fwd[0], fwd[2]) );
-
- rb_update_matrices( &localplayer.rb );
+ player__walk_upright();
}
void player__walk_animator_exchange( bitpack_ctx *ctx, void *data ){
void player__walk_animator_exchange( bitpack_ctx *ctx, void *data );
void player__walk_transition( bool grounded, f32 board_yaw );
void player__walk_sfx_oneshot( u8 id, v3f pos, f32 volume );
+void player__walk_upright(void);
vehicle_update_post();
skaterift_autosave_update();
+
+ localplayer.immunity = 0;
}
/*
{
k_challenge_state_none = 0,
k_challenge_state_viewing,
- k_challenge_state_running
+ k_challenge_state_running,
+ k_challenge_state_fail
}
challenge_state;
ent_challenge *challenge = af_arritm( &world->ent_challenge, i );
const char *alias = af_str( &world->meta.af, challenge->pstr_alias );
- if( challenge->flags & k_ent_challenge_is_story )
- {
- }
- else
- {
- u32 result;
- vg_msg_getkvintg( sav, alias, k_vg_msg_u32, &result, NULL );
+ u32 result;
+ vg_msg_getkvintg( sav, alias, k_vg_msg_u32, &result, NULL );
- if( result )
- {
- ent_call call;
- call.data = NULL;
- call.function = 0;
- call.id = mdl_entity_id( k_ent_challenge, i );
- entity_call( world, &call );
- }
+ if( result )
+ {
+ ent_call call;
+ call.data = NULL;
+ call.function = 0;
+ call.id = mdl_entity_id( k_ent_challenge, i );
+ entity_call( world, &call );
}
}
else if( type == k_ent_challenge )
{
ent_challenge *challenge = af_arritm( &world->ent_challenge, index );
- if( challenge->flags & k_ent_challenge_is_story )
- continue;
vg_strnull( &str, buf, sizeof(buf) );
vg_strcat( &str, af_str( &world->meta.af,challenge->pstr_alias));
u32 objective_count = 0,
challenge_count = 0;
- if( (_world.event == k_world_event_challenge) && (_world.challenge_state == k_challenge_state_running) )
+ 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 );
f32 scale = 1.0f;
if( (_world.event == k_world_event_challenge) &&
- (_world.challenge_state == k_challenge_state_running || _world.challenge_state == k_challenge_state_viewing) )
+ (_world.challenge_state >= k_challenge_state_running || _world.challenge_state == k_challenge_state_viewing) )
{
u32 passed = objective->flags & k_ent_objective_passed;
f32 target = passed? 0.0f: 1.0f;
for( u32 i=0; i<af_arrcount(&world->ent_challenge); i++ )
{
ent_challenge *challenge = af_arritm( &world->ent_challenge, i );
- if( !(challenge->flags & k_ent_challenge_is_story) )
- {
- if( challenge->status )
- count ++;
- total ++;
- }
+ if( challenge->status )
+ count ++;
+ total ++;
}
char buf[32];
u32 index = challenge_list[ i ];
ent_challenge *challenge = af_arritm( &world->ent_challenge, index );
- if( challenge->flags & k_ent_challenge_is_story )
- continue;
-
m4x3f mmdl;
mdl_transform_m4x3( &challenge->transform, mmdl );
m4x3_mul( mmdl, mlocal, mmdl );
m4x3_mulv( volume->to_local, pos, local );
if( (fabsf(local[0]) <= 1.0f) &&
(fabsf(local[1]) <= 1.0f) &&
- (fabsf(local[2]) <= 1.0f) )
+ (fabsf(local[2]) <= 1.0f) &&
+ (localplayer.subsystem != k_player_subsystem_dead) )
{
_world.active_trigger_volumes[ j ++ ] = idx;
boxf cube = {{-1.0f,-1.0f,-1.0f},{1.0f,1.0f,1.0f}};
if( _world.active_trigger_volume_count > VG_ARRAY_LEN(_world.active_trigger_volumes) )
continue;
+ if( localplayer.subsystem == k_player_subsystem_dead )
+ continue;
+
v3f local;
m4x3_mulv( volume->to_local, pos, local );