challenge effects
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_challenge.c
index 515aeb09d5e456b813dbb00c40642cc7fa72348a..bed85870c08d2ce0b1fa0f581bdfc85b8f6ebc36 100644 (file)
@@ -3,12 +3,13 @@
 
 #include "entity.h"
 #include "input.h"
+#include "gui.h"
 
 VG_STATIC void ent_challenge_call( world_instance *world, ent_call *call ){
    u32 index = mdl_entity_id_id( call->id );
    ent_challenge *challenge = mdl_arritm( &world->ent_challenge, index );
 
-   if( call->function == 0 ){ /* challenge() */
+   if( call->function == 0 ){ /* unlock() */
       if( !challenge->status ){
          vg_info( "challenge( '%s' )\n", 
                   mdl_pstr( &world->meta, challenge->pstr_alias) );
@@ -21,7 +22,11 @@ VG_STATIC void ent_challenge_call( world_instance *world, ent_call *call ){
       challenge->status = 1;
    }
    else if( call->function == 1 ){  /* view() */
-      world_entity_focus( call->id );
+      if( (localplayer.subsystem == k_player_subsystem_walk) &&
+          (world_static.challenge_target == NULL) ){
+         world_static.challenge_target = NULL;
+         world_entity_focus( call->id );
+      }
    }
    else {
       vg_print_backtrace();
@@ -53,7 +58,31 @@ VG_STATIC void ent_challenge_preupdate( ent_challenge *challenge ){
       world_static.focus_cam.farz = localplayer.cam.farz;
    }
 
+   gui_helper_action( button_display_string( k_srbind_maccept ), "start" );
+   gui_helper_action( button_display_string( k_srbind_mback ), "exit" );
+
+   if( mdl_entity_id_type( challenge->first ) == k_ent_objective ){
+      if( button_down( k_srbind_maccept ) ){
+         u32 index = mdl_entity_id_id( challenge->first );
+         world_static.challenge_target = mdl_arritm( &world->ent_objective, 
+                                                     index );
+         world_static.challenge_timer = 0.0f;
+         world_entity_unfocus();
+
+         u32 next = challenge->first;
+         while( mdl_entity_id_type(next) == k_ent_objective ){
+            u32 index = mdl_entity_id_id( next );
+            ent_objective *objective = mdl_arritm(&world->ent_objective,index);
+            objective->flags &= ~k_ent_objective_passed;
+            next = objective->id_next;
+            v3_fill( objective->transform.s, 1.0f );
+         }
+         return;
+      }
+   }
+
    if( button_down( k_srbind_mback ) ){
+      world_static.challenge_target = NULL;
       world_entity_unfocus();
       return;
    }