oh yeah mr crabs
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.h
index 7920588e27e9672717669b890f7557d343d13b9a..35d3cd7088f32fc8330be7412a62d3ccdd6ff15a 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ */
+
 #ifndef ROUTES_H
 #define ROUTES_H
 
@@ -15,11 +19,6 @@ enum route_special_type
    k_route_special_type_collector = 2
 };
 
-static void world_routes_interact(void)
-{
-   world.routes.last_interaction = vg_time;
-}
-
 static void debug_sbpath( struct route_node *rna, struct route_node *rnb,
                           u32 colour, float xoffset )
 {
@@ -304,6 +303,8 @@ static void world_routes_ui_updatetime( u32 route, float time )
  */
 static void world_routes_ui_notch( u32 route, float time )
 {
+   return; /* FIXME: Temporarily disabled */
+
    struct subworld_routes *r = &world.routes;
    struct route *pr = &r->routes[route];
 
@@ -406,7 +407,7 @@ static void world_routes_ui_draw( u32 route, v4f colour, float offset )
    shader_routeui_use();
    glBindVertexArray( pr->ui.vao );
 
-   float fade_amt = vg_time - pr->ui.fade_timer_start;
+   float fade_amt = r->time - pr->ui.fade_timer_start;
    fade_amt = vg_clampf( fade_amt / 1.0f, 0.0f, 1.0f );
    
    float fade_block_size = 0.0f,
@@ -426,7 +427,8 @@ static void world_routes_ui_draw( u32 route, v4f colour, float offset )
    v4_copy( colour, fade_colour );
    fade_colour[3] *= 1.0f-fade_amt;
 
-   float timer_delta = (vg_time - world.routes.last_interaction) * (1.0/60.0),
+   /* 1 minute timer */
+   float timer_delta = (r->time - r->last_use) * (1.0/45.0),
          timer_scale = 1.0f - vg_minf( timer_delta, 1.0f );
 
    /* 
@@ -491,7 +493,15 @@ static void world_routes_local_set_record( u32 route, double lap_time )
       temp.time     = time_centiseconds;
 
       highscores_push_record( &temp );
-      track_infos[ pr->track_id ].push = 1;
+
+      struct track_info *pti = &track_infos[ pr->track_id ];
+      pti->push = 1;
+      
+      if( pti->achievement_id )
+      {
+         steam_set_achievement( pti->achievement_id );
+         steam_store_achievements();
+      }
    }
    else
    {
@@ -576,7 +586,7 @@ static void world_routes_verify_run( u32 route )
 
    pr->ui.fade_start = pr->ui.segment_start;
    pr->ui.fade_count = 0;
-   pr->ui.fade_timer_start = vg_time;
+   pr->ui.fade_timer_start = r->time;
 
    int orig_seg_count = pr->ui.segment_count;
 
@@ -599,7 +609,7 @@ static void world_routes_verify_run( u32 route )
       pr->ui.fade_count ++;
    }
 
-   r->routes[route].latest_pass = vg_time;
+   r->routes[route].latest_pass = r->time;
 }
 
 /*
@@ -607,18 +617,18 @@ static void world_routes_verify_run( u32 route )
  */
 static void world_routes_activate_gate( u32 id )
 {
-   world_routes_interact();
-
    struct subworld_routes *r = &world.routes;
    struct route_gate *rg = &r->gates[id];
    struct route_node *pnode = &r->nodes[rg->node_id],
                      *pdest = &r->nodes[pnode->next[0]];
 
+   r->last_use = r->time;
+
    struct route_collector *rc = &r->collectors[ pdest->special_id ];
 
    r->active_gate = id;
    rg->timing.version = r->current_run_version;
-   rg->timing.time = vg_time;
+   rg->timing.time = r->time;
    for( u32 i=0; i<r->route_count; i++ )
    {
       struct route *route = &r->routes[i];
@@ -640,7 +650,7 @@ static void world_routes_activate_gate( u32 id )
       {
          route->ui.fade_start = route->ui.segment_start;
          route->ui.fade_count = route->ui.segment_count;
-         route->ui.fade_timer_start = vg_time;
+         route->ui.fade_timer_start = r->time;
          world_routes_ui_clear(i);
 
          vg_success( "CLEARING -> %u %u \n", route->ui.fade_start,
@@ -651,7 +661,7 @@ static void world_routes_activate_gate( u32 id )
    r->current_run_version ++;
 
    rc->timing.version = r->current_run_version;
-   rc->timing.time = vg_time;
+   rc->timing.time = r->time;
    r->current_run_version ++;
 }
 
@@ -661,15 +671,24 @@ static void world_routes_activate_gate( u32 id )
 static void world_routes_notify_reset(void)
 {
    struct subworld_routes *r = &world.routes;
-   world_routes_interact();
+   r->rewind_from = r->time;
+   r->rewind_to = r->last_use;
 
+#if 0
    for( int i=0; i<r->route_count; i++ )
    {
       struct route *route = &r->routes[i];
 
       if( route->active )
-         world_routes_ui_notch( i, vg_time - route->latest_pass );
+         world_routes_ui_notch( i, r->time - route->latest_pass );
    }
+#endif
+}
+
+static void world_routes_rollback_time( double t )
+{
+   struct subworld_routes *r = &world.routes;
+   r->time = vg_lerp( r->rewind_to, r->rewind_from, t );
 }
 
 static void world_routes_debug(void)
@@ -1011,6 +1030,7 @@ static void world_routes_loadfrom( mdl_header *mdl )
                                      1, sizeof( struct route ) );
 
          struct route *route = &r->routes[r->route_count];
+         memset( route, 0, sizeof(struct route) );
 
          v3_copy( inf->colour, route->colour );
          route->colour[3] = 1.0f;
@@ -1094,6 +1114,8 @@ static void world_routes_init(void)
 {
    struct subworld_routes *r = &world.routes;
    r->current_run_version = 2;
+   r->time = RESET_MAX_TIME*2.0;
+   r->last_use = 0.0;
 
    shader_route_register();
    shader_routeui_register();
@@ -1111,15 +1133,17 @@ static void world_routes_free(void*_)
 static void world_routes_update(void)
 {
    struct subworld_routes *r = &world.routes;
+   r->time += vg.time_delta;
 
    for( int i=0; i<r->route_count; i++ )
    {
       struct route *route = &r->routes[i];
-      route->factive = vg_lerpf( route->factive, route->active, 0.01f );
+      route->factive = vg_lerpf( route->factive, route->active, 
+                                 0.6f*vg.time_delta );
 
       if( route->active )
       {
-         world_routes_ui_updatetime( i, vg_time - route->latest_pass );
+         world_routes_ui_updatetime( i, r->time - route->latest_pass );
       }
    }
 }