X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_map.c;h=13de85cb735a09abf66eb6702952bfd2ae84dc4f;hb=fd9119a30ccb8def877a4187348dd071b08227c0;hp=3465776c7bd6a5d44efba6752d19354f4489d90d;hpb=494c85703c76c4123c49937a32584840b6be1470;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_map.c b/world_map.c index 3465776..13de85c 100644 --- a/world_map.c +++ b/world_map.c @@ -8,7 +8,8 @@ struct world_map world_map; -static void world_map_get_dir( v3f dir ){ +static void world_map_get_dir( v3f dir ) +{ /* idk */ dir[0] = -sqrtf(0.5f); dir[2] = sqrtf(0.5f); @@ -16,7 +17,8 @@ static void world_map_get_dir( v3f dir ){ v3_normalize(dir); } -static void world_map_get_plane( v4f plane ){ +static void world_map_get_plane( v4f plane ) +{ world_instance *world = &world_static.instances[ world_map.world_id ]; f32 h = localplayer.rb.co[1]; if( world_map.world_id != world_static.active_instance ) @@ -25,7 +27,8 @@ static void world_map_get_plane( v4f plane ){ v4_copy( (v4f){0.0f,1.0f,0.0f,h}, plane ); } -static void respawn_world_to_plane_pos( v3f pos, v2f plane_pos ){ +static void respawn_world_to_plane_pos( v3f pos, v2f plane_pos ) +{ v3f dir; world_map_get_dir( dir ); v3_negate(dir,dir); @@ -40,37 +43,79 @@ static void respawn_world_to_plane_pos( v3f pos, v2f plane_pos ){ } static void respawn_map_draw_icon( vg_camera *cam, - enum gui_icon icon, v3f pos ){ + enum gui_icon icon, v3f pos, f32 size ) +{ v4f v; v3_copy( pos, v ); v[3] = 1.0f; m4x4_mulv( cam->mtx.pv, v, v ); v2_divs( v, v[3], v ); - gui_draw_icon( icon, (v2f){ v[0]*0.5f+0.5f,v[1]*0.5f+0.5f }, 1.0f ); + gui_draw_icon( icon, (v2f){ v[0]*0.5f+0.5f,v[1]*0.5f+0.5f }, size ); } -void world_map_pre_update(void) +static void world_map_select_close(void) { - if( skaterift.activity != k_skaterift_world_map ) return; - - if( button_down( k_srbind_mback ) ){ - gui_helper_clear(); - srinput.state = k_input_state_resume; - skaterift.activity = k_skaterift_menu; - menu.page = 0xffffffff; - menu_open_page( "Main Menu", k_ent_menuitem_stack_append ); - return; - } + world_map.sel_spawn = world_map.close_spawn; + gui_helper_clear(); + + vg_str text; + if( gui_new_helper( input_button_list[k_srbind_maccept], &text ) ) + vg_strcat( &text, "Spawn Here" ); + if( gui_new_helper( input_button_list[k_srbind_mback], &text ) ) + vg_strcat( &text, "Back" ); +} - if( button_down( k_srbind_maccept ) ){ - skaterift.activity = k_skaterift_default; - srinput.state = k_input_state_resume; +void world_map_click(void) +{ + world_map_select_close(); +} - if( world_map.spawn ){ - world_static.active_instance = world_map.world_id; - player__spawn( world_map.spawn ); +static void world_map_help_normal(void) +{ + gui_helper_clear(); + + vg_str text; + if( gui_new_helper( input_joy_list[k_srjoystick_steer], &text ) ) + vg_strcat( &text, "Move" ); + + if( gui_new_helper( input_button_list[k_srbind_maccept], &text ) ) + vg_strcat( &text, "Select" ); + + if( gui_new_helper( input_button_list[k_srbind_mback], &text ) ) + vg_strcat( &text, "Exit" ); +} + +void world_map_pre_update(void) +{ + if( menu_viewing_map() ) + { + if( !world_map.view_ready ) + { + world_map.world_id = world_static.active_instance; + + world_instance *world = &world_static.instances[ world_map.world_id ]; + v3f *bbx = world->scene_geo.bbx; + + v3_copy( localplayer.rb.co, world->player_co ); + respawn_world_to_plane_pos( localplayer.rb.co, world_map.plane_pos ); + world_map.boom_dist = 400.0f; + world_map.home_select = 0; + world_map.view_ready = 1; + world_map.sel_spawn = NULL; + world_map.close_spawn = NULL; + + world_map_help_normal(); } + } + else + { + if( world_map.view_ready ) + { + gui_helper_clear(); + world_map.view_ready = 0; + } + return; } @@ -82,11 +127,28 @@ void world_map_pre_update(void) joystick_state( k_srjoystick_steer, steer ); v2_normalize_clamp( steer ); - m2x2f rm; - m2x2_create_rotation( rm, -0.25f*VG_PIf ); - m2x2_mulv( rm, steer, steer ); + if( !world_map.sel_spawn ) + { + f32 *pos = world_map.plane_pos; + m2x2f rm; + m2x2_create_rotation( rm, -0.25f*VG_PIf ); + m2x2_mulv( rm, steer, steer ); + v2_muladds( pos, steer, vg.time_frame_delta * 200.0f, pos ); + } + + f32 bd_target = 400.0f, + interp = vg.time_frame_delta*2.0f; + + if( world_map.sel_spawn ) + { + v2f pp; + respawn_world_to_plane_pos( world_map.sel_spawn->transform.co, pp ); + v2_lerp( pos, pp, interp, pos ); + + bd_target = 200.0f; + } + world_map.boom_dist = vg_lerpf( world_map.boom_dist, bd_target, interp ); - v2_muladds( pos, steer, vg.time_frame_delta * 200.0f, pos ); v2_minv( (v2f){ bbx[1][0], bbx[1][2] }, pos, pos ); v2_maxv( (v2f){ bbx[0][0], bbx[0][2] }, pos, pos ); @@ -115,10 +177,11 @@ void world_map_pre_update(void) vg_camera_finalize( cam ); /* pick spawn */ - world_map.spawn = NULL; f32 closest2 = INFINITY; + v2f centroid = { 0, 0 }; - for( u32 i=0; ient_spawn); i++ ){ + for( u32 i=0; ient_spawn); i++ ) + { ent_spawn *spawn = mdl_arritm(&world->ent_spawn,i); v4f v; @@ -127,43 +190,97 @@ void world_map_pre_update(void) m4x4_mulv( cam->mtx.pv, v, v ); v2_divs( v, v[3], v ); - f32 d2 = v2_length2(v); - if( d2 < closest2 ){ - world_map.spawn = spawn; + f32 d2 = v2_dist2(v, centroid); + if( d2 < closest2 ) + { + world_map.close_spawn = spawn; closest2 = d2; } + spawn->transform.s[0] = d2; + } + + if( button_down( k_srbind_maccept ) ) + { + if( world_map.sel_spawn ) + { + skaterift.activity = k_skaterift_default; + world_static.active_instance = world_map.world_id; + srinput.state = k_input_state_resume; + player__spawn( world_map.sel_spawn ); + return; + } + else + { + world_map_select_close(); + } + } + + if( button_down( k_srbind_mback ) ) + { + if( world_map.sel_spawn ) + { + world_map.sel_spawn = NULL; + world_map_help_normal(); + } + else + { + srinput.state = k_input_state_resume; + skaterift.activity = k_skaterift_default; + return; + } } /* icons * ---------------------*/ - for( u32 i=0; ient_challenge); i++ ){ + for( u32 i=0; ient_challenge); i++ ) + { ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i ); enum gui_icon icon = k_gui_icon_exclaim_2d; if( challenge->status ) icon = k_gui_icon_tick_2d; - respawn_map_draw_icon( cam, icon, challenge->transform.co ); + respawn_map_draw_icon( cam, icon, challenge->transform.co, 1.0f ); } - for( u32 i=0; ient_skateshop); i++ ){ + for( u32 i=0; ient_spawn); i ++ ) + { + ent_spawn *spawn = mdl_arritm( &world->ent_spawn, i ); + + if( spawn->transform.s[0] > 0.3f ) + continue; + + f32 s = 1.0f-(spawn->transform.s[0] / 0.3f); + respawn_map_draw_icon( cam, + spawn==world_map.sel_spawn? + k_gui_icon_spawn_select: k_gui_icon_spawn, + spawn->transform.co, s ); + } + + for( u32 i=0; ient_skateshop); i++ ) + { ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, i ); - if( shop->type == k_skateshop_type_boardshop ){ - respawn_map_draw_icon( cam, k_gui_icon_board, shop->transform.co ); + if( shop->type == k_skateshop_type_boardshop ) + { + respawn_map_draw_icon( cam, k_gui_icon_board, shop->transform.co, 1 ); } - else if( shop->type == k_skateshop_type_worldshop ){ - respawn_map_draw_icon( cam, k_gui_icon_world, shop->transform.co ); + else if( shop->type == k_skateshop_type_worldshop ) + { + respawn_map_draw_icon( cam, k_gui_icon_world, shop->transform.co, 1 ); } } - for( u32 i=0; ient_gate); i++ ){ + for( u32 i=0; ient_gate); i++ ) + { ent_gate *gate = mdl_arritm( &world->ent_gate, i ); - if( gate->flags & k_ent_gate_nonlocal ){ - respawn_map_draw_icon( cam, k_gui_icon_rift, gate->co[0] ); + if( gate->flags & k_ent_gate_nonlocal ) + { + respawn_map_draw_icon( cam, k_gui_icon_rift, gate->co[0], 1 ); } } - for( u32 i=0; ient_route); i++ ){ + for( u32 i=0; ient_route); i++ ) + { ent_route *route = mdl_arritm( &world->ent_route, i ); v4f colour; @@ -171,10 +288,11 @@ void world_map_pre_update(void) v3_muls( colour, 1.6666f, colour ); gui_icon_setcolour( colour ); respawn_map_draw_icon( cam, k_gui_icon_rift_run_2d, - route->board_transform[3] ); + route->board_transform[3], 1 ); } - for( u32 i=0; ient_glider); i ++ ){ + for( u32 i=0; ient_glider); i ++ ) + { ent_glider *glider = mdl_arritm( &world->ent_glider, i ); v4f colour = { 1,1,1,1 }; @@ -183,31 +301,6 @@ void world_map_pre_update(void) v3_muls( colour, 0.5f, colour ); gui_icon_setcolour( colour ); - respawn_map_draw_icon( cam, k_gui_icon_glider, glider->transform.co ); + respawn_map_draw_icon( cam, k_gui_icon_glider, glider->transform.co, 1 ); } } - -void world_map_enter(void) -{ - skaterift.activity = k_skaterift_world_map; - world_map.world_id = world_static.active_instance; - - world_instance *world = &world_static.instances[ world_map.world_id ]; - v3f *bbx = world->scene_geo.bbx; - - respawn_world_to_plane_pos( localplayer.rb.co, world_map.plane_pos ); - world_map.boom_dist = 400.0f; - world_map.home_select = 0; - - gui_helper_clear(); - - vg_str text; - if( gui_new_helper( input_joy_list[k_srjoystick_steer], &text ) ) - vg_strcat( &text, "Move" ); - - if( gui_new_helper( input_button_list[k_srbind_maccept], &text ) ) - vg_strcat( &text, "Spawn" ); - - if( gui_new_helper( input_button_list[k_srbind_mback], &text ) ) - vg_strcat( &text, "Exit" ); -}