fnugz's idea
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
1 #ifndef PLAYER_H
2 #define PLAYER_H
3
4 #include "player_api.h"
5
6 #include "player_common.h"
7 #include "player_walk.h"
8 #include "player_skate.h"
9 #include "player_dead.h"
10 #include "player_drive.h"
11
12 #define PLAYER_REWIND_FRAMES 60*4
13 #define RESET_MAX_TIME 45.0
14
15 struct player_instance
16 {
17 /* transform definition */
18 rigidbody rb, rb_gate_storage;
19 v3f angles, angles_storage;
20
21 v4f qbasis;
22 m3x3f basis, invbasis, basis_gate;
23 world_instance *viewable_world;
24
25 /*
26 * Camera management
27 * ---------------------------
28 */
29 camera cam;
30
31 enum camera_mode{
32 k_cam_firstperson = 1,
33 k_cam_thirdperson = 0
34 }
35 camera_mode;
36 float camera_type_blend;
37
38 v3f fpv_offset, /* expressed relative to rigidbody */
39 tpv_offset,
40 fpv_viewpoint, /* expressed relative to neck bone inverse final */
41 fpv_offset_smooth,
42 fpv_viewpoint_smooth,
43 tpv_offset_smooth,
44 tpv_lpf,
45 cam_velocity_smooth;
46
47 v3f cam_override_pos;
48 v2f cam_override_angles;
49 float cam_override_strength;
50
51 float cam_velocity_influence,
52 cam_velocity_coefficient,
53 cam_velocity_constant,
54 cam_velocity_coefficient_smooth,
55 cam_velocity_constant_smooth,
56 cam_velocity_influence_smooth,
57 cam_land_punch,
58 cam_land_punch_v;
59
60 ent_gate *gate_waiting;
61
62 /*
63 * Input
64 * --------------------------------
65 */
66 struct input_binding *input_js1h,
67 *input_js1v,
68 *input_js2h,
69 *input_js2v,
70 *input_jump,
71 *input_push,
72 *input_trick0,
73 *input_trick1,
74 *input_trick2,
75 *input_walk,
76 *input_walkh,
77 *input_walkv,
78 *input_use,
79 *input_reset,
80 *input_grab,
81 *input_camera;
82
83 /*
84 * Animation
85 * --------------------------------------------------
86 */
87
88 struct player_avatar *playeravatar;
89 glmesh *playermesh;
90 struct player_ragdoll ragdoll;
91 vg_tex2d *playertex;
92
93 player_pose holdout_pose;
94 float holdout_time;
95
96 /*
97 * Rewind
98 * ----------------------------------------------------
99 */
100 int rewinding, rewind_sound_wait;
101
102 struct rewind_frame{
103 v3f pos;
104 v3f ang;
105 }
106 *rewind_buffer;
107 u32 rewind_length;
108 float rewind_accum;
109 ent_gate *rewind_gate;
110
111 float rewind_total_length, rewind_predicted_time,
112 dist_accum;
113 double rewind_start, rewind_time;
114
115 /*
116 * Subsystems
117 * -------------------------------------------------
118 */
119
120 enum player_subsystem{
121 k_player_subsystem_walk = 0,
122 k_player_subsystem_skate = 1,
123 k_player_subsystem_dead = 2,
124 k_player_subsystem_drive = 3
125 }
126 subsystem,
127 subsystem_gate;
128
129 struct player_skate _skate;
130 struct player_walk _walk;
131 struct player_dead _dead;
132 struct player_drive _drive;
133 }
134 static localplayer;
135
136 /*
137 * Gameloop tables
138 * ---------------------------------------------------------
139 */
140
141 VG_STATIC
142 void (*_player_system_register[])(void) =
143 {
144 player__walk_register,
145 player__skate_register,
146 NULL,
147 NULL
148 };
149
150 VG_STATIC
151 void (*_player_bind[])( player_instance *player ) =
152 {
153 player__walk_bind,
154 player__skate_bind,
155 NULL,
156 player__drive_bind
157 };
158
159 VG_STATIC
160 void (*_player_reset[])( player_instance *player, ent_spawn *rp ) =
161 {
162 player__walk_reset,
163 player__skate_reset,
164 NULL,
165 player__drive_reset
166 };
167
168 VG_STATIC
169 void (*_player_pre_update[])( player_instance *player ) =
170 {
171 player__walk_pre_update,
172 player__skate_pre_update,
173 NULL,
174 player__drive_pre_update
175 };
176
177 VG_STATIC
178 void( *_player_update[])( player_instance *player ) =
179 {
180 player__walk_update,
181 player__skate_update,
182 player__dead_update,
183 player__drive_update
184 };
185
186 VG_STATIC
187 void( *_player_post_update[])( player_instance *player ) =
188 {
189 player__walk_post_update,
190 player__skate_post_update,
191 NULL,
192 player__drive_post_update
193 };
194
195 VG_STATIC
196 void( *_player_im_gui[])( player_instance *player ) =
197 {
198 player__walk_im_gui,
199 player__skate_im_gui,
200 NULL,
201 player__drive_im_gui
202 };
203
204 VG_STATIC
205 void( *_player_animate[])( player_instance *player, player_animation *dest ) =
206 {
207 player__walk_animate,
208 player__skate_animate,
209 player__dead_animate,
210 player__drive_animate
211 };
212
213 VG_STATIC
214 void( *_player_post_animate[])( player_instance *player ) =
215 {
216 player__walk_post_animate,
217 player__skate_post_animate,
218 player__dead_post_animate,
219 player__drive_post_animate
220 };
221
222 VG_STATIC
223 void( *_player_restore[] )( player_instance *player ) =
224 {
225 player__walk_restore,
226 player__skate_restore,
227 NULL,
228 NULL
229 };
230
231 /* implementation */
232
233 #include "player.c"
234 #include "player_common.c"
235 #include "player_walk.c"
236 #include "player_skate.c"
237 #include "player_dead.c"
238 #include "player_drive.c"
239
240 #endif /* PLAYER_H */