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