Menu world locks and fix rendering issue in depth map
authorhgn <hgodden00@gmail.com>
Thu, 6 Mar 2025 14:14:43 +0000 (14:14 +0000)
committerhgn <hgodden00@gmail.com>
Thu, 6 Mar 2025 14:14:43 +0000 (14:14 +0000)
build.c
content_skaterift/maps/mp_line1/addon.inf
content_skaterift/models/rs_superworlds.mdl
src/addon_types.h
src/menu.c
src/world_map.c
src/world_map.h
src/world_render.c

diff --git a/build.c b/build.c
index 20d180d1733b3e2a00e2177816b4b756d8c224e4..ec772baaded0c32340be746c0d9504d486501448 100644 (file)
--- a/build.c
+++ b/build.c
@@ -119,7 +119,7 @@ void build_game_metadata(void)
       { "Mt.Zero Island", "Australia", "content_skaterift/maps/mp_mtzero/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_MTZERO | ADDON_REG_PREMIUM },
       { "Flat World", "...", "content_skaterift/maps/dev_flatworld/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_HIDDEN },
       { "Heaven", "...", "content_skaterift/maps/dev_heaven/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_HIDDEN },
-      { "Valley", "Cambodia", "content_skaterift/maps/mp_line1/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_PREMIUM },
+      { "Valley", "Cambodia", "content_skaterift/maps/mp_line1/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_VALLEY | ADDON_REG_PREMIUM },
       { "Training Island", "Australia", "content_skaterift/maps/dev_tutorial/addon.inf", ADDON_REG_CAMPAIGN },
       { "Center Island", "Australia", "content_skaterift/maps/dev_hub/addon.inf", ADDON_REG_CAMPAIGN },
       { "Downtown", "USA, Georgia", "content_skaterift/maps/mp_spawn/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_CITY | ADDON_REG_PREMIUM }
index 0e44d05ea3480ecbfa1ba669a9e66f12770d1eeb..e7d0d6ce46a344a5ae99f0101b9defd12184d715 100644 (file)
Binary files a/content_skaterift/maps/mp_line1/addon.inf and b/content_skaterift/maps/mp_line1/addon.inf differ
index 71733c5dfbd7e45abd85b2b3023bf7ff2f6e5a84..48523f982ece760ad632414ab9846604cedf6610 100644 (file)
Binary files a/content_skaterift/models/rs_superworlds.mdl and b/content_skaterift/models/rs_superworlds.mdl differ
index 8e0b5dc7eaad96effae1c590e408da18983bcec0..5f50d618e36ccc1dc68f2d2a925834bf058e1fd0 100644 (file)
@@ -22,6 +22,8 @@ enum addon_type{
 #define ADDON_REG_VENUS    0x40
 #define ADDON_REG_INFINITE 0x80
 
+#define ADDON_REG_VALLEY   0x100
+
 #ifdef VG_ENGINE
 
 struct addon_type_info 
index 89cc0b99278f15875e4bd47565229c3896596c26..edb95b6536aebf99bdc9a7b5f98b3463335fd012 100644 (file)
@@ -374,8 +374,20 @@ static void menu_link_modal( const char *url )
 void menu_update_world_list(void)
 {
    menu_update_world_filter();
-   menu.world_list_total_count = addon_count( k_addon_type_world, 
-                                              menu.world_list_whitelist, menu.world_list_blacklist );
+   world_map.selected_superworld_locked = 0;
+   if( world_map.superworld_list_selected == k_superworld_infinite ) world_map.selected_superworld_locked = 1;
+   if( world_map.superworld_list_selected == k_superworld_venus_moon )
+   {
+      world_map.selected_superworld_locked = !_skaterift_script_check_unlocked( k_escript_script_id_ch4s3 );
+   }
+
+   if( world_map.selected_superworld_locked )
+   {
+      menu.world_list_total_count = 0;
+      menu.world_list_display_count = 0;
+   }
+
+   menu.world_list_total_count = addon_count( k_addon_type_world, menu.world_list_whitelist, menu.world_list_blacklist );
    menu.world_list_display_count = 0;
 
    i32 *selected_world_index = &menu.world_list_selected_index[ world_map.superworld_list_selected ];
@@ -402,22 +414,37 @@ void menu_update_world_list(void)
       {
          addon_reg *reg = get_addon_from_index( k_addon_type_world, world_index, 
                                                 menu.world_list_whitelist, menu.world_list_blacklist );
-         menu.world_list_entries[ menu.world_list_display_count ] = reg;
+         bool unlocked = 1;
 
-         const char *name = NULL;
+         if( reg->flags & ADDON_REG_MTZERO )
+            unlocked = _skaterift_script_check_unlocked( k_escript_script_id_ch2s1 );
+         if( reg->flags & ADDON_REG_CITY )
+            unlocked = _skaterift_script_check_unlocked( k_escript_script_id_ch3s1 );
+         if( reg->flags & ADDON_REG_VALLEY )
+            unlocked = _skaterift_script_check_unlocked( k_escript_script_id_ch4s1a );
 
-         vg_msg msg;
-         vg_msg_init( &msg, reg->metadata, reg->metadata_len );
+         menu.world_list_entries[ menu.world_list_display_count ] = unlocked? reg: NULL;
 
-         if( vg_msg_seekframe( &msg, "workshop" ) )
+         if( unlocked )
          {
-            name = vg_msg_getkvstr( &msg, "title" );
-         }
+            const char *name = NULL;
+            vg_msg msg;
+            vg_msg_init( &msg, reg->metadata, reg->metadata_len );
 
-         if( !name )
-            name = reg->alias.foldername;
+            if( vg_msg_seekframe( &msg, "workshop" ) )
+            {
+               name = vg_msg_getkvstr( &msg, "title" );
+            }
+
+            if( !name )
+               name = reg->alias.foldername;
 
-         menu.world_list_names[ menu.world_list_display_count ] = name;
+            menu.world_list_names[ menu.world_list_display_count ] = name;
+         }
+         else
+         {
+            menu.world_list_names[ menu.world_list_display_count ] = "...";
+         }
          menu.world_list_display_count ++;
       }
    }
index 3acda21698c154c14874cc0eacccf6d6113cd5b3..0a618acd63be34ceb765cc9b3f986653a6f3f797 100644 (file)
@@ -374,7 +374,8 @@ void render_world_map(void)
       glDisable( GL_CULL_FACE );
 
       vg_camera cam, *smooth_cam = &world_map.superworld_cam;
-      ent_camera *cam_temp = af_arritm( &world_map.ent_camera, world_map.superworld_list_selected );
+      ent_camera *cam_temp = af_arritm( &world_map.ent_camera, world_map.selected_superworld_locked? 
+                                                               k_superworld_max: world_map.superworld_list_selected );
       ent_camera_unpack( cam_temp, &cam );
 
       vg_camera_lerp( smooth_cam, &cam, vg.time_frame_delta * 6.0f, smooth_cam );
@@ -781,7 +782,8 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al
       ui_split( planet_box, k_ui_axis_h, 28, 0, planet_box_title, planet_box );
       ui_fill( ctx, planet_box_title, ui_opacity( GUI_COL_DARK, 0.2f ) );
       ctx->font = &vgf_default_large;
-      ui_text( ctx, planet_box_title, _superworld_names[world_map.superworld_list_selected], 1, 
+      ui_text( ctx, planet_box_title, world_map.selected_superworld_locked? "Locked..": 
+                                      _superworld_names[world_map.superworld_list_selected], 1, 
                k_ui_align_middle_center, ui_colour(ctx,k_ui_yellow) );
 
       ui_px change_w = 48,
@@ -870,16 +872,25 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al
       {
          addon_reg *reg = menu.world_list_entries[i];
 
-         bool selected = reg == menu.clicked_world_reg;
+         bool clickable = 1;
          
-         if( selected )
+         if( reg )
          {
-            ui_rect sel_box, _null;
-            ui_split( panel, k_ui_axis_h, ctx->font->sy*2, 8, sel_box, _null );
-            ui_outline( ctx, sel_box, 2, ui_colour(ctx,k_ui_fg), 0 );
+            bool selected = reg == menu.clicked_world_reg;
+            if( selected )
+            {
+               ui_rect sel_box, _null;
+               ui_split( panel, k_ui_axis_h, ctx->font->sy*2, 8, sel_box, _null );
+               ui_outline( ctx, sel_box, 2, ui_colour(ctx,k_ui_fg), 0 );
+            }
+            clickable = !selected;
+         }
+         else
+         {
+            clickable = 0;
          }
 
-         if( menu_button( ctx, panel, R == (page_base + i), !selected, menu.world_list_names[i] ) )
+         if( menu_button( ctx, panel, R == (page_base + i), clickable, menu.world_list_names[i] ) )
          {
             menu.clicked_world_reg = reg;
             menu.clicked_world_name = menu.world_list_names[i];
index 95dd78212ad759b95d370d038e9967895b2e8617..2b8e7bbba2b91898cf9d370ceee049363249837b 100644 (file)
@@ -38,6 +38,7 @@ struct world_map
 
    i32 superworld_list_selected,
        superworld_actual_world;
+   bool selected_superworld_locked;
 
    vg_camera superworld_cam;
    v2f view_centroid;
index 98b27e97179cee1bd5f116c3d3952a30ae4e3c26..f9f47e93fa8d286b11390278bcd6332c504c6ed4 100644 (file)
@@ -1518,7 +1518,14 @@ void render_world_depth( world_instance *world, vg_camera *cam )
    world_link_lighting_ub( world, _shader_scene_depth.id );
 
    mesh_bind( &world->mesh_geo );
-   mesh_draw( &world->mesh_geo );
+   for( int i=0; i<world->surface_count; i++ )
+   {
+      struct world_surface *mat = &world->surfaces[i];
+      if( mat->info.flags & k_material_flag_ghosts ) continue;
+
+      mdl_submesh *sm = &mat->sm_geo;
+      mdl_draw_submesh( sm );
+   }
 }
 
 void render_world_position( world_instance *world, vg_camera *cam )
@@ -1534,7 +1541,14 @@ void render_world_position( world_instance *world, vg_camera *cam )
    world_link_lighting_ub( world, _shader_scene_position.id );
 
    mesh_bind( &world->mesh_geo );
-   mesh_draw( &world->mesh_geo );
+   for( int i=0; i<world->surface_count; i++ )
+   {
+      struct world_surface *mat = &world->surfaces[i];
+      if( mat->info.flags & k_material_flag_ghosts ) continue;
+
+      mdl_submesh *sm = &mat->sm_geo;
+      mdl_draw_submesh( sm );
+   }
 }
 
 struct ui_enum_opt skybox_setting_options[] = {