--- /dev/null
+#include "vg/vg_opt.h"
+#include "vg/vg_loader.h"
+#include "vg/vg_io.h"
+#include "vg/vg_audio.h"
+#include "vg/vg_async.h"
+
+#include "client.h"
+#include "render.h"
+#include "network.h"
+#include "player_remote.h"
+#include "menu.h"
+
+struct game_client g_client =
+{
+ .demo_mode = 1
+};
+
+static void async_client_ready( void *payload, u32 size )
+{
+ g_client.loaded = 1;
+
+ if( network_client.auto_connect )
+ network_client.user_intent = k_server_intent_online;
+
+ menu_at_begin();
+}
+
+void vg_load(void)
+{
+ vg_audio.always_keep_compressed = 1;
+ vg_loader_step( render_init, NULL );
+
+ game_load();
+
+ vg_async_call( async_client_ready, NULL, 0 );
+}
+
+void vg_preload(void)
+{
+vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" );
+vg_info(" 2021-2024 |\\ /| | / | | | | /| \n" );
+vg_info(" | \\ / | +-- / +----- +---' | / | \n" );
+vg_info(" | \\ / | | / | | \\ | / | \n" );
+vg_info(" | \\/ | | / | | \\ | / | \n" );
+vg_info(" ' ' '--' [] '----- '----- ' ' '---' "
+ "SOFTWARE\n" );
+
+ /* 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 );
+
+ 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" ) )
+ network_client.auth_mode = eServerModeNoAuthentication;
+
+ if( (arg = vg_long_opt_arg( "server" )) )
+ network_set_host( arg, NULL );
+
+ if( vg_long_opt( "demo" ) )
+ g_client.demo_mode = 1;
+
+ game_launch_opt();
+}
+
+int main( int argc, char *argv[] )
+{
+ network_set_host( "skaterift.com", NULL );
+ vg_mem.use_libc_malloc = 0;
+ vg_set_mem_quota( 160*1024*1024 );
+ vg_enter( argc, argv, "Voyager Game Engine" );
+ return 0;
+}
+
+#ifdef SKATERIFT
+#include "skaterift.c"
+#endif
+
+#ifdef HGATE
+#include "hgate.c"
+#endif