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.. */
}
}
-void ent_volume_call( world_instance *world, ent_call *call )
+entity_call_result ent_volume_call( world_instance *world, ent_call *call )
{
u32 index = mdl_entity_id_id( call->id );
ent_volume *volume = mdl_arritm( &world->ent_volume, index );
- if( !volume->target ) return;
- if( call->function == k_ent_function_trigger ){
+ if( !volume->target )
+ return k_entity_call_result_OK;
+
+ if( call->function == k_ent_function_trigger )
+ {
call->id = volume->target;
- if( volume->flags & k_ent_volume_flag_particles ){
+ if( volume->flags & k_ent_volume_flag_particles )
+ {
float *co = alloca( sizeof(float)*3 );
co[0] = vg_randf64(&vg.rand)*2.0f-1.0f;
co[1] = vg_randf64(&vg.rand)*2.0f-1.0f;
call->data = co;
entity_call( world, call );
}
- else{
+ else
+ {
call->function = volume->trigger.event;
entity_call( world, call );
}
+
+ return k_entity_call_result_OK;
}
- else if( call->function == k_ent_function_trigger_leave ){
+ else if( call->function == k_ent_function_trigger_leave )
+ {
call->id = volume->target;
- if( volume->flags & k_ent_volume_flag_particles ){
+ if( volume->flags & k_ent_volume_flag_particles )
+ {
vg_warn( "Invalid condition; calling leave on particle volume.\n" );
}
- else{
+ else
+ {
call->function = volume->trigger.event_leave;
entity_call( world, call );
}
+
+ return k_entity_call_result_OK;
}
+
+ return k_entity_call_result_unhandled;
}
-void ent_audio_call( world_instance *world, ent_call *call )
+entity_call_result ent_audio_call( world_instance *world, ent_call *call )
{
- if( world->status == k_world_status_unloading ){
+ if( world->status == k_world_status_unloading )
+ {
vg_warn( "cannot modify audio while unloading world\n" );
- return;
+ return k_entity_call_result_invalid;
}
u8 world_id = (world - world_static.instances) + 1;
v3f sound_co;
- if( call->function == k_ent_function_particle_spawn ){
+ if( call->function == k_ent_function_particle_spawn )
+ {
v3_copy( call->data, sound_co );
}
- else if( call->function == k_ent_function_trigger ){
+ else if( call->function == k_ent_function_trigger )
+ {
v3_copy( audio->transform.co, sound_co );
}
else
- return;
+ return k_entity_call_result_unhandled;
float chance = vg_randf64(&vg.rand)*100.0f,
bar = 0.0f;
if( existing ){
if( existing->source == &clip->_.clip ){
audio_unlock();
- return;
+ return k_entity_call_result_OK;
}
existing->group = 0;
}
audio_unlock();
- return;
+ return k_entity_call_result_OK;
}
}
+ return k_entity_call_result_OK;
}
-void ent_ccmd_call( world_instance *world, ent_call *call )
+entity_call_result ent_ccmd_call( world_instance *world, ent_call *call )
{
- if( call->function == k_ent_function_trigger ){
+ if( call->function == k_ent_function_trigger )
+ {
u32 index = mdl_entity_id_id( call->id );
ent_ccmd *ccmd = mdl_arritm( &world->ent_ccmd, index );
- vg_execute_console_input( mdl_pstr(&world->meta, ccmd->pstr_command),
- 0 );
+ vg_execute_console_input( mdl_pstr(&world->meta, ccmd->pstr_command), 0 );
+ return k_entity_call_result_OK;
}
+ else
+ return k_entity_call_result_unhandled;
}
/*
const char *alias = mdl_pstr( &world->meta, challenge->pstr_alias );
u32 result;
- vg_msg_getkvintg( sav, alias, k_vg_msg_u32, &result );
+ vg_msg_getkvintg( sav, alias, k_vg_msg_u32, &result, NULL );
if( result ){
ent_call call;
mdl_pstr(&world->meta,route->pstr_name) ) ){
u32 flags;
- vg_msg_getkvintg( &route_info, "flags", k_vg_msg_u32, &flags );
+ vg_msg_getkvintg( &route_info, "flags", k_vg_msg_u32,
+ &flags, NULL );
route->flags |= flags;
vg_msg_getkvintg( &route_info, "best_laptime", k_vg_msg_f64,
- &route->best_laptime );
+ &route->best_laptime, NULL );
f32 sections[ route->checkpoints_count ];
vg_msg_cmd cmd;