From ca1798f62b65b72703e960d132dd0170728b7709 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 21 Nov 2023 13:46:24 +0000 Subject: [PATCH] world save position --- ent_miniworld.c | 19 +++++++++++------- gui.h | 2 ++ input.h | 7 ++++++- models_src/rs_icons.mdl | Bin 41400 -> 43184 bytes save.c | 42 +++++++++++++++------------------------- skaterift.c | 30 ---------------------------- world.c | 5 ++++- world_entity.c | 32 ------------------------------ world_load.c | 11 ++++++++--- 9 files changed, 48 insertions(+), 100 deletions(-) diff --git a/ent_miniworld.c b/ent_miniworld.c index 9d1d615..5e9a23c 100644 --- a/ent_miniworld.c +++ b/ent_miniworld.c @@ -9,7 +9,7 @@ static void miniworld_helper_default(void){ 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" ); @@ -51,7 +51,7 @@ static void ent_miniworld_call( world_instance *world, ent_call *call ){ } } -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; @@ -61,7 +61,7 @@ static void miniworld_icon( camera *cam, enum gui_icon icon, v3f pos ){ 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 ); @@ -116,6 +116,9 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){ 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; ient_challenge); i++ ){ ent_challenge *challenge = mdl_arritm( &dest_world->ent_challenge, i ); @@ -123,18 +126,20 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){ 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; ient_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; ient_route); i++ ){ ent_route *route = mdl_arritm( &dest_world->ent_route, i ); @@ -143,7 +148,7 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){ 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); } } diff --git a/gui.h b/gui.h index 30664d8..a84835d 100644 --- a/gui.h +++ b/gui.h @@ -13,6 +13,7 @@ enum gui_icon { k_gui_icon_rift, k_gui_icon_rift_run, k_gui_icon_friend, + k_gui_icon_player, k_gui_icon_count, }; @@ -317,6 +318,7 @@ static void gui_init(void){ 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 ) ) diff --git a/input.h b/input.h index e66bdc6..c66b7fb 100644 --- a/input.h +++ b/input.h @@ -102,7 +102,12 @@ static vg_input_op *input_button_list[] = { [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 diff --git a/models_src/rs_icons.mdl b/models_src/rs_icons.mdl index 5cb97695e4025b83bba41015131cd84fe3f57625..45dbefe8f8a12c99d223efa5d66de5965d220838 100644 GIT binary patch delta 1736 zcmdmSm}$dBrU@#t3m6y}7=gIBq$o2ly%@-X00Sll29Al2;;aHJAV#dXYym4or43L) zZc0vkZemGlQD$NeNd1P16QvmsOk4{hPD;xjfGX7iN~PwN#3v`_rWPfF6f!V;n9Rs1 z&G=!mETc5*2cWvOlWiHrcITkg78vp;- zPZnp_WQVcc*){8-Z2K0g?Y71|dG`N-0HhuUK!#&62d8??DN1{`ar4-L90oFD+eb?c z28IUvDbgElMN4zg&97$wX-N9Qj8(&j+$?kr3_+L8Y_O?+kaW=&mwIdt0;v}*t;cW? z!?r9v8}(K`3}rZJ1z%se1~q5ehSIa|TSnCd?;J+KyU6N0F(M+&03 zM^4%97Qu{yS(Xjfjw^*REV$-%%yw%mrh2cRidNHjMKILw&^%~+s|-~=$bN>NGX34y zESPJ&2df2hTDI?o`vA!U*LH5l>Ve!NjC-(!P`A#OdaOazqb;=uTNLbjvJq<(YInxC#KR0A3rL9qkOv@fj4#SImo;pXnEaqYW%7{;8lt>F zyZE4(A4m&;@Z_%( TSQLmsVj%V^AlR%ia{>ndxrQcI delta 213 zcmdmRk!iH0M$*HY|AJv*U-SgpvA_(zyeeOGCVUcB{Mk{q@IC6W9H-{#&w$wn3gcI ctOA0~0xTv_Rsm~6_2z`O6%v~j7EIs(04TjP^8f$< diff --git a/save.c b/save.c index 90e9c20..472305d 100644 --- a/save.c +++ b/save.c @@ -77,7 +77,7 @@ static void skaterift_read_addon_alias( vg_msg *msg, const char *key, } 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 ]; @@ -92,18 +92,17 @@ static void skaterift_populate_world_savedata( savedata_file *file, 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; istatus == 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; } @@ -123,18 +122,6 @@ static void skaterift_populate_main_savedata( savedata_file *file ){ } 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; } @@ -143,8 +130,10 @@ static int skaterift_autosave( int async ){ 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; @@ -161,7 +150,8 @@ static int skaterift_autosave( int async ){ 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 ); } diff --git a/skaterift.c b/skaterift.c index c020532..011fa26 100644 --- a/skaterift.c +++ b/skaterift.c @@ -151,36 +151,6 @@ static void skaterift_restore_state(void){ 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){ diff --git a/world.c b/world.c index 22c3c2c..550ac50 100644 --- a/world.c +++ b/world.c @@ -44,8 +44,11 @@ static void world_switch_instance( u32 index ){ 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; diff --git a/world_entity.c b/world_entity.c index c5c2fc7..47b846c 100644 --- a/world_entity.c +++ b/world_entity.c @@ -604,38 +604,6 @@ static void world_entity_start( world_instance *world, vg_msg *sav ){ } } -#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; ient_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; jstatus == 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; ient_challenge); i++ ){ ent_challenge *challenge = mdl_arritm(&world->ent_challenge,i); diff --git a/world_load.c b/world_load.c index 50a882c..e2c2bb3 100644 --- a/world_load.c +++ b/world_load.c @@ -137,12 +137,18 @@ struct world_load_complete_data{ 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; @@ -157,7 +163,6 @@ struct world_load_args { * 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; -- 2.25.1