8 #include "ent_miniworld.h"
12 #include "shaders/model_menu.h"
14 struct global_menu menu
= { .skip_starter
= 0 };
16 void menu_at_begin(void)
18 if( menu
.skip_starter
) return;
20 skaterift
.activity
= k_skaterift_menu
;
21 menu
.page
= k_menu_page_starter
;
26 vg_console_reg_var( "skip_starter_menu", &menu
.skip_starter
,
27 k_var_dtype_i32
, VG_VAR_PERSISTENT
);
30 void menu_open( enum menu_page page
)
32 skaterift
.activity
= k_skaterift_menu
;
34 if( page
!= k_menu_page_any
)
40 bool menu_viewing_map(void)
42 return (skaterift
.activity
== k_skaterift_menu
) &&
43 (menu
.page
== k_menu_page_main
) &&
44 (menu
.main_index
== k_menu_main_map
);
49 if( button_down( k_srbind_mopen
) )
51 if( skaterift
.activity
== k_skaterift_default
)
53 menu_open( k_menu_page_main
);
58 if( skaterift
.activity
!= k_skaterift_menu
)
62 * -------------------------------------------------------------------*/
63 int ml
= button_down( k_srbind_mleft
),
64 mr
= button_down( k_srbind_mright
),
65 mu
= button_down( k_srbind_mup
),
66 md
= button_down( k_srbind_mdown
),
69 enter
= button_down( k_srbind_maccept
);
73 menu
.input_mode
= k_menu_input_mode_keys
;
77 * --------------------------------------------------------------------*/
78 menu
.mouse_dist
+= v2_length( vg
.mouse_delta
); /* TODO: Move to UI */
79 if( menu
.mouse_dist
> 10.0f
)
81 menu
.input_mode
= k_menu_input_mode_mouse
;
82 menu
.mouse_dist
= 0.0f
;
85 if( ui_clicking(UI_MOUSE_LEFT
) || ui_clicking(UI_MOUSE_RIGHT
) )
87 menu
.input_mode
= k_menu_input_mode_mouse
;
90 if( menu
.input_mode
== k_menu_input_mode_mouse
)
94 * ------------------------------------------------------------*/
95 vg_ui
.wants_mouse
= 1;
98 if( skaterift
.activity
!= k_skaterift_menu
) return;
102 * -------------------------------------------------------------------*/
104 ui_font_face( &vgf_default_title
);
105 ui_px height
= vg_ui
.font
->ch
+ 16;
106 ui_rect topbar
= { 0, 0, vg
.window_x
, height
};
108 const char *opts
[] = {
109 [k_menu_main_main
] = "Menu",
110 [k_menu_main_map
] = "Map"
114 u8 lb_down
= 0, rb_down
= 0;
115 vg_exec_input_program( k_vg_input_type_button_u8
,
117 vg_joy_button
, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
, vg_end
119 vg_exec_input_program( k_vg_input_type_button_u8
,
121 vg_joy_button
, SDL_CONTROLLER_BUTTON_LEFTSHOULDER
, vg_end
124 if( menu
.repeater
> 0.0f
)
126 menu
.repeater
-= vg_minf( vg
.time_frame_delta
, 0.5f
);
130 if( lb_down
!= rb_down
)
132 menu
.main_index
+= rb_down
;
133 menu
.main_index
-= lb_down
;
134 menu
.repeater
+= 0.2f
;
136 if( menu
.main_index
== -1 )
139 if( menu
.main_index
== vg_list_size(opts
) )
146 for( u32 draw
=0; draw
<2; draw
++ )
150 ui_rect inf_lb
= { x
, 0, 32, height
};
151 ui_fill( inf_lb
, lb_down
? GUI_COL_NORM
: GUI_COL_NORM
);
152 ui_text( inf_lb
, "\x91", 1, k_ui_align_middle_center
, 0 );
156 for( i32 i
=0; i
<vg_list_size(opts
); i
++ )
158 ui_rect box
= { x
, 0, ui_text_line_width(opts
[i
]) + 32, height
};
162 enum ui_button_state state
= ui_button_base( box
);
163 if( state
== k_ui_button_click
)
165 ui_fill( box
, GUI_COL_DARK
);
168 else if( state
== k_ui_button_holding_inside
)
170 ui_fill( box
, GUI_COL_DARK
);
172 else if( state
== k_ui_button_holding_outside
)
174 ui_fill( box
, GUI_COL_DARK
);
175 ui_outline( box
, 1, GUI_COL_CLICK
, 0 );
177 else if( state
== k_ui_button_hover
)
179 ui_fill( box
, GUI_COL_NORM
);
180 ui_outline( box
, 1, GUI_COL_ACTIVE
, 0 );
183 ui_fill( box
, i
==menu
.main_index
? GUI_COL_ACTIVE
: GUI_COL_NORM
);
185 ui_text( box
, opts
[i
], 1, k_ui_align_middle_center
, 0 );
188 x
+= box
[2] + spacer
;
193 ui_rect inf_rb
= { x
, 0, 32, height
};
194 ui_fill( inf_rb
, rb_down
? GUI_COL_NORM
: GUI_COL_NORM
);
195 ui_text( inf_rb
, "\x92", 1, k_ui_align_middle_center
, 0 );
200 ui_fill( (ui_rect
){ x
+8,0, vg
.window_x
-(x
+8),height
}, GUI_COL_NORM
);
203 x
= vg
.window_x
/2 - x
/2;
204 ui_fill( (ui_rect
){ 0, 0, x
-8, height
}, GUI_COL_NORM
);
208 if( menu
.main_index
== k_menu_main_map
)
210 ui_font_face( &vgf_default_large
);
211 ui_rect title
= { vg
.window_x
/2 - 512/2, height
+8, 512, 64 };
217 ui_fill( (ui_rect
){ x
,y
, 0,height
},
218 world_static
.active_instance
? GUI_COL_DARK
: GUI_COL_ACTIVE
);
222 vg_strnull( &str
, buf
, sizeof(buf
) );
223 vg_strcat( &str
, "Hub World" );
225 if( world_static
.active_instance
&&
226 (vg_input
.display_input_method
== k_input_method_controller
) )
228 vg_strcat( &str
, " (" );
229 vg_input_string( &str
, input_button_list
[k_srbind_mhub
], 1 );
230 vg_strcat( &str
, ")" );
233 ui_px w
= ui_text( (ui_rect
){ x
+8, y
, 1000, height
}, buf
, 1,
234 k_ui_align_middle_left
, 0 );
243 world_instance
*world
= &world_static
.instances
[1];
244 if( world
->status
== k_world_status_loaded
)
246 const char *world_name
=
247 mdl_pstr( &world
->meta
, world
->info
.pstr_name
);
249 vg_strnull( &str
, buf
, sizeof(buf
) );
250 vg_strcat( &str
, world_name
);
252 if( !world_static
.active_instance
&&
253 (vg_input
.display_input_method
== k_input_method_controller
) )
255 vg_strcat( &str
, " (" );
256 vg_input_string( &str
, input_button_list
[k_srbind_mhub
], 1 );
257 vg_strcat( &str
, ")" );
260 vs
= ui_fill( (ui_rect
){ x
,y
, 1000,height
},
261 world_static
.active_instance
? GUI_COL_ACTIVE
: GUI_COL_DARK
);
262 w
= ui_text( (ui_rect
){ x
+16,y
, 1000,height
}, buf
,
263 1, k_ui_align_middle_left
, 0 );
265 w
= w
*vg_ui
.font
->sx
+ 8*3;
268 if( button_down( k_srbind_mhub
) ||
269 ui_button_base( (ui_rect
){0,y
,x
,height
} ) == k_ui_button_click
)
271 world_switch_instance( world_static
.active_instance
^ 0x1 );
272 skaterift
.activity
= k_skaterift_default
;
273 world_map
.view_ready
= 0;
283 if( button_down( k_srbind_mback
) )
285 skaterift
.activity
= k_skaterift_default
;
291 * -------------------------------------------------------------------*/
293 if( menu
.main_index
== k_menu_main_main
)
295 ui_rect list
= { vg
.window_x
/2 - 512/2, height
+64,
296 512, vg
.window_y
-height
-128 };
297 ui_fill( list
, GUI_COL_DARK
);
300 vg_ui
.frosting
= 0.015f
;
301 ui_flush( k_ui_shader_colour
, vg
.window_x
, vg
.window_y
);
302 vg_ui
.frosting
= 0.0f
;
304 ui_font_face( &vgf_default_small
);