From af9c6a075f8a94939c038c03184f77d93e0a26e4 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 1 May 2025 18:32:24 +0100 Subject: [PATCH] quick menu and some other shit --- content_skaterift/models/rs_overlay.mdl | Bin 480000 -> 495376 bytes src/control_overlay.c | 12 ++ src/ent_challenge.c | 1 + src/ent_route.c | 186 +++++++++--------------- src/ent_route.h | 1 + src/ent_skateshop.c | 7 +- src/input.h | 164 ++++++++++++--------- src/menu.c | 99 ++++++++++++- src/menu.h | 5 +- src/network.c | 2 +- src/player.c | 14 +- src/player.h | 5 +- src/player_dead.c | 3 - src/player_walk.c | 126 +++++++--------- src/replay2.c | 12 +- src/replay2.h | 1 + src/skaterift.c | 19 +-- src/world_load.c | 2 + src/world_routes.c | 1 + src/world_routes_ui.c | 2 - 20 files changed, 385 insertions(+), 277 deletions(-) diff --git a/content_skaterift/models/rs_overlay.mdl b/content_skaterift/models/rs_overlay.mdl index 96c6a96b60d3ec5a7726efe365d5c52dba251c6b..6027f62d8502dfca94c63c61b6729614afa16b04 100644 GIT binary patch delta 9975 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 V2Eg8Mm$OIw?}}Z!Cq$0a{tt|4-Yx(D delta 1396 zcmYjRZD?Cn7(Q>BH0QR-mb6WqwzpZ@x=>+C&9%1fsH{??Xc^rmGRJ1Un&`5nX_uu^ zVQPlO4{(y~-H(A&Hc-(KKgOo3Qo+G~3<;wXe<)1oU_a&$WrP0c4+lQy?i4)mKKFUg z^StNgob%pPK1q~6?-@NHgh(R72pf?rWU}*ku8#@{;g>?-Ar6;{xx%Z5*Clb%5@M!0 z+7US2ugSiSw-z6{=ZwQMoykv4yQOR~=jL_Eve6<&D`n?PbH%Kd#0oS$Mi9ErEuzwh z>)Nc*UYaS~D?+}mnKhr8atk?B=4J~269-J;!R+g=6y0gBSQq}25Mt11uVsrRP;ZnQ z8pVgZs#n{`7k323Aa<@dKkL4H&=|bOt(`#;1@jJOznjSxr!sEI^|Z4X+uVZV2UJ% z!-{O6!$-oB2Kny|j@4p*%otySx|{C;^Ze)rMP;4?p5Sx98oY`w^ZgqY{l;fDI#!pd zyNOKE8vh9lac4yNY#)A18y|?I@QP|g(HPJ<9+fny2|ot5S2L^6tdZxVQT@JZB*wo+ zQ`nvMZE2BsulA*kZ;21JD5~>Uz!m-rxXPPb_0C+N%^w2?`Hxl{X9IuTlC~Z+h0pSi zHodK5ZOT_};H!}||Jx?1!hx8gPk9u$$Zr7a`~z?W=vcZ_^_{QsL+#2Z{9I_?N^$-Y z$)HZs)>h+~;NA{J8Quq+2RdBukhH+m=~zz~Plcm#MW^)~m*bMY<@b>bC%Pn!@Mp*;`37)5(Ba8$iBr|=12FVV zmt$==Yt;B!x1ygpY%BVmFWKk`TheXKnsyqGXym8uw6)8m5xxs^lF#)xobS;M1ZF*F z)G=fV7pv7|LeeasNjSV0Y(Xhp?-<;kM%3x?cn)e`ukb~`di+OhHee$|A5Tf?(nent_camera, mdl_entity_id_id(cam_id) ), &temp ); world_set_entity_driven_camera( &temp ); } - - bool select_move = 0; - - /* TODO: Visual buttons like the board shops */ - if( button_down( k_srbind_mup ) ) - { - if( _ent_route.run_selection > 0 ) - { - _ent_route.run_selection --; - select_move = 1; - } - } - if( button_down( k_srbind_mdown ) ) - { - if( _ent_route.run_selection < 10 ) - { - _ent_route.run_selection ++; - select_move = 1; - } - } - - if( select_move ) - { - sfd_encode( (v2i){0,_ent_route.run_selection }, " ", k_world_sfd_left ); - sfd_encode( (v2i){0,_ent_route.run_selection + 1}, "AA", k_world_sfd_left ); - sfd_encode( (v2i){0,_ent_route.run_selection + 2}, " ", k_world_sfd_left ); - } - - if( button_down( k_srbind_maccept ) ) - { - if( _remote_replay.state != k_remote_replay_state_none ) - goto E0; - - struct leaderboard_cache *board = &world->leaderboard_cache[ mdl_entity_id_id( _ent_route.viewing_route_id ) ]; - vg_msg body; - vg_msg_init( &body, board->data, board->data_len ); - - vg_info( "Looking for the %u run\n", _ent_route.run_selection ); - - u32 l = 0; - - if( vg_msg_seekframe( &body, "rows" ) ) - { - while( vg_msg_seekframe( &body, NULL ) ) - { - const char *username = vg_msg_getkvstr( &body, "username" ); - vg_info( "%u: %s\n", l, username ); - - if( l == _ent_route.run_selection ) - { - u32 centiseconds; - vg_msg_getkvintg( &body, "time", k_vg_msg_u32, ¢iseconds, NULL ); - - i64 lastsec; - vg_msg_getkvintg( &body, "lastsec", k_vg_msg_i64, &lastsec, NULL ); - - u64 steamid; - vg_msg_getkvintg( &body, "steamid", k_vg_msg_u64, &steamid, NULL ); - - u32 last_minute = (u32)( lastsec / 60 ); - - // TODO: put this in a header - u32 minutes_span = (centiseconds+(200*60)) / (100*60); - vg_queue_clear( &_remote_replay.buffer ); - _remote_replay.min_frame_t = 0.0; - _remote_replay.total_chunks = minutes_span; - _remote_replay.chunks_downloaded = 0; - _remote_replay.steamid = steamid; - _remote_replay.state = k_remote_replay_state_init; - _remote_replay.last_second = lastsec; - - for( u32 i=0; iminute = last_minute - minutes_span + 1 + i; - chunk->state = k_chunk_state_none; - } - - // TODO: UI overlay for downlaoding - world_clear_event( k_world_event_route_leaderboard ); - srinput.state = k_input_state_resume; - gui_helper_reset( k_gui_helper_mode_clear ); - _replay2_open_player( k_replay_type_network, 0 ); - break; - } - else - { - l ++; - vg_msg_skip_frame( &body ); - } - } - } - } - -E0: if( button_down( k_srbind_mback ) ) { if( world_clear_event( k_world_event_route_leaderboard ) ) @@ -163,8 +62,21 @@ E0: } } +void _ent_route_imgui( ui_context *ctx ) +{ + if( _world.event != k_world_event_route_leaderboard ) + return; + + u32 index = mdl_entity_id_id( _ent_route.viewing_route_id ); + + ui_fill( ctx, (ui_rect){0,0,vg.window_x,vg.window_y}, 0x01ffffff ); + ui_px w = 500; + ent_route_leaderboard_ui( ctx, (ui_rect){ vg.window_x/2 - w/2, 64, w, 0 }, index ); +} + void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index ) { + ctx->font = &vgf_default_large; if( _ent_route.viewing_route_id != route_index ) { _ent_route.viewing_route_id = route_index; @@ -172,6 +84,9 @@ void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index _ent_route.cursor[1] = 0; } + if( vg_input.display_input_method == k_input_method_kbm ) + ui_capture_mouse(ctx, 1); + ui_rect leaderboard_box = { ref_box[0], ref_box[1] + ref_box[3] + 16, ref_box[2], 24 }; if( !network_connected() ) @@ -262,6 +177,9 @@ void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index u32 centiseconds; vg_msg_getkvintg( &body, "time", k_vg_msg_u32, ¢iseconds, NULL ); + i64 lastsec; + vg_msg_getkvintg( &body, "lastsec", k_vg_msg_i64, &lastsec, NULL ); + i32 seconds = centiseconds / 100, minutes = seconds / 60; @@ -274,26 +192,20 @@ void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index vg_strcati32r( &str, seconds, 2, '0' ); vg_strcat( &str, "." ); vg_strcati32r( &str, centiseconds, 2, '0' ); - ui_text( ctx, brr, buf, 1, k_ui_align_middle_center, 0 ); bool view_profile = 0, - view_replay = 0; + view_replay = 0, + hover_replay = 0; if( vg_input.display_input_method == k_input_method_controller ) { if( _ent_route.cursor[1] == count ) { if( _ent_route.cursor[0] == 0 ) - { - ui_outline( ctx, br, -1, ui_colour(ctx,k_ui_fg), 0 ); - - //if( button_down( k_srbind_maccept ) ) view_profile = 1; - } else if( _ent_route.cursor[0] == 1 ) { - ui_outline( ctx, brr, -1, ui_colour(ctx,k_ui_fg), 0 ); - + hover_replay = 1; if( button_down( k_srbind_maccept ) ) view_replay = 1; } @@ -303,20 +215,26 @@ void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index { enum ui_button_state state = ui_button_base( ctx, br ); if( state == k_ui_button_hover ) - { - ui_outline( ctx, br, -1, ui_colour(ctx,k_ui_fg), 0 ); view_profile = 1; - } state = ui_button_base( ctx, brr ); if( state == k_ui_button_hover ) - ui_outline( ctx, brr, -1, ui_colour(ctx,k_ui_fg), 0 ); + hover_replay = 1; if( state == k_ui_button_click ) view_replay = 1; } + if( hover_replay ) + { + ui_outline( ctx, brr, -1, ui_colour(ctx,k_ui_fg), 0 ); + vg_strcat( &str, " \xba" ); + } + + ui_text( ctx, brr, buf, 1, k_ui_align_middle_center, 0 ); + if( view_profile ) { + ui_outline( ctx, br, -1, ui_colour(ctx,k_ui_fg), 0 ); u64 steamid; vg_msg_getkvintg( &body, "steamid", k_vg_msg_u64, &steamid, NULL ); ui_px y = bl[1]; @@ -325,8 +243,46 @@ void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index _user_profile_ui( ctx, (ui_rect){ bl[0]-(360+8),y, 360,200 }, steamid ); } + if( view_replay ) + { + if( _remote_replay.state == k_remote_replay_state_none ) + { + skaterift.activity = k_skaterift_default; + + u32 last_minute = (u32)( lastsec / 60 ); + + // TODO: put this in a header + u32 minutes_span = (centiseconds+(200*60)) / (100*60); + vg_queue_clear( &_remote_replay.buffer ); + _remote_replay.min_frame_t = 0.0; + _remote_replay.total_chunks = minutes_span; + _remote_replay.chunks_downloaded = 0; + u64 steamid; + vg_msg_getkvintg( &body, "steamid", k_vg_msg_u64, &steamid, NULL ); + _remote_replay.steamid = steamid; + _remote_replay.state = k_remote_replay_state_init; + _remote_replay.last_second = lastsec; + + for( u32 i=0; iminute = last_minute - minutes_span + 1 + i; + chunk->state = k_chunk_state_none; + } + + world_clear_event( k_world_event_route_leaderboard ); + srinput.state = k_input_state_resume; + gui_helper_reset( k_gui_helper_mode_clear ); + _replay2_open_player( k_replay_type_network, 0 ); + } + } + count ++; vg_msg_skip_frame( &body ); } _ent_route.entries_max = count; + vg_ui.frosting = 0.015f; + ui_flush( ctx, k_ui_shader_colour, NULL ); + vg_ui.frosting = 0.0f; + ctx->font = &vgf_default_small; } diff --git a/src/ent_route.h b/src/ent_route.h index 7bf8820..efd5022 100644 --- a/src/ent_route.h +++ b/src/ent_route.h @@ -16,3 +16,4 @@ extern _ent_route; entity_call_result ent_route_call( world_instance *world, ent_call *call ); void ent_route_preupdate(void); void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index ); +void _ent_route_imgui( ui_context *ctx ); diff --git a/src/ent_skateshop.c b/src/ent_skateshop.c index 23962f8..fa664fe 100644 --- a/src/ent_skateshop.c +++ b/src/ent_skateshop.c @@ -115,13 +115,11 @@ static void ent_skateshop_helpers_pickable( const char *acceptance ) if( gui_new_helper( input_button_list[k_srbind_mback], &text )) vg_strcat( &text, "Exit" ); - if( (_skateshop.helper_pick = gui_new_helper( input_button_list[k_srbind_maccept], &text))){ + if( (_skateshop.helper_pick = gui_new_helper( input_button_list[k_srbind_maccept], &text))) vg_strcat( &text, acceptance ); - } - if( (_skateshop.helper_browse = gui_new_helper( input_axis_list[k_sraxis_mbrowse_h], &text ))){ + if( (_skateshop.helper_browse = gui_new_helper( input_axis_list[k_sraxis_mbrowse_h], &text ))) vg_strcat( &text, "Browse" ); - } } static void skateshop_playermod( bool immobile ) @@ -294,6 +292,7 @@ void ent_skateshop_update(void) { if( button_down( k_srbind_use ) ) { + menu_close(); ent_skateshop *shop = _skateshop.current_shop; if( shop->type == k_skateshop_type_boardshop ) { diff --git a/src/input.h b/src/input.h index 0b3d002..94f0a6a 100644 --- a/src/input.h +++ b/src/input.h @@ -19,15 +19,6 @@ enum sr_bind k_srbind_reset, k_srbind_dead_respawn, k_srbind_camera, - k_srbind_mleft, - k_srbind_mright, - k_srbind_mup, - k_srbind_mdown, - k_srbind_mback, - k_srbind_maccept, - k_srbind_mopen, - k_srbind_mclose, - k_srbind_mhub, k_srbind_replay_play, k_srbind_replay_freecam, k_srbind_replay_resume, @@ -42,6 +33,18 @@ enum sr_bind k_srbind_miniworld_teleport, k_srbind_miniworld_resume, k_srbind_devbutton, + + k_srbind_mopen, + k_srbind_mleft, + k_srbind_mright, + k_srbind_mup, + k_srbind_mdown, + k_srbind_mback, + k_srbind_maccept, + k_srbind_mquick, + k_srbind_mclose, + k_srbind_mhub, + k_srbind_max, }; @@ -54,10 +57,12 @@ enum sr_joystick{ enum sr_axis{ k_sraxis_grab = 0, - k_sraxis_mbrowse_h, - k_sraxis_mbrowse_v, k_sraxis_replay_h, k_sraxis_skid, + + k_sraxis_mbrowse_h, + k_sraxis_mbrowse_v, + k_sraxis_max }; @@ -83,19 +88,16 @@ static vg_input_op *input_button_list[] = { [k_srbind_skate] = INPUT_BASIC( SDLK_e, SDL_CONTROLLER_BUTTON_Y ), [k_srbind_use] = INPUT_BASIC( SDLK_e, SDL_CONTROLLER_BUTTON_X ), [k_srbind_reset] = INPUT_BASIC( SDLK_r, SDL_CONTROLLER_BUTTON_DPAD_LEFT ), -[k_srbind_dead_respawn] = - INPUT_BASIC( SDLK_q, SDL_CONTROLLER_BUTTON_DPAD_UP ), [k_srbind_camera]= INPUT_BASIC( SDLK_c, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ), [k_srbind_mleft] = INPUT_BASIC( SDLK_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT ), [k_srbind_mright]= INPUT_BASIC( SDLK_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ), -[k_srbind_world_left] = - INPUT_BASIC( SDLK_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT ), -[k_srbind_world_right] = - INPUT_BASIC( SDLK_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ), +[k_srbind_world_left] = INPUT_BASIC( SDLK_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT ), +[k_srbind_world_right]= INPUT_BASIC( SDLK_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ), [k_srbind_mup] = INPUT_BASIC( SDLK_UP, SDL_CONTROLLER_BUTTON_DPAD_UP ), [k_srbind_mdown] = INPUT_BASIC( SDLK_DOWN, SDL_CONTROLLER_BUTTON_DPAD_DOWN ), [k_srbind_mback] = INPUT_BASIC( SDLK_ESCAPE, SDL_CONTROLLER_BUTTON_B ), [k_srbind_mopen] = INPUT_BASIC( SDLK_ESCAPE, SDL_CONTROLLER_BUTTON_START ), +[k_srbind_mquick] = INPUT_BASIC( SDLK_q, SDL_CONTROLLER_BUTTON_DPAD_LEFT ), [k_srbind_mclose]= (vg_input_op[]){ vg_joy_button, SDL_CONTROLLER_BUTTON_START, vg_end }, [k_srbind_mhub] = INPUT_BASIC( SDLK_h, SDL_CONTROLLER_BUTTON_Y ), [k_srbind_maccept] = (vg_input_op[]){ @@ -177,12 +179,14 @@ static vg_input_op *input_joy_list[] = { [k_srjoystick_max]=NULL }; -struct { +struct +{ float axis_states[ k_sraxis_max ][2]; v2f joystick_states[ k_srjoystick_max ][2]; u8 button_states[ k_srbind_max ][2]; - enum input_state { + enum input_state + { k_input_state_enabled, k_input_state_resume, k_input_state_resuming, @@ -192,18 +196,20 @@ struct { } static srinput; -static int input_filter_generic(void){ - if( (srinput.state != k_input_state_enabled) || vg_console.enabled || - (workshop_form.page != k_workshop_form_hidden) ) +static int input_filter_generic(void) +{ + if( (srinput.state != k_input_state_enabled) + || vg_console.enabled + || (workshop_form.page != k_workshop_form_hidden) ) return 1; else return 0; } -static int buttons_filter_fixed(void){ +static int buttons_filter_fixed(void) +{ if( input_filter_generic() ) return 1; - if( vg.engine_stage == k_engine_stage_update_fixed ) if( vg.fixed_iterations > 0 ) return 1; @@ -212,105 +218,131 @@ static int buttons_filter_fixed(void){ } /* Rising edge of button */ -static int button_down( enum sr_bind button ){ - if( buttons_filter_fixed() ) return 0; - - if( srinput.button_states[ button ][0] && - !srinput.button_states[ button ][1] ) - return 1; - else +static int button_down( enum sr_bind button ) +{ + if( buttons_filter_fixed() ) + return 0; + + if( (skaterift.activity == k_skaterift_menu) && (button < k_srbind_mopen) && (vg_input.display_input_method != k_input_method_kbm) ) return 0; + + if( srinput.button_states[ button ][0] && !srinput.button_states[ button ][1] ) + return 1; + + return 0; } /* Falling edge of button */ -static int button_up( enum sr_bind button ){ - if( buttons_filter_fixed() ) return 0; - - if( !srinput.button_states[ button ][0] && - srinput.button_states[ button ][1] ) - return 1; - else +static int button_up( enum sr_bind button ) +{ + if( buttons_filter_fixed() ) return 0; + + if( (skaterift.activity == k_skaterift_menu) && (button < k_srbind_mopen) && (vg_input.display_input_method != k_input_method_kbm) ) + return 0; + + if( !srinput.button_states[ button ][0] && srinput.button_states[ button ][1] ) + return 1; + + return 0; } /* State of button */ -static int button_press( enum sr_bind button ){ +static int button_press( enum sr_bind button ) +{ if( input_filter_generic() ) return 0; - return - srinput.button_states[ button ][0]; + + if( (skaterift.activity == k_skaterift_menu) && (button < k_srbind_mopen) && (vg_input.display_input_method != k_input_method_kbm)) + return 0; + + return srinput.button_states[ button ][0]; } -static void joystick_state( enum sr_joystick joystick, v2f state ){ +static void joystick_state( enum sr_joystick joystick, v2f state ) +{ + if( (skaterift.activity == k_skaterift_menu) && (vg_input.display_input_method != k_input_method_kbm) ) + { + v2_zero( state ); + return; + } + if( input_filter_generic() ) v2_zero( state ); else v2_copy( srinput.joystick_states[ joystick ][0], state ); } -static float axis_state( enum sr_axis axis ){ +static float axis_state( enum sr_axis axis ) +{ + if( (skaterift.activity == k_skaterift_menu) && (axis < k_sraxis_mbrowse_h ) && (vg_input.display_input_method != k_input_method_kbm) ) + return 0; + if( input_filter_generic() ) return 0.0f; - else - return srinput.axis_states[axis][0]; + + return srinput.axis_states[axis][0]; } -static void skaterift_preupdate_inputs(void){ +static void skaterift_preupdate_inputs(void) +{ if( srinput.state == k_input_state_resuming ) srinput.state = k_input_state_enabled; if( srinput.state == k_input_state_resume ) srinput.state = k_input_state_resuming; - for( u32 i=0; i sensitivity ){ + if( fabsf(x) > sensitivity ) + { if( x > 0.0f ) srinput.button_states[k_srbind_mright][0] = 1; else srinput.button_states[k_srbind_mleft][0] = 1; } - if( fabsf(y) > sensitivity ){ + if( fabsf(y) > sensitivity ) + { if( y > 0.0f ) srinput.button_states[k_srbind_mup][0] = 1; else srinput.button_states[k_srbind_mdown][0] = 1; } diff --git a/src/menu.c b/src/menu.c index d402ca5..0c39c1e 100644 --- a/src/menu.c +++ b/src/menu.c @@ -103,7 +103,7 @@ void menu_open( enum menu_page page ) } } -static void menu_close(void) +void menu_close(void) { skaterift.activity = k_skaterift_default; srinput.state = k_input_state_resume; @@ -469,6 +469,12 @@ void menu_gui( ui_context *ctx ) menu_open( k_menu_page_main ); return; } + + if( button_down( k_srbind_mquick ) ) + { + menu_open( k_menu_page_quick ); + return; + } } if( skaterift.activity != k_skaterift_menu ) @@ -778,6 +784,97 @@ void menu_gui( ui_context *ctx ) goto menu_draw; } + else if( menu.page == k_menu_page_quick ) + { + ui_px pad = 64; + ui_rect panel = { 24, pad, 300, vg.window_y-(pad*2) }; + ui_fill( ctx, panel, ui_opacity( GUI_COL_DARK, 0.35f ) ); + ui_outline( ctx, panel, 1, GUI_COL_NORM, 0 ); + ui_rect_pad( panel, (ui_px[]){8,8} ); + + ui_rect title; + ctx->font = &vgf_default_title; + ui_split( panel, k_ui_axis_h, 28*2, 0, title, panel ); + ui_text( ctx, title, "Quick Menu", 1, k_ui_align_middle_center, 0 ); + + ctx->font = &vgf_default_large; + + bool in_run = 0, in_challenge = 0, allow = 1; + if( (_world.time - _world.last_gate_hit_time) < 60.0 ) + in_run = 1; + if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) ) + in_challenge = 1; + + if( in_run || in_challenge ) + ui_split( panel, k_ui_axis_h, 28*2, 0, title, panel ); + + if( in_run ) + ui_text( ctx, title, "In Race", 1, k_ui_align_middle_center, 0 ); + else if( in_challenge ) + ui_text( ctx, title, "In Challenge", 1, k_ui_align_middle_center, 0 ); + + i32 R = 0; + if( in_run || in_challenge ) + { + allow = 0; + R = menu_nav( &menu.quick_row, mv, 0 ); + if( menu_button( ctx, panel, R == 0, 1, "Leave" ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[0], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + + if( in_challenge ) + { + if( world_clear_event( k_world_event_challenge ) ) + { + gui_helper_reset( k_gui_helper_mode_clear ); + _world.challenge_state = k_challenge_state_none; + _world.active_challenge_id = 0; + _world.challenge_target = NULL; + _world.challenge_timer = 0.0f; + } + } + else + world_routes_clear( &_world.main ); + } + } + else + R = menu_nav( &menu.quick_row, mv, 2 ); + + if( menu_button( ctx, panel, R == 0, allow && (localplayer.subsystem == k_player_subsystem_walk), "Set waypoint" ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[0], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + player__set_waypoint(); + } + + if( menu_button( ctx, panel, R == 1, allow && localplayer.saved_waypoint, "Go to waypoint" ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[2], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + player__spawn( &localplayer.waypoint ); + localplayer.have_glider = localplayer.waypoint_with_glider; + menu_close(); + } + + if( menu_button( ctx, panel, R == 2, allow, "Spectate" ) ) + { + menu_close(); + } + + if( button_down( k_srbind_mquick ) || button_down( k_srbind_mback ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[3], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + menu_close(); + } + + goto menu_draw; + } /* TOP BAR * -------------------------------------------------------------------*/ diff --git a/src/menu.h b/src/menu.h index 2e27922..209a835 100644 --- a/src/menu.h +++ b/src/menu.h @@ -16,6 +16,7 @@ enum menu_page k_menu_page_credits, k_menu_page_help, k_menu_page_impromptu_guide, + k_menu_page_quick }; enum menu_main_subpage @@ -39,7 +40,8 @@ struct global_menu intro_row, guide_sel, prem_row, - prof_row; + prof_row, + quick_row; f32 mouse_dist; /* used for waking up mouse */ f32 repeater; @@ -79,3 +81,4 @@ void menu_on_world_change( addon_id addon ); bool menu_button_rect( ui_context *ctx, ui_rect rect, bool select, bool clickable, const char *text ); //util i32 menu_nav( i32 *p_row, int mv, i32 max ); +void menu_close(void); diff --git a/src/network.c b/src/network.c index 01d1764..2c5b81a 100644 --- a/src/network.c +++ b/src/network.c @@ -215,7 +215,7 @@ void network_status_string( vg_str *str, u32 *colour ) vg_strcat( str, "No Connection" ); else if( state == k_ESteamNetworkingConnectionState_Connecting ) { - vg_strcatf( str, "Connecting...\n%s", network_client.host_adress ); + vg_strcatf( str, "Connecting... %s", network_client.host_adress ); if( network_client.retries ) { diff --git a/src/player.c b/src/player.c index a02d571..6078f5f 100644 --- a/src/player.c +++ b/src/player.c @@ -324,8 +324,6 @@ void player__setpos( v3f pos ) void player__clean_refs(void) { - // FIXME - //replay_clear( &player_replay.local ); gui_helper_reset( k_gui_helper_mode_clear ); _world.challenge_target = NULL; @@ -337,6 +335,11 @@ void player__clean_refs(void) world_routes_clear( &_world.main ); } +void player__clear_world_dependent_variables(void) +{ + localplayer.saved_waypoint = 0; +} + void player__reset(void) { v3_zero( localplayer.rb.v ); @@ -372,6 +375,13 @@ void player__spawn( ent_spawn *rp ) player__reset(); } +void player__set_waypoint(void) +{ + localplayer.saved_waypoint = 1; + localplayer.waypoint_with_glider = localplayer.have_glider; + q_copy( localplayer.rb.q, localplayer.waypoint.transform.q ); + v3_copy( localplayer.rb.co, localplayer.waypoint.transform.co ); +} void player__kill(void) { diff --git a/src/player.h b/src/player.h index 7ec7183..771426b 100644 --- a/src/player.h +++ b/src/player.h @@ -65,7 +65,8 @@ struct localplayer rigidbody rb; v3f angles; - bool have_glider, glider_orphan, drowned; + bool have_glider, glider_orphan, drowned, saved_waypoint, waypoint_with_glider; + ent_spawn waypoint; /* * Camera management @@ -184,7 +185,9 @@ void player__transport( m4x3f transport ); void player__im_gui( ui_context *ctx ); void player__setpos( v3f pos ); void player__spawn( ent_spawn *rp ); +void player__set_waypoint(void); void player__clean_refs(void); +void player__clear_world_dependent_variables(void); void player__reset(void); void player__kill(void); void player__begin_holdout( v3f offset ); diff --git a/src/player_dead.c b/src/player_dead.c index a431dfe..69418b9 100644 --- a/src/player_dead.c +++ b/src/player_dead.c @@ -239,9 +239,6 @@ void player__dead_transition( enum player_die_type type ) 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 ) diff --git a/src/player_walk.c b/src/player_walk.c index eefacfe..270f392 100644 --- a/src/player_walk.c +++ b/src/player_walk.c @@ -239,19 +239,17 @@ static int player_walk_scan_for_drop_in(void){ player_walk_drop_in_vector( localplayer.rb.v ); return 1; } - else{ + else vg_error( "failed to find intersection of drop in\n" ); - } } return 0; } -static bool player__preupdate_anim( struct skeleton_anim *anim, f32 *t, - f32 speed ){ +static bool player__preupdate_anim( struct skeleton_anim *anim, f32 *t, f32 speed ) +{ f32 length = (f32)(anim->strip->length-1) / anim->framerate; *t += (vg.time_delta * speed) / length; - if( *t >= 1.0f ) return 1; else return 0; } @@ -262,13 +260,10 @@ static void player_walk_pre_sit(void) v2f steer; joystick_state( k_srjoystick_steer, steer ); - vg_slewf( &w->state.transition_t, 1.0f, vg.time_delta ); - if( button_down(k_srbind_sit) || (v2_length2(steer)>0.2f) || - button_down(k_srbind_jump) ){ + if( button_down(k_srbind_sit) || (v2_length2(steer)>0.2f) || button_down(k_srbind_jump) ) w->state.activity = k_walk_activity_sit_up; - } return; } @@ -360,21 +355,16 @@ 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 ); - } } -static void player_walk_pre_running_start(void){ +static void player_walk_pre_running_start(void) +{ struct player_walk *w = &player_walk; bool finished = player__preupdate_anim( &w->anim_intro, &w->state.transition_t, 1.0f ); - if( finished ){ - /* TODO: get the derivative of the last keyframes to calculate new - * velocity for player */ - player_walk_generic_to_skate( k_skate_activity_ground, - player_walk.animator.board_yaw+1.0f ); - } + if( finished ) + player_walk_generic_to_skate( k_skate_activity_ground, player_walk.animator.board_yaw+1.0f ); } static void player_walk_pre_popoff(void){ @@ -388,14 +378,13 @@ static void player_walk_pre_popoff(void){ } } -void player__walk_pre_update(void){ +void player__walk_pre_update(void) +{ struct player_walk *w = &player_walk; - - if( localplayer.immobile ) return; + if( localplayer.immobile ) + return; else player_look( localplayer.angles, skaterift.time_rate ); - enum walk_activity a = w->state.activity; - if ( a == k_walk_activity_sit ) player_walk_pre_sit(); else if( a == k_walk_activity_sit_up ) player_walk_pre_sit_up(); else if( a == k_walk_activity_ground ) player_walk_pre_ground(); @@ -410,49 +399,45 @@ static int player_walk_normal_standable( v3f n ){ return n[1] > 0.70710678118f; } -static void player_accelerate( v3f v, v3f movedir, f32 speed, f32 accel ){ - float currentspeed = v3_dot( v, movedir ), - addspeed = speed - currentspeed; - +static void player_accelerate( v3f v, v3f movedir, f32 speed, f32 accel ) +{ + f32 currentspeed = v3_dot( v, movedir ), + addspeed = speed - currentspeed; if( addspeed <= 0 ) return; - float accelspeed = accel * vg.time_fixed_delta * speed; - + f32 accelspeed = accel * vg.time_fixed_delta * speed; if( accelspeed > addspeed ) accelspeed = addspeed; - v3_muladds( v, movedir, accelspeed, v ); } -static void player_friction( v3f v, f32 friction ){ - float speed = v3_length( v ), - drop = 0.0f, - control = vg_maxf( speed, k_stopspeed ); +static void player_friction( v3f v, f32 friction ) +{ + f32 speed = v3_length( v ), + drop = 0.0f, + control = vg_maxf( speed, k_stopspeed ); if( speed < 0.04f ) return; drop += control * friction * vg.time_fixed_delta; - float newspeed = vg_maxf( 0.0f, speed - drop ); newspeed /= speed; - v3_muls( v, newspeed, v ); } -static void player_walk_custom_filter( world_instance *world, - rb_ct *man, int len, f32 w ){ - for( int i=0; itype == k_contact_type_disabled || - ci->type == k_contact_type_edge ) + if( ci->type == k_contact_type_disabled || ci->type == k_contact_type_edge ) continue; - - float d1 = v3_dot( ci->co, ci->n ); - - for( int j=0; jco, ci->n ); + for( int j=0; jinfo.flags & k_material_flag_walking) && - !(si->info.flags & k_material_flag_walking)){ + !(si->info.flags & k_material_flag_walking)) continue; - } float d2 = v3_dot( cj->co, ci->n ), d = d2-d1; - if( fabsf( d ) <= w ){ + if( fabsf( d ) <= w ) cj->type = k_contact_type_disabled; - } } } } -static void player_walk_update_generic(void){ +static void player_walk_update_generic(void) +{ struct player_walk *w = &player_walk; - - if( (w->state.activity != k_walk_activity_oregular) && - (w->state.activity != k_walk_activity_oair) ){ + if( (w->state.activity != k_walk_activity_oregular) && (w->state.activity != k_walk_activity_oair) ) + { joystick_state( k_srjoystick_steer, w->state.steer ); w->state.steer[2] = button_press(k_srbind_run)? k_runspeed: k_walkspeed; if( v2_length2(w->state.steer)>1.0f ) @@ -493,7 +476,8 @@ static void player_walk_update_generic(void){ v3_zero( localplayer.rb.w ); world_instance *world = &_world.main; - if( !world_water_player_safe( world, 0.4f ) ) return; + if( !world_water_player_safe( world, 0.4f ) ) + return; enum walk_activity prev_state = w->state.activity; @@ -558,15 +542,14 @@ static void player_walk_update_generic(void){ w->state.activity = k_walk_activity_air; w->surface = k_surface_prop_concrete; - for( int i=0; in ) ){ + if( player_walk_normal_standable( ct->n ) ) + { w->state.activity = k_walk_activity_ground; - v3_add( surface_avg, ct->n, surface_avg ); - struct world_surface *surf = world_contact_surface( world, ct ); if( surf->info.surface_prop > w->surface ) w->surface = surf->info.surface_prop; @@ -584,13 +567,15 @@ static void player_walk_update_generic(void){ v3_muls( right_dir, w->state.steer[0], movedir ); v3_muladds( movedir, forward_dir, w->state.steer[1], movedir ); - if( w->state.activity == k_walk_activity_ground ){ + if( w->state.activity == k_walk_activity_ground ) + { v3_normalize( surface_avg ); v3f tx, ty; v3_tangent_basis( surface_avg, tx, ty ); - if( v2_length2(w->state.steer) > 0.001f ){ + if( v2_length2(w->state.steer) > 0.001f ) + { /* clip movement to the surface */ float d = v3_dot(surface_avg,movedir); v3_muladds( movedir, surface_avg, -d, movedir ); @@ -600,11 +585,12 @@ static void player_walk_update_generic(void){ nominal_speed = w->state.steer[2]; /* jump */ - if( w->state.jump_queued ){ + if( w->state.jump_queued ) + { w->state.jump_queued = 0; - f32 t = vg.time - w->state.jump_input_time; - if( t < PLAYER_JUMP_EPSILON ){ + if( t < PLAYER_JUMP_EPSILON ) + { localplayer.rb.v[1] = 5.0f; w->state.activity = k_walk_activity_air; prev_state = k_walk_activity_air; @@ -612,18 +598,18 @@ static void player_walk_update_generic(void){ nominal_speed = k_airspeed; } } - else{ + else player_friction( localplayer.rb.v, k_walk_friction ); - } } - else{ + else + { accel_speed = k_walk_air_accel; nominal_speed = k_airspeed; } - if( v2_length2( w->state.steer ) > 0.001f ){ - player_accelerate( localplayer.rb.v, movedir, - nominal_speed, accel_speed ); + if( v2_length2( w->state.steer ) > 0.001f ) + { + player_accelerate( localplayer.rb.v, movedir, nominal_speed, accel_speed ); v3_normalize( movedir ); } diff --git a/src/replay2.c b/src/replay2.c index 04bcc05..8b67730 100644 --- a/src/replay2.c +++ b/src/replay2.c @@ -19,6 +19,11 @@ void _replay2_init(void) _replay2.final_mtx = vg_linear_alloc( vg_mem.rtmemory, mtx_size ); } +void _replay2_clear_local_buffer(void) +{ + vg_queue_clear( &_replay2.buffer ); +} + static vg_queue *_replay2_player_buffer(void) { return _replay2.type == k_replay_type_local? &_replay2.buffer: &_remote_replay.buffer; @@ -480,8 +485,10 @@ void _replay2_pre_update(void) if( bounds & NETMSG_GATE_BOUNDARY_BIT ) t = 1.0f; - v2f angles; - v2_lerp( _remote_replay.cam0, _remote_replay.cam1, t, angles ); + v3f angles; + angles[0] = vg_alerpf( _remote_replay.cam0[0], _remote_replay.cam1[0], t ); + angles[1] = vg_lerpf( _remote_replay.cam0[1], _remote_replay.cam1[1], t ); + angles[2] = 0.0f; /* position */ v3f fpv_pos, fpv_offset; @@ -504,6 +511,7 @@ void _replay2_pre_update(void) v3_add( tpv_origin, tpv_offset, tpv_pos ); v3_lerp( tpv_pos, fpv_pos, cc.camera_type_blend, _replay2.playback_cam.pos ); v2_copy( angles, _replay2.playback_cam.angles ); + f32 fov_skate = vg_lerpf( 97.0f, 135.0f, k_fov ), fov_walk = vg_lerpf( 90.0f, 110.0f, k_fov ); _replay2.playback_cam.fov = vg_lerpf( fov_walk, fov_skate, cc.camera_type_blend ); diff --git a/src/replay2.h b/src/replay2.h index 8f9a288..cbf52fe 100644 --- a/src/replay2.h +++ b/src/replay2.h @@ -137,3 +137,4 @@ void _replay2_seek( f64 t, bool play_sounds ); void _replay2_get_camera( vg_camera *cam ); void _replay2_decode(void); void _replay2_record_local_frame(void); +void _replay2_clear_local_buffer(void); diff --git a/src/skaterift.c b/src/skaterift.c index 1ef1f19..9ef18ef 100644 --- a/src/skaterift.c +++ b/src/skaterift.c @@ -56,6 +56,7 @@ #include "compass.h" #include "replay2.h" #include "user_profile.h" +#include "ent_route.h" struct skaterift_globals skaterift = { @@ -229,10 +230,8 @@ void vg_pre_update(void) cutscene_update( vg.time_rate * vg.time_frame_delta ); - if( skaterift.activity != k_skaterift_menu ) - { + if( !((skaterift.activity == k_skaterift_menu) && (menu.page != k_menu_page_quick)) ) player__pre_update(); - } _replay2_pre_update(); remote_sfx_pre_update(); @@ -241,11 +240,12 @@ void vg_pre_update(void) v3_copy( localplayer.rb.co, listen_co ); if( skaterift.activity & k_skaterift_menu ) { - if( menu.bg_cam ) + if( menu.page != k_menu_page_quick ) { - v3_copy( menu.bg_cam->co, listen_co ); + if( menu.bg_cam ) + v3_copy( menu.bg_cam->co, listen_co ); + else target = 0; } - else target = 0; } audio_ambient_sprites_update( &_world.main, listen_co ); @@ -307,6 +307,9 @@ static void render_player_transparent(void) return; } + if( skaterift.activity == k_skaterift_replay ) + return; + static vg_camera small_cam; /* DOES NOT NEED TO BE STATIC BUT MINGW SAIS OTHERWISE */ @@ -324,9 +327,6 @@ static void render_player_transparent(void) player__render( &small_cam ); } - - - static void render_scene(void) { } @@ -556,6 +556,7 @@ void vg_gui( ui_context *ctx ) world_instance *world = &_world.main; world_routes_imgui( ctx, world ); + _ent_route_imgui( ctx ); //skaterift_replay_imgui( ctx ); _replay2_imgui( ctx ); workshop_form_gui( ctx ); diff --git a/src/world_load.c b/src/world_load.c index a09719e..3ae65de 100644 --- a/src/world_load.c +++ b/src/world_load.c @@ -480,8 +480,10 @@ void skaterift_load_world_start( addon_id addon_id, bool preview ) _world.previous_world_addon = _world.main.addon_id; _vg_tower_set_flag( skaterift.sig_world, 0 ); + _replay2_clear_local_buffer(); _world.loader_state = k_world_loader_saving_current; _world.event = k_world_event_none; + player__clear_world_dependent_variables(); vg_loader_set_user_information( "Saving current world" ); } else diff --git a/src/world_routes.c b/src/world_routes.c index 6df0412..b9adcad 100644 --- a/src/world_routes.c +++ b/src/world_routes.c @@ -43,6 +43,7 @@ void world_routes_clear( world_instance *world ) } _world.current_run_version += 4; + _world.last_gate_hit_time = -9999.9; } static void world_routes_time_lap( world_instance *world, ent_route *route ) diff --git a/src/world_routes_ui.c b/src/world_routes_ui.c index 25ac799..ec6c115 100644 --- a/src/world_routes_ui.c +++ b/src/world_routes_ui.c @@ -168,9 +168,7 @@ void world_routes_imgui( ui_context *ctx, world_instance *world ) ui_point cursor = { 4, 4 }; for( u32 i=0; ient_route); i++ ) - { ent_route_imgui( ctx, world, af_arritm( &world->ent_route, i ), cursor ); - } ui_flush( ctx, k_ui_shader_colour, NULL ); vg_ui.colour[3] = 1.0f; -- 2.25.1