("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',
("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' }
(str(0x80),'footplant',''),
(str(0x100),'passthrough',''),
])
+ description: bpy.props.StringProperty( name="UI Description" )
@staticmethod
def sr_inspector( layout, data ):#{
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' )
#}
#}
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", \
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 )
#}
#}
#}
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 )
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 )
}
}
}
+
+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;
+}
#include "entity.h"
entity_call_result ent_challenge_call( world_instance *world, ent_call *call );
+void _ent_challenge_ui( ui_context *ctx );
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 */
{
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 );
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();
+ }
}
}
}
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 );
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;
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 ) )
{
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;
+ }
}
}
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,
id_win;
i32 win_event;
f32 time_limit;
+ u32 pstr_description_ui;
};
enum ent_challenge_flag
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 {
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 );
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 )
.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 */
/* 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 );
{
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;
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;
{
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
{
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 );
}
}
}