From edac8fb2acb3431d1e17ce5f7ed198d2c8fdcafe Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 16 Mar 2025 15:01:51 +0000 Subject: [PATCH] getting up, redoing challenges, spawn directions --- content_skaterift/maps/dev_tutorial/main.mdl | Bin 4762592 -> 4770248 bytes content_skaterift/maps/mp_mtzero/before.mdl | Bin 11305952 -> 11306008 bytes content_skaterift/maps/mp_mtzero/main.mdl | Bin 16354328 -> 16354384 bytes content_skaterift/maps/mp_spawn/main.mdl | Bin 14425768 -> 14425912 bytes skaterift_blender/sr_main.py | 16 +- skaterift_blender/sr_mdl.py | 2 +- src/control_overlay.c | 1 + src/ent_challenge.c | 145 +++++++++++-------- src/ent_challenge.h | 1 + src/ent_objective.c | 42 +++--- src/ent_region.c | 3 - src/entity.h | 6 +- src/player.c | 8 +- src/player.h | 1 + src/player_dead.c | 104 ++++++++----- src/player_dead.h | 1 + src/player_replay.c | 70 +++++++-- src/player_replay.h | 2 + src/player_skate.c | 8 +- src/player_walk.c | 15 +- src/player_walk.h | 1 + src/skaterift.c | 2 + src/world.h | 3 +- src/world_entity.c | 24 ++- src/world_map.c | 2 - src/world_render.c | 16 +- src/world_volumes.c | 6 +- 27 files changed, 302 insertions(+), 177 deletions(-) diff --git a/content_skaterift/maps/dev_tutorial/main.mdl b/content_skaterift/maps/dev_tutorial/main.mdl index 5264be9352af4263057570bebd0075ccf41adcfc..e4564566892264226b9a070009d4a14f4eb04477 100644 GIT binary patch delta 14610 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 diff --git a/content_skaterift/maps/mp_mtzero/before.mdl b/content_skaterift/maps/mp_mtzero/before.mdl index 117556a8392b41753ee67c5dca7f46d3d2fcd8bb..67de6d32e1b10778b7c9ac46a51846f4f1507b3f 100644 GIT binary patch delta 1235 zcmYMwS4{n0)o9@?~00o1$)7QcpfL5UXkMv?0^Nko?`(kcCdwb zDkjFD#Kibuf>D9^U@$RJpVT+wlmA7Hll;D&-T7vBGfgG;%%%J8nUBRq7Q_l6g%G&` zzssAI%k0mv1}EyWJh)u9RooXMoQGC;GTj*-d%)>;+1*AjF&NZkRq&23zXV_EwzO&? z+VHpqoZdi&+m#zIYQ`v3QtHyGY-EZWD|zuNA!F>>j7z&JCknJ=1h8+M+&aQJM%>zqBY@LWFES zxPSlS$hN!PPH&d+KZR$ve;Bg#j=L)# zg+{)8Eah|cRO z+N$Pxb*)7fOH&7-l_W<<7*`Woz>Jn?h1O_;FtkNGv_}VYgazSr+Fc5<<7(r`iCLJ9IY`A^%)@*vz(Op-Vl2T@EJGTWV+B@X71FU98CU~5 z*1~~III#{{$c78+u>o#);Drwxkpn++5kMX`As+?Uj4jxTZP<<-*oi_Ep%}Zc8+))9 zCD@1kIDmsVgu^(3qd0~jjzi%DPT~|!qZDO0gR?k?^SFSED90sS#uZ$}HC)FHRG<f0LJl|2dkne3pSSL3X9mWS5y=`Sh0%@mfaN=x5)0QSg~UPWgQE4>^(8A z5se4pNlY{`QGs|cdJ=DXLr?x6$|S!p^WJ!0s2QV7NvTV-vXWUULvrvtAxx~aw;c|zv#m-zSEck4RTWvF?$K^|FNB$u zTo`Bj3rk#%kbA3(=LYpn>Zax7>zT=_n~lP$Gs ziKffV%1hR&qqNPxgovWq=YQK__qqah9vH>ym8NSgaq5efq&1k;A1%q+8ZX;^T>E_- z#deR!slO|1|nOLp^?$9+@?u^^vTMWPW@p<#YA> z(+F~KV?Ft!(U@DBjLd1Omv196&D*rdLX2c@_-O&R* z(F?ti2n&*+qYtd;i)5t0hE()J8v0`Z24WBfV+e*K9m6mjBQO%9FdAbp7UM7;6EG1O zn1sogf=o=sG-P2qW?&{}VK(MqF0zq>d6UR@MAMd5kL?jY{6D+Lm9SX2X&O&`iuys7%MH z?kp=PE3xQBb?u=|(^AWv_7Gn=^O;yePyD0Lr{6^Fd_LcEwtId%JD(d09g2%!@t~Bj zO9&~1s0>tid?l59>KZk{3|)qTQ*=jYq!fL4Xh&I*H^0mX6jyi*Z>%c_26Y(@HtRAP z+^9R!M@un)$E_@cQsV_9rOm6W=4DhG46a!C%(lR{%B9kIHi*lSeBQbwnmP8U`S znWL(SIx@GbcC*`6mw5cXld;HC`{;sMbjP5HYxhEdHU?ia%0A+n0m6N%UV^& z98z`EB3={SsaKvp+h29&;*-=Gx>B`=xj~(vZcoxg9A(<6+Ndh>`11?Bo^l}~YM4#e zL~k|GmMYto$Hr9xdqsNR)RS+y+$fyJug;9TmPT8mD1t1%Lz z;KDT+jWNhTCbE!?YmtMoaN{~$k8v1}3Ah0_A{RGdB5uYcOvWv^6}RDb+<`lhhbg!V zcjF%1i~Ep|0vNa-g(yNXrlJI;@ZbSVgBNA+!H;rGM+GVoKouUu3_OHt%)~4_jM;bu zb5Mi1cog&S7#_!bEI=*l@C2U3Q&@&8oiVyBa!%3BMFXX1%fm3FC)*R#tvM;#Hmlv=B{-eB^f*g(>2n^} z%{>N5(V53Sq-5kIrjq(I|MDp*b!ky%W|WGST$~_<#z`dnb#{u~I?tc7>eOsHk6O<3 zsh!l`g$?y^P8;e}TV_UmEaFr(-4^v9)1tyP-E66m!ouPGyB%59Irm~=QSq8C<5W6x zhFVJP4bVhWY7gq~&dhCm@i0|E7pbb4Y3eSuCs-2!l$Lw7H8-)dZzJ;kP=XyqB~HI!K3JlNc6*FcpUvP z08d~bq7aQIF$jYZgCQ7-SPa8ccpAeo0wXaBqcH|!F%Hk*S&YX7#33FN@f;>$GM>i^ zNWc_K#WcK#>39i=m;ozZMiP>df>)4=G}tf`vtUO$GLVTZ%tkgG$U!b%#T?AVJiLZH zTNU1y-U6POO5$YOKLp7;s@7)?))U;$3XQ zW^6$*w&Fd!k8RkF9ryq{QG#9AjZ%DwkMJ?d@Co){FZN+S-0+JuF!6Uzbt zk#pTCV`d+DWT6rt5+&g; zgfPdO;?fdQQdxhGLoSd!RQYnHcSL0ble)FZ4zq^hH1P#{l@j9|0JMKm`4N6LHW(HeiVNm1^8HUB@NHx;5FH2v;)cf#nl@t66z9Lhg!Ts`!UCa` zU__c%5lLTy-GBP3{OTAqhZ6qx%l}>Mchyji)WMRf(vpsF(vyLV zWFj+J$VxV{lY^Y(A~$)+OFr^bfPxevg2EJ`D8(pF2}%-46s0Il8OlHNAm8eV= zqNz$Xs#AlS)S@_iqVW=EaQkJj`2(&o{3CiGEV_oaPK?ImdaDxWGj&k<4YTaFuIZCxsi_= k_challenge_state_running) ) { return k_entity_call_result_OK; } @@ -46,7 +46,7 @@ entity_call_result ent_challenge_call( world_instance *world, ent_call *call ) 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" ); } } } @@ -55,7 +55,7 @@ entity_call_result ent_challenge_call( world_instance *world, ent_call *call ) } 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) ) { @@ -74,6 +74,66 @@ entity_call_result ent_challenge_call( world_instance *world, ent_call *call ) } } +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; @@ -99,24 +159,8 @@ void ent_challenge_update(void) _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 ) { @@ -167,51 +211,26 @@ void ent_challenge_update(void) 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; } } } @@ -230,7 +249,7 @@ void _ent_challenge_ui( ui_context *ctx ) 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; @@ -242,8 +261,12 @@ void _ent_challenge_ui( ui_context *ctx ) 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 ); diff --git a/src/ent_challenge.h b/src/ent_challenge.h index 4751c11..36ae1b6 100644 --- a/src/ent_challenge.h +++ b/src/ent_challenge.h @@ -3,3 +3,4 @@ entity_call_result ent_challenge_call( world_instance *world, ent_call *call ); void _ent_challenge_ui( ui_context *ctx ); +void _restart_active_challenge(void); diff --git a/src/ent_objective.c b/src/ent_objective.c index c1750c8..5891d83 100644 --- a/src/ent_objective.c +++ b/src/ent_objective.c @@ -96,29 +96,35 @@ entity_call_result ent_objective_call( world_instance *world, ent_call *call ) 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" ); + } } } } diff --git a/src/ent_region.c b/src/ent_region.c index 425b101..35df0b1 100644 --- a/src/ent_region.c +++ b/src/ent_region.c @@ -104,9 +104,6 @@ void ent_region_re_eval( world_instance *world ) { ent_challenge *challenge = af_arritm( &world->ent_challenge, index ); - if( challenge->flags & k_ent_challenge_is_story ) - continue; - u32 flags = 0x00; if( challenge->status ) { diff --git a/src/entity.h b/src/entity.h index fbc1c9e..ec43135 100644 --- a/src/entity.h +++ b/src/entity.h @@ -628,7 +628,8 @@ enum ent_objective_filter{ 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 @@ -648,7 +649,7 @@ 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, }; @@ -668,6 +669,7 @@ struct ent_challenge u32 camera_id; u32 status; + u32 reset_spawn_id; }; struct ent_relay { diff --git a/src/player.c b/src/player.c index b3c3f47..f4fdc17 100644 --- a/src/player.c +++ b/src/player.c @@ -34,7 +34,8 @@ struct localplayer localplayer = .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[] = @@ -361,6 +362,11 @@ void player__reset(void) 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(); } diff --git a/src/player.h b/src/player.h index 6b10f65..caff55b 100644 --- a/src/player.h +++ b/src/player.h @@ -89,6 +89,7 @@ struct localplayer int deferred_frame_record; int immobile; + bool immunity; int rewinded_since_last_gate; /* diff --git a/src/player_dead.c b/src/player_dead.c index dd2b9ae..f416121 100644 --- a/src/player_dead.c +++ b/src/player_dead.c @@ -26,9 +26,9 @@ void player__dead_update(void) 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; @@ -43,23 +43,44 @@ void player__dead_post_update(void){ 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; @@ -75,7 +96,8 @@ void player__dead_animate(void){ v3_copy( localplayer.rb.co, animator->transforms[0].co ); /* colliders with bones transforms */ - for( int i=0; ipart_count; i++ ){ + for( int i=0; ipart_count; i++ ) + { struct ragdoll_part *part = &rd->parts[i]; m4x3f mtx; @@ -95,10 +117,12 @@ void player__dead_animate(void){ } /* bones without colliders transforms */ - for( u32 i=1; ibone_count; i++ ){ + for( u32 i=1; ibone_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 ); @@ -112,7 +136,8 @@ void player__dead_animate(void){ } /* measurements */ - for( u32 i=1; ibone_count; i++ ){ + for( u32 i=1; ibone_count; i++ ) + { struct skeleton_bone *sb = &sk->bones[i]; v3_zero( animator->transforms[i].co ); @@ -126,8 +151,7 @@ void player__dead_animate(void){ 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 ); } } @@ -143,7 +167,8 @@ void player__dead_pose( void *_animator, player_pose *pose ) v3_copy( animator->transforms[0].co, pose->root_co ); v4_copy( animator->transforms[0].q, pose->root_q ); - for( u32 i=1; ibone_count; i++ ){ + for( u32 i=1; ibone_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 ); @@ -164,12 +189,8 @@ void player__dead_transition( enum player_die_type type ) 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 ); @@ -180,21 +201,36 @@ void player__dead_transition( enum player_die_type 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; itransforms[i].co ); bitpack_qquat( ctx, animator->transforms[i].q ); } diff --git a/src/player_dead.h b/src/player_dead.h index b86c586..30d9a72 100644 --- a/src/player_dead.h +++ b/src/player_dead.h @@ -16,6 +16,7 @@ struct player_dead animator; skeleton_anim anim_bail; + struct gui_helper *helper_getup; } extern player_dead; extern struct player_subsystem_interface player_subsystem_dead; diff --git a/src/player_replay.c b/src/player_replay.c index f0ad6d4..e06ddfe 100644 --- a/src/player_replay.c +++ b/src/player_replay.c @@ -759,27 +759,49 @@ void skaterift_replay_post_render(void) 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(); } } } @@ -876,6 +898,28 @@ static void replay_fly_edit_keyframe( ui_context *ctx, replay_keyframe *kf ) 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 */ diff --git a/src/player_replay.h b/src/player_replay.h index 313b4d4..f84a767 100644 --- a/src/player_replay.h +++ b/src/player_replay.h @@ -102,6 +102,8 @@ struct replay_globals replay_keyframe keyframes[32]; u32 keyframe_count; i32 active_keyframe; + + f32 reset_timer; } extern player_replay; diff --git a/src/player_skate.c b/src/player_skate.c index fb25787..2eb37fa 100644 --- a/src/player_skate.c +++ b/src/player_skate.c @@ -1277,13 +1277,11 @@ void player__skate_pre_update(void){ 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; } diff --git a/src/player_walk.c b/src/player_walk.c index 03fe56b..fe136bf 100644 --- a/src/player_walk.c +++ b/src/player_walk.c @@ -1223,18 +1223,21 @@ void player__walk_transition( bool grounded, f32 board_yaw ){ 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 ){ diff --git a/src/player_walk.h b/src/player_walk.h index b740a8c..50c1a7c 100644 --- a/src/player_walk.h +++ b/src/player_walk.h @@ -112,3 +112,4 @@ void player__walk_restore (void); 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); diff --git a/src/skaterift.c b/src/skaterift.c index 7a9f745..3ec7873 100644 --- a/src/skaterift.c +++ b/src/skaterift.c @@ -247,6 +247,8 @@ void vg_post_update(void) vehicle_update_post(); skaterift_autosave_update(); + + localplayer.immunity = 0; } /* diff --git a/src/world.h b/src/world.h index 7b8a288..dad0421 100644 --- a/src/world.h +++ b/src/world.h @@ -274,7 +274,8 @@ struct world_static { k_challenge_state_none = 0, k_challenge_state_viewing, - k_challenge_state_running + k_challenge_state_running, + k_challenge_state_fail } challenge_state; diff --git a/src/world_entity.c b/src/world_entity.c index 0fa08f5..279667a 100644 --- a/src/world_entity.c +++ b/src/world_entity.c @@ -658,22 +658,16 @@ void world_entity_start( world_instance *world, vg_msg *sav ) 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 ); } } diff --git a/src/world_map.c b/src/world_map.c index d8ee256..2a89476 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -638,8 +638,6 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al 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)); diff --git a/src/world_render.c b/src/world_render.c index f9d395b..44fa862 100644 --- a/src/world_render.c +++ b/src/world_render.c @@ -506,7 +506,7 @@ static void world_render_challenges( world_instance *world, struct world_pass *p 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 ); @@ -563,7 +563,7 @@ static void world_render_challenges( world_instance *world, struct world_pass *p 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; @@ -611,12 +611,9 @@ static void world_render_challenges( world_instance *world, struct world_pass *p for( u32 i=0; ient_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]; @@ -638,9 +635,6 @@ static void world_render_challenges( world_instance *world, struct world_pass *p 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 ); diff --git a/src/world_volumes.c b/src/world_volumes.c index d111264..d3dbcf7 100644 --- a/src/world_volumes.c +++ b/src/world_volumes.c @@ -15,7 +15,8 @@ void world_volumes_update( world_instance *world, v3f pos ) 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}}; @@ -111,6 +112,9 @@ void world_volumes_update( world_instance *world, v3f pos ) 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 ); -- 2.25.1