fix segfault
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_challenge.c
1 #ifndef ENT_CHALLENGE_C
2 #define ENT_CHALLENGE_C
3
4 #include "entity.h"
5 #include "input.h"
6 #include "gui.h"
7 #include "audio.h"
8
9 static void ent_challenge_call( world_instance *world, ent_call *call ){
10 u32 index = mdl_entity_id_id( call->id );
11 ent_challenge *challenge = mdl_arritm( &world->ent_challenge, index );
12
13 if( call->function == 0 ){ /* unlock() */
14 if( !challenge->status ){
15 vg_info( "challenge( '%s' )\n",
16 mdl_pstr( &world->meta, challenge->pstr_alias) );
17 ent_call call;
18 call.data = NULL;
19 call.function = challenge->target_event;
20 call.id = challenge->target;
21 entity_call( world, &call );
22 }
23 challenge->status = 1;
24 }
25 else if( call->function == 1 ){ /* view() */
26 if( (localplayer.subsystem == k_player_subsystem_walk) &&
27 (world_static.challenge_target == NULL) ){
28 world_static.challenge_target = NULL;
29 world_entity_focus( call->id );
30 }
31 }
32 else {
33 vg_print_backtrace();
34 vg_error( "Unhandled function id: %u\n", call->function );
35 }
36 }
37
38 static void ent_challenge_preupdate( ent_challenge *challenge, int active ){
39 world_instance *world = world_current_instance();
40
41 /* maximum distance from active challenge */
42 if( !active ){
43 f32 min_dist2 = 999999.9f;
44
45 if( mdl_entity_id_type( challenge->first ) == k_ent_objective ){
46 u32 next = challenge->first;
47 while( mdl_entity_id_type(next) == k_ent_objective ){
48 u32 index = mdl_entity_id_id( next );
49 ent_objective *objective = mdl_arritm(&world->ent_objective,index);
50 next = objective->id_next;
51
52 f32 d2 = v3_dist2( localplayer.rb.co, objective->transform.co );
53 if( d2 < min_dist2 )
54 min_dist2 = d2;
55 }
56 }
57
58 f32 max_dist = 100.0f;
59 if( min_dist2 > max_dist*max_dist ){
60 world_static.challenge_target = NULL;
61 world_static.challenge_timer = 0.0f;
62 world_static.focused_entity = 0;
63 audio_oneshot_3d( &audio_challenge[6], localplayer.rb.co,
64 30.0f, 1.0f );
65 }
66 return;
67 }
68
69 world_entity_focus_camera( world, challenge->camera );
70
71 gui_helper_action( button_display_string( k_srbind_maccept ), "start" );
72 gui_helper_action( button_display_string( k_srbind_mback ), "exit" );
73
74 if( mdl_entity_id_type( challenge->first ) == k_ent_objective ){
75 if( button_down( k_srbind_maccept ) ){
76 u32 index = mdl_entity_id_id( challenge->first );
77 world_static.challenge_target = mdl_arritm( &world->ent_objective,
78 index );
79 world_static.challenge_timer = 0.0f;
80 world_entity_unfocus();
81
82 u32 next = challenge->first;
83 while( mdl_entity_id_type(next) == k_ent_objective ){
84 u32 index = mdl_entity_id_id( next );
85 ent_objective *objective = mdl_arritm(&world->ent_objective,index);
86 objective->flags &= ~k_ent_objective_passed;
87 next = objective->id_next;
88 v3_fill( objective->transform.s, 1.0f );
89 }
90 audio_oneshot( &audio_challenge[5], 1.0f, 0.0f );
91 return;
92 }
93 }
94
95 if( button_down( k_srbind_mback ) ){
96 world_static.challenge_target = NULL;
97 world_entity_unfocus();
98 audio_oneshot( &audio_challenge[4], 1.0f, 0.0f );
99 return;
100 }
101 }
102
103 static void ent_challenge_render( ent_challenge *challenge ){
104
105 }
106
107 #endif /* ENT_CHALLENGE_C */