From: hgn Date: Thu, 13 Mar 2025 13:25:57 +0000 (+0000) Subject: Fix route boards, change region api X-Git-Url: https://skaterift.com/git/?a=commitdiff_plain;h=94b063789a6b29b9eb84aab92f0e53883661323b;p=carveJwlIkooP6JGAAIwe30JlM.git Fix route boards, change region api --- diff --git a/content_skaterift/maps/dev_tutorial/main.mdl b/content_skaterift/maps/dev_tutorial/main.mdl index 38bef2a..1cdda78 100644 Binary files a/content_skaterift/maps/dev_tutorial/main.mdl and b/content_skaterift/maps/dev_tutorial/main.mdl differ diff --git a/content_skaterift/maps/mp_line1/main.mdl b/content_skaterift/maps/mp_line1/main.mdl index af8ec30..d99d5a0 100644 Binary files a/content_skaterift/maps/mp_line1/main.mdl and b/content_skaterift/maps/mp_line1/main.mdl differ diff --git a/content_skaterift/maps/mp_mtzero/main.mdl b/content_skaterift/maps/mp_mtzero/main.mdl index b6b8ed8..8e5b2a9 100644 Binary files a/content_skaterift/maps/mp_mtzero/main.mdl and b/content_skaterift/maps/mp_mtzero/main.mdl differ diff --git a/content_skaterift/maps/mp_spawn/main.mdl b/content_skaterift/maps/mp_spawn/main.mdl index 6ab54b5..97614c1 100644 Binary files a/content_skaterift/maps/mp_spawn/main.mdl and b/content_skaterift/maps/mp_spawn/main.mdl differ diff --git a/skaterift_blender/sr_main.py b/skaterift_blender/sr_main.py index ab637bd..b982679 100644 --- a/skaterift_blender/sr_main.py +++ b/skaterift_blender/sr_main.py @@ -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 ) #} #} #} diff --git a/skaterift_blender/sr_mdl.py b/skaterift_blender/sr_mdl.py index f84e5fa..2559b4b 100644 --- a/skaterift_blender/sr_mdl.py +++ b/skaterift_blender/sr_mdl.py @@ -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 ) diff --git a/src/ent_challenge.c b/src/ent_challenge.c index 6313821..8edf20d 100644 --- a/src/ent_challenge.c +++ b/src/ent_challenge.c @@ -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; +} diff --git a/src/ent_challenge.h b/src/ent_challenge.h index 73641bd..4751c11 100644 --- a/src/ent_challenge.h +++ b/src/ent_challenge.h @@ -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 ); diff --git a/src/ent_region.c b/src/ent_region.c index 197e84e..425b101 100644 --- a/src/ent_region.c +++ b/src/ent_region.c @@ -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; ient_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; ient_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; ientity_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; ient_region); i ++ ) + for( u32 j=0; jent_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; jent_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; ientity_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; jent_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; jent_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(); + } } } diff --git a/src/ent_region.h b/src/ent_region.h index 6a86a32..886858b 100644 --- a/src/ent_region.h +++ b/src/ent_region.h @@ -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 ); diff --git a/src/ent_route.c b/src/ent_route.c index 7c409f1..8412d61 100644 --- a/src/ent_route.c +++ b/src/ent_route.c @@ -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; + } } } diff --git a/src/entity.h b/src/entity.h index 50a1ae7..e1aceef 100644 --- a/src/entity.h +++ b/src/entity.h @@ -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 { diff --git a/src/world.c b/src/world.c index b06d202..2cd84c1 100644 --- a/src/world.c +++ b/src/world.c @@ -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 ) diff --git a/src/world_entity.c b/src/world_entity.c index cca108d..0fa08f5 100644 --- a/src/world_entity.c +++ b/src/world_entity.c @@ -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 */ diff --git a/src/world_map.c b/src/world_map.c index 5884fbf..c316fad 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -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; jent_route); j ++ ) + for( u32 j=0; jentity_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; jent_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; diff --git a/src/world_volumes.c b/src/world_volumes.c index f92ebc1..d111264 100644 --- a/src/world_volumes.c +++ b/src/world_volumes.c @@ -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 ); } } }