npcs and tutorial stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / entity.c
index f5e8004510d104c3eb9799b572a6e9c168cef7d6..557ba799a792d2e61e96f8fa3591b67ed72a4b78 100644 (file)
--- a/entity.c
+++ b/entity.c
@@ -1,25 +1,65 @@
-#ifndef ENTITY_C
-#define ENTITY_C
-
 #include "world.h"
 #include "entity.h"
 #include "world_entity.h"
 
-#include "ent_skateshop.c"
+#include "ent_objective.h"
+#include "ent_skateshop.h"
+#include "ent_relay.h"
+#include "ent_challenge.h"
+#include "ent_route.h"
+#include "ent_miniworld.h"
+#include "ent_region.h"
+#include "ent_glider.h"
+#include "ent_npc.h"
+
+typedef void (*fn_entity_call_handler)( world_instance *, ent_call *);
 
-VG_STATIC void entity_call( world_instance *world, ent_call *call )
+void entity_call( world_instance *world, ent_call *call )
 {
    u32 type = mdl_entity_id_type( call->id );
 
-   if( type == k_ent_volume ){
-      ent_volume_call( world, call );
-   } else if( type == k_ent_audio ){
-      ent_audio_call( world, call );
-   } else if( type == k_ent_skateshop ){
-      ent_skateshop_call( world, call );
-   } else if( type == k_ent_ccmd ){
-      ent_ccmd_call( world, call );
+   fn_entity_call_handler table[] = {
+      [k_ent_volume]    = ent_volume_call,
+      [k_ent_audio]     = ent_audio_call,
+      [k_ent_skateshop] = ent_skateshop_call,
+      [k_ent_objective] = ent_objective_call,
+      [k_ent_ccmd]      = ent_ccmd_call,
+      [k_ent_gate]      = ent_gate_call,
+      [k_ent_relay]     = ent_relay_call,
+      [k_ent_challenge] = ent_challenge_call,
+      [k_ent_route]     = ent_route_call,
+      [k_ent_miniworld] = ent_miniworld_call,
+      [k_ent_region]    = ent_region_call,
+      [k_ent_glider]    = ent_glider_call,
+      [k_ent_npc]       = ent_npc_call
+   };
+
+   if( type >= vg_list_size(table) ){
+      vg_error( "call to entity type: %u is out of range\n", type );
+      return;
    }
+
+   fn_entity_call_handler fn = table[ type ];
+
+   if( !fn ){
+      vg_error( "call to entity type: %u is undefined\n", type );
+      return;
+   }
+
+   fn( world, call );
+}
+
+ent_marker *ent_find_marker( mdl_context *mdl, mdl_array_ptr *arr, 
+                             const char *alias )
+{
+   for( u32 i=0; i<mdl_arrcount(arr); i++ ){
+      ent_marker *marker = mdl_arritm( arr, i );
+
+      if( !strcmp( mdl_pstr( mdl, marker->pstr_alias ), alias ) ){
+         return marker;
+      }
+   }
+
+   return NULL;
 }
 
-#endif /* ENTITY_C */