update helpers/location to 'frosted' ui
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.h
1 #pragma once
2 #include "vg/vg_audio.h"
3 #include "player.h"
4 #include "player_api.h"
5
6 typedef struct jump_info jump_info;
7
8 struct player_skate{
9 struct player_skate_state{
10 enum skate_activity{
11 k_skate_activity_air,
12 k_skate_activity_air_to_grind,
13 k_skate_activity_ground,
14 k_skate_activity_handplant,
15 k_skate_activity_undefined,
16 k_skate_activity_grind_any,
17 k_skate_activity_grind_boardslide,
18 k_skate_activity_grind_metallic,
19 k_skate_activity_grind_back50,
20 k_skate_activity_grind_front50,
21 k_skate_activity_grind_5050
22 }
23 activity,
24 activity_prev;
25
26 u32 grind_cooldown,
27 surface_cooldown;
28
29 f32 reverse, slip, delayed_slip_dir;
30 int manual_direction;
31
32 /* tricks */
33 v3f flip_axis;
34 float flip_time,
35 flip_rate;
36
37 v3f trick_vel, /* measured in units of TAU/s */
38 trick_euler; /* measured in units of TAU */
39 v3f trick_residualv, /* spring */
40 trick_residuald;
41
42 float trick_time;
43 enum trick_type{
44 k_trick_type_none,
45 k_trick_type_kickflip,
46 k_trick_type_shuvit,
47 k_trick_type_treflip,
48 }
49 trick_type;
50 float gravity_bias;
51
52 f32 trick_input_collect;
53
54 v3f up_dir;
55 v3f head_position;
56
57 v3f throw_v;
58 v3f cog_v, cog;
59
60 float grabbing;
61 v2f grab_mouse_delta;
62
63 int charging_jump, jump_dir;
64 float jump_charge,
65 slap;
66
67 double jump_time;
68 double start_push,
69 cur_push;
70
71 v3f prev_pos;
72
73 /* initial launch conditions */
74 double air_start;
75 v3f air_init_v,
76 air_init_co;
77
78 float land_dist;
79 v3f land_normal;
80 v4f smoothed_rotation;
81
82 f32 velocity_limit, grind_y_start, skid;
83 f32 handplant_t;
84
85 v3f store_cog_v, store_cog, store_co;
86 v4f store_smoothed, store_q;
87 }
88 state;
89
90 struct player_skate_animator {
91 v3f root_co;
92 v4f root_q;
93 v3f root_v;
94
95 v3f offset,
96 local_cog;
97
98 f32 slide,
99 skid,
100 z,
101 x,
102 fly,
103 grind,
104 grind_balance,
105 stand,
106 push,
107 jump,
108 airdir,
109 weight,
110 trick_foot,
111 slap,
112 subslap,
113 reverse,
114 delayed_slip_dir,
115 grabbing;
116
117 v2f wobble;
118 f32 foot_offset[2];
119
120 v4f qfixuptotal;
121 v4f qflip;
122
123 v3f board_euler;
124 f32 board_lean;
125 v2f steer, grab;
126
127 f32 jump_charge;
128
129 /* linear anims. TODO: we can union a bunch of variables here depending
130 * on activity. */
131 f32 push_time, jump_time, handplant_t;
132 u8 jump_dir;
133 u8 trick_type; /* todo: should encode grind type */
134 u8 activity, surface;
135 }
136 animator;
137
138 f32 collect_feedback;
139
140 /* animation /audio
141 * --------------------------------------------------------------*/
142 struct skeleton_anim *anim_stand, *anim_highg, *anim_slide,
143 *anim_air, *anim_grind, *anim_grind_jump,
144 *anim_push, *anim_push_reverse,
145 *anim_ollie, *anim_ollie_reverse,
146 *anim_grabs, *anim_stop,
147 *anim_handplant;
148
149 /* vectors representing the direction of the axels in localspace */
150 v3f truckv0[2];
151
152 audio_channel *aud_main, *aud_slide, *aud_air;
153 enum mdl_surface_prop surface, audio_surface;
154
155 int wheel_contacts[2];
156 float sample_change_cooldown;
157
158 enum {
159 k_skate_sample_concrete,
160 k_skate_sample_wood,
161 k_skate_sample_concrete_scrape_metal,
162 k_skate_sample_concrete_scrape_wood,
163 k_skate_sample_metal_scrape_generic
164 }
165 main_sample_type;
166
167 /*
168 * Physics
169 * ----------------------------------------------------
170 */
171
172 float substep, substep_delta;
173
174 struct jump_info{
175 v3f log[50];
176 v3f n;
177 v3f apex;
178 v3f v;
179
180 float gravity;
181
182 int log_length;
183 float score,
184 land_dist;
185
186 enum prediction_type{
187 k_prediction_none,
188 k_prediction_unset,
189 k_prediction_land,
190 k_prediction_grind
191 }
192 type;
193
194 u32 colour;
195 }
196 possible_jumps[36];
197 u32 possible_jump_count;
198
199 v3f surface_picture,
200 weight_distribution,
201 grind_vec,
202 grind_dir;
203
204 float grind_strength;
205 struct grind_limit{
206 v3f ra, n;
207 float p;
208 }
209 limits[3];
210 u32 limit_count;
211 }
212 extern player_skate;
213 extern struct player_subsystem_interface player_subsystem_skate;
214
215 enum player_skate_soundeffect {
216 k_player_skate_soundeffect_jump,
217 k_player_skate_soundeffect_tap,
218 k_player_skate_soundeffect_land_good,
219 k_player_skate_soundeffect_land_bad,
220 k_player_skate_soundeffect_grind_metal,
221 k_player_skate_soundeffect_grind_wood,
222 };
223
224 static float
225 k_friction_lat = 12.0f,
226 k_friction_resistance = 0.01f,
227
228 k_max_push_speed = 16.0f,
229 k_push_accel = 10.0f,
230 k_push_cycle_rate = 8.0f,
231
232 k_steer_ground = 2.5f,
233 k_steer_air = 3.6f,
234
235 k_jump_charge_speed = (1.0f/0.4f),
236 k_jump_force = 5.0f,
237
238 k_cog_spring = 0.2f,
239 k_cog_damp = 0.02f,
240 k_cog_mass_ratio = 0.9f,
241
242 k_mmthrow_steer = 1.0f,
243 k_mmthrow_scale = 6.0f,
244 k_mmcollect_lat = 2.0f,
245 k_mmcollect_vert = 0.0f,
246 k_mmdecay = 12.0f,
247 k_spring_angular = 1.0f,
248
249 k_spring_force = 300.0f,
250 k_spring_dampener = 5.0f,
251
252 k_grind_spring = 50.0f,
253 k_grind_aligment = 10.0f,
254 k_grind_dampener = 5.0f,
255
256 k_surface_spring = 100.0f,
257 k_surface_dampener = 40.0f,
258 k_manul_spring = 200.0f,
259 k_manul_dampener = 30.0f,
260 k_board_interia = 8.0f,
261
262 k_grind_decayxy = 30.0f,
263 k_grind_axel_min_vel = 1.0f,
264 k_grind_axel_max_angle = 0.95f, /* cosine(|a|) */
265 k_grind_axel_max_vangle = 0.4f,
266 k_grind_max_friction = 3.0f,
267 k_grind_max_edge_angle = 0.97f,
268
269 k_board_length = 0.45f,
270 k_board_width = 0.13f,
271 k_board_end_radius = 0.1f,
272 k_board_radius = 0.14f, /* 0.07 */
273
274 k_grind_balance = -40.0f,
275 k_anim_transition = 0.12f;
276
277 static void player__skate_register(void){
278 VG_VAR_F32( k_grind_dampener, flags=VG_VAR_CHEAT );
279 VG_VAR_F32( k_grind_spring, flags=VG_VAR_CHEAT );
280 VG_VAR_F32( k_grind_aligment, flags=VG_VAR_CHEAT );
281 VG_VAR_F32( k_surface_spring, flags=VG_VAR_CHEAT );
282 VG_VAR_F32( k_surface_dampener, flags=VG_VAR_CHEAT );
283 VG_VAR_F32( k_board_interia, flags=VG_VAR_CHEAT );
284 VG_VAR_F32( k_grind_decayxy, flags=VG_VAR_CHEAT );
285 VG_VAR_F32( k_grind_axel_min_vel, flags=VG_VAR_CHEAT );
286 VG_VAR_F32( k_grind_axel_max_angle, flags=VG_VAR_CHEAT );
287 VG_VAR_F32( k_grind_max_friction, flags=VG_VAR_CHEAT );
288 VG_VAR_F32( k_grind_balance, flags=VG_VAR_CHEAT );
289 VG_VAR_F32( k_friction_lat, flags=VG_VAR_CHEAT );
290
291 VG_VAR_F32( k_cog_spring, flags=VG_VAR_CHEAT );
292 VG_VAR_F32( k_cog_damp, flags=VG_VAR_CHEAT );
293 VG_VAR_F32( k_cog_mass_ratio, flags=VG_VAR_CHEAT );
294
295 VG_VAR_F32( k_spring_force, flags=VG_VAR_CHEAT );
296 VG_VAR_F32( k_spring_dampener, flags=VG_VAR_CHEAT );
297 VG_VAR_F32( k_spring_angular, flags=VG_VAR_CHEAT );
298
299 VG_VAR_F32( k_mmthrow_scale, flags=VG_VAR_CHEAT );
300 VG_VAR_F32( k_mmcollect_lat, flags=VG_VAR_CHEAT );
301 VG_VAR_F32( k_mmcollect_vert, flags=VG_VAR_CHEAT );
302 VG_VAR_F32( k_mmdecay, flags=VG_VAR_CHEAT );
303 VG_VAR_F32( k_mmthrow_steer, flags=VG_VAR_CHEAT );
304 VG_VAR_F32( k_anim_transition, flags=VG_VAR_CHEAT );
305 }
306
307 void player__skate_bind (void);
308 void player__skate_pre_update (void);
309 void player__skate_update (void);
310 void player__skate_post_update (void);
311 void player__skate_im_gui (void);
312 void player__skate_animate (void);
313 void player__skate_pose (void *animator, player_pose *pose);
314 void player__skate_effects( void *_animator, m4x3f *final_mtx,
315 struct player_board *board,
316 struct player_effects_data *effect_data );
317 void player__skate_post_animate (void);
318 void player__skate_animator_exchange( bitpack_ctx *ctx, void *data );
319 void player__skate_sfx_oneshot ( u8 id, v3f pos, f32 volume );
320
321 void player__skate_clear_mechanics(void);
322 void player__skate_reset_animator(void);
323 void player__approximate_best_trajectory(void);
324 void player__skate_comp_audio( void *animator );
325 void player__skate_kill_audio(void);