+ const char *ll,
+ *lu,
+ *lr,
+ *ld;
+
+ mdl_mesh *mesh;
+ float falpha, fsize;
+}
+VG_STATIC menu_buttons[] =
+{
+ {
+ "text_quit", menu_vis, {.i=k_menu_page_main|k_menu_page_quit},
+ .fn_press = menu_btn_quit,
+ .ld="text_reset", .lr="text_settings", /*.ll="text_map"*/
+ },
+ {
+ "text_quitty", menu_vis, {.i=k_menu_page_quit}
+ },
+ {
+ "text_yes", menu_vis, {.i=k_menu_page_quit},
+ .fn_press = menu_btn_fuckoff
+ },
+{
+ "text_reset", menu_vis, {.i=k_menu_page_main},
+ .fn_press = menu_btn_reset,
+ .lu="text_quit", .ld="text_skater", /*.ll="text_map",*/ .lr="text_settings"
+},
+{
+ "text_skater", menu_vis, {.i=k_menu_page_main|k_menu_page_skater},
+ .fn_press = menu_btn_skater,
+ .lu="text_reset", /*.ll="text_map",*/ .lr="text_settings"
+},
+/*
+{
+ "text_map", menu_vis, {.i=k_menu_page_main},
+ .fn_press = menu_btn_map,
+ .lr="text_reset"
+},
+*/
+{
+ "text_settings", menu_vis, {.i=k_menu_page_main|k_menu_page_settings},
+ .fn_press = menu_btn_settings,
+ .ll="text_reset"
+},
+{
+ "skater_left", menu_vis, {k_menu_page_skater}
+},
+{
+ "skater_right", menu_vis, {k_menu_page_skater}
+},
+
+{
+ "fov_slider", menu_vis, {k_menu_page_settings},
+ .ld="text_invert_y"
+},
+{ "fov_info", menu_vis, {k_menu_page_settings} },
+
+{
+ "vol_slider", menu_vis, {k_menu_page_settings},
+ .lu="res_slider"
+},
+{ "vol_info", menu_vis, {k_menu_page_settings} },
+
+{
+ "text_invert_y", menu_vis, {k_menu_page_settings},
+ .fn_press = menu_btn_invert_y,
+ .lu = "fov_slider", .ld="text_blur"
+},
+{
+ "text_invert_y_check", menu_settings_if, {.ptr_generic=&cl_invert_y}
+},
+{
+ "text_blur", menu_vis, {k_menu_page_settings},
+ .fn_press = menu_btn_blur,
+ .lu="text_invert_y", .ld="res_slider"
+},
+{
+ "text_blur_check", menu_settings_if, {.ptr_generic=&cl_blur}
+},
+{
+ "res_slider", menu_vis, {k_menu_page_settings},
+ .ld = "vol_slider", .lu = "text_blur"
+},
+{
+ "res_info", menu_vis, {k_menu_page_settings},
+},
+{ "ctr_xbox", menu_controller_inf, {k_menu_controller_type_xbox}},
+{ "ctr_xbox_text", menu_controller_inf, {k_menu_controller_type_xbox}},
+{ "ctr_steam", menu_controller_inf, {k_menu_controller_type_steam}},
+{ "ctr_steam_text", menu_controller_inf, {k_menu_controller_type_steam}},
+{ "ctr_deck", menu_controller_inf, {k_menu_controller_type_steam_deck}},
+{ "ctr_deck_text", menu_controller_inf, {k_menu_controller_type_steam_deck}},
+{ "ctr_ps", menu_controller_inf, {k_menu_controller_type_playstation}},
+{ "ctr_ps_text", menu_controller_inf, {k_menu_controller_type_playstation}},
+{ "ctr_kbm", menu_controller_inf, {k_menu_controller_type_keyboard}},
+{ "ctr_kbm_text", menu_controller_inf, {k_menu_controller_type_keyboard}},
+{
+ "text_paused", menu_vis, {k_menu_page_main}
+},
+};
+
+VG_STATIC int menu_get_loc( const char *loc )
+{
+ for( int i=0; i<vg_list_size(menu_buttons); i++ )
+ if( !strcmp( menu_buttons[i].name, loc ) )
+ return i;
+
+ assert(0);
+ return 0;
+}
+
+VG_STATIC int __respawn( int argc, const char *argv[] );
+VG_STATIC void menu_btn_reset( int event )
+{
+ __respawn(0,NULL);
+ cl_menu_go_away = 1;
+ game_menu.page = 0;
+}
+
+VG_STATIC void menu_btn_fuckoff( int event )
+{
+ vg.window_should_close = 1;
+}
+
+VG_STATIC void menu_btn_quit( int event )
+{
+ game_menu.page = k_menu_page_quit;
+ game_menu.loc = menu_get_loc( "text_yes" );
+}
+
+VG_STATIC void menu_btn_settings( int event )
+{
+ game_menu.page = k_menu_page_settings;
+ game_menu.loc = menu_get_loc( "fov_slider" );
+}
+
+VG_STATIC void menu_btn_skater( int event )
+{
+ game_menu.page = k_menu_page_skater;
+}
+
+VG_STATIC void menu_btn_blur( int event )
+{
+ cl_blur ^= 0x1;
+}
+
+VG_STATIC void menu_btn_invert_y( int event )
+{
+ cl_invert_y ^= 0x1;
+}
+
+VG_STATIC void menu_btn_map( int event )
+{
+ game_menu.page = k_menu_page_map;
+ game_menu.map_count = 0;
+ game_menu.selected_map = 0;
+
+ tinydir_dir dir;
+ tinydir_open( &dir, "maps" );
+
+ while( dir.has_next ){
+ tinydir_file file;
+ tinydir_readfile( &dir, &file );
+
+ if( file.is_reg ){
+ struct menu_map_file *mf = &game_menu.maps_list[ game_menu.map_count ];
+
+ vg_strncpy( file.name, mf->name,
+ vg_list_size(game_menu.maps_list[0].name)-1 );
+
+ game_menu.map_count ++;
+ if( game_menu.map_count == vg_list_size(game_menu.maps_list) )
+ break;
+ }
+
+ tinydir_next( &dir );
+ }
+
+ tinydir_close(&dir);
+}
+
+VG_STATIC void menu_crap_ui(void)
+{
+ if( cl_menu && (game_menu.page == k_menu_page_map) ){
+ ui_rect box;
+ box[0] = vg.window_x/2 - 150;
+ box[1] = vg.window_y/2 - 300;
+ box[2] = 300;
+ box[3] = 600;
+
+ ui_fill_rect( box, 0xa0000000 );
+
+ if( game_menu.map_count == 0 ){
+ ui_text( (ui_rect){ vg.window_x/2, box[1]+8, 0,0 }, "No maps found", 1,
+ k_text_align_center );
+ }
+ else{
+ ui_rect_pad( box, 4 );
+ box[3] = 16;
+
+ for( int i=0; i<game_menu.map_count; i++ ){
+ struct menu_map_file *mf = &game_menu.maps_list[ i ];
+
+ ui_fill_rect( box, game_menu.selected_map == i? 0xa0ffffff:
+ 0xa0808080 );
+ ui_text( (ui_rect){ vg.window_x/2, box[1]+2, 0,0 },
+ mf->name, 1, k_text_align_center );
+ box[1] += 16+4;
+ }
+ }
+ }
+}
+
+VG_STATIC void steam_on_game_overlay( CallbackMsg_t *msg )
+{
+ GameOverlayActivated_t *inf = (GameOverlayActivated_t *)msg->m_pubParam;
+ vg_info( "Steam game overlay activated; pausing\n" );
+
+ if( inf->m_bActive ){
+ cl_menu = 1;
+ game_menu.page = k_menu_page_main;
+ game_menu.loc = menu_get_loc( "text_skater" );
+ }
+}
+
+VG_STATIC void menu_init(void)
+{
+ vg_create_unnamed_input( &input_menu_h, k_input_type_axis );
+ vg_create_unnamed_input( &input_menu_v, k_input_type_axis );
+ vg_create_unnamed_input( &input_menu_back, k_input_type_button );
+ vg_create_unnamed_input( &input_menu_press, k_input_type_button );
+ vg_create_unnamed_input( &input_menu_toggle, k_input_type_button );
+ vg_create_unnamed_input( &input_menu_toggle_kbm, k_input_type_button );
+
+ vg_apply_bind_str( &input_menu_h, "", "gp-ls-h" );
+ vg_apply_bind_str( &input_menu_h, "+", "right" );
+ vg_apply_bind_str( &input_menu_h, "-", "left" );
+ vg_apply_bind_str( &input_menu_v, "", "-gp-ls-v" );
+ vg_apply_bind_str( &input_menu_v, "+", "up" );
+ vg_apply_bind_str( &input_menu_v, "-", "down" );
+ vg_apply_bind_str( &input_menu_press, "", "gp-a" );
+ vg_apply_bind_str( &input_menu_press, "", "\2enter" );
+ vg_apply_bind_str( &input_menu_back, "", "gp-b" );
+ vg_apply_bind_str( &input_menu_back, "", "\2escape" );
+ vg_apply_bind_str( &input_menu_toggle_kbm, "", "\2escape" );
+ vg_apply_bind_str( &input_menu_toggle, "", "\2gp-menu" );
+
+ vg_linear_clear( vg_mem.scratch );
+
+ mdl_open( &menu_model, "models/rs_menu.mdl", vg_mem.rtmemory );
+ mdl_load_metadata_block( &menu_model, vg_mem.rtmemory );
+ mdl_load_mesh_block( &menu_model, vg_mem.scratch );
+ mdl_load_array( &menu_model, &menu_markers, "ent_marker", vg_mem.rtmemory );
+ //mdl_invert_uv_coordinates( &menu_model );
+ mdl_close( &menu_model );