oh yeah mr crabs
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gen.h
index 54857f59137ea40c3c34f84ad6004cb8ebcf49aa..31722e563bf40f8a662929b000cdb5747fefe559 100644 (file)
@@ -227,9 +227,79 @@ static void world_load(void)
          vg_strncpy( mdl_pstr(mworld, box->pstr_name), zone->name, 31 );
          zone->name[31] = 0x00;
          zone->triggered = 0;
+
+         if( box->trigger )
+            zone->ptarget_delegated = mdl_node_from_id( mworld, box->trigger );
+         else
+            zone->ptarget_delegated = NULL;
+      }
+      else if( pnode->classtype == k_classtype_audio )
+      {
+         world.audio_things = 
+            buffer_reserve( world.audio_things,
+                            world.audio_things_count,
+                            &world.audio_things_cap, 1, 
+                            sizeof(struct world_audio_thing) );
+
+         struct world_audio_thing *thing = &world.audio_things[
+                                            world.audio_things_count ];
+         memset( thing, 0, sizeof(struct world_audio_thing) );
+         struct classtype_audio *aud = mdl_get_entdata(mworld,pnode);
+
+         v3_copy( pnode->co, thing->pos );
+         
+         if( aud->flags & AUDIO_FLAG_SPACIAL_3D )
+            thing->volume = aud->volume * pnode->s[0];
+         else
+            thing->volume = aud->volume;
+
+         thing->flags = aud->flags;
+         const char *fp = mdl_pstr( mworld, aud->pstr_file );
+         char *path2 = vg_alloc( strlen(fp)+1 );
+         strcpy( path2, fp );
+         thing->temp_embedded_clip.path = path2;
+         thing->temp_embedded_clip.source_mode = k_audio_source_compressed;
+         audio_clip_load( &thing->temp_embedded_clip );
+         thing->player.name = "[temp]";
+         thing->player.enqued = 0;
+
+         pnode->sub_uid = world.audio_things_count;
+         world.audio_things_count ++;
       }
    }
 
+   /* fixup links */
+   for( int i=0; i<world.achievement_zones_count; i ++ )
+   {
+      struct achievement_zone *ach = &world.achievement_zones[ i ];
+      if( ach->ptarget_delegated )
+      {
+         u32 id = ach->ptarget_delegated->sub_uid;
+         ach->ptarget = &world.audio_things[ id ];
+      }
+      else
+         ach->ptarget = NULL;
+   }
+
+   /* initialize audio if need be */
+   audio_lock();
+   for( int i=0; i<world.audio_things_count; i++ )
+   {
+      struct world_audio_thing *thingy = &world.audio_things[ i ];
+      
+      audio_player_init( &thingy->player );
+      audio_player_set_flags( &thingy->player, thingy->flags );
+      audio_player_set_vol( &thingy->player, thingy->volume );
+      audio_player_set_pan( &thingy->player, 0.0f );
+
+      if( thingy->flags & AUDIO_FLAG_SPACIAL_3D )
+         audio_player_set_position( &thingy->player, thingy->pos );
+
+      if( thingy->flags & AUDIO_FLAG_AUTO_START )
+         audio_player_playclip( &thingy->player, &thingy->temp_embedded_clip );
+   }
+   audio_unlock();
+
    world.instance_cache = buffer_fix( world.instance_cache, 
                                       world.instance_cache_count,
                                      &world.instance_cache_cap,