TODO about preupdate call style
[carveJwlIkooP6JGAAIwe30JlM.git] / world_entity.c
index 13c89a025da827f4382dddd0830040f8074d083e..d525572f1e7dd548b791ef50ad472bf998fd3b21 100644 (file)
@@ -115,31 +115,32 @@ void world_entity_focus_preupdate(void)
    vg_slewf( &world_static.focus_strength, active, 
              vg.time_frame_delta * (1.0f/0.5f) );
 
+   if( world_static.focused_entity == 0 )
+      return;
+
    u32 type = mdl_entity_id_type( world_static.focused_entity ),
        index = mdl_entity_id_id( world_static.focused_entity );
+
    world_instance *world = world_current_instance();
 
-   /* TODO: Table. */
-   if( type == k_ent_skateshop )
-   {
-      ent_skateshop *skateshop = mdl_arritm( &world->ent_skateshop, index );
-      ent_skateshop_preupdate( skateshop, active );
-   }
-   else if( type == k_ent_challenge )
-   {
-      ent_challenge *challenge = mdl_arritm( &world->ent_challenge, index );
-      ent_challenge_preupdate( challenge, active );
-   }
-   else if( type == k_ent_route )
+   static void (*table[])( ent_focus_context *ctx ) =
    {
-      ent_route *route = mdl_arritm( &world->ent_route, index );
-      ent_route_preupdate( route, active );
-   }
-   else if( type == k_ent_npc )
+      [ k_ent_skateshop ] = ent_skateshop_preupdate,
+      [ k_ent_challenge ] = ent_challenge_preupdate,
+      [ k_ent_route ] = ent_route_preupdate,
+      [ k_ent_npc ] = ent_npc_preupdate,
+   };
+
+   if( (type > vg_list_size(table)) || (table[type] == NULL) )
    {
-      ent_npc *npc = mdl_arritm( &world->ent_npc, index );
-      ent_npc_preupdate( npc, active );
+      vg_fatal_error( "No pre-update method set for entity (%u#%u)\n",
+                      type, index );
    }
+
+   table[type]( &(ent_focus_context){
+                  .world = world,
+                  .index = index,
+                  .active = active } );
 }
 
 /* additional renderings like text etc.. */