#include "entity.h"
#include "world.h"
#include "world_load.h"
+#include "save.h"
+#include "vg/vg_msg.h"
-VG_STATIC void world_gen_entities_init(void){
- world_instance *world = world_loading_instance();
-
+VG_STATIC void world_gen_entities_init( world_instance *world ){
/* lights */
for( u32 j=0; j<mdl_arrcount(&world->ent_light); j ++ ){
ent_light *light = mdl_arritm( &world->ent_light, j );
for( u32 j=0; j<mdl_arrcount(&world->ent_gate); j ++ ){
ent_gate *gate = mdl_arritm( &world->ent_gate, j );
- if( gate->type == k_gate_type_teleport ){
+ if( !(gate->flags & k_ent_gate_nonlocal) ) {
gate_transform_update( gate );
}
}
return;
}
- u8 world_id = (world - world_static.worlds) + 1;
+ u8 world_id = (world - world_static.instances) + 1;
u32 index = mdl_entity_id_id( call->id );
ent_audio *audio = mdl_arritm( &world->ent_audio, index );
}
}
+VG_STATIC void entity_bh_closest( void *user, u32 item_index, v3f point,
+ v3f closest ){
+ world_instance *world = user;
+
+ u32 id = world->entity_list[ item_index ],
+ type = mdl_entity_id_type( id ),
+ index = mdl_entity_id_id( id );
+
+ if( type == k_ent_gate ){
+ ent_gate *gate = mdl_arritm( &world->ent_gate, index );
+ v3_copy( gate->to_world[3], closest );
+ }
+ else if( type == k_ent_challenge ){
+ ent_challenge *challenge = mdl_arritm( &world->ent_challenge, index );
+ v3_copy( challenge->transform.co, closest );
+ }
+ else if( type == k_ent_volume ){
+ ent_volume *volume = mdl_arritm( &world->ent_volume, index );
+ v3_copy( volume->to_world[3], closest );
+ }
+ else{
+ vg_fatal_error( "Programming error\n" );
+ }
+}
+
+VG_STATIC void world_entity_start( world_instance *world, vg_msg *sav ){
+ vg_info( "Start instance %p\n", world );
+
+ world->probabilities[ k_probability_curve_constant ] = 1.0f;
+ for( u32 i=0; i<mdl_arrcount(&world->ent_audio); i++ ){
+ ent_audio *audio = mdl_arritm(&world->ent_audio,i);
+ if( audio->flags & AUDIO_FLAG_AUTO_START ){
+ ent_call call;
+ call.data = NULL;
+ call.function = k_ent_function_trigger;
+ call.id = mdl_entity_id( k_ent_audio, i );
+ entity_call( world, &call );
+ }
+ }
+
+ /* read savedata
+ * ----------------------------------------------------------------------- */
+
+ for( u32 i=0; i<mdl_arrcount(&world->ent_unlock); i++ ){
+ ent_unlock *unlock = mdl_arritm( &world->ent_unlock, i );
+ const char *alias = mdl_pstr( &world->meta, unlock->pstr_alias );
+
+ if( vg_msg_seekkvu32( sav, alias, k_vg_msg_first ) ){
+ ent_call call;
+ call.data = NULL;
+ call.function = 0;
+ call.id = mdl_entity_id( k_ent_unlock, i );
+ entity_call( world, &call );
+ }
+ }
+}
+
+VG_STATIC void world_entity_serialize( world_instance *world, vg_msg *sav ){
+ for( u32 i=0; i<mdl_arrcount(&world->ent_unlock); i++ ){
+ ent_unlock *unlock = mdl_arritm(&world->ent_unlock,i);
+
+ const char *alias = mdl_pstr(&world->meta,unlock->pstr_alias);
+ vg_msg_wkvu32( sav, alias, unlock->status );
+ }
+}
+
#endif /* WORLD_ENTITY_C */