--- /dev/null
+vg/bin/msgdump bin/skaterift-clang/savedata/sr002-local-dev_hub.bkv bin/skaterift-clang/savedata/sr002-local-mp_mtzero.bkv bin/skaterift-clang/savedata/sr002-local-mp_spawn.bkv bin/skaterift-clang/savedata/sr002-steam-2986666679.bkv bin/skaterift-clang/savedata/sr002-steam-2987160007.bkv bin/skaterift-clang/savedata/sr002-steam-3006909988.bkv bin/skaterift-clang/savedata/sr002-steam-3015566387.bkv bin/skaterift-clang/savedata/sr002-steam-3017733355.bkv bin/skaterift-clang/savedata/sr002-steam-3081422037.bkv bin/skaterift-clang/save.bkv
miniworld_icon( cam, icon, challenge->transform.co, 1.0f );
}
+ for( u32 i=0; i<mdl_arrcount(&dest_world->ent_route); i++ ){
+ ent_route *route = mdl_arritm( &dest_world->ent_route, i );
+
+ if( route->achievment_status & 0x2 ){
+ miniworld_icon( cam, k_gui_icon_rift_run_gold,
+ route->board_transform[3],1.0f);
+ }
+ else if( route->achievment_status & 0x1 ){
+ miniworld_icon( cam, k_gui_icon_rift_run_silver,
+ route->board_transform[3],1.0f);
+ }
+ }
+
for( u32 i=0; i<mdl_arrcount(&dest_world->ent_route); i++ ){
ent_route *route = mdl_arritm( &dest_world->ent_route, i );
k_ent_gate_flip = 0x4, /* flip direction 180* for exiting portal */
k_ent_gate_custom_mesh = 0x8, /* use a custom submesh instead of default */
k_ent_gate_locked = 0x10,/* has to be unlocked to be useful */
+
+ k_ent_gate_clean_pass = 0x20,/* player didn't rewind while getting here */
};
struct ent_gate{
f64 timing_base;
u32 id_camera; /* v103+ */
+
+ /* v104+, but always accessible */
+ u32 achievment_status;
+ f64 best_laptime;
};
struct ent_water{
k_gui_icon_rift_run_2d,
k_gui_icon_friend,
k_gui_icon_player,
+ k_gui_icon_rift_run_gold,
+ k_gui_icon_rift_run_silver,
k_gui_icon_count,
};
gui.icons[ k_gui_icon_rift_run_2d ] = gui_find_icon( "icon_rift_run2d" );
gui.icons[ k_gui_icon_friend ] = gui_find_icon( "icon_friend" );
gui.icons[ k_gui_icon_player ] = gui_find_icon( "icon_player" );
+ gui.icons[ k_gui_icon_rift_run_gold ] =
+ gui_find_icon("icon_rift_run_medal_gold");
+ gui.icons[ k_gui_icon_rift_run_silver]=
+ gui_find_icon("icon_rift_run_medal_silver");
vg_linear_clear( vg_mem.scratch );
if( !mdl_arrcount( &gui.model_icons.textures ) )
}
else {
assert( stride >= arr->item_size );
+ vg_warn( "Applying alignment fixup to array @%p [%u -> %u] x %u\n",
+ buffer, arr->item_size, stride, arr->item_count );
for( u32 i=0; i<arr->item_count; i++ ){
u64 l = fread( buffer+i*stride, arr->item_size, 1, mdl->file );
localplayer.boundary_hash ^= NETMSG_GATE_BOUNDARY_BIT;
localplayer.boundary_hash &= ~NETMSG_BOUNDARY_MASK;
localplayer.boundary_hash |= index;
-
+
ent_gate *gate = mdl_arritm( &world->ent_gate, mdl_entity_id_id(id) );
world_routes_fracture( world, gate, localplayer.rb.co, localplayer.rb.v );
ent_gate *gate_waiting;
int immobile;
+ int rewinded_since_last_gate;
+
/*
* Network
* --------------------------------------------------
/* capture the current resume frame at the very last point */
if( button_down( k_srbind_reset ) ){
if( skaterift.activity == k_skaterift_default ){
+ localplayer.rewinded_since_last_gate = 1;
skaterift.activity = k_skaterift_replay;
skaterift_record_frame( &skaterift.replay, 1 );
if( skaterift.replay.head ){
u32 file_count;
struct savedata_file {
char path[128];
- u8 buf[1024];
+ u8 buf[2048];
u32 len;
}
files[];
entity_call( world, &call );
}
}
+
+ for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
+ ent_route *route = mdl_arritm( &world->ent_route, i );
+ route->achievment_status = 0;
+ route->best_laptime = 0.0;
+ }
+
+ vg_msg routes_block = *sav;
+ if( vg_msg_seekframe( &routes_block, "routes" ) ){
+ for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
+ ent_route *route = mdl_arritm( &world->ent_route, i );
+
+ vg_msg route_info = routes_block;
+ if( vg_msg_seekframe( &route_info,
+ mdl_pstr(&world->meta,route->pstr_name) ) ){
+ route->achievment_status =
+ vg_msg_getkvu32( &route_info, "achivement_status", 0 );
+ route->best_laptime =
+ vg_msg_getkvf64( &route_info, "best_laptime", 0.0 );
+ }
+ }
+ }
}
static void world_entity_serialize( world_instance *world, vg_msg *sav ){
const char *alias = mdl_pstr(&world->meta,challenge->pstr_alias);
vg_msg_wkvu32( sav, alias, challenge->status );
}
+
+ if( mdl_arrcount(&world->ent_route) ){
+ vg_msg_frame( sav, "routes" );
+ for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
+ ent_route *route = mdl_arritm( &world->ent_route, i );
+
+ vg_msg_frame( sav, mdl_pstr( &world->meta, route->pstr_name ) );
+ {
+ vg_msg_wkvu32( sav, "achivement_status", route->achievment_status );
+ vg_msg_wkvf64( sav, "best_laptime", route->best_laptime );
+ }
+ vg_msg_end_frame( sav );
+ }
+ vg_msg_end_frame( sav );
+ }
}
#endif /* WORLD_ENTITY_C */
u32 last_version=0;
u32 valid_count=0;
+ int clean = 1;
for( u32 i=0; i<route->checkpoints_count; i++ ){
u32 cpid = (i+route->active_checkpoint) % route->checkpoints_count;
}
last_version = rg->timing_version;
- vg_info( "%u %f\n", rg->timing_version, rg->timing_time );
+
+ vg_info( "%u %f [%s]\n", rg->timing_version, rg->timing_time,
+ (rg->flags & k_ent_gate_clean_pass)? "CLEAN": "-----");
+
+ if( !(rg->flags & k_ent_gate_clean_pass) )
+ clean = 0;
}
if( world_static.current_run_version == last_version+1 ){
if( valid_count==route->checkpoints_count ){
f64 lap_time = world_static.time - start_time;
- //world_routes_local_set_record( world, route, lap_time );
+ if( (route->best_laptime == 0.0) || (lap_time < route->best_laptime) ){
+ route->best_laptime = lap_time;
+ route->achievment_status |= 0x1;
+
+ if( clean )
+ route->achievment_status |= 0x2;
+ }
+
+ /* for steam achievements. */
if( route->anon.official_track_id != 0xffffffff ){
struct track_info *ti = &track_infos[ route->anon.official_track_id ];
if( ti->achievement_id ){
world_static.last_use = world_static.time;
ent_gate *dest = mdl_arritm( &world->ent_gate, rg->target );
+ if( localplayer.rewinded_since_last_gate ){
+ localplayer.rewinded_since_last_gate = 0;
+ dest->flags &= ~k_ent_gate_clean_pass;
+ }
+ else
+ dest->flags |= k_ent_gate_clean_pass;
+
for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
ent_route *route = mdl_arritm( &world->ent_route, i );