build system revision
[carveJwlIkooP6JGAAIwe30JlM.git] / skaterift.c
index 353f544c0844e3c5a19c24ce998e2c1edf2e00ed..fee0039dc2c05dcea491e3c64f261f87521f058c 100644 (file)
@@ -2,7 +2,7 @@
  * =============================================================================
  *
  * Copyright  .        . .       -----, ,----- ,---.   .---.
- * 2021-2023  |\      /| |           /  |      |    | |    /|
+ * 2021-2024  |\      /| |           /  |      |    | |    /|
  *            | \    / | +--        /   +----- +---'  |   / |
  *            |  \  /  | |         /    |      |   \  |  /  |
  *            |   \/   | |        /     |      |    \ | /   |
  * =============================================================================
  */
 
-#define SR_NETWORKED
-#define VG_AUDIO_FORCE_COMPRESSED
-
-#ifndef VG_RELEASE
- #define VG_DEVWINDOW
-#endif
+#define SR_ALLOW_REWIND_HUB
 
 /* 
  *     system headers
@@ -26,6 +21,7 @@
 #include "steam.h"
 #include "render.h"
 #include "audio.h"
+#include "vg/vg_opt.h"
 
 #include "world.h"
 
@@ -47,7 +43,6 @@
 #include "entity.c"
 #include "workshop.c"
 #include "addon.c"
-#include "highscores.c"
 #include "save.c"
 #include "world_map.c"
 #include "network.c"
@@ -57,6 +52,9 @@
 #include "particle.c"
 #include "player_effects.c"
 #include "freecam.c"
+#include "testing.c"
+#include "trail.h"
+#include "trail.c"
 
 static int k_tools_mode = 0;
 
@@ -67,7 +65,8 @@ int main( int argc, char *argv[] ){
    return 0;
 }
 
-static void vg_launch_opt(void){
+void vg_launch_opt(void)
+{
    const char *arg;
    if( vg_long_opt( "noauth" ) ){
       network_client.auth_mode = eServerModeNoAuthentication;
@@ -85,9 +84,14 @@ static void vg_launch_opt(void){
    if( vg_long_opt( "demo" ) ){
       skaterift.demo_mode = 1;
    }
+
+   if( (arg = vg_long_opt_arg( "world" )) ){
+      skaterift.hub_world = arg;
+   }
 }
 
-static void vg_preload(void){
+void vg_preload(void)
+{
 vg_info(" Copyright  .        . .       -----, ,----- ,---.   .---.  \n" );
 vg_info(" 2021-2023  |\\      /| |           /  |      |    | |    /| \n" );
 vg_info("            | \\    / | +--        /   +----- +---'  |   / | \n" );
@@ -127,7 +131,10 @@ static void skaterift_restore_state(void){
 
    vg_msg kvsav;
    vg_msg_init( &kvsav, sav.buf, sizeof(sav.buf) );
-   skaterift.achievements |= vg_msg_getkvu32( &kvsav, "ach", 0 );
+
+   u32 ach;
+   vg_msg_getkvintg( &kvsav, "ach", k_vg_msg_u32, &ach );
+   skaterift.achievements |= ach;
 
    u32 board_reg_id = 0,
        player_reg_id = 0;
@@ -160,16 +167,54 @@ static void skaterift_restore_state(void){
 
 static addon_reg *skaterift_mount_world_unloadable( const char *path, u32 ext ){
    addon_reg *reg = addon_mount_local_addon( path, k_addon_type_world, ".mdl" );
+   if( !reg ) vg_fatal_error( "world not found\n" );
    reg->flags |= (ADDON_REG_HIDDEN | ext);
    return reg;
 }
 
-static void vg_load(void){
+static void skaterift_load_world_content(void){
+   /* hub world */
+   addon_reg *hub = skaterift_mount_world_unloadable( skaterift.hub_world, 0 );
+   skaterift_mount_world_unloadable( "maps/mp_spawn", 
+         ADDON_REG_CITY|ADDON_REG_PREMIUM );
+   skaterift_mount_world_unloadable( "maps/mp_mtzero", 
+         ADDON_REG_MTZERO|ADDON_REG_PREMIUM );
+   skaterift_mount_world_unloadable( "maps/dev_tutorial", 0 );
+   skaterift_mount_world_unloadable( "maps/dev_flatworld", 0 );
+
+   world_static.load_state = k_world_loader_load;
+
+   struct world_load_args args = {
+      .purpose = k_world_purpose_hub,
+      .reg = hub
+   };
+   skaterift_world_load_thread( &args );
+}
+
+static void skaterift_load_player_content(void){
+   u32 bytes = 1024*1024*10;
+   skaterift.replay.data = vg_linear_alloc( vg_mem.rtmemory, bytes );
+   skaterift.replay.size = bytes;
+   replay_clear( &skaterift.replay );
+
+   particle_alloc( &particles_grind, 300 );
+   particle_alloc( &particles_env, 200 );
+
+   player_load_animation_reference( "models/ch_none.mdl" );
+   player_model_load( &localplayer.fallback_model, "models/ch_none.mdl" );
+   player__bind();
+   player_board_load( &localplayer.fallback_board, "models/board_none.mdl" );
+}
+
+void vg_load(void)
+{
    if( k_tools_mode ){
       vg_async_call( async_call_ready, NULL, 0 );
       return;
    }
 
+   vg_audio.always_keep_compressed = 1;
+
    vg_console_reg_cmd( "load_world", skaterift_load_world_command, NULL );
    vg_console_reg_cmd( "switch_active_instance", 
                         skaterift_switch_instance_cmd, NULL );
@@ -190,20 +235,12 @@ static void vg_load(void){
    vg_loader_step( addon_system_init, NULL );
    vg_loader_step( workshop_init, NULL );
    vg_loader_step( skateshop_init, NULL );
+   vg_loader_step( ent_tornado_init, NULL );
+   vg_loader_step( testing_init, NULL );
+   vg_loader_step( trail_init, NULL );
+   vg_loader_step( particle_init, NULL );
   
-   /* player setup */
-   u32 bytes = 1024*1024*10;
-   skaterift.replay.data = vg_linear_alloc( vg_mem.rtmemory, bytes );
-   skaterift.replay.size = bytes;
-   replay_clear( &skaterift.replay );
-
-   particle_alloc( &particles_grind, 300 );
-
-   player_load_animation_reference( "models/ch_none.mdl" );
-   player_model_load( &localplayer.fallback_model, "models/ch_none.mdl" );
-   player__bind();
-
-   player_board_load( &localplayer.fallback_board, "models/board_none.mdl" );
+   vg_loader_step( skaterift_load_player_content, NULL );
 
    /* --------------------- */
 
@@ -216,23 +253,8 @@ static void vg_load(void){
     * -------------------------------------
     */
 
-   /* hub world */
-   addon_reg *hub = skaterift_mount_world_unloadable( "maps/dev_hub", 0 );
-   skaterift_mount_world_unloadable( "maps/mp_spawn", 
-         ADDON_REG_CITY|ADDON_REG_PREMIUM );
-   skaterift_mount_world_unloadable( "maps/mp_mtzero", 
-         ADDON_REG_MTZERO|ADDON_REG_PREMIUM );
-   skaterift_mount_world_unloadable( "maps/dev_tutorial", 0 );
-
    /* load home/permanent world manually */
-   world_static.load_state = k_world_loader_load;
-
-   struct world_load_args args = {
-      .purpose = k_world_purpose_hub,
-      .reg = hub
-   };
-   skaterift_world_load_thread( &args );
-
+   vg_loader_step( skaterift_load_world_content, NULL );
    vg_async_call( async_skaterift_player_start, NULL, 0 );
    vg_async_stall();
 
@@ -268,7 +290,8 @@ static void skaterift_change_client_world_preupdate(void);
  * UPDATE LOOP
  * ---------------------------------------------------------------------------*/
 
-static void vg_pre_update(void){
+void vg_pre_update(void)
+{
    skaterift_preupdate_inputs();
 
    if( k_tools_mode ) return;
@@ -305,16 +328,19 @@ static void vg_pre_update(void){
    world_map_pre_update();
 }
 
-static void vg_fixed_update(void){
+void vg_fixed_update(void)
+{
    if( k_tools_mode ) return;
    if( skaterift.op == k_async_op_clientloading ) return;
 
    world_routes_fixedupdate( world_current_instance() );
    player__update();
    vehicle_update_fixed();
+   testing_update();
 }
 
-static void vg_post_update(void){
+void vg_post_update(void)
+{
    if( k_tools_mode ) return;
    if( skaterift.op == k_async_op_clientloading ) return;
 
@@ -354,7 +380,7 @@ static void vg_post_update(void){
  * RENDERING
  * ---------------------------------------------------------------------------*/
 
-static void vg_framebuffer_resize( int w, int h ){
+void vg_framebuffer_resize( int w, int h ){
    render_fb_resize();
 }
 
@@ -490,6 +516,13 @@ static void render_scene(void){
    //particle_system_debug( &particles_grind );
    particle_system_prerender( &particles_grind );
    particle_system_render( &particles_grind, &skaterift.cam );
+   
+   ent_tornado_pre_update();
+   particle_system_update( &particles_env, vg.time_delta );
+   particle_system_prerender( &particles_env );
+   particle_system_render( &particles_env, &skaterift.cam );
+
+   player_glide_render_effects( &skaterift.cam );
 
    /* 
     * render transition 
@@ -576,7 +609,9 @@ static void render_main_game(void){
    }
    else{
       player__animate();
-      skaterift_record_frame( &skaterift.replay, 0 );
+      skaterift_record_frame( &skaterift.replay, 
+                              localplayer.deferred_frame_record );
+      localplayer.deferred_frame_record = 0;
    }
    animate_remote_players();
    player__pre_render();
@@ -622,7 +657,8 @@ static void render_main_game(void){
    skaterift_replay_post_render();
 }
 
-static void vg_render(void){
+void vg_render(void)
+{
    if( k_tools_mode ){
       glBindFramebuffer( GL_FRAMEBUFFER, 0 );
       glViewport( 0,0, vg.window_x, vg.window_y );
@@ -632,7 +668,7 @@ static void vg_render(void){
    }
 
    if( skaterift.op == k_async_op_clientloading ){
-      _vg_loader_render();
+      vg_loader_render();
       return;
    }
 
@@ -656,9 +692,31 @@ static void vg_render(void){
    gui_draw();
 }
 
-static void vg_gui(void){
+void vg_gui(void)
+{
    if( skaterift.op == k_async_op_clientloading ) return;
 
+   if( k_tools_mode ){
+      ui_rect null;
+      ui_rect screen = { 0, 0, vg.window_x, vg.window_y };
+      ui_rect panel = { 0, 0, 1000, 700 };
+      ui_rect_center( screen, panel );
+      vg_ui.wants_mouse = 1;
+
+      ui_fill( panel, ui_colour( k_ui_bg+1 ) );
+      ui_outline( panel, 1, ui_colour( k_ui_bg+7 ), 0 );
+
+      ui_rect_pad( panel, (ui_px[2]){ 8, 8 } );
+
+      return;
+   }
+
+   if( k_light_editor )
+      imgui_world_light_edit( world_current_instance() );
+
+   vg_ui.tex_bg = gpipeline.fb_main->attachments[0].id;
+   render_fb_inverse_ratio( gpipeline.fb_main, vg_ui.bg_inverse_ratio );
+
    menu_update();
    if( skaterift.activity == k_skaterift_menu ){
       glClear( GL_DEPTH_BUFFER_BIT );