small simplifying
authorhgn <hgodden00@gmail.com>
Sat, 19 Apr 2025 08:34:15 +0000 (09:34 +0100)
committerhgn <hgodden00@gmail.com>
Sat, 19 Apr 2025 08:34:15 +0000 (09:34 +0100)
build.c
src/client.c
src/client.h
src/menu.c
src/player_render.c
src/skaterift.c
src/skaterift.h
src/world_load.c

diff --git a/build.c b/build.c
index 46e3becc4906daf02b45f7fab0fe739f67d145af..32c6d06275fbcc2be86a6f2fda0cd23ff5892bf5 100644 (file)
--- a/build.c
+++ b/build.c
@@ -425,39 +425,41 @@ void s_queuetest_build(void)
    vg_compiler_run( &test_proj, &vg_test_env, &conf, sources.buffer, "qtest", k_obj_type_exe );
 }
 
-int main( int argc, char *argv[] )
+int main( int argc, const char *argv[] )
 {
    vg_log_init();
+   _vg_opt_init( argc, argv );
 
-   char *arg;
-   while( vg_argp( argc, argv ) ){
-      if( vg_long_opt( "release-all", NULL ) )
-         s_release_all();
+   const char *arg;
+   if( vg_long_opt( "release-all", NULL ) )
+      s_release_all();
 
-      if( vg_long_opt( "testing-build", NULL ) )
-         s_testing_build();
+   if( vg_long_opt( "testing-build", NULL ) )
+      s_testing_build();
 
-      if( vg_long_opt( "utest", NULL ) )
-         s_utest_build();
+   if( vg_long_opt( "utest", NULL ) )
+      s_utest_build();
 
-      if( vg_long_opt( "testing-server", NULL ) )
-         s_testing_server();
+   if( vg_long_opt( "testing-server", NULL ) )
+      s_testing_server();
 
-      if( vg_long_opt( "queuetest", NULL ) )
-         s_queuetest_build();
+   if( vg_long_opt( "queuetest", NULL ) )
+      s_queuetest_build();
 
-      if( vg_long_opt( "tools", NULL ) )
-         s_compile_tools();
+   if( vg_long_opt( "tools", NULL ) )
+      s_compile_tools();
 
-      if( vg_opt('r', NULL) )
-         vg_test_env.optimization = 3;
+   if( vg_opt('r', NULL) )
+      vg_test_env.optimization = 3;
 
-      if( vg_long_opt( "no-asan", NULL ) )
-         vg_test_env.debug_asan = 0;
+   if( vg_long_opt( "no-asan", NULL ) )
+      vg_test_env.debug_asan = 0;
 
-      if( (arg = vg_long_opt_arg( "strdjb2", NULL )) )
-         printf( "vg_strdjb2('%s'): %u\n", arg, vg_strdjb2(arg) );
-   }
+   if( (arg = vg_long_opt_arg( "strdjb2", NULL )) )
+      printf( "vg_strdjb2('%s'): %u\n", arg, vg_strdjb2(arg) );
+
+   if( !_vg_opt_check() )
+      return 0;
 
    vg_success( "All scripts completed\n" );
 }
index 6d0dbd903e481bea49b6d431d2f018dc456db920..b8cbacc74c0dd7206de3fafa8bec39f3de701c3d 100644 (file)
@@ -14,76 +14,6 @@ const char* __asan_default_options() { return "detect_leaks=0"; }
 struct game_client g_client = 
 {
    .demo_mode = 1,
-   .unreadyness = 2  /* once for client, once for world switcher */
 };
 
-void async_client_ready( void *userdata )
-{
-   THREAD_0;
-
-   g_client.unreadyness --;
-
-   if( network_client.auto_connect )
-      network_client.user_intent = k_server_intent_online;
-
-   menu_at_begin();
-}
-
-void vg_load(void)
-{
-   THREAD_1;
-
-   //vg_audio.always_keep_compressed = 1;
-   vg_loader_step( render_init, NULL );
-   game_load();
-}
-
-void vg_preload(void)
-{
-   /* please forgive me! */
-   u32 sz; char *drm;
-   if( (drm = vg_file_read_text( vg_mem.scratch, "DRM", &sz )) )
-      if( !strcmp(drm, "blibby!") )
-         g_client.demo_mode = 0;
-
-   vg_loader_step( remote_players_init, NULL );
-
-   if( !g_client.nosteam )
-   {
-      steam_init();
-      vg_loader_step( NULL, steam_end );
-   }
-
-   vg_loader_step( network_init, network_end );
-}
-
-void vg_launch_opt(void)
-{
-   const char *arg; //
-
-   if( vg_long_opt( "noauth", "Disable server authentication" ) )
-      network_client.auth_mode = eServerModeNoAuthentication;
-
-   if( (arg = vg_long_opt_arg( "server", "Specify server address" )) )
-      network_set_host( arg, NULL );
-
-   if( vg_long_opt( "demo", "Turn demo mode on" ) )
-      g_client.demo_mode = 1;
-
-   if( vg_long_opt( "nosteam", "Disable steam integration (offline)" ) )
-      g_client.nosteam = 1;
-
-   game_launch_opt();
-}
-
-int main( int argc, char *argv[] )
-{
-   vg_log_init();
-   network_set_host( "skaterift.com", NULL );
-   vg_mem.use_libc_malloc = 0;
-   vg_set_mem_quota( 200*1024*1024 );
-   vg_enter( argc, argv, "Voyager Game Engine" ); 
-   return 0;
-}
-
 #include "skaterift.c"
index 5b0b24ac96eaf1f6b07cdbe4390373613f910358..ab7c9805286f8f93ca1deb7011ce6c72c97248a4 100644 (file)
 struct game_client
 {
    bool demo_mode, nosteam;
-   u32 unreadyness;
 }
 extern g_client;
 
 /* game defined */
 void game_launch_opt( void );
-void game_load( void );
index 77c82f00d5289dc9f86226db34acc2573f4d701e..d36cca830bb697a35ed9450711216130cfe40530 100644 (file)
@@ -16,7 +16,8 @@ struct global_menu menu = { .skip_starter = 0 };
 
 void menu_at_begin(void)
 {
-   if( menu.skip_starter ) return;
+   if( menu.skip_starter ) 
+      return;
 
    skaterift.activity = k_skaterift_menu;
    menu.page = k_menu_page_starter;
index 2138e79e71ac319c43d0ee84f937a9144664d499..0f5b6c74d9b5ec617dfb65b00815ae5856681b33 100644 (file)
@@ -166,7 +166,7 @@ void player_board_load( player_board *board, const char *path, void *arena )
 
 void player_board_unload( struct player_board *board )
 {
-   VG_ASSERT( vg_thread_purpose() == k_thread_purpose_main );
+   THREAD_0;
    mdl_sync_std_unload( &board->mdl );
 }
 
@@ -211,7 +211,7 @@ void player_model_load( player_model *pm, const char *path, void *arena )
 
 void player_model_unload( player_model *pm )
 {
-   VG_ASSERT( vg_thread_purpose() == k_thread_purpose_main );
+   THREAD_0;
    mdl_sync_std_unload( &pm->mdl );
 }
 
index 32398b6b5c8384f322e7bc448cb6579ed974208a..eb7ff717e2e0a2b92b83be9538471baec7d9bf82 100644 (file)
@@ -61,13 +61,6 @@ struct skaterift_globals skaterift =
    .time_rate = 1.0f,
 };
 
-void game_launch_opt(void)
-{
-   const char *arg;
-   if( (arg = vg_long_opt_arg( "world", "Specify path to world to load" )) )
-      skaterift.override_load_world = arg;
-}
-
 static void skaterift_load_player_content(void)
 {
    particle_alloc( &particles_grind, 300 );
@@ -80,109 +73,119 @@ static void skaterift_load_player_content(void)
    player_board_load( &localplayer.fallback_board, "models/board_none.mdl", vg_mem.rtmemory );
 }
 
-static void game_load_0(void *_);
-static void game_load_1(void *_);
-static void game_load_2(void *_);
-static void game_load_3(void *_);
-static void game_load_4( vg_async_task *task );
-void game_load(void) { THREAD_1; game_load_0(NULL); }
-
-static void game_load_0(void *_)
+static void game_load_co( vg_coroutine *co )
 {
-   THREAD_1;
-
-   _skaterift_script_init();
-
-   vg_loader_set_user_information( "Initializing subsystems" );
-   vg_console_reg_cmd( "load_world", skaterift_load_world_command, NULL );
-   vg_console_reg_var( "immobile", &localplayer.immobile, k_var_dtype_i32, 0 );
-   vg_console_reg_var( "allow_resume", &skaterift.allow_replay_resume, k_var_dtype_i32, VG_VAR_CHEAT );
-   vg_loader_step( menu_init, NULL );
-   vg_loader_step( control_overlay_init, NULL );
-   vg_loader_step( world_init, NULL );
-   vg_loader_step( vehicle_init, NULL );
-   vg_loader_step( gui_init, NULL );
-   vg_loader_step( compass_init, NULL );
-
-   vg_loader_step( player_init, NULL );
-   vg_loader_step( player_ragdoll_init, NULL );
-   vg_loader_step( cutscene_init, NULL );
-
-   /* content stuff */
-   vg_loader_step( addon_system_init, NULL );
-   vg_loader_step( workshop_init, NULL );
-   vg_loader_step( skateshop_init, NULL );
-   vg_loader_step( world_map_init, NULL );
-   vg_loader_step( ent_tornado_init, NULL );
-   vg_loader_step( skaterift_replay_init, NULL );
-   vg_loader_step( skaterift_load_player_content, NULL );
-   vg_loader_step( _replay2_init, NULL );
-
-   vg_loader_set_user_information( "Compiling shaders" );
-   vg_bake_shaders();
-
-   vg_loader_set_user_information( "Loading content files" );
-   vg_loader_step( audio_init, NULL );
-
-   _world.default_hub_addon = _addon_mount_from_folder( "maps/dev_hub", k_addon_type_world, ".mdl" );
-   VG_ASSERT( _world.default_hub_addon );
-
-   vg_console_load_autos();
-   vg_loader_set_user_information( "Mounting addons" );
-   _addon_mount_content_folder( k_addon_type_player, "playermodels", ".mdl" );
-   _addon_mount_content_folder( k_addon_type_board, "boards", ".mdl" );
-   _addon_mount_content_folder( k_addon_type_world, "maps", ".mdl" );
-   vg_async_call( &vg.main_tasks, game_load_1, NULL );
-}
+   if( co_begin( co ) )
+   {
+      co_thread( co, 0, &vg.main_tasks );
+      co_thread( co, 1, &vg.loader_tasks );
+   }
 
-static void game_load_1(void *_)
-{
-   THREAD_0;
-   _mount_workshop_addons( NULL );
-   vg_async_call( &vg.loader_tasks, game_load_2, NULL );
-}
+   if( co_step( co, 1 ) )
+   {
+      vg_loader_step( render_init, NULL );
 
-static void game_load_2(void *_)
-{
-   THREAD_1;
+      /* please forgive me! */
+      u32 sz; char *drm;
+      if( (drm = vg_file_read_text( vg_mem.scratch, "DRM", &sz )) )
+         if( !strcmp(drm, "blibby!") )
+            g_client.demo_mode = 0;
 
-   /* initializing / loading world. */
-   vg_loader_set_user_information( "Loading savedata" );
-   skaterift_load_mainsave();
+      vg_loader_step( remote_players_init, NULL );
 
-   if( skaterift.override_load_world )
-      _world.load_addon = _addon_mount_from_folder( skaterift.override_load_world, k_addon_type_world, ".mdl" );
+      if( !g_client.nosteam )
+      {
+         steam_init();
+         vg_loader_step( NULL, steam_end );
+      }
 
-   _world.loader_instance = &_world.main;
-   _world.loader_preview_mode = 0;
-   _world.loader_heap = _world.heap; 
+      vg_loader_step( network_init, network_end );
+
+      _skaterift_script_init();
+      vg_loader_set_user_information( "Initializing subsystems" );
+      vg_console_reg_cmd( "load_world", skaterift_load_world_command, NULL );
+      vg_console_reg_var( "immobile", &localplayer.immobile, k_var_dtype_i32, 0 );
+      vg_console_reg_var( "allow_resume", &skaterift.allow_replay_resume, k_var_dtype_i32, VG_VAR_CHEAT );
+      vg_loader_step( menu_init, NULL );
+      vg_loader_step( control_overlay_init, NULL );
+      vg_loader_step( world_init, NULL );
+      vg_loader_step( vehicle_init, NULL );
+      vg_loader_step( gui_init, NULL );
+      vg_loader_step( compass_init, NULL );
+
+      vg_loader_step( player_init, NULL );
+      vg_loader_step( player_ragdoll_init, NULL );
+      vg_loader_step( cutscene_init, NULL );
+
+      /* content stuff */
+      vg_loader_step( addon_system_init, NULL );
+      vg_loader_step( workshop_init, NULL );
+      vg_loader_step( skateshop_init, NULL );
+      vg_loader_step( world_map_init, NULL );
+      vg_loader_step( ent_tornado_init, NULL );
+      vg_loader_step( skaterift_replay_init, NULL );
+      vg_loader_step( skaterift_load_player_content, NULL );
+      vg_loader_step( _replay2_init, NULL );
+
+      vg_loader_set_user_information( "Compiling shaders" );
+      vg_bake_shaders();
+
+      vg_loader_set_user_information( "Loading content files" );
+      vg_loader_step( audio_init, NULL );
+
+      _world.default_hub_addon = _addon_mount_from_folder( "maps/dev_hub", k_addon_type_world, ".mdl" );
+      VG_ASSERT( _world.default_hub_addon );
+
+      vg_console_load_autos();
+      vg_loader_set_user_information( "Mounting addons" );
+      _addon_mount_content_folder( k_addon_type_player, "playermodels", ".mdl" );
+      _addon_mount_content_folder( k_addon_type_board, "boards", ".mdl" );
+      _addon_mount_content_folder( k_addon_type_world, "maps", ".mdl" );
+   }
 
-   if( !_world.load_addon )
+   if( co_step( co, 0 ) )
    {
-      vg_warn( "Falling back to default hub world...\n" );
-      _world.load_addon = _world.default_hub_addon;
+      _mount_workshop_addons( NULL );
    }
 
-   _world_loader_set_addon( _world.load_addon );
-   vg_async_call( &vg.main_tasks, game_load_3, NULL );
-}
+   if( co_step( co, 1 ) )
+   {
+      /* initializing / loading world. */
+      vg_loader_set_user_information( "Loading savedata" );
+      skaterift_load_mainsave();
 
-static void game_load_3(void *_)
-{
-   THREAD_0;
-   vg_async_task *task = world_load_go();
-   vg_async_task_dispatch( task, game_load_4 );
-}
+      if( skaterift.override_load_world )
+         _world.load_addon = _addon_mount_from_folder( skaterift.override_load_world, k_addon_type_world, ".mdl" );
 
-static void game_load_4( vg_async_task *task )
-{
-   THREAD_1;
-   skaterift_world_load_t1( task );
+      _world.loader_instance = &_world.main;
+      _world.loader_preview_mode = 0;
+      _world.loader_heap = _world.heap; 
+
+      if( !_world.load_addon )
+      {
+         vg_warn( "Falling back to default hub world...\n" );
+         _world.load_addon = _world.default_hub_addon;
+      }
 
-   /* add autosave function to exit list */
-   vg_loader_step( NULL, skaterift_autosave_synchronous );
-   vg_async_call( &vg.main_tasks, async_client_ready, NULL );
-   _vg_load_temp_end();
+      _world_loader_set_addon( _world.load_addon );
+   }
+
+   if( co_step( co, 0 ) )
+   {
+      _world.loader_state = k_world_loader_ready;
+
+      if( network_client.auto_connect )
+         network_client.user_intent = k_server_intent_online;
+      menu_at_begin();
+   }
+
+   if( co_step( co, 1 ) )
+   {
+      vg_loader_step( NULL, skaterift_autosave_synchronous );
+      _vg_tower_set_flag( vg.sig_client, 1 );
+   }
+
+   co_end( co );
 }
 
 /* 
@@ -199,12 +202,15 @@ void skaterift_change_client_world_preupdate(void);
 
 void vg_pre_update(void)
 {
+   if( !_vg_tower_clearence( _vg_tower_mask(vg.sig_engine)|_vg_tower_mask(vg.sig_client) ) )
+      return;
+
    skaterift_preupdate_inputs();
 
    steam_update();
    world_switcher_update();
 
-   if( g_client.unreadyness ) 
+   if( !_vg_tower_clearence( skaterift.full_ready_mask ) )
       return;
 
    //draw_origin_axis();
@@ -249,7 +255,7 @@ void vg_pre_update(void)
 
 void vg_fixed_update(void)
 {
-   if( g_client.unreadyness ) 
+   if( !_vg_tower_clearence( skaterift.full_ready_mask ) )
       return;
 
    world_routes_fixedupdate( &_world.main );
@@ -259,7 +265,7 @@ void vg_fixed_update(void)
 
 void vg_post_update(void)
 {
-   if( g_client.unreadyness ) 
+   if( !_vg_tower_clearence( skaterift.full_ready_mask ) )
       return;
 
    player__post_update();
@@ -339,7 +345,7 @@ static void skaterift_composite_maincamera(void)
    else
    {
       _world.entity_camera_modulate = vg_maxf( 0.0f, _world.entity_camera_modulate-vg.time_frame_delta );
-}
+   }
    
    vg_camera_lerp( &localplayer.cam, &_world.entity_driven_camera,
                    vg_smoothstepf(_world.entity_camera_modulate), &g_render.cam );
@@ -510,7 +516,7 @@ static void render_main_game(void)
 
 void vg_render(void)
 {
-   if( g_client.unreadyness )
+   if( !_vg_tower_clearence( skaterift.full_ready_mask ) )
    {
       vg_loader_render();
       return;
@@ -541,7 +547,7 @@ void vg_render(void)
 
 void vg_gui( ui_context *ctx )
 {
-   if( g_client.unreadyness ) 
+   if( !_vg_tower_clearence( skaterift.full_ready_mask ) )
       return;
 
    glBindFramebuffer( GL_FRAMEBUFFER, 0 );
@@ -650,3 +656,44 @@ void vg_framebuffer_resize( int w, int h )
 
 //TODO
 //#include "vg/submodules/hashmap.c/hashmap.c"
+
+static void _handle_vg_signal( vg_signal_id id, bool state )
+{
+   if( (id == vg.sig_engine) && state )
+   {
+      //vg_audio.always_keep_compressed = 1;
+      co_run( game_load_co, NULL );
+   }
+}
+
+int main( int argc, const char *argv[] )
+{
+   vg_init( argc, argv, "Voyager Game Engine" );
+
+   const char *arg;
+   if( vg_long_opt( "noauth", "Disable server authentication" ) )
+      network_client.auth_mode = eServerModeNoAuthentication;
+
+   if( (arg = vg_long_opt_arg( "server", "Specify server address" )) )
+      network_set_host( arg, NULL );
+
+   if( vg_long_opt( "demo", "Turn demo mode on" ) )
+      g_client.demo_mode = 1;
+
+   if( vg_long_opt( "nosteam", "Disable steam integration (offline)" ) )
+      g_client.nosteam = 1;
+
+   if( (arg = vg_long_opt_arg( "world", "Specify path to world to load" )) )
+      skaterift.override_load_world = arg;
+
+   network_set_host( "skaterift.com", NULL );
+   vg_mem.use_libc_malloc = 0;
+   vg_set_mem_quota( 200*1024*1024 );
+   skaterift.sig_world = _vg_tower_create_signal( "World Loaded" );
+   skaterift.full_ready_mask = _vg_tower_mask( skaterift.sig_world ) | 
+                               _vg_tower_mask( vg.sig_engine ) | 
+                               _vg_tower_mask( vg.sig_client );
+   _vg_tower_register_trigger( _vg_tower_mask( vg.sig_engine ), _handle_vg_signal );
+   vg_run();
+   return 0;
+}
index f7d7ddc96155d77e40b16d081ce93abc96cb4551..f54c994a5a525efcdd5c95e5b3caeb1c33c9ea22 100644 (file)
@@ -2,6 +2,8 @@
 #define SKATERIFT
 #define SKATERIFT_APPID 2103940
 
+#define SKATERIFT_WORLD_READY 0x10000
+
 #include "vg/vg_engine.h"
 #include "vg/vg_camera.h"
 
@@ -29,6 +31,8 @@ struct skaterift_globals
    u32 achievements;
    int demo_mode;
    i32 allow_replay_resume;
+   vg_signal_id sig_world;
+   u64 full_ready_mask;
 
    const char *override_load_world;
 }
index c23357dc9d0f6aa69c3c9df66e5a8660caa2e489..24bb911468ae2cf0923ff157a582de7dc3617286 100644 (file)
@@ -379,7 +379,7 @@ void async_worldsave_go( vg_async_task *task )
    network_send_item( k_netmsg_playeritem_world0 );
    _world.loader_state = k_world_loader_done;
    _world.load_addon = 0;
-   g_client.unreadyness --;
+   _vg_tower_set_flag( skaterift.sig_world, 1 );
 }
 
 void load_world_savedata_t1( void *userdata )
@@ -394,19 +394,6 @@ void load_world_savedata_t1( void *userdata )
    vg_async_task_dispatch( task, async_worldsave_go );
 }
 
-vg_async_task *world_load_go(void)
-{
-   THREAD_0;
-   _world.loader_state = k_world_loader_loading;
-   vg_linear_clear( _world.loader_heap );
-   vg_async_task *task = vg_allocate_async_task( &vg.loader_tasks, sizeof(struct world_load_info), 1 );
-   struct world_load_info *info = (void *)task->data;
-   vg_str folder_str;
-   vg_strnull( &folder_str, info->path, sizeof(info->path) );
-   info->OK = addon_get_content_folder( _world.load_addon, &folder_str );
-   return task;
-}
-
 void world_switcher_update(void)
 {
    if( !_world.load_addon )
@@ -433,7 +420,13 @@ void world_switcher_update(void)
 
    if( _world.loader_state == k_world_loader_ready )
    {
-      vg_async_task *task = world_load_go();
+      _world.loader_state = k_world_loader_loading;
+      vg_linear_clear( _world.loader_heap );
+      vg_async_task *task = vg_allocate_async_task( &vg.loader_tasks, sizeof(struct world_load_info), 1 );
+      struct world_load_info *info = (void *)task->data;
+      vg_str folder_str;
+      vg_strnull( &folder_str, info->path, sizeof(info->path) );
+      info->OK = addon_get_content_folder( _world.load_addon, &folder_str );
       vg_async_task_dispatch( task, skaterift_world_load_t1 );
    }
 
@@ -454,7 +447,7 @@ void world_switcher_update(void)
 
 void skaterift_load_world_start( addon_id addon_id, bool preview )
 {
-   if( g_client.unreadyness )
+   if( !_vg_tower_clearence( skaterift.full_ready_mask ) )
    {
       vg_error( "Cannot start changeworld while client is not ready?\n" );
       return;
@@ -484,7 +477,7 @@ void skaterift_load_world_start( addon_id addon_id, bool preview )
       if( addon_id != world->addon_id )
          _world.previous_world_addon = _world.main.addon_id;
 
-      g_client.unreadyness ++;
+      _vg_tower_set_flag( skaterift.sig_world, 0 );
       _world.loader_state = k_world_loader_saving_current;
       _world.event = k_world_event_none;
       vg_loader_set_user_information( "Saving current world" );