Fix route boards, change region api
authorhgn <hgodden00@gmail.com>
Thu, 13 Mar 2025 13:25:57 +0000 (13:25 +0000)
committerhgn <hgodden00@gmail.com>
Thu, 13 Mar 2025 13:25:57 +0000 (13:25 +0000)
16 files changed:
content_skaterift/maps/dev_tutorial/main.mdl
content_skaterift/maps/mp_line1/main.mdl
content_skaterift/maps/mp_mtzero/main.mdl
content_skaterift/maps/mp_spawn/main.mdl
skaterift_blender/sr_main.py
skaterift_blender/sr_mdl.py
src/ent_challenge.c
src/ent_challenge.h
src/ent_region.c
src/ent_region.h
src/ent_route.c
src/entity.h
src/world.c
src/world_entity.c
src/world_map.c
src/world_volumes.c

index 38bef2a30b34f0993261817b7013b1d62d177c1d..1cdda7858a9b23aaf49ae08be7e90057b42beb9f 100644 (file)
Binary files a/content_skaterift/maps/dev_tutorial/main.mdl and b/content_skaterift/maps/dev_tutorial/main.mdl differ
index af8ec30815fe688a6654e165df586ac5dded6f57..d99d5a0f6bd35b199e571b5a9cbd021f6c724eef 100644 (file)
Binary files a/content_skaterift/maps/mp_line1/main.mdl and b/content_skaterift/maps/mp_line1/main.mdl differ
index b6b8ed8a1451e515b694d2c257db752764c5a0a9..8e5b2a96d52e89dbad9bb87f44b2e7a036a0e633 100644 (file)
Binary files a/content_skaterift/maps/mp_mtzero/main.mdl and b/content_skaterift/maps/mp_mtzero/main.mdl differ
index 6ab54b58fb0e4dfaf106e468673d2060682be7d2..97614c1e2399b662a7293fef515a9178e6a6afc7 100644 (file)
Binary files a/content_skaterift/maps/mp_spawn/main.mdl and b/content_skaterift/maps/mp_spawn/main.mdl differ
index ab637bdef0d0a2e26d8ddfee31f17e70ff0d1c6b..b982679e229d8aed305a17b36b35c107e0ab65a4 100644 (file)
@@ -491,7 +491,8 @@ class ent_objective(Structure):#{
                ("filter",c_uint32),("filter2",c_uint32),
                ("id_win",c_uint32),
                ("win_event",c_int32),
-               ("time_limit",c_float)]
+               ("time_limit",c_float),
+               ("pstr_description_ui",c_uint32)]
 
    sr_functions = { 0: 'trigger',
                     2: 'show',
@@ -520,7 +521,7 @@ class ent_region(Structure):#{
                ("submesh_start",c_uint32), ("submesh_count",c_uint32),
                ("pstr_title",c_uint32),
                ("flags",c_uint32),
-               ("zone_volume",c_uint32),
+               ("list_id",c_uint32),
                #105+
                ("target0",c_uint32*2)]
    sr_functions = { 0: 'enter', 1: 'leave' }
@@ -1954,6 +1955,7 @@ class SR_OBJECT_ENT_OBJECTIVE(bpy.types.PropertyGroup):#{
              (str(0x80),'footplant',''),
              (str(0x100),'passthrough',''),
              ])
+   description: bpy.props.StringProperty( name="UI Description" )
 
    @staticmethod
    def sr_inspector( layout, data ):#{
@@ -1961,6 +1963,7 @@ class SR_OBJECT_ENT_OBJECTIVE(bpy.types.PropertyGroup):#{
       layout.prop( data[0], 'time_limit' )
       layout.prop( data[0], 'filtrar' )
       SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' )
+      layout.prop( data[0], 'description' )
    #}
 #}
 
@@ -2009,8 +2012,8 @@ class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{
 class SR_OBJECT_ENT_REGION(bpy.types.PropertyGroup):#{
    title: bpy.props.StringProperty( name="Title" )
    zone_volume: bpy.props.PointerProperty(
-            type=bpy.types.Object, name="Zone Volume", \
-            poll=lambda self,obj: sr_filter_ent_type(obj,['ent_volume']))
+            type=bpy.types.Object, name="Challenge List", \
+            poll=lambda self,obj: sr_filter_ent_type(obj,['ent_list']))
 
    target0: bpy.props.PointerProperty( \
             type=bpy.types.Object, name="Triger on unlock", \
@@ -3093,20 +3096,11 @@ def cv_draw():#{
             if display1:
                cv_draw_ucube(display1.matrix_world, cc1, display_cu, display_co)
          #}
-         # elif ent_type == 'ent_list':#{
-         #    data = obj.SR_data.ent_list[0]
-         #    for child in data.entities:#{
-         #       if child.target:#{
-         #          cv_draw_arrow( obj.location, child.target.location, \
-         #                         (.5,.5,.5), 0.1 )
-         #       #}
-         #    #}
-         # #}
-         elif ent_type == 'ent_region':#{
+         elif ent_type == 'ent_region':
+         #{
             data = obj.SR_data.ent_region[0]
             if data.target0:#{
-               cv_draw_arrow( obj.location, data.target0.location, \
-                              (.5,.5,.5), 0.1 )
+               cv_draw_arrow( obj.location, data.target0.location, (.5,.5,.5), 0.1 )
             #}
          #}
       #}
index f84e5fa794c66f5734eca1c8005a0805d1fe1eec..2559b4ba56aa150284b3551cb1bba4e8b5c442e5 100644 (file)
@@ -871,12 +871,17 @@ def _mdl_compiler_compile_entities():
             objective.time_limit = obj_data.time_limit
 
             compile_obj_transform( obj, objective.transform )
-            objective.submesh_start, objective.submesh_count, _ = \
-                  mdl_compile_mesh_internal( obj )
+            objective.submesh_start, objective.submesh_count, _ = mdl_compile_mesh_internal( obj )
+
+            if obj_data.description != '':
+            #{
+               objective.pstr_description_ui = _af_pack_string( obj_data.description )
+            #}
 
             sr_ent_push( objective )
          #}
-         elif ent_type == 'ent_challenge':#{
+         elif ent_type == 'ent_challenge':
+         #{
             challenge = ent_challenge()
             obj_data = obj.SR_data.ent_challenge[0]
             compile_obj_transform( obj, challenge.transform )
@@ -919,7 +924,7 @@ def _mdl_compiler_compile_entities():
             region.submesh_start, region.submesh_count, _ = \
                   mdl_compile_mesh_internal( obj )
             region.pstr_title = _af_pack_string( obj_data.title )
-            region.zone_volume = sr_entity_id( obj_data.zone_volume )
+            region.list_id = sr_entity_id( obj_data.zone_volume )
             region.target0[0] = sr_entity_id( obj_data.target0 )
             region.target0[1] = obj_data.target0_event
             sr_ent_push( region )
index 6313821401675fcf21d738d4da826fb42de8161a..8edf20da79ccf9ff70381c1c965cadeb9916b1eb 100644 (file)
@@ -215,3 +215,45 @@ void ent_challenge_update(void)
       }
    }
 }
+
+void _ent_challenge_ui( ui_context *ctx )
+{
+   if( _world.event != k_world_event_challenge )
+      return;
+
+   world_instance *world = &_world.main;
+
+   u32 challenge_index = mdl_entity_id_id( _world.active_challenge_id );
+   ent_challenge *challenge = af_arritm( &world->ent_challenge, challenge_index );
+
+   ui_px w = 340;
+   ui_rect description_box = { vg.window_x - (w + 8), 8, w, 32 };
+   ctx->font = &vgf_default_large;
+   
+   if( _world.challenge_state != k_challenge_state_running )
+      description_box[1] += 48;
+
+   u32 next = challenge->first_objective_id;
+   while( mdl_entity_id_type(next) == k_ent_objective )
+   {
+      u32 index = mdl_entity_id_id( next );
+      ent_objective *objective = af_arritm( &world->ent_objective, index );
+      next = objective->id_next;
+
+      if( objective->pstr_description_ui )
+      {
+         bool passed = (objective->flags & k_ent_objective_passed)? 1: 0;
+         u32 colour = passed? ui_colour(ctx,k_ui_yellow): 0xffcccccc;
+         
+         ui_fill( ctx, description_box, ui_opacity( GUI_COL_DARK, 0.36f ) );
+         ui_outline( ctx, description_box, 1, colour, 0 );
+
+         const char *description = af_str( &world->meta.af, objective->pstr_description_ui );
+         ui_text( ctx, description_box, description, 1, k_ui_align_middle_center, colour );
+
+         description_box[1] += description_box[3] + 4;
+      }
+   }
+
+   ctx->font = &vgf_default_small;
+}
index 73641bd4d3f4f98ac45ec528384c38923abd8931..4751c11ccd89e24fabf17daf7daf46281ede683f 100644 (file)
@@ -2,3 +2,4 @@
 #include "entity.h"
 
 entity_call_result ent_challenge_call( world_instance *world, ent_call *call );
+void _ent_challenge_ui( ui_context *ctx );
index 197e84e17cc604f6fbe8234a91aa5d1656a2bdec..425b1018de1681fbcaadb8e7fd996c3adea5d20b 100644 (file)
@@ -17,45 +17,45 @@ u32 region_spark_colour( u32 flags )
 
 entity_call_result ent_region_call( world_instance *world, ent_call *call )
 {
-   ent_region *region = 
-      af_arritm( &world->ent_region, mdl_entity_id_id(call->id) );
+   ent_region *region = af_arritm( &world->ent_region, mdl_entity_id_id(call->id) );
+   ent_list *challenge_list = NULL;
 
-   if( !region->zone_volume )
-      return k_entity_call_result_invalid;
-
-   ent_volume *volume = 
-      af_arritm( &world->ent_volume, mdl_entity_id_id(region->zone_volume) );
+   if( region->v109.id_list != 0 )
+      challenge_list = af_arritm( &world->ent_list, mdl_entity_id_id( region->v109.id_list ) );
 
    if( call->function == 0 ) /* enter */
    {
-      for( u32 i=0; i<af_arrcount(&world->ent_route); i ++ )
-      {
-         ent_route *route = af_arritm( &world->ent_route, i );
-
-         v3f local;
-         m4x3_mulv( volume->to_local, route->board_transform[3], local );
-         if( (fabsf(local[0]) <= 1.0f) &&
-             (fabsf(local[1]) <= 1.0f) &&
-             (fabsf(local[2]) <= 1.0f) )
-         {
-            route->flags &= ~k_ent_route_flag_out_of_zone;
-         }
-         else 
-         {
-            route->flags |= k_ent_route_flag_out_of_zone;
-         }
-      }
-
-      gui_location_print_ccmd( 1, (const char *[]){
-            af_str( &world->meta.af, region->pstr_title)} );
-
+      gui_location_print_ccmd( 1, (const char *[]){af_str( &world->meta.af, region->pstr_title)} );
       vg_strncpy( af_str( &world->meta.af, region->pstr_title ), 
                   global_ent_region.location, NETWORK_REGION_MAX,
                   k_strncpy_always_add_null );
       global_ent_region.flags = region->flags;
       network_send_region();
-
       localplayer.effect_data.spark.colour = region_spark_colour(region->flags);
+
+      for( u32 i=0; i<af_arrcount( &world->ent_route ); i ++ )
+      {
+         ent_route *route = af_arritm( &world->ent_route, i );
+         route->flags |= k_ent_route_flag_out_of_zone;
+      }
+      
+      if( challenge_list )
+      {
+         for( u32 i=0; i<challenge_list->entity_ref_count; i ++ )
+         {
+            file_entity_ref *ref = af_arritm( &world->file_entity_ref, challenge_list->entity_ref_start + i );
+            
+            u32 type = mdl_entity_id_type( ref->entity_id ),
+                index = mdl_entity_id_id( ref->entity_id );
+
+            if( type == k_ent_route )
+            {
+               ent_route *route = af_arritm( &world->ent_route, index );
+               route->flags &= ~k_ent_route_flag_out_of_zone;
+            }
+         }
+      }
+
       return k_entity_call_result_OK;
    }
    else if( call->function == 1 ) /* leave */
@@ -79,71 +79,70 @@ void ent_region_re_eval( world_instance *world )
 {
    u32 world_total = k_ent_route_flag_achieve_gold | k_ent_route_flag_achieve_silver;
 
-   for( u32 i=0; i<af_arrcount(&world->ent_region); i ++ )
+   for( u32 j=0; j<af_arrcount( &world->ent_region ); j ++ )
    {
-      ent_region *region = af_arritm(&world->ent_region, i);
-
-      if( !region->zone_volume )
-         continue;
-
-      ent_volume *volume = af_arritm(&world->ent_volume,mdl_entity_id_id(region->zone_volume));
+      ent_region *region = af_arritm( &world->ent_region, j );
       u32 combined = k_ent_route_flag_achieve_gold | k_ent_route_flag_achieve_silver;
 
-      for( u32 j=0; j<af_arrcount(&world->ent_route); j ++ )
+      if( region->v109.id_list != 0 )
       {
-         ent_route *route = af_arritm(&world->ent_route, j );
+         ent_list *list = af_arritm( &world->ent_list, mdl_entity_id_id( region->v109.id_list ) );
 
-         v3f local;
-         m4x3_mulv( volume->to_local, route->board_transform[3], local );
-         if( !((fabsf(local[0]) <= 1.0f) &&
-               (fabsf(local[1]) <= 1.0f) &&
-               (fabsf(local[2]) <= 1.0f)) )
+         for( u32 i=0; i<list->entity_ref_count; i ++ )
          {
-            continue;
-         }
-
-         combined &= route->flags;
-      }
+            file_entity_ref *ref = af_arritm( &world->file_entity_ref, list->entity_ref_start + i );
+            
+            u32 type = mdl_entity_id_type( ref->entity_id ),
+                index = mdl_entity_id_id( ref->entity_id );
 
-      for( u32 j=0; j<af_arrcount(&world->ent_challenge); j ++ )
-      {
-         ent_challenge *challenge = af_arritm( &world->ent_challenge, j );
+            if( type == k_ent_route )
+            {
+               ent_route *route = af_arritm( &world->ent_route, index );
+               combined &= route->flags;
+            }
+            else if( type == k_ent_challenge )
+            {
+               ent_challenge *challenge = af_arritm( &world->ent_challenge, index );
 
-         if( challenge->flags & k_ent_challenge_is_story )
-            continue;
+               if( challenge->flags & k_ent_challenge_is_story )
+                  continue;
 
-         v3f local;
-         m4x3_mulv( volume->to_local, challenge->transform.co, local );
-         if( !((fabsf(local[0]) <= 1.0f) &&
-               (fabsf(local[1]) <= 1.0f) &&
-               (fabsf(local[2]) <= 1.0f)) )
-         {
-            continue;
-         }
+               u32 flags = 0x00;
+               if( challenge->status )
+               {
+                  flags |= k_ent_route_flag_achieve_gold;
+                  flags |= k_ent_route_flag_achieve_silver;
+               }
 
-         u32 flags = 0x00;
-         if( challenge->status )
-         {
-            flags |= k_ent_route_flag_achieve_gold;
-            flags |= k_ent_route_flag_achieve_silver;
+               combined &= flags;
+            }
          }
 
-         combined &= flags;
+         region->flags = combined;
+         world_total &= combined;
       }
+   }
 
-      region->flags = combined;
-      world_total &= combined;
-
-      /* run unlock triggers. v105+ */
-      if( world->meta.version >= 105 )
+   /* run unlock triggers. v105+ */
+   if( world->meta.version >= 105 )
+   {
+      for( u32 j=0; j<af_arrcount( &world->ent_region ); j ++ )
       {
+         ent_region *region = af_arritm( &world->ent_region, j );
          if( region->flags & (k_ent_route_flag_achieve_gold|k_ent_route_flag_achieve_silver) )
          {
             if( region->target0[0] )
             {
                vg_info( "Trigger region unlock -> %u\n", region->target0[0] );
+
+               struct ent_region_unlock_data data = 
+               {
+                  .world_total = world_total,
+                  .region_total = region->flags
+               };
+
                ent_call call;
-               call.data = NULL;
+               call.data = &data;
                call.id = region->target0[0];
                call.function = region->target0[1];
                entity_call( world, &call );
@@ -166,10 +165,12 @@ void ent_region_re_eval( world_instance *world )
          steam_store_achievements();
       }
    }
-
-   if( _world.main.addon->flags & ADDON_REG_CITY )
+   else if( _world.main.addon->flags & ADDON_REG_CITY )
    {
-      steam_set_achievement( "CITY_COMPLETE" );
-      steam_store_achievements();
+      if( world_total & k_ent_route_flag_achieve_silver )
+      {
+         steam_set_achievement( "CITY_COMPLETE" );
+         steam_store_achievements();
+      }
    }
 }
index 6a86a320b33ba136d63e0750550bf230974caaad..886858b64becbc89a7e73fa230ddd96013f2d962 100644 (file)
@@ -9,6 +9,12 @@ struct global_ent_region
 }
 extern global_ent_region;
 
+struct ent_region_unlock_data
+{
+   u32 world_total;
+   u32 region_total;
+};
+
 u32 region_spark_colour( u32 flags );
 void ent_region_re_eval( world_instance *world );
 entity_call_result ent_region_call( world_instance *world, ent_call *call );
index 7c409f1b2a949738bb205bbc0d8135545c2e4974..8412d61ff4b28dc41765d5e30cef8fa4815600e6 100644 (file)
@@ -11,26 +11,22 @@ entity_call_result ent_route_call( world_instance *world, ent_call *call )
 
    if( call->function == 0 )
    { 
-      if( localplayer.subsystem == k_player_subsystem_walk ) /* view */
+      if( world_set_event( k_world_event_route_leaderboard ) )
       {
-#if 0
-         world_entity_set_focus( call->id );
-         world_entity_focus_modal();
-
-         gui_helper_clear();
+         gui_helper_reset( k_gui_helper_mode_clear );
          vg_str text;
 
-         if( (_ent_route.helper_weekly = 
-                  gui_new_helper( input_button_list[k_srbind_mleft], &text )))
+         if( (_ent_route.helper_weekly = gui_new_helper( input_button_list[k_srbind_mleft], &text )))
             vg_strcat( &text, "Weekly" );
 
-         if( (_ent_route.helper_alltime = 
-                  gui_new_helper( input_button_list[k_srbind_mright], &text )))
+         if( (_ent_route.helper_alltime = gui_new_helper( input_button_list[k_srbind_mright], &text )))
             vg_strcat( &text, "All time" );
 
          if( gui_new_helper( input_button_list[k_srbind_mback], &text ) )
             vg_strcat( &text, "Exit" );
-#endif
+
+         _ent_route.looking_at_board = route;
+         localplayer.immobile = 1;
       }
 
       return k_entity_call_result_OK;
@@ -48,11 +44,15 @@ void ent_route_preupdate(void)
    ent_route *route = _ent_route.looking_at_board;
 
    u32 cam_id = 0;
-   
    if( __builtin_expect( world->meta.version >= 103, 1 ) )
       cam_id = route->id_camera;
 
-   //world_entity_focus_camera( world, cam_id );
+   if( cam_id )
+   {
+      vg_camera temp;
+      ent_camera_unpack( af_arritm( &world->ent_camera, mdl_entity_id_id(cam_id) ), &temp );
+      world_set_entity_driven_camera( &temp );
+   }
 
    if( button_down( k_srbind_mleft ) )
    {
@@ -66,14 +66,17 @@ void ent_route_preupdate(void)
       world_sfd_compile_active_scores();
    }
 
-   _ent_route.helper_alltime->greyed =!world_sfd.view_weekly;
-   _ent_route.helper_weekly->greyed =  world_sfd.view_weekly;
+   _ent_route.helper_alltime->greyed = !world_sfd.view_weekly;
+   _ent_route.helper_weekly->greyed = world_sfd.view_weekly;
 
    if( button_down( k_srbind_mback ) )
    {
-      //world_entity_exit_modal();
-      //world_entity_clear_focus();
-      gui_helper_reset( k_gui_helper_mode_clear );
-      return;
+      if( world_clear_event( k_world_event_route_leaderboard ) )
+      {
+         srinput.state = k_input_state_resume;
+         localplayer.immobile = 0;
+         gui_helper_reset( k_gui_helper_mode_clear );
+         return;
+      }
    }
 }
index 50a1ae7c76c2aab72e915a7ec1a26c9537f40a06..e1aceefcbd849754b63d5d5133a43ff948172042 100644 (file)
@@ -617,12 +617,14 @@ enum ent_objective_filter{
    k_ent_objective_filter_passthrough     = 0x00000100
 };
 
-enum ent_objective_flag {
+enum ent_objective_flag 
+{
    k_ent_objective_hidden = 0x1,
    k_ent_objective_passed = 0x2
 };
 
-struct ent_objective{
+struct ent_objective
+{
    mdl_transform transform;
    u32 submesh_start,
        submesh_count,
@@ -632,6 +634,7 @@ struct ent_objective{
        id_win;
    i32 win_event;
    f32 time_limit;
+   u32 pstr_description_ui;
 };
 
 enum ent_challenge_flag 
@@ -689,12 +692,19 @@ struct ent_prop {
    u32 submesh_start, submesh_count, flags, pstr_alias;
 };
 
-struct ent_region {
+struct ent_region 
+{
    mdl_transform transform;
-   u32 submesh_start, submesh_count, pstr_title, flags, zone_volume,
+   u32 submesh_start, submesh_count, pstr_title, flags;
+
+   union
+   {
+      struct{ u32 zone_volume; } v105;
+      struct{ u32 id_list; } v109;
+   };
 
-       /* 105+ */
-       target0[2];
+   /* 105+ */
+   u32 target0[2];
 };
 
 struct ent_glider {
index b06d202c1e2f86c3f2e087198a382908d8e5c2eb..2cd84c147e68febc26cea208e7bce76c898e515f 100644 (file)
@@ -39,6 +39,7 @@ void skaterift_world_get_save_path( addon_reg *world_reg, char buf[128] )
 void world_update( world_instance *world, v3f pos )
 {
    ent_script_update( world );
+   ent_route_preupdate();
    world_routes_update_timer_texts( world );
    world_routes_update( world );
    ent_traffic_update( world, pos );
@@ -52,6 +53,7 @@ void world_update( world_instance *world, v3f pos )
 void world_gui( ui_context *ctx, world_instance *world )
 {
    ent_skateshop_gui( ctx );
+   _ent_challenge_ui( ctx );
 }
 
 bool world_set_event( enum world_event event )
index cca108d6780e1466aab42a5e4ec2cc3359a9fca5..0fa08f5175eafaff0645326475ae4fbeba8be8d4 100644 (file)
@@ -27,146 +27,6 @@ bh_system bh_system_entity_list =
    .cast_ray = NULL
 };
 
-#if 0
-void world_entity_set_focus( u32 entity_id )
-{
-   if( _world.focused_entity )
-   {
-      vg_warn( "Entity %u#%u tried to take focus from %u#%u\n",
-                  mdl_entity_id_type( entity_id ),
-                  mdl_entity_id_id( entity_id ),
-                  mdl_entity_id_type( _world.focused_entity ),
-                  mdl_entity_id_id( _world.focused_entity ) );
-      return;
-   }
-
-   _world.focused_entity = entity_id;
-}
-
-void world_entity_focus_modal(void)
-{
-   localplayer.immobile = 1;
-   menu.disable_open = 1;
-   srinput.state = k_input_state_resume;
-
-   v3_zero( localplayer.rb.v );
-   v3_zero( localplayer.rb.w );
-   player_walk.move_speed = 0.0f;
-   skaterift.activity = k_skaterift_ent_focus;
-}
-
-void world_entity_exit_modal(void)
-{
-   if( skaterift.activity != k_skaterift_ent_focus )
-   {
-      vg_warn( "Entity %u#%u tried to exit modal when we weren't in one\n",
-                  mdl_entity_id_type( _world.focused_entity ),
-                  mdl_entity_id_id( _world.focused_entity ) );
-      return;
-   }
-
-   localplayer.immobile = 0;
-   menu.disable_open = 0;
-   srinput.state = k_input_state_resume;
-   skaterift.activity = k_skaterift_default;
-}
-
-void world_entity_clear_focus(void)
-{
-   if( skaterift.activity == k_skaterift_ent_focus )
-   {
-      vg_warn( "Entity %u#%u tried to clear focus before exiting modal\n",
-                  mdl_entity_id_type( _world.focused_entity ),
-                  mdl_entity_id_id( _world.focused_entity ) );
-      return;
-   }
-
-   _world.focused_entity = 0;
-}
-
-void world_entity_focus_camera( world_instance *world, u32 uid )
-{
-   if( mdl_entity_id_type( uid ) == k_ent_camera )
-   {
-      u32 index = mdl_entity_id_id( uid );
-      ent_camera *cam = af_arritm( &world->ent_camera, index );
-      ent_camera_unpack( cam, &_world.focus_cam );
-   }
-   else 
-   {
-      vg_camera_copy( &localplayer.cam, &_world.focus_cam );
-
-      /* TODO ? */
-      _world.focus_cam.nearz = localplayer.cam.nearz;
-      _world.focus_cam.farz = localplayer.cam.farz;
-   }
-}
-
-/* logic preupdate */
-void world_entity_focus_preupdate(void)
-{
-   f32 rate = vg_minf( 1.0f, vg.time_frame_delta * 2.0f );
-   int active = 0;
-   if( skaterift.activity == k_skaterift_ent_focus )
-      active = 1;
-
-   vg_slewf( &_world.focus_strength, active, 
-             vg.time_frame_delta * (1.0f/0.5f) );
-
-   if( _world.focused_entity == 0 )
-      return;
-
-   u32 type = mdl_entity_id_type( _world.focused_entity ),
-       index = mdl_entity_id_id( _world.focused_entity );
-
-   world_instance *world = world_current_instance();
-
-   static void (*table[])( ent_focus_context *ctx ) =
-   {
-      [ 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_ARRAY_LEN(table)) || (table[type] == NULL) )
-   {
-      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.. */
-void world_entity_focus_render(void)
-{
-   world_instance *world = world_current_instance();
-   if( skaterift.activity != k_skaterift_ent_focus ){
-      skateshop_render_nonfocused( world, &g_render.cam );
-      return;
-   }
-
-   u32 type = mdl_entity_id_type( _world.focused_entity ),
-       index = mdl_entity_id_id( _world.focused_entity );
-
-   if( type == k_ent_skateshop ){
-      ent_skateshop *skateshop = af_arritm( &world->ent_skateshop, index );
-      skateshop_render( skateshop );
-   }
-   else if( type == k_ent_challenge ){}
-   else if( type == k_ent_route ){}
-   else if( type == k_ent_miniworld ){}
-   else if( type == k_ent_npc ){}
-   else {
-      vg_fatal_error( "Programming error\n" );
-   }
-}
-#endif
-
 void world_gen_entities_init( world_instance *world )
 {
    /* lights */
index 5884fbf1a92a4a7ab4501d167b3f2de876158e40..c316fad5fc9364d63fdc13acb3b571e8e0888b81 100644 (file)
@@ -583,7 +583,7 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al
 
          /* Draw world completion list
           * ------------------------------------------------------------------------------------------------------- */
-         if( af_arrcount( &world->ent_region ) )
+         if( (world->meta.version >= 109) && af_arrcount( &world->ent_region ) )
          {
             ui_rect stat_panel = { main_area[0]+main_area[2]-(256+8), main_area[1]+8, 256, main_area[3]-16 };
             u32 c0 = ui_opacity( GUI_COL_DARK, 0.36f );
@@ -595,8 +595,10 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al
             {
                ent_region *region = af_arritm( &world->ent_region, i );
 
-               if( !region->zone_volume )
+               u32 list_id = region->v109.id_list;
+               if( list_id == 0 )
                   continue;
+               ent_list *list = af_arritm( &world->ent_list, mdl_entity_id_id( list_id ) );
 
                const char *title = af_str( &world->meta.af, region->pstr_title );
                ctx->font = &vgf_default_large;
@@ -608,76 +610,61 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al
                stat_panel[2] -= 16;
                ctx->font = &vgf_default_small;
 
-               ent_volume *volume = af_arritm(&world->ent_volume,
-                     mdl_entity_id_id(region->zone_volume));
-
-               u32 combined = k_ent_route_flag_achieve_gold | 
-                              k_ent_route_flag_achieve_silver;
+               u32 combined = k_ent_route_flag_achieve_gold | k_ent_route_flag_achieve_silver;
 
                char buf[128];
                vg_str str;
 
-               for( u32 j=0; j<af_arrcount(&world->ent_route); j ++ )
+               for( u32 j=0; j<list->entity_ref_count; j ++ )
                {
-                  ent_route *route = af_arritm(&world->ent_route, j );
-
-                  v3f local;
-                  m4x3_mulv( volume->to_local, route->board_transform[3], local );
-                  if( !((fabsf(local[0]) <= 1.0f) &&
-                        (fabsf(local[1]) <= 1.0f) &&
-                        (fabsf(local[2]) <= 1.0f)) )
-                  {
+                  file_entity_ref *ref = af_arritm( &world->file_entity_ref, list->entity_ref_start + j );
+                  if( ref->entity_id == 0 )
                      continue;
-                  }
-
-                  combined &= route->flags;
 
-                  vg_strnull( &str, buf, sizeof(buf) );
-                  vg_strcat( &str, "(Race) " );
-                  vg_strcat( &str, af_str( &world->meta.af, route->pstr_name ));
+                  u32 type = mdl_entity_id_type( ref->entity_id ),
+                      index = mdl_entity_id_id( ref->entity_id );
 
-                  if( route->flags & k_ent_route_flag_achieve_silver )
-                     vg_strcat( &str, " \xb3");
-                  if( route->flags & k_ent_route_flag_achieve_gold )
-                     vg_strcat( &str, "\xb3");
+                  if( type == k_ent_route )
+                  {
+                     ent_route *route = af_arritm( &world->ent_route, index );
+                     combined &= route->flags;
 
-                  ui_rect r;
-                  ui_standard_widget( ctx, stat_panel, r, 1 );
-                  ui_text( ctx, r, buf, 1, k_ui_align_middle_left, 
-                           medal_colour( ctx, route->flags ) );
-               }
+                     vg_strnull( &str, buf, sizeof(buf) );
+                     vg_strcat( &str, "(Race) " );
+                     vg_strcat( &str, af_str( &world->meta.af, route->pstr_name ));
 
-               for( u32 j=0; j<af_arrcount(&world->ent_challenge); j ++ )
-               {
-                  ent_challenge *challenge = af_arritm( &world->ent_challenge, j );
-                  if( challenge->flags & k_ent_challenge_is_story )
-                     continue;
+                     if( route->flags & k_ent_route_flag_achieve_silver )
+                        vg_strcat( &str, " \xb3");
+                     if( route->flags & k_ent_route_flag_achieve_gold )
+                        vg_strcat( &str, "\xb3");
 
-                  v3f local;
-                  m4x3_mulv( volume->to_local, challenge->transform.co, local );
-                  if( !((fabsf(local[0]) <= 1.0f) &&
-                        (fabsf(local[1]) <= 1.0f) &&
-                        (fabsf(local[2]) <= 1.0f)) )
-                  {
-                     continue;
+                     ui_rect r;
+                     ui_standard_widget( ctx, stat_panel, r, 1 );
+                     ui_text( ctx, r, buf, 1, k_ui_align_middle_left, medal_colour( ctx, route->flags ) );
                   }
+                  else if( type == k_ent_challenge )
+                  {
+                     ent_challenge *challenge = af_arritm( &world->ent_challenge, index );
+                     if( challenge->flags & k_ent_challenge_is_story )
+                        continue;
 
-                  vg_strnull( &str, buf, sizeof(buf) );
-                  vg_strcat( &str, af_str( &world->meta.af,challenge->pstr_alias));
+                     vg_strnull( &str, buf, sizeof(buf) );
+                     vg_strcat( &str, af_str( &world->meta.af,challenge->pstr_alias));
 
-                  u32 flags = 0x00;
-                  if( challenge->status )
-                  {
-                     flags |= k_ent_route_flag_achieve_gold;
-                     flags |= k_ent_route_flag_achieve_silver;
-                     vg_strcat( &str, " \xb3\xb3" );
-                  }
+                     u32 flags = 0x00;
+                     if( challenge->status )
+                     {
+                        flags |= k_ent_route_flag_achieve_gold;
+                        flags |= k_ent_route_flag_achieve_silver;
+                        vg_strcat( &str, " \xb3\xb3" );
+                     }
 
-                  combined &= flags;
+                     combined &= flags;
 
-                  ui_rect r;
-                  ui_standard_widget( ctx, stat_panel, r, 1 );
-                  ui_text( ctx, r, buf, 1, k_ui_align_middle_left, medal_colour( ctx, flags ) );
+                     ui_rect r;
+                     ui_standard_widget( ctx, stat_panel, r, 1 );
+                     ui_text( ctx, r, buf, 1, k_ui_align_middle_left, medal_colour( ctx, flags ) );
+                  }
                }
 
                stat_panel[0] -= 16;
index f92ebc1c4d0457e67eda805c3ca7fc691456411e..d111264225817dfb0ceb4cce0481941fde8f4e90 100644 (file)
@@ -120,13 +120,16 @@ void world_volumes_update( world_instance *world, v3f pos )
          {
             if( volume->flags & k_ent_volume_flag_interact )
             {
-               if( world_set_event( k_world_event_interact ) )
+               if( localplayer.subsystem == k_player_subsystem_walk )
                {
-                  gui_helper_reset( k_gui_helper_mode_black_bars );
-                  vg_str text;
-                  if( gui_new_helper( input_button_list[k_srbind_maccept], &text ))
-                     vg_strcat( &text, af_str( &world->meta.af, volume->interact.pstr_text ) );
-                  _world_volumes.active_volume_interact = volume;
+                  if( world_set_event( k_world_event_interact ) )
+                  {
+                     gui_helper_reset( k_gui_helper_mode_black_bars );
+                     vg_str text;
+                     if( gui_new_helper( input_button_list[k_srbind_maccept], &text ))
+                        vg_strcat( &text, af_str( &world->meta.af, volume->interact.pstr_text ) );
+                     _world_volumes.active_volume_interact = volume;
+                  }
                }
             }
             else
@@ -154,17 +157,17 @@ next_volume:;
          {
             srinput.state = k_input_state_resume;
 
-            ent_call call;
-            call.data = NULL;
-            call.function = volume->interact.activate_event;
-            call.id = volume->target;
-            entity_call( &_world.main, &call );
-
             if( world_clear_event( k_world_event_interact ) )
             {
                _world_volumes.active_volume_interact = NULL;
                gui_helper_reset( k_gui_helper_mode_clear );
             }
+
+            ent_call call;
+            call.data = NULL;
+            call.function = volume->interact.activate_event;
+            call.id = volume->target;
+            entity_call( &_world.main, &call );
          }
       }
    }