gui_helper_clear();
vg_str text;
if( gui_new_helper( input_button_list[k_srbind_miniworld_resume], &text ))
- vg_strcat( &text, "Resume" );
+ vg_strcat( &text, "Enter World" );
if( gui_new_helper( input_button_list[k_srbind_miniworld_teleport],&text))
vg_strcat( &text, "Teleport" );
}
}
-static void miniworld_icon( camera *cam, enum gui_icon icon, v3f pos ){
+static void miniworld_icon( camera *cam, enum gui_icon icon, v3f pos, f32 size){
m4x3f mmdl;
v3_copy( cam->transform[2], mmdl[2] );
mmdl[2][1] = 0.0f;
m4x3_mulv( global_miniworld.mmdl, pos, mmdl[3] );
shader_model_font_uMdl( mmdl );
- shader_model_font_uOffset( (v4f){0,0,0,20} );
+ shader_model_font_uOffset( (v4f){0,0,0,20.0f*size} );
m4x4f m4mdl;
m4x3_expand( mmdl, m4mdl );
shader_model_font_uTexMain( 0 );
shader_model_font_uColour( (v4f){1,1,1,1} );
+ miniworld_icon( cam, k_gui_icon_player, dest_world->player_co,
+ 1.0f + sinf(vg.time)*0.2f );
+
for( u32 i=0; i<mdl_arrcount(&dest_world->ent_challenge); i++ ){
ent_challenge *challenge = mdl_arritm( &dest_world->ent_challenge, i );
if( challenge->status )
icon = k_gui_icon_tick;
- miniworld_icon( cam, icon, challenge->transform.co );
+ miniworld_icon( cam, icon, challenge->transform.co, 1.0f );
}
+#if 0
for( u32 i=0; i<mdl_arrcount(&dest_world->ent_skateshop); i++ ){
ent_skateshop *shop = mdl_arritm( &dest_world->ent_skateshop, i );
if( shop->type == k_skateshop_type_boardshop ){
- miniworld_icon( cam, k_gui_icon_board, shop->transform.co );
+ miniworld_icon( cam, k_gui_icon_board, shop->transform.co, 1.0f );
}
else if( shop->type == k_skateshop_type_worldshop ){
- miniworld_icon( cam, k_gui_icon_world, shop->transform.co );
+ miniworld_icon( cam, k_gui_icon_world, shop->transform.co, 1.0f );
}
}
+#endif
for( u32 i=0; i<mdl_arrcount(&dest_world->ent_route); i++ ){
ent_route *route = mdl_arritm( &dest_world->ent_route, i );
v4_copy( route->colour, colour );
v3_muls( colour, 1.6666f, colour );
shader_model_font_uColour( colour );
- miniworld_icon( cam, k_gui_icon_rift_run, route->board_transform[3] );
+ miniworld_icon( cam, k_gui_icon_rift_run, route->board_transform[3],1.0f);
}
}
k_gui_icon_rift,
k_gui_icon_rift_run,
k_gui_icon_friend,
+ k_gui_icon_player,
k_gui_icon_count,
};
gui.icons[ k_gui_icon_rift ] = gui_find_icon( "icon_rift" );
gui.icons[ k_gui_icon_rift_run ] = gui_find_icon( "icon_rift_run" );
gui.icons[ k_gui_icon_friend ] = gui_find_icon( "icon_friend" );
+ gui.icons[ k_gui_icon_player ] = gui_find_icon( "icon_player" );
vg_linear_clear( vg_mem.scratch );
if( !mdl_arrcount( &gui.model_icons.textures ) )
[k_srbind_lobby] = INPUT_BASIC( SDLK_TAB, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
[k_srbind_chat ] = (vg_input_op[]){ vg_keyboard, SDLK_y, vg_end },
-[k_srbind_miniworld_resume] = INPUT_BASIC( SDLK_e, SDL_CONTROLLER_BUTTON_A ),
+[k_srbind_miniworld_resume] = (vg_input_op[]){
+ vg_keyboard, SDLK_RETURN, vg_gui_visible, 0,
+ vg_keyboard, SDLK_RETURN2,
+ vg_gui_visible, 1,
+ vg_joy_button, SDL_CONTROLLER_BUTTON_X, vg_end
+},
[k_srbind_miniworld_teleport]= INPUT_BASIC( SDLK_r, SDL_CONTROLLER_BUTTON_X ),
[k_srbind_max]=NULL
}
static void skaterift_populate_world_savedata( savedata_file *file,
- enum world_purpose which ){
+ enum world_purpose which ){
file->path[0] = '\0';
file->len = 0;
addon_reg *reg = world_static.instance_addons[ which ];
vg_msg sav;
vg_msg_init( &sav, file->buf, sizeof(file->buf) );
- if( which == k_world_purpose_hub ){
- if( world_static.instances[0].status == k_world_status_loaded )
- world_entity_serialize( &world_static.instances[0], &sav );
- }
- else {
- for( u32 i=1; i<vg_list_size(world_static.instances); i++ ){
- world_instance *instance = &world_static.instances[i];
- if( instance->status == k_world_status_loaded ){
- world_entity_serialize( instance, &sav );
- }
- }
+ world_instance *instance = &world_static.instances[which];
+ world_entity_serialize( instance, &sav );
+
+ vg_msg_frame( &sav, "player" );
+ {
+ vg_msg_wkvnum( &sav, "position", k_vg_msg_float|k_vg_msg_32b, 3,
+ (which == world_static.active_instance)?
+ localplayer.rb.co:
+ instance->player_co );
}
+ vg_msg_end_frame( &sav );
file->len = sav.cur.co;
}
}
vg_msg_end_frame( &sav );
- vg_msg_frame( &sav, "world" );
- {
- addon_reg *reg = world_static.instance_addons[ k_world_purpose_client ];
- if( reg && (world_static.active_instance > 0) ){
- skaterift_write_addon_alias( &sav, "alias", ®->alias );
- }
- vg_msg_wkvu32( &sav, "index", world_static.active_instance );
- vg_msg_wkvnum( &sav, "position", k_vg_msg_float|k_vg_msg_32b, 3,
- localplayer.rb.co );
- }
- vg_msg_end_frame( &sav );
-
file->len = sav.cur.co;
}
if( !vg_loader_availible() ) return 0;
u32 save_files = 2;
- if( world_static.instance_addons[ k_world_purpose_client ] )
+ if( world_static.instances[k_world_purpose_client].status
+ == k_world_status_loaded ){
save_files ++;
+ }
vg_linear_clear( vg_async.buffer );
u32 size = sizeof(savedata_group) + sizeof(savedata_file) * save_files;
skaterift_populate_main_savedata( &group->files[0] );
skaterift_populate_world_savedata( &group->files[1], k_world_purpose_hub );
- if( world_static.instance_addons[ k_world_purpose_client ] ){
+ if( world_static.instances[ k_world_purpose_client ].status
+ == k_world_status_loaded ){
skaterift_populate_world_savedata( &group->files[2],
k_world_purpose_client );
}
addon_cache_create_viewer( k_addon_type_player, player_reg_id );
kvsav.cur = orig;
-
-#if 0
- if( vg_msg_seekframe( &kvsav, "world" ) ){
- addon_alias q;
-
- /* world */
- skaterift_read_addon_alias( &kvsav, "alias", k_addon_type_world, &q );
- u32 reg_id = addon_match( &q );
- if( reg_id != 0xffffffff ){
- addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id );
-
- world_static.load_state = k_world_loader_load;
- struct world_load_args args = {
- .purpose = k_world_purpose_client,
- .reg = reg
- };
- skaterift_world_load_thread( &args );
-
- world_set_active_instance( vg_msg_getkvu32( &kvsav, "index", 0 ) );
- world_static.active_trigger_volume_count = 0;
- localplayer.viewable_world = world_current_instance();
- }
-
- v3f pos;
- vg_msg_getkvv3f( &kvsav, "position", pos, (v3f){0.0f,0.0f,0.0f} );
-
- if( v3_length2(pos) > 1.0f )
- player__setpos( pos );
- }
-#endif
}
static void vg_load(void){
world_instance *current =
&world_static.instances[ world_static.active_instance ];
- if( index != world_static.active_instance )
+ if( index != world_static.active_instance ){
v3_copy( localplayer.rb.co, current->player_co );
+ skaterift_autosave(1);
+ }
+
v3_copy( new->player_co, localplayer.rb.co );
world_static.active_instance = index;
}
}
-#if 0
-/*
- * used for relinking multi-world data. ran anytime the world setup changes
- */
-static void world_entity_relink( world_instance *world ){
- vg_info( "entity_relink(%d)\n", world - world_static.instances );
- for( u32 i=0; i<mdl_arrcount(&world->ent_miniworld); i++ ){
- ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld, i );
- miniworld->purpose = k_world_purpose_invalid;
-
- const char *uid = mdl_pstr( &world->meta, miniworld->pstr_world );
- addon_alias q;
- addon_uid_to_alias( uid, &q );
-
- u32 addon_id = addon_match( &q );
- if( addon_id != 0xffffffff ){
- addon_reg *reg = get_addon_from_index( k_addon_type_world, addon_id );
-
- for( int j=0; j<k_world_max; j ++ ){
- world_instance *other = &world_static.instances[j];
- if( other == world ) continue;
- if( (other->status == k_world_status_loaded) &&
- (world_static.instance_addons[j] == reg) ){
- miniworld->purpose = j;
- break;
- }
- }
- }
- }
-}
-#endif
-
static void world_entity_serialize( world_instance *world, vg_msg *sav ){
for( u32 i=0; i<mdl_arrcount(&world->ent_challenge); i++ ){
ent_challenge *challenge = mdl_arritm(&world->ent_challenge,i);
static void skaterift_world_load_done( void *payload, u32 size ){
struct world_load_complete_data *data = payload;
+ world_instance *world = &world_static.instances[ data->purpose ];
- /* TODO(W2): Load player position from this save file */
vg_msg sav;
vg_msg_init( &sav, data->save.buf, data->save.len );
- world_instance *world = &world_static.instances[ data->purpose ];
+ if( data->purpose != k_world_purpose_hub ){
+ vg_msg player_frame = sav;
+ if( vg_msg_seekframe( &player_frame, "player" ) ){
+ vg_msg_getkvv3f( &player_frame, "position", world->player_co, NULL );
+ }
+ }
+
world_entity_start( world, &sav );
world->status = k_world_status_loaded;
world_static.load_state = k_world_loader_none;
* Does a complete world switch using the remaining free slots
*/
static void skaterift_world_load_thread( void *_args ){
- /* FIXME: we need to check all threads that take args. args can dissapear! */
struct world_load_args args = *((struct world_load_args *)_args);
addon_reg *reg = args.reg;