Update spawn map to new UI
[carveJwlIkooP6JGAAIwe30JlM.git] / menu.c
1 #pragma once
2 #include "skaterift.h"
3 #include "menu.h"
4 #include "model.h"
5 #include "entity.h"
6 #include "input.h"
7 #include "world_map.h"
8 #include "ent_miniworld.h"
9 #include "audio.h"
10 #include "workshop.h"
11 #include "gui.h"
12 #include "shaders/model_menu.h"
13
14 struct global_menu menu = { .skip_starter = 0 };
15
16 void menu_at_begin(void)
17 {
18 if( menu.skip_starter ) return;
19
20 skaterift.activity = k_skaterift_menu;
21 menu.page = k_menu_page_starter;
22 }
23
24 void menu_init(void)
25 {
26 vg_console_reg_var( "skip_starter_menu", &menu.skip_starter,
27 k_var_dtype_i32, VG_VAR_PERSISTENT );
28 }
29
30 void menu_open( enum menu_page page )
31 {
32 skaterift.activity = k_skaterift_menu;
33
34 if( page != k_menu_page_any )
35 {
36 menu.page = page;
37 }
38 }
39
40 bool menu_viewing_map(void)
41 {
42 return (skaterift.activity == k_skaterift_menu) &&
43 (menu.page == k_menu_page_main) &&
44 (menu.main_index == 0);
45 }
46
47 void menu_gui(void)
48 {
49 if( button_down( k_srbind_mopen ) )
50 {
51 if( skaterift.activity == k_skaterift_default )
52 {
53 menu_open( k_menu_page_main );
54 return;
55 }
56 }
57
58 if( skaterift.activity != k_skaterift_menu )
59 return;
60
61 /* get buttons inputs
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 ),
67 mh = ml-mr,
68 mv = mu-md,
69 enter = button_down( k_srbind_maccept );
70
71 if( mh||mv||enter )
72 {
73 menu.input_mode = k_menu_input_mode_keys;
74 }
75
76 /* get mouse inputs
77 * --------------------------------------------------------------------*/
78 menu.mouse_dist += v2_length( vg.mouse_delta ); /* TODO: Move to UI */
79 if( menu.mouse_dist > 10.0f )
80 {
81 menu.input_mode = k_menu_input_mode_mouse;
82 menu.mouse_dist = 0.0f;
83 }
84
85 if( ui_clicking(UI_MOUSE_LEFT) || ui_clicking(UI_MOUSE_RIGHT) )
86 {
87 menu.input_mode = k_menu_input_mode_mouse;
88 }
89
90 if( menu.input_mode == k_menu_input_mode_mouse )
91 {
92 /*
93 * handle mouse input
94 * ------------------------------------------------------------*/
95 vg_ui.wants_mouse = 1;
96 }
97
98 if( skaterift.activity != k_skaterift_menu ) return;
99
100 /* top bar */
101 ui_font_face( &vgf_default_title );
102 ui_px height = vg_ui.font->ch + 16;
103 ui_rect topbar = { 0, 0, vg.window_x, height };
104
105 const char *opts[] = {
106 "Map", "Online", "Settings", "Video"
107 };
108
109 /* TAB CONTROL */
110 u8 lb_down = 0, rb_down = 0;
111 vg_exec_input_program( k_vg_input_type_button_u8,
112 (vg_input_op[]){
113 vg_joy_button, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, vg_end
114 }, &rb_down );
115 vg_exec_input_program( k_vg_input_type_button_u8,
116 (vg_input_op[]){
117 vg_joy_button, SDL_CONTROLLER_BUTTON_LEFTSHOULDER, vg_end
118 }, &lb_down );
119
120 if( menu.repeater > 0.0f )
121 {
122 menu.repeater -= vg_minf( vg.time_frame_delta, 0.5f );
123 }
124 else
125 {
126 if( lb_down != rb_down )
127 {
128 menu.main_index += rb_down;
129 menu.main_index -= lb_down;
130 menu.repeater += 0.2f;
131
132 if( menu.main_index == -1 )
133 menu.main_index ++;
134
135 if( menu.main_index == vg_list_size(opts) )
136 menu.main_index --;
137 }
138 }
139
140 ui_px x = 0,
141 spacer = 8;
142 for( u32 draw=0; draw<2; draw ++ )
143 {
144 if( draw )
145 {
146 ui_rect inf_lb = { x, 0, 32, height };
147 ui_fill( inf_lb, lb_down? GUI_COL_NORM: GUI_COL_NORM );
148 ui_text( inf_lb, "\x91", 1, k_ui_align_middle_center, 0 );
149 }
150 x += 32 + spacer;
151
152 for( i32 i=0; i<vg_list_size(opts); i ++ )
153 {
154 ui_rect box = { x, 0, ui_text_line_width(opts[i]) + 32, height };
155
156 if( draw )
157 {
158 enum ui_button_state state = ui_button_base( box );
159 if( state == k_ui_button_click )
160 {
161 ui_fill( box, GUI_COL_DARK );
162 menu.main_index = i;
163 }
164 else if( state == k_ui_button_holding_inside )
165 {
166 ui_fill( box, GUI_COL_DARK );
167 }
168 else if( state == k_ui_button_holding_outside )
169 {
170 ui_fill( box, GUI_COL_DARK );
171 ui_outline( box, 1, GUI_COL_CLICK, 0 );
172 }
173 else if( state == k_ui_button_hover )
174 {
175 ui_fill( box, GUI_COL_NORM );
176 ui_outline( box, 1, GUI_COL_ACTIVE, 0 );
177 }
178 else
179 ui_fill( box, i==menu.main_index? GUI_COL_ACTIVE: GUI_COL_NORM );
180
181 ui_text( box, opts[i], 1, k_ui_align_middle_center, 0 );
182 }
183
184 x += box[2] + spacer;
185 }
186
187 if( draw )
188 {
189 ui_rect inf_rb = { x, 0, 32, height };
190 ui_fill( inf_rb, rb_down? GUI_COL_NORM: GUI_COL_NORM );
191 ui_text( inf_rb, "\x92", 1, k_ui_align_middle_center, 0 );
192 }
193 x += 32;
194
195 if( draw )
196 ui_fill( (ui_rect){ x+8,0, vg.window_x-(x+8),height }, GUI_COL_NORM );
197 else
198 {
199 x = vg.window_x/2 - x/2;
200 ui_fill( (ui_rect){ 0, 0, x-8, height }, GUI_COL_NORM );
201 }
202 }
203
204 if( menu.main_index == 0 )
205 {
206 }
207 else
208 {
209 if( button_down( k_srbind_mback ) )
210 {
211 skaterift.activity = k_skaterift_default;
212 return;
213 }
214 }
215
216 vg_ui.frosting = gui.factive*0.015f;
217 ui_flush( k_ui_shader_colour, vg.window_x, vg.window_y );
218 vg_ui.frosting = 0.0f;
219
220 ui_font_face( &vgf_default_small );
221 }