6d503f9b9f334728bbd895033939fcbcfadb3c57
[carveJwlIkooP6JGAAIwe30JlM.git] / entity.h
1 #pragma once
2
3 #include "vg/vg_audio.h"
4 #include "vg/vg_ui/imgui.h"
5 #include "model.h"
6
7 typedef struct ent_spawn ent_spawn;
8 typedef struct ent_light ent_light;
9 typedef struct ent_gate ent_gate;
10 typedef struct ent_route_node ent_route_node;
11 typedef struct ent_path_index ent_path_index;
12 typedef struct ent_checkpoint ent_checkpoint;
13 typedef struct ent_route ent_route;
14 typedef struct ent_water ent_water;
15 typedef struct ent_audio_clip ent_audio_clip;
16 typedef struct volume_particles volume_particles;
17 typedef struct volume_trigger volume_trigger;
18 typedef struct ent_volume ent_volume;
19 typedef struct ent_audio ent_audio;
20 typedef struct ent_marker ent_marker;
21 typedef struct ent_traffic ent_traffic;
22 typedef struct ent_font ent_font;
23 typedef struct ent_font_variant ent_font_variant;
24 typedef struct ent_glyph ent_glyph;
25 typedef struct ent_skateshop ent_skateshop;
26 typedef struct ent_camera ent_camera;
27 typedef struct ent_swspreview ent_swspreview;
28 typedef struct ent_worldinfo ent_worldinfo;
29 typedef struct ent_ccmd ent_ccmd;
30 typedef struct ent_objective ent_objective;
31 typedef struct ent_challenge ent_challenge;
32 typedef struct ent_relay ent_relay;
33 typedef struct ent_cubemap ent_cubemap;
34 typedef struct ent_miniworld ent_miniworld;
35 typedef struct ent_prop ent_prop;
36 typedef struct ent_region ent_region;
37 typedef struct ent_list ent_list;
38 typedef struct ent_glider ent_glider;
39 typedef struct ent_npc ent_npc;
40
41 enum entity_alias{
42 k_ent_none = 0,
43 k_ent_gate = 1,
44 k_ent_spawn = 2,
45 k_ent_route_node = 3,
46 k_ent_route = 4,
47 k_ent_water = 5,
48 k_ent_volume = 6,
49 k_ent_audio = 7,
50 k_ent_marker = 8,
51 k_ent_font = 9,
52 k_ent_font_variant= 10,
53 k_ent_traffic = 11,
54 k_ent_skateshop = 12,
55 k_ent_camera = 13,
56 k_ent_swspreview = 14,
57 k_ent_menuitem = 15,
58 k_ent_worldinfo = 16,
59 k_ent_ccmd = 17,
60 k_ent_objective = 18,
61 k_ent_challenge = 19,
62 k_ent_relay = 20,
63 k_ent_cubemap = 21,
64 k_ent_miniworld = 22,
65 k_ent_prop = 23,
66 k_ent_list = 24,
67 k_ent_region = 25,
68 k_ent_glider = 26,
69 k_ent_npc = 27
70 };
71
72 typedef struct ent_call ent_call;
73 typedef enum entity_call_result entity_call_result;
74 enum entity_call_result
75 {
76 k_entity_call_result_OK,
77 k_entity_call_result_unhandled,
78 k_entity_call_result_invalid
79 };
80
81 static inline u32 mdl_entity_id_type( u32 entity_id )
82 {
83 return (entity_id & 0x0fff0000) >> 16;
84 }
85
86 static inline u32 mdl_entity_id_id( u32 entity_id )
87 {
88 return entity_id & 0x0000ffff;
89 }
90
91 static inline u32 mdl_entity_id( u32 type, u32 index )
92 {
93 return (type & 0xfffff)<<16 | (index & 0xfffff);
94 }
95
96 enum entity_function
97 {
98 k_ent_function_trigger,
99 k_ent_function_particle_spawn,
100 k_ent_function_trigger_leave
101 };
102
103 struct ent_spawn{
104 mdl_transform transform;
105 u32 pstr_name;
106 };
107
108 enum light_type{
109 k_light_type_point = 0,
110 k_light_type_spot = 1
111 };
112
113 struct ent_light{
114 mdl_transform transform;
115 u32 daytime,
116 type;
117
118 v4f colour;
119 float angle,
120 range;
121
122 m4x3f inverse_world;
123 v2f angle_sin_cos;
124 };
125
126 /* v101 */
127 #if 0
128 enum gate_type{
129 k_gate_type_unlinked = 0,
130 k_gate_type_teleport = 1,
131 k_gate_type_nonlocal_unlinked = 2,
132 k_gate_type_nonlocel = 3
133 };
134 #endif
135
136 /* v102+ */
137 enum ent_gate_flag{
138 k_ent_gate_linked = 0x1, /* this is a working portal */
139 k_ent_gate_nonlocal = 0x2, /* use the key string to link this portal.
140 NOTE: if set, it adds the flip flag. */
141 k_ent_gate_flip = 0x4, /* flip direction 180* for exiting portal */
142 k_ent_gate_custom_mesh = 0x8, /* use a custom submesh instead of default */
143 k_ent_gate_locked = 0x10,/* has to be unlocked to be useful */
144
145 k_ent_gate_clean_pass = 0x20,/* player didn't rewind while getting here */
146 };
147
148 struct ent_gate{
149 u32 flags,
150 target,
151 key;
152
153 v3f dimensions,
154 co[2];
155
156 v4f q[2];
157
158 /* runtime */
159 m4x3f to_world, transport;
160
161 union{
162 u32 timing_version;
163
164 struct{
165 u8 ref_count;
166 };
167 };
168
169 double timing_time;
170 u16 routes[4]; /* routes that pass through this gate */
171 u8 route_count;
172
173 /* v102+ */
174 u32 submesh_start, submesh_count;
175 };
176
177 struct ent_route_node{
178 v3f co;
179 u8 ref_count, ref_total;
180 };
181
182 struct ent_path_index{
183 u16 index;
184 };
185
186 struct ent_checkpoint{
187 u16 gate_index,
188 path_start,
189 path_count;
190
191 /* EXTENSION */
192 f32 best_time;
193 };
194
195 enum ent_route_flag {
196 k_ent_route_flag_achieve_silver = 0x1,
197 k_ent_route_flag_achieve_gold = 0x2,
198
199 k_ent_route_flag_out_of_zone = 0x10,
200 k_ent_region_flag_hasname = 0x20
201 };
202
203 struct ent_route{
204 union{
205 mdl_transform transform;
206 u32 official_track_id; /* TODO: remove this */
207 }
208 anon;
209
210 u32 pstr_name;
211 u16 checkpoints_start,
212 checkpoints_count;
213
214 v4f colour;
215
216 /* runtime */
217 u16 active_checkpoint,
218 valid_checkpoints;
219
220 f32 factive;
221 m4x3f board_transform;
222 mdl_submesh sm;
223 f64 timing_base;
224
225 u32 id_camera; /* v103+ */
226
227 /* v104+, but always accessible */
228 u32 flags;
229 f64 best_laptime;
230 f32 ui_stopper, ui_residual;
231
232 ui_px ui_first_block_width, ui_residual_block_w;
233 };
234
235 struct ent_water{
236 mdl_transform transform;
237 float max_dist;
238 u32 reserved0, reserved1;
239 };
240
241 struct ent_audio_clip{
242 union{
243 mdl_file file;
244 audio_clip clip;
245 }_;
246
247 float probability;
248 };
249
250 struct volume_particles{
251 u32 blank, blank2;
252 };
253
254 struct volume_trigger{
255 i32 event, event_leave;
256 };
257
258 enum ent_volume_flag {
259 k_ent_volume_flag_particles = 0x1,
260 k_ent_volume_flag_disabled = 0x2
261 };
262
263 struct ent_volume{
264 mdl_transform transform;
265 m4x3f to_world, to_local;
266 u32 flags;
267
268 u32 target;
269 union{
270 volume_trigger trigger;
271 volume_particles particles;
272 };
273 };
274
275 struct ent_audio{
276 mdl_transform transform;
277 u32 flags,
278 clip_start,
279 clip_count;
280 float volume, crossfade;
281 u32 behaviour,
282 group,
283 probability_curve,
284 max_channels;
285 };
286
287 struct ent_marker{
288 mdl_transform transform;
289 u32 pstr_alias;
290 };
291
292 enum skateshop_type{
293 k_skateshop_type_boardshop = 0,
294 k_skateshop_type_charshop = 1,
295 k_skateshop_type_worldshop = 2,
296 k_skateshop_type_DELETED = 3,
297 k_skateshop_type_server = 4
298 };
299
300 struct ent_skateshop{
301 mdl_transform transform;
302 u32 type, id_camera;
303
304 union{
305 struct{
306 u32 id_display,
307 id_info,
308 id_rack;
309 }
310 boards;
311
312 struct{
313 u32 id_display,
314 id_info;
315 }
316 character;
317
318 struct{
319 u32 id_display,
320 id_info;
321 }
322 worlds;
323
324 struct{
325 u32 id_lever;
326 }
327 server;
328 };
329 };
330
331 struct ent_swspreview{
332 u32 id_camera, id_display, id_display1;
333 };
334
335 struct ent_traffic{
336 mdl_transform transform;
337 u32 submesh_start,
338 submesh_count,
339 start_node,
340 node_count;
341 float speed,
342 t;
343 u32 index; /* into the path */
344 };
345
346 struct ent_camera{
347 mdl_transform transform;
348 float fov;
349 };
350
351 enum ent_menuitem_type{
352 k_ent_menuitem_type_visual = 0,
353 k_ent_menuitem_type_event_button = 1,
354 k_ent_menuitem_type_page_button = 2,
355 k_ent_menuitem_type_toggle = 3,
356 k_ent_menuitem_type_slider = 4,
357 k_ent_menuitem_type_page = 5,
358 k_ent_menuitem_type_binding = 6,
359 k_ent_menuitem_type_visual_nocol = 7,
360 k_ent_menuitem_type_disabled = 90
361 };
362
363 enum ent_menuitem_stack_behaviour{
364 k_ent_menuitem_stack_append = 0,
365 k_ent_menuitem_stack_replace = 1
366 };
367
368 typedef struct ent_menuitem ent_menuitem;
369 struct ent_menuitem{
370 u32 type, groups,
371 id_links[4]; /* ent_menuitem */
372 f32 factive, fvisible;
373
374 mdl_transform transform;
375 u32 submesh_start, submesh_count;
376
377 union{ u64 _u64; /* force storage for 64bit pointers */
378 i32 *pi32;
379 f32 *pf32;
380 void *pvoid;
381 };
382
383 union{
384 struct{
385 u32 pstr_name;
386 }
387 visual;
388
389 struct{
390 u32 id_min, /* ent_marker */
391 id_max, /* . */
392 id_handle, /* ent_menuitem */
393 pstr_data;
394 }
395 slider;
396
397 struct{
398 u32 pstr,
399 stack_behaviour;
400 }
401 button;
402
403 struct{
404 u32 id_check, /* ent_menuitem */
405 pstr_data;
406 v3f offset; /* relative to parent */
407 }
408 checkmark;
409
410 struct{
411 u32 pstr_name,
412 id_entrypoint, /* ent_menuitem */
413 id_viewpoint; /* ent_camera */
414 }
415 page;
416
417 struct{
418 u32 pstr_bind,
419 font_variant;
420 }
421 binding;
422 };
423 };
424
425 struct ent_worldinfo{
426 u32 pstr_name, pstr_author, pstr_desc;
427 f32 timezone;
428 u32 pstr_skybox;
429 u32 flags;
430 };
431
432 ent_marker *ent_find_marker( mdl_context *mdl, mdl_array_ptr *arr,
433 const char *alias );
434
435 enum channel_behaviour{
436 k_channel_behaviour_unlimited = 0,
437 k_channel_behaviour_discard_if_full = 1,
438 k_channel_behaviour_crossfade_if_full = 2
439 };
440
441 enum probability_curve{
442 k_probability_curve_constant = 0,
443 k_probability_curve_wildlife_day = 1,
444 k_probability_curve_wildlife_night = 2
445 };
446
447 struct ent_font{
448 u32 alias,
449 variant_start,
450 variant_count,
451 glyph_start,
452 glyph_count,
453 glyph_utf32_base;
454 };
455
456 struct ent_font_variant{
457 u32 name,
458 material_id;
459 };
460
461 struct ent_glyph{
462 v2f size;
463 u32 indice_start,
464 indice_count;
465 };
466
467 struct ent_ccmd{
468 u32 pstr_command;
469 };
470
471 enum ent_objective_filter{
472 k_ent_objective_filter_none = 0x00000000,
473 k_ent_objective_filter_trick_shuvit = 0x00000001,
474 k_ent_objective_filter_trick_kickflip = 0x00000002,
475 k_ent_objective_filter_trick_treflip = 0x00000004,
476 k_ent_objective_filter_trick_any =
477 k_ent_objective_filter_trick_shuvit|
478 k_ent_objective_filter_trick_treflip|
479 k_ent_objective_filter_trick_kickflip,
480 k_ent_objective_filter_flip_back = 0x00000008,
481 k_ent_objective_filter_flip_front = 0x00000010,
482 k_ent_objective_filter_flip_any =
483 k_ent_objective_filter_flip_back|
484 k_ent_objective_filter_flip_front,
485 k_ent_objective_filter_grind_truck_any = 0x00000020,
486 k_ent_objective_filter_grind_board_any = 0x00000040,
487 k_ent_objective_filter_grind_any =
488 k_ent_objective_filter_grind_truck_any|
489 k_ent_objective_filter_grind_board_any,
490 k_ent_objective_filter_footplant = 0x00000080,
491 k_ent_objective_filter_passthrough = 0x00000100
492 };
493
494 enum ent_objective_flag {
495 k_ent_objective_hidden = 0x1,
496 k_ent_objective_passed = 0x2
497 };
498
499 struct ent_objective{
500 mdl_transform transform;
501 u32 submesh_start,
502 submesh_count,
503 flags,
504 id_next,
505 filter,filter2,
506 id_win;
507 i32 win_event;
508 f32 time_limit;
509 };
510
511 enum ent_challenge_flag {
512 k_ent_challenge_timelimit = 0x1
513 };
514
515 struct ent_challenge{
516 mdl_transform transform;
517 u32 pstr_alias,
518 flags,
519 target;
520 i32 target_event;
521 u32 reset;
522 i32 reset_event;
523 u32 first,
524 camera,
525 status;
526 };
527
528 struct ent_relay {
529 u32 targets[4][2];
530 i32 targets_events[4];
531 };
532
533 struct ent_cubemap {
534 v3f co;
535 u32 resolution, live, texture_id,
536 framebuffer_id, renderbuffer_id, placeholder[2];
537 };
538
539 struct ent_miniworld {
540 mdl_transform transform;
541 u32 pstr_world;
542 u32 camera;
543 u32 proxy;
544 };
545
546 struct ent_prop {
547 mdl_transform transform;
548 u32 submesh_start, submesh_count, flags, pstr_alias;
549 };
550
551 struct ent_region {
552 mdl_transform transform;
553 u32 submesh_start, submesh_count, pstr_title, flags, zone_volume,
554
555 /* 105+ */
556 target0[2];
557 };
558
559 struct ent_glider {
560 mdl_transform transform;
561 u32 flags;
562 f32 cooldown;
563 };
564
565 struct ent_npc
566 {
567 mdl_transform transform;
568 u32 id, context, camera;
569 };
570
571 #include "world.h"
572
573 struct ent_call{
574 u32 id;
575 i32 function;
576 void *data;
577 };
578
579 typedef enum entity_call_result
580 (*fn_entity_call_handler)( world_instance *, ent_call *);
581
582 void entity_call( world_instance *world, ent_call *call );