X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_entity.c;h=cdc76f1ae23d96d5bde4957843f86ea791e7ba7a;hb=95f6ef1a859423a0d9554ac6a9f4c6cbd8bb540c;hp=88e0e7e1a240815bc38bde6606efa077f919d09d;hpb=d0069069f683eab48418faed415de932896d08ee;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_entity.c b/world_entity.c index 88e0e7e..cdc76f1 100644 --- a/world_entity.c +++ b/world_entity.c @@ -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.. */ @@ -347,16 +348,20 @@ void world_default_spawn_pos( world_instance *world, v3f pos ) } } -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; @@ -367,29 +372,40 @@ void ent_volume_call( world_instance *world, ent_call *call ) 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; @@ -398,14 +414,16 @@ void ent_audio_call( world_instance *world, ent_call *call ) 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; @@ -458,7 +476,7 @@ void ent_audio_call( world_instance *world, ent_call *call ) if( existing ){ if( existing->source == &clip->_.clip ){ audio_unlock(); - return; + return k_entity_call_result_OK; } existing->group = 0; @@ -479,20 +497,24 @@ void ent_audio_call( world_instance *world, ent_call *call ) } 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; } /* @@ -745,7 +767,7 @@ void world_entity_start( world_instance *world, vg_msg *sav ) 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; @@ -766,11 +788,12 @@ void world_entity_start( world_instance *world, vg_msg *sav ) 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;