From cab063a27c067f6b5387305fe358c94fc7793f45 Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 24 Nov 2023 12:18:38 +0000 Subject: [PATCH] add medals to miniworld display --- check_savedata.sh | 1 + ent_miniworld.c | 13 +++++++++++++ entity.h | 6 ++++++ gui.h | 6 ++++++ model.h | 2 ++ models_src/rs_icons.mdl | Bin 56192 -> 68448 bytes player.c | 2 +- player.h | 2 ++ player_replay.c | 1 + save.h | 2 +- world_entity.c | 37 +++++++++++++++++++++++++++++++++++++ world_routes.c | 25 +++++++++++++++++++++++-- 12 files changed, 93 insertions(+), 4 deletions(-) create mode 100755 check_savedata.sh diff --git a/check_savedata.sh b/check_savedata.sh new file mode 100755 index 0000000..84d551a --- /dev/null +++ b/check_savedata.sh @@ -0,0 +1 @@ +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 diff --git a/ent_miniworld.c b/ent_miniworld.c index baee0c3..497e9d0 100644 --- a/ent_miniworld.c +++ b/ent_miniworld.c @@ -114,6 +114,19 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){ miniworld_icon( cam, icon, challenge->transform.co, 1.0f ); } + for( u32 i=0; ient_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; ient_route); i++ ){ ent_route *route = mdl_arritm( &dest_world->ent_route, i ); diff --git a/entity.h b/entity.h index c39d224..3fd3508 100644 --- a/entity.h +++ b/entity.h @@ -118,6 +118,8 @@ enum ent_gate_flag{ 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{ @@ -187,6 +189,10 @@ struct ent_route{ f64 timing_base; u32 id_camera; /* v103+ */ + + /* v104+, but always accessible */ + u32 achievment_status; + f64 best_laptime; }; struct ent_water{ diff --git a/gui.h b/gui.h index f3da9a4..2d984f3 100644 --- a/gui.h +++ b/gui.h @@ -17,6 +17,8 @@ enum gui_icon { 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, }; @@ -327,6 +329,10 @@ static void gui_init(void){ 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 ) ) diff --git a/model.h b/model.h index 5608bec..34963be 100644 --- a/model.h +++ b/model.h @@ -311,6 +311,8 @@ static void mdl_load_array_file_buffer( mdl_context *mdl, mdl_array *arr, } 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; iitem_count; i++ ){ u64 l = fread( buffer+i*stride, arr->item_size, 1, mdl->file ); diff --git a/models_src/rs_icons.mdl b/models_src/rs_icons.mdl index 8e48c54223358472e50d294a7c25dd3927db125b..e3ee8b5d351052d3637f8ae815721cc0145691d0 100644 GIT binary patch delta 17135 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 J)J|q4`9H2Y$r=Cv delta 3326 zcmZXX4Ny~87RM8K33-9=(Fh6(0x@~0ZzZB^73G3;v0cR~3fjV2Km`qGU=dK3JXl;B`ZMEXQ`V^=DBUkV1-N}z=FXs_mxuSWF#zK zyexfrW?@!=DRY^SAK@XzeC@HqtW||Y1zAE!Ho;@tksvqxdpRg(f<2FipJgsgUzE8# zs~}TMlPyI|_&920noU^3lxK#w)Psh|gOozbSMHR^1HwOQk;!sYG8u!Y(2dEw*tAGm zP}X}@CaX}jx@jvL)M5W)%u?03SGD=h_P${2i zh+b41HgoFnH@wJTsK}}G#AbuKNbf~LB>5BM`@I?xD#?H?26f;jZxSTQX3 zMYKkR-o!kq;Sq!X+8M@s;BtVkWTx8M(S`6t(hTI2P+~gsS4e~nV<8l=lf@dL>+YGEjmeJ^K9P7v} zqghY^<*Yd2GFk;?O;w9Ml+jBr>L7jUl6jEoEu5m{t{YL(mW3R!lct^Rwc(eUaB-&Rmm~J`BEFQ{j2+9X)j=7JDkueo)tiN z-A>VzDvo8ocN1rEif(XGXXtUL(l$nXzt7NnF6uD#ujbhPi%K#ARSwex7v)Kdph_;N zhygKA+EC3gf})+(JR@8XOAW6bbu@yU$zL!j(_`aU;Wod1y_QB!57r+3myw)$%TI@o z>-UadK0R3T!-ODm0{K5imm1g8)6;dDhT%GL%<23L#}eb}1kTVghfF?%&fd;5#>;~U zEd><*2hhBo_X(QiEiUvjBgVSwt0sDLMwm8G?MqrvvQU?7{GhGVDm3ep7_8l$<4>C3 z^5fuluYT9hOAOY;tPd7zZ;wqj&ZIjMb(+8Rgp-q~AUW-D5~f-mQ~qUUup(<{e{3^dm&>U- z{(d(`ampLh*vYg1d*mf{lSYd^=9uhGFN|a-?=$YzbFpT3;oRn?2U>db<1ls3;#aZ4 z)@2iEz%B#xe5Hoa_+7j@he{>3-lE034C>fLFT@6R45j;a8Q7pxA;gNO!sxYK9P2*U zPdvLYs@To3_mX*XT8u?QP1Q2uDSFYY-JG^PI*9b`**hs}PQln|Yj=+q4&ayB!P=nf zq2$-M{NYK#+W8(~@A$Klf;H+AZ}J%V_f5CQ>S;-mPDA|PBfU{N$O+A;<=GCckGMi5y*HO*OzUw%HrOhgOx#!%O-Sb0mpf!) z^M`0rGRGvG7ml%xXHvJLNNFAKUHqXGkBOY$qP#%WDd9|y5lP*3yk=X3RH^jy2hC@w zDMhDVwl#wM(A+qwH;q=O7}S3q6G{Fd$u`Ir=}!49#lRjM;v+^kQT;r8nXU5{)z(s~ z+-qPgf5c@n?&TSFe;~F45Sf8H=>pE38-?itbcLgcWgpLcU5^!vfRE^J&<ShyD;mI>W&Po51B>y-k&zwV0*;ec*H!4@2(?*X2vy`@JxfPi#tD<5!s z4jQZlWaOgdPQcGsM-odT&)n?62#kQWDr`6d;PWyZ?Ev-&Wo!VkOfTRsNpM1&c;@#} zL6{C8?w=u;4&Ym(FebqDtC(^(V3jHW?HuG8RX+|O9&q1)7b_o7Q16F!0EdRZhjsw1 z1-`^`$ev;Zh$$HWu}lR(EMo(Ri}wP=r9uzeyO<4-x&VlqXatRRKTiBvGH#%*uI`Ey)a&(E z2I}kUzsvPolkJx`=(Cl6gKSbLA|m2awx(^Mv8mBkY)iF;tsHiK&HON(6s`$S$n^>_ zvnEj?53%DH3i$~AKu=GPxO7xhRQqb(cLS}htryG_ZMkbwRk_PmKGIY76>^>ZsZgb} zR+>^i!tPR_^7tm9Qq2{me5l=i4SSZgu|j%b%CR zQ{tzX<5F$rxaE`OMX|PM^Mrw$H*cA2e=^(rY~~`hS>qGnCpELj!`V!ihdk82l%LA! z&QQtq9`=3Jl&PHEoP=-B?o-Lb>^Pcrx=UEO!R|J^asLa~SuRBF%uZE17q5EbUIjX{ SeLdxRX@tTTB|iAy&i?^)4GvNO diff --git a/player.c b/player.c index 93cfb10..07e5f30 100644 --- a/player.c +++ b/player.c @@ -123,7 +123,7 @@ static void player__pass_gate( u32 id ){ 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 ); diff --git a/player.h b/player.h index a5ae8e8..fe6d74c 100644 --- a/player.h +++ b/player.h @@ -97,6 +97,8 @@ struct { ent_gate *gate_waiting; int immobile; + int rewinded_since_last_gate; + /* * Network * -------------------------------------------------- diff --git a/player_replay.c b/player_replay.c index befbf0f..1b33947 100644 --- a/player_replay.c +++ b/player_replay.c @@ -511,6 +511,7 @@ static void skaterift_replay_post_render(void){ /* 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 ){ diff --git a/save.h b/save.h index 941dd12..4074b89 100644 --- a/save.h +++ b/save.h @@ -13,7 +13,7 @@ struct savedata_group { u32 file_count; struct savedata_file { char path[128]; - u8 buf[1024]; + u8 buf[2048]; u32 len; } files[]; diff --git a/world_entity.c b/world_entity.c index cbe7432..0e484ed 100644 --- a/world_entity.c +++ b/world_entity.c @@ -617,6 +617,28 @@ static void world_entity_start( world_instance *world, vg_msg *sav ){ entity_call( world, &call ); } } + + for( u32 i=0; ient_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; ient_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 ){ @@ -626,6 +648,21 @@ 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; ient_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 */ diff --git a/world_routes.c b/world_routes.c index 33d84db..48df267 100644 --- a/world_routes.c +++ b/world_routes.c @@ -48,6 +48,7 @@ static void world_routes_time_lap( world_instance *world, ent_route *route ) u32 last_version=0; u32 valid_count=0; + int clean = 1; for( u32 i=0; icheckpoints_count; i++ ){ u32 cpid = (i+route->active_checkpoint) % route->checkpoints_count; @@ -69,7 +70,12 @@ static void world_routes_time_lap( world_instance *world, ent_route *route ) } 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 ){ @@ -85,8 +91,16 @@ static void world_routes_time_lap( world_instance *world, ent_route *route ) 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 ){ @@ -120,6 +134,13 @@ static void world_routes_activate_entry_gate( world_instance *world, 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; ient_route); i++ ){ ent_route *route = mdl_arritm( &world->ent_route, i ); -- 2.25.1