1429ff04a04c7a16c7b17c5a9c12ac7b4d045060
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.h
1 #ifndef PLAYER_SKATE_H
2 #define PLAYER_SKATE_H
3
4 #include "player_api.h"
5
6 #define SKATE_CCD
7
8 typedef struct jump_info jump_info;
9
10 struct player_skate{
11 struct player_skate_state{
12 enum skate_activity{
13 k_skate_activity_air,
14 k_skate_activity_air_to_grind,
15 k_skate_activity_ground,
16 k_skate_activity_undefined,
17 k_skate_activity_grind_any,
18 k_skate_activity_grind_boardslide,
19 k_skate_activity_grind_metallic,
20 k_skate_activity_grind_back50,
21 k_skate_activity_grind_front50,
22 k_skate_activity_grind_5050
23 }
24 activity,
25 activity_prev;
26
27 float reverse,
28 slip;
29
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 float trick_time;
40 enum trick_type{
41 k_trick_type_none,
42 k_trick_type_kickflip,
43 k_trick_type_shuvit,
44 k_trick_type_treflip
45 }
46 trick_type;
47 float gravity_bias;
48
49 v3f up_dir;
50 v3f head_position;
51
52 v3f throw_v;
53 v3f cog_v, cog;
54
55 float grabbing;
56 v2f grab_mouse_delta;
57
58 int charging_jump, jump_dir;
59 float jump_charge,
60 slap;
61
62 double jump_time;
63 double start_push,
64 cur_push;
65
66 v3f prev_pos;
67
68 /* initial launch conditions */
69 double air_start;
70 v3f air_init_v,
71 air_init_co;
72
73 v4f smoothed_rotation;
74 }
75 state,
76 state_gate_storage;
77
78 /* animation /audio */
79 struct skeleton_anim *anim_stand, *anim_highg, *anim_slide,
80 *anim_air, *anim_grind, *anim_grind_jump,
81 *anim_push, *anim_push_reverse,
82 *anim_ollie, *anim_ollie_reverse,
83 *anim_grabs, *anim_stop;
84 v3f
85 board_trick_residualv,
86 board_trick_residuald;
87
88 float blend_slide,
89 blend_z,
90 blend_x,
91 blend_fly,
92 blend_grind,
93 blend_grind_balance,
94 blend_stand,
95 blend_push,
96 blend_jump,
97 blend_airdir,
98 blend_weight,
99 blend_trick_foot,
100 subslap;
101
102 /* vectors representing the direction of the axels in localspace */
103 v3f truckv0[2];
104 v2f wobble;
105
106 audio_channel *aud_main, *aud_slide, *aud_air;
107 enum mdl_surface_prop surface, audio_surface;
108
109 int wheel_contacts[2];
110 float sample_change_cooldown;
111
112 enum {
113 k_skate_sample_concrete,
114 k_skate_sample_wood,
115 k_skate_sample_concrete_scrape_metal,
116 k_skate_sample_concrete_scrape_wood,
117 k_skate_sample_metal_scrape_generic
118 }
119 main_sample_type;
120
121 player_pose holdout;
122
123 /*
124 * Physics
125 * ----------------------------------------------------
126 */
127
128 float substep,
129 substep_delta;
130
131 struct jump_info{
132 v3f log[50];
133 v3f n;
134 v3f apex;
135 v3f v;
136
137 float gravity;
138
139 int log_length;
140 float score,
141 land_dist;
142
143 enum prediction_type{
144 k_prediction_none,
145 k_prediction_unset,
146 k_prediction_land,
147 k_prediction_grind
148 }
149 type;
150
151 u32 colour;
152 }
153 possible_jumps[36];
154 u32 possible_jump_count;
155
156 float land_dist;
157 v3f land_normal;
158
159 v3f surface_picture,
160 weight_distribution,
161 grind_vec,
162 grind_dir;
163
164 u32 grind_cooldown,
165 surface_cooldown;
166
167 float grind_strength;
168
169 struct grind_limit{
170 v3f ra, n;
171 float p;
172 }
173 limits[3];
174 u32 limit_count;
175 };
176
177 VG_STATIC float
178 k_friction_lat = 12.0f,
179 k_friction_resistance = 0.01f,
180
181 k_max_push_speed = 16.0f,
182 k_push_accel = 10.0f,
183 k_push_cycle_rate = 8.0f,
184
185 k_steer_ground = 2.5f,
186 k_steer_air = 3.6f,
187
188 k_jump_charge_speed = (1.0f/0.4f),
189 k_jump_force = 5.0f,
190
191 k_cog_spring = 0.2f,
192 k_cog_damp = 0.02f,
193 k_cog_mass_ratio = 0.9f,
194
195 k_mmthrow_steer = 1.0f,
196 k_mmthrow_scale = 6.0f,
197 k_mmcollect_lat = 2.0f,
198 k_mmcollect_vert = 0.0f,
199 k_mmdecay = 12.0f,
200 k_spring_angular = 1.0f,
201
202 k_spring_force = 300.0f,
203 k_spring_dampener = 5.0f,
204
205 k_grind_spring = 50.0f,
206 k_grind_aligment = 10.0f,
207 k_grind_dampener = 5.0f,
208
209 k_surface_spring = 100.0f,
210 k_surface_dampener = 40.0f,
211 k_manul_spring = 200.0f,
212 k_manul_dampener = 30.0f,
213 k_board_interia = 8.0f,
214
215 k_grind_decayxy = 30.0f,
216 k_grind_axel_min_vel = 1.0f,
217 k_grind_axel_max_angle = 0.95f, /* cosine(|a|) */
218 k_grind_axel_max_vangle = 0.4f,
219 k_grind_max_friction = 3.0f,
220 k_grind_max_edge_angle = 0.97f,
221
222 k_board_length = 0.45f,
223 k_board_width = 0.13f,
224 k_board_end_radius = 0.1f,
225 k_board_radius = 0.14f, /* 0.07 */
226
227 k_grind_balance = -40.0f;
228
229 VG_STATIC void player__skate_register(void)
230 {
231 VG_VAR_F32( k_grind_dampener, flags=VG_VAR_CHEAT );
232 VG_VAR_F32( k_grind_spring, flags=VG_VAR_CHEAT );
233 VG_VAR_F32( k_grind_aligment, flags=VG_VAR_CHEAT );
234 VG_VAR_F32( k_surface_spring, flags=VG_VAR_CHEAT );
235 VG_VAR_F32( k_surface_dampener, flags=VG_VAR_CHEAT );
236 VG_VAR_F32( k_board_interia, flags=VG_VAR_CHEAT );
237 VG_VAR_F32( k_grind_decayxy, flags=VG_VAR_CHEAT );
238 VG_VAR_F32( k_grind_axel_min_vel, flags=VG_VAR_CHEAT );
239 VG_VAR_F32( k_grind_axel_max_angle, flags=VG_VAR_CHEAT );
240 VG_VAR_F32( k_grind_max_friction, flags=VG_VAR_CHEAT );
241 VG_VAR_F32( k_grind_balance, flags=VG_VAR_CHEAT );
242 VG_VAR_F32( k_friction_lat, flags=VG_VAR_CHEAT );
243
244 VG_VAR_F32( k_cog_spring, flags=VG_VAR_CHEAT );
245 VG_VAR_F32( k_cog_damp, flags=VG_VAR_CHEAT );
246 VG_VAR_F32( k_cog_mass_ratio, flags=VG_VAR_CHEAT );
247
248 VG_VAR_F32( k_spring_force, flags=VG_VAR_CHEAT );
249 VG_VAR_F32( k_spring_dampener, flags=VG_VAR_CHEAT );
250 VG_VAR_F32( k_spring_angular, flags=VG_VAR_CHEAT );
251
252 VG_VAR_F32( k_mmthrow_scale, flags=VG_VAR_CHEAT );
253 VG_VAR_F32( k_mmcollect_lat, flags=VG_VAR_CHEAT );
254 VG_VAR_F32( k_mmcollect_vert, flags=VG_VAR_CHEAT );
255 VG_VAR_F32( k_mmdecay, flags=VG_VAR_CHEAT );
256 VG_VAR_F32( k_mmthrow_steer, flags=VG_VAR_CHEAT );
257 }
258
259 VG_STATIC void player__skate_bind ( player_instance *player );
260 VG_STATIC void player__skate_pre_update ( player_instance *player );
261 VG_STATIC void player__skate_update ( player_instance *player );
262 VG_STATIC void player__skate_post_update ( player_instance *player );
263 VG_STATIC void player__skate_im_gui ( player_instance *player );
264 VG_STATIC void player__skate_animate ( player_instance *player,
265 player_animation *anim );
266 VG_STATIC void player__skate_post_animate ( player_instance *player );
267 VG_STATIC void player__skate_reset ( player_instance *player,
268 ent_spawn *rp );
269 VG_STATIC void player__skate_restore( player_instance *player );
270
271 VG_STATIC void player__skate_clear_mechanics( player_instance *player );
272 VG_STATIC void player__skate_reset_animator( player_instance *player );
273 VG_STATIC void player__approximate_best_trajectory( player_instance *player );
274 #endif /* PLAYER_SKATE_H */