Update spawn map to new UI
[carveJwlIkooP6JGAAIwe30JlM.git] / world_map.c
index 3465776c7bd6a5d44efba6752d19354f4489d90d..13de85cb735a09abf66eb6702952bfd2ae84dc4f 100644 (file)
@@ -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; i<mdl_arrcount(&world->ent_spawn); i++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->ent_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; i<mdl_arrcount(&world->ent_challenge); i++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->ent_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; i<mdl_arrcount(&world->ent_skateshop); i++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->ent_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; i<mdl_arrcount(&world->ent_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; i<mdl_arrcount(&world->ent_gate); i++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->ent_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; i<mdl_arrcount(&world->ent_route); i++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->ent_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; i<mdl_arrcount(&world->ent_glider); i ++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->ent_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" );
-}