some gate improvements
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.c
index d366a123e09ee0f3f5e079504dacf1e66bdbb440..44d055b1686409fa68015036d5993f194ce29028 100644 (file)
@@ -6,6 +6,7 @@
 #define ROUTES_C
 
 #include <time.h>
+#include "entity.h"
 #include "world_routes.h"
 #include "world_gate.h"
 #include "world_load.h"
@@ -31,17 +32,13 @@ void world_routes_local_set_record( world_instance *world, ent_route *route,
       if( time_centiseconds > (float)0xfffe )   /* skill issue */
          return;
 
-      highscore_record temp;
-      temp.trackid  = route->official_track_id;
-      temp.datetime = time(NULL);
-      temp.playerid = 0;
-      temp.points   = 0;
-      temp.time     = time_centiseconds;
-#if 0
-      highscores_push_record( &temp );
-#endif
-
       struct track_info *ti = &track_infos[ route->official_track_id ];
+      highscore_record *record = &ti->record;
+      record->trackid  = route->official_track_id;
+      record->datetime = time(NULL);
+      record->playerid = 0;
+      record->points   = 0;
+      record->time     = time_centiseconds;
       ti->push = 1;
       
       if( ti->achievement_id ){
@@ -136,7 +133,7 @@ VG_STATIC void world_routes_activate_entry_gate( world_instance *world,
    world_static.last_use = world_static.time;
 
    /* disable all routes and leave the world */
-   if( rg->type == k_gate_type_nonlocel ){
+   if( rg->flags & k_ent_gate_nonlocal ){
       for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
          ent_route *route = mdl_arritm( &world->ent_route, i );
          route->active_checkpoint = 0xffff;
@@ -182,7 +179,7 @@ VG_STATIC void world_routes_debug( world_instance *world )
 {
    for( u32 i=0; i<mdl_arrcount(&world->ent_route_node); i++ ){
       ent_route_node *rn = mdl_arritm(&world->ent_route_node,i);
-      vg_line_pt3( rn->co, 0.25f, VG__WHITE );
+      vg_line_point( rn->co, 0.25f, VG__WHITE );
    }
 
    for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
@@ -254,15 +251,12 @@ void world_routes_pointcloud_spot( world_instance *world,
       v3_sub( point, pcbuf->boundary[0], pos );
       v3_mul( pos, inv_ext, pos );
 
-      for( u32 i=0; i<3; i++ ){
-         vert->pos[i] = (pos[i]-0.5f) * 32767.0f;
-      }
-
       float dist = 1.0f-(v3_length(jitter));
 
-      for( u32 i=0; i<4; i++ ){
-         vert->colour[i] = colour[i] * 255.0f * dist*dist;
-      }
+      v4f final_colour;
+      v4_muls( colour, dist*dist, final_colour );
+
+      pointcloud_packvert( vert, pos, final_colour );
    }
 }
 
@@ -306,14 +300,7 @@ void world_routes_pointcloud_tower( world_instance *world,
       v3_sub( point, pcbuf->boundary[0], point );
       v3_mul( point, inv_ext, point );
 
-      /* TODO....... */
-      for( u32 i=0; i<3; i++ ){
-         vert->pos[i] = (point[i]-0.5f) * 32767.0f;
-      }
-
-      for( u32 i=0; i<4; i++ ){
-         vert->colour[i] = colour[i] * 255.0f;
-      }
+      pointcloud_packvert( vert, point, colour );
    }
 }
 
@@ -666,10 +653,6 @@ VG_STATIC f64 world_routes_scatter_surface_points( world_instance *world,
          v3_sub( pt, pcbuf->boundary[0], pos );
          v3_mul( pos, inv_ext, pos );
 
-         for( u32 i=0; i<3; i++ ){
-            vert->pos[i] = (pos[i]-0.5f) * 32767.0f;
-         }
-
          static v4f colours[] = {
             [k_surface_prop_concrete] = { 0.13, 0.15, 0.17, 1.0 },
             [k_surface_prop_grass]    = { 0.07, 0.1, 0.14, 1.0 },
@@ -679,16 +662,13 @@ VG_STATIC f64 world_routes_scatter_surface_points( world_instance *world,
          };
 
          v4f col = {0.0f,0.0f,0.0f,0.0f};
-         if( surf->info.surface_prop < vg_list_size(colours) ){
+         if( surf->info.surface_prop < vg_list_size(colours) )
             v4_copy( colours[surf->info.surface_prop], col );
-         }
 
          f32 brightness = v3_dot(vn,light_dir)*0.5f+0.5f;
          v3_muls( col, brightness, col );
 
-         for( u32 j=0; j<4; j++ ){
-            vert->colour[j] = col[j] * 255.0f;
-         }
+         pointcloud_packvert( vert, pos, col );
       }
    }
 
@@ -757,13 +737,7 @@ VG_STATIC void world_routes_surface_grid( world_instance *world,
                   v3_sub( hit, pcbuf->boundary[0], co );
                   v3_mul( co, inv_ext, co );
 
-                  for( u32 i=0; i<3; i++ ){
-                     vert->pos[i] = (co[i]-0.5f) * 32767.0f;
-                  }
-
-                  for( u32 i=0; i<4; i++ ){
-                     vert->colour[i] = colour[i] * 255.0f;
-                  }
+                  pointcloud_packvert( vert, co, colour );
                }
             }
          }
@@ -771,6 +745,33 @@ VG_STATIC void world_routes_surface_grid( world_instance *world,
    }
 }
 
+VG_STATIC void world_write_preview( pointcloud_buffer *pcbuf ){
+   char path_buf[4096];
+   vg_str path;
+   vg_strnull( &path, path_buf, 4096 );
+
+   if( world_loader.reg ){
+      /* Don't want to override the one we get from the workshop */
+      if( world_loader.reg->alias.workshop_id ) return;
+
+      addon_get_content_folder( world_loader.reg, &path );
+   }
+   else{
+      vg_strcat( &path, "maps/" );
+      vg_strcat( &path, world_loader.override_name );
+   }
+
+   vg_strcat( &path, "/preview.bin" );
+
+   if( !vg_strgood( &path ) ) vg_fatal_error( "Path too long\n" );
+   FILE *fp = fopen( path_buf, "wb" );
+   if( !fp ) vg_fatal_error( "Cannot open '%s' for writing\n", path_buf );
+   
+   fwrite( pcbuf, sizeof(struct pointcloud_buffer) + 
+                  sizeof(struct pointcloud_vert)*pcbuf->count, 1, fp );
+   fclose( fp );
+}
+
 /* 
  * Create the strips of colour that run through the world along course paths
  */
@@ -865,23 +866,7 @@ VG_STATIC void world_gen_routes_generate(void)
       vg_info( "Distrubuted %u points over %fkm^2!\n", 
                 pcbuf->count, area/1e6f );
 
-      if( world_loader.location == k_world_load_type_local ){
-         char path_buf[4096];
-         vg_str path;
-         vg_strnull( &path, path_buf, 4096 );
-         vg_strcat( &path, "maps/" );
-         vg_strcat( &path, world_loader.name );
-         vg_strcat( &path, "/preview.bin" );
-
-         if( !vg_strgood( &path ) ) vg_fatal_error( "Path too long\n" );
-         FILE *fp = fopen( path_buf, "wb" );
-         if( !fp ) vg_fatal_error( "Cannot open '%s' for writing\n", path_buf );
-         
-         fwrite( pcbuf, sizeof(pcbuf) + 
-                        sizeof(struct pointcloud_vert)*pcbuf->count, 1, fp );
-         fclose( fp );
-      }
-
+      world_write_preview( pcbuf );
       vg_async_dispatch( call_pointcloud, async_pointcloud_sub );
    }
 
@@ -927,7 +912,8 @@ VG_STATIC void world_gen_routes_ent_init(void)
             }
          }
 
-         if( gate->type == k_gate_type_teleport ){
+         if( (gate->flags & k_ent_gate_linked) &
+            !(gate->flags & k_ent_gate_nonlocal) ){
             gate = mdl_arritm(&world->ent_gate, gate->target );
 
             for( u32 k=0; k<4; k++ ){