switch to entity list
[carveJwlIkooP6JGAAIwe30JlM.git] / entity.c
index 1e85e565ecd89ce8ceafbe0316998e1c7b185e51..cfc710618e60af5a26d6d1064c95ced82b4631e4 100644 (file)
--- a/entity.c
+++ b/entity.c
@@ -6,18 +6,34 @@
 #include "world_entity.h"
 
 #include "ent_skateshop.c"
+#include "ent_challenge.c"
 
-VG_STATIC void entity_call( world_instance *world, ent_call *call )
-{
+typedef void (*fn_entity_call_handler)( world_instance *, ent_call *);
+
+VG_STATIC 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 );
+   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_challenge] = ent_challenge_call,
+      [k_ent_ccmd]      = ent_ccmd_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 );
 }
 
 #endif /* ENTITY_C */