-#ifndef RESPAWN_C
-#define RESPAWN_C
-
-#include "world_map.h"
#include "skaterift.h"
+#include "world_map.h"
#include "world.h"
#include "input.h"
#include "gui.h"
#include "menu.h"
#include "scene.h"
-static void world_map_get_dir( v3f dir ){
+struct world_map world_map;
+
+static void world_map_get_dir( v3f dir )
+{
/* idk */
dir[0] = -sqrtf(0.5f);
dir[2] = sqrtf(0.5f);
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 )
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);
plane_pos[1] = co[2];
}
-static void respawn_map_draw_icon( camera *cam,
- enum gui_icon icon, v3f pos ){
+static void respawn_map_draw_icon( vg_camera *cam,
+ 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 );
}
-static void world_map_pre_update(void){
- if( skaterift.activity != k_skaterift_world_map ) return;
+static void world_map_select_close(void)
+{
+ world_map.sel_spawn = world_map.close_spawn;
+ gui_helper_clear();
- 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;
- }
+ 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;
}
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 );
/* update camera */
- camera *cam = &world_map.cam;
+ vg_camera *cam = &world_map.cam;
v3f dir;
world_map_get_dir(dir);
cam->nearz = 10.0f;
cam->fov = 40.0f;
- camera_update_transform( cam );
- camera_update_view( cam );
- camera_update_projection( cam );
- camera_finalize( cam );
+ vg_camera_update_transform( cam );
+ vg_camera_update_view( cam );
+ vg_camera_update_projection( cam );
+ 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;
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_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++ ){
+ 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;
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 );
}
-}
-
-static 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();
+ for( u32 i=0; i<mdl_arrcount(&world->ent_glider); i ++ )
+ {
+ ent_glider *glider = mdl_arritm( &world->ent_glider, i );
- vg_str text;
- if( gui_new_helper( input_joy_list[k_srjoystick_steer], &text ) )
- vg_strcat( &text, "move" );
+ v4f colour = { 1,1,1,1 };
- if( gui_new_helper( input_button_list[k_srbind_maccept], &text ) )
- vg_strcat( &text, "spawn" );
+ if( !(glider->flags & 0x1) )
+ v3_muls( colour, 0.5f, colour );
+ gui_icon_setcolour( colour );
- if( gui_new_helper( input_button_list[k_srbind_mback], &text ) )
- vg_strcat( &text, "exit" );
+ respawn_map_draw_icon( cam, k_gui_icon_glider, glider->transform.co, 1 );
+ }
}
-
-#endif /* RESPAWN_C */