world save position
authorhgn <hgodden00@gmail.com>
Tue, 21 Nov 2023 13:46:24 +0000 (13:46 +0000)
committerhgn <hgodden00@gmail.com>
Tue, 21 Nov 2023 13:46:24 +0000 (13:46 +0000)
ent_miniworld.c
gui.h
input.h
models_src/rs_icons.mdl
save.c
skaterift.c
world.c
world_entity.c
world_load.c

index 9d1d615dd66668e09cd2db53782a2fe1f6fe5cf7..5e9a23c03f17f6a0bb37b23430866b8083c87955 100644 (file)
@@ -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; i<mdl_arrcount(&dest_world->ent_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; 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 );
@@ -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 30664d8a00bb7b8905e92dc0fd10a04bf0af33cf..a84835d99108b30e0004a4824462bb1f742ae115 100644 (file)
--- 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 e66bdc69bb5726618f6d604062cfd2930ac06014..c66b7fb774e4a30cfe9f4477c09da15502aa4db2 100644 (file)
--- 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
index 5cb97695e4025b83bba41015131cd84fe3f57625..45dbefe8f8a12c99d223efa5d66de5965d220838 100644 (file)
Binary files a/models_src/rs_icons.mdl and b/models_src/rs_icons.mdl differ
diff --git a/save.c b/save.c
index 90e9c202cbab2732ce793d90e0ce7dca9603a3a3..472305d28d7e2c1cc220bf36d2edbcebbf97faf3 100644 (file)
--- 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; 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;
 }
@@ -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", &reg->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 );
    }
index c020532fd0d204d276c503941e5dd9b389001a68..011fa268c3b1e4494c7b1a95f513a90cf74b5799 100644 (file)
@@ -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 22c3c2c63be1017518454612ccbf169adee2829d..550ac508f0c894a64412a73923fe92cc3289068b 100644 (file)
--- 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;
index c5c2fc747a3a77ebbb61bd85b53af7dff26d3f4f..47b846c658102cf29f1a038ff012e4b7b61532b1 100644 (file)
@@ -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; 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);
index 50a882c2fab5dc1f8907a87c051d189eb55fed62..e2c2bb3f3c6c783304f8e0a540713e325f4792ec 100644 (file)
@@ -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;