From 523cd61216b9c5cfe9214400b5de34d6e117e6ae Mon Sep 17 00:00:00 2001 From: hgn Date: Mon, 11 Aug 2025 20:38:38 +0000 Subject: [PATCH] migration to vg4 (BROKEN) --- .gitignore | 1 + build.c | 367 ++--- build.sh | 2 +- .../boards/skaterift_fract/addon.inf | Bin 73 -> 0 bytes .../boards/skaterift_fract/addon.kv | 7 + .../boards/skaterift_licco/addon.inf | Bin 71 -> 0 bytes .../boards/skaterift_licco/addon.kv | 7 + .../boards/skaterift_long/addon.inf | Bin 75 -> 0 bytes .../boards/skaterift_long/addon.kv | 7 + .../boards/skaterift_shark/addon.inf | Bin 71 -> 0 bytes .../boards/skaterift_shark/addon.kv | 7 + .../boards/skaterift_spiral/addon.inf | Bin 71 -> 0 bytes .../boards/skaterift_spiral/addon.kv | 7 + .../boards/skaterift_striped/addon.inf | Bin 73 -> 0 bytes .../boards/skaterift_striped/addon.kv | 7 + .../maps/dev_flatworld/addon.inf | Bin 86 -> 0 bytes content_skaterift/maps/dev_flatworld/addon.kv | 10 + content_skaterift/maps/dev_heaven/addon.inf | Bin 82 -> 0 bytes content_skaterift/maps/dev_heaven/addon.kv | 10 + content_skaterift/maps/dev_hub/addon.inf | Bin 89 -> 0 bytes content_skaterift/maps/dev_hub/addon.kv | 10 + content_skaterift/maps/dev_tutorial/addon.inf | Bin 91 -> 0 bytes content_skaterift/maps/dev_tutorial/addon.kv | 10 + content_skaterift/maps/mp_line1/addon.inf | Bin 82 -> 0 bytes content_skaterift/maps/mp_line1/addon.kv | 10 + content_skaterift/maps/mp_mtzero/addon.inf | Bin 90 -> 0 bytes content_skaterift/maps/mp_mtzero/addon.kv | 10 + content_skaterift/maps/mp_spawn/addon.inf | Bin 84 -> 0 bytes content_skaterift/maps/mp_spawn/addon.kv | 10 + content_skaterift/maps/vm/addon.inf | Bin 80 -> 0 bytes content_skaterift/maps/vm/addon.kv | 10 + .../playermodels/skaterift_aaron/addon.inf | Bin 74 -> 0 bytes .../playermodels/skaterift_aaron/addon.kv | 7 + .../playermodels/skaterift_amin/addon.inf | Bin 72 -> 0 bytes .../playermodels/skaterift_amin/addon.kv | 7 + .../playermodels/skaterift_chip/addon.inf | Bin 83 -> 0 bytes .../playermodels/skaterift_chip/addon.kv | 8 + .../playermodels/skaterift_ela/addon.inf | Bin 70 -> 0 bytes .../playermodels/skaterift_ela/addon.kv | 7 + .../playermodels/skaterift_fbi/addon.inf | Bin 81 -> 0 bytes .../playermodels/skaterift_fbi/addon.kv | 8 + .../playermodels/skaterift_fbi2/addon.inf | Bin 83 -> 0 bytes .../playermodels/skaterift_fbi2/addon.kv | 8 + .../playermodels/skaterift_j/addon.inf | Bin 66 -> 0 bytes .../playermodels/skaterift_jesus/addon.inf | Bin 85 -> 0 bytes .../playermodels/skaterift_jesus/addon.kv | 8 + .../playermodels/skaterift_john/addon.inf | Bin 81 -> 0 bytes .../playermodels/skaterift_john/addon.kv | 8 + .../playermodels/skaterift_jordan/addon.inf | Bin 76 -> 0 bytes .../playermodels/skaterift_jordan/addon.kv | 7 + .../playermodels/skaterift_new/addon.inf | Bin 75 -> 0 bytes .../playermodels/skaterift_new/addon.kv | 7 + .../playermodels/skaterift_outlaw/addon.inf | Bin 76 -> 0 bytes .../playermodels/skaterift_outlaw/addon.kv | 7 + .../skaterift_president/addon.inf | Bin 93 -> 0 bytes .../playermodels/skaterift_president/addon.kv | 8 + .../playermodels/skaterift_pro/addon.inf | Bin 70 -> 0 bytes .../playermodels/skaterift_pro/addon.kv | 7 + content_skaterift/playermodels/sr2t/addon.inf | Bin 74 -> 0 bytes content_skaterift/playermodels/sr2t/addon.kv | 7 + control_overlay.h.c0 | 111 -- shaders/common_scene.glsl | 3 +- src/addon.c | 350 ++--- src/addon.h | 22 +- src/addon_types.c | 4 - src/addon_types.h | 5 +- src/array_file.c | 131 +- src/array_file.h | 34 +- src/audio.c | 83 +- src/audio.h | 19 +- src/board_maker.c | 206 ++- src/board_maker.h | 14 +- src/build_control_overlay.c | 25 - src/client.c | 520 ++++++- src/client.h | 53 +- src/common.h | 8 - src/compass.c | 85 +- src/compass.h | 15 +- src/control_overlay.c | 56 +- src/control_overlay.h | 18 +- src/cutscene.c | 978 +++++++++++++ src/cutscene.h | 111 ++ src/demo_check.c | 47 + src/demo_check.h | 15 + src/depth_compare.h | 11 +- src/ent_atom.c | 29 +- src/ent_atom.h | 8 +- src/ent_camera.c | 2 - src/ent_camera.h | 6 +- src/ent_challenge.c | 37 +- src/ent_challenge.h | 9 +- src/ent_cutscene.c | 6 +- src/ent_cutscene.h | 6 +- src/ent_glider.c | 8 +- src/ent_glider.h | 8 +- src/ent_list.c | 6 +- src/ent_list.h | 6 +- src/ent_npc.c | 98 +- src/ent_npc.h | 9 +- src/ent_objective.c | 17 +- src/ent_objective.h | 9 +- src/ent_prop.c | 2 - src/ent_prop.h | 8 +- src/ent_region.c | 13 +- src/ent_region.h | 8 +- src/ent_relay.c | 1 - src/ent_relay.h | 6 +- src/ent_route.c | 55 +- src/ent_route.h | 7 +- src/ent_script.c | 4 +- src/ent_script.h | 6 +- src/ent_skateshop.c | 124 +- src/ent_skateshop.h | 15 +- src/ent_tornado.c | 14 +- src/ent_tornado.h | 8 +- src/ent_traffic.c | 2 - src/ent_traffic.h | 6 +- src/entity.c | 16 - src/entity.h | 10 +- src/font.c | 252 ++++ src/font.h | 278 +--- src/freecam.c | 40 - src/freecam.h | 3 - src/gameserver.c | 2 +- src/gameserver.h | 15 +- src/gameserver_database.c | 18 +- src/gameserver_monitor.c | 8 +- src/gameserver_replay.c | 6 +- src/gameserver_requests.c | 14 +- src/gui.c | 340 +++++ src/gui.h | 384 +---- src/input.c | 290 ++++ src/input.h | 301 +--- src/menu.c | 101 +- src/menu.h | 18 +- src/metascene.c | 1283 +++++------------ src/metascene.h | 169 +-- src/model.c | 779 +++++----- src/model.h | 239 +-- src/network.c | 250 ++-- src/network.h | 32 +- src/network_common.h | 10 +- src/network_compression.h | 10 +- src/network_msg.h | 13 +- src/network_requests.c | 38 +- src/network_requests.h | 13 +- src/particle.c | 85 +- src/particle.h | 17 +- src/physics_test.h | 290 ---- src/player.c | 57 +- src/player.h | 56 +- src/player_api.h | 49 +- src/player_basic_info.c | 3 - src/player_basic_info.h | 7 +- src/player_common.c | 6 - src/player_common.h | 8 +- src/player_dead.c | 35 +- src/player_dead.h | 11 +- src/player_drive.c | 87 -- src/player_drive.h | 21 - src/player_effects.c | 5 - src/player_effects.h | 8 +- src/player_glide.c | 166 +-- src/player_glide.h | 27 +- src/player_model.h | 10 - src/player_ragdoll.c | 190 ++- src/player_ragdoll.h | 34 +- src/player_remote.c | 45 +- src/player_remote.h | 26 +- src/player_render.c | 302 ++-- src/player_render.h | 27 +- src/player_skate.c | 123 +- src/player_skate.h | 23 +- src/player_walk.c | 31 +- src/player_walk.h | 17 +- src/render.c | 135 +- src/render.h | 27 +- src/replay2.c | 336 +++-- src/replay2.h | 112 +- src/save.c | 39 +- src/save.h | 12 +- src/save2.c | 178 +++ src/save2.h | 7 + src/scene.c | 344 ++--- src/scene.h | 72 +- src/scene_rigidbody.c | 245 ++++ src/scene_rigidbody.h | 255 +--- src/scripts/board_maker.c | 4 +- src/scripts/boost.c | 2 +- src/scripts/explode.c | 2 +- src/scripts/generic.c | 12 +- src/scripts/l1_speed.c | 2 +- src/scripts/tutorial_island.c | 4 +- src/serialized_replay.h | 2 - src/shader_props.h | 94 +- src/skaterift.c | 721 --------- src/skaterift.h | 42 - src/skaterift.hconf | 121 ++ src/skaterift_script.c | 521 ------- src/skaterift_script.h | 21 - src/skeleton.h | 531 ------- src/traffic.h | 222 --- src/trail.c | 61 +- src/trail.h | 11 +- src/unit_skaterift.c | 8 + src/user_profile.c | 116 +- src/user_profile.h | 9 +- src/utest.c | 4 +- src/vehicle.c | 4 - src/vehicle.h | 10 +- src/workshop.c | 238 +-- src/workshop.h | 13 +- src/world.c | 36 +- src/world.h | 102 +- src/world_audio.c | 31 +- src/world_audio.h | 8 +- src/world_entity.c | 177 +-- src/world_entity.h | 16 +- src/world_gate.c | 100 +- src/world_gate.h | 27 +- src/world_gen.c | 355 ++--- src/world_gen.h | 16 +- src/world_info.h | 11 +- src/world_load.c | 268 ++-- src/world_load.h | 18 +- src/world_map.c | 83 +- src/world_map.h | 15 +- src/world_physics.c | 28 +- src/world_physics.h | 36 +- src/world_render.c | 424 +++--- src/world_render.h | 115 +- src/world_routes.c | 261 ++-- src/world_routes.h | 19 +- src/world_routes_ui.c | 9 +- src/world_routes_ui.h | 7 +- src/world_sfd.c | 84 +- src/world_sfd.h | 18 +- src/world_volumes.c | 16 +- src/world_volumes.h | 8 +- src/world_water.c | 90 +- src/world_water.h | 19 +- 241 files changed, 7970 insertions(+), 9725 deletions(-) delete mode 100644 content_skaterift/boards/skaterift_fract/addon.inf create mode 100644 content_skaterift/boards/skaterift_fract/addon.kv delete mode 100644 content_skaterift/boards/skaterift_licco/addon.inf create mode 100644 content_skaterift/boards/skaterift_licco/addon.kv delete mode 100644 content_skaterift/boards/skaterift_long/addon.inf create mode 100644 content_skaterift/boards/skaterift_long/addon.kv delete mode 100644 content_skaterift/boards/skaterift_shark/addon.inf create mode 100644 content_skaterift/boards/skaterift_shark/addon.kv delete mode 100644 content_skaterift/boards/skaterift_spiral/addon.inf create mode 100644 content_skaterift/boards/skaterift_spiral/addon.kv delete mode 100644 content_skaterift/boards/skaterift_striped/addon.inf create mode 100644 content_skaterift/boards/skaterift_striped/addon.kv delete mode 100644 content_skaterift/maps/dev_flatworld/addon.inf create mode 100644 content_skaterift/maps/dev_flatworld/addon.kv delete mode 100644 content_skaterift/maps/dev_heaven/addon.inf create mode 100644 content_skaterift/maps/dev_heaven/addon.kv delete mode 100644 content_skaterift/maps/dev_hub/addon.inf create mode 100644 content_skaterift/maps/dev_hub/addon.kv delete mode 100644 content_skaterift/maps/dev_tutorial/addon.inf create mode 100644 content_skaterift/maps/dev_tutorial/addon.kv delete mode 100644 content_skaterift/maps/mp_line1/addon.inf create mode 100644 content_skaterift/maps/mp_line1/addon.kv delete mode 100644 content_skaterift/maps/mp_mtzero/addon.inf create mode 100644 content_skaterift/maps/mp_mtzero/addon.kv delete mode 100644 content_skaterift/maps/mp_spawn/addon.inf create mode 100644 content_skaterift/maps/mp_spawn/addon.kv delete mode 100644 content_skaterift/maps/vm/addon.inf create mode 100644 content_skaterift/maps/vm/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_aaron/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_aaron/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_amin/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_amin/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_chip/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_chip/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_ela/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_ela/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_fbi/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_fbi/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_fbi2/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_fbi2/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_j/addon.inf delete mode 100644 content_skaterift/playermodels/skaterift_jesus/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_jesus/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_john/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_john/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_jordan/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_jordan/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_new/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_new/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_outlaw/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_outlaw/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_president/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_president/addon.kv delete mode 100644 content_skaterift/playermodels/skaterift_pro/addon.inf create mode 100644 content_skaterift/playermodels/skaterift_pro/addon.kv delete mode 100644 content_skaterift/playermodels/sr2t/addon.inf create mode 100644 content_skaterift/playermodels/sr2t/addon.kv delete mode 100644 control_overlay.h.c0 delete mode 100644 src/build_control_overlay.c delete mode 100644 src/common.h create mode 100644 src/cutscene.c create mode 100644 src/cutscene.h create mode 100644 src/demo_check.c create mode 100644 src/demo_check.h create mode 100644 src/font.c delete mode 100644 src/freecam.c delete mode 100644 src/freecam.h create mode 100644 src/gui.c create mode 100644 src/input.c delete mode 100644 src/physics_test.h delete mode 100644 src/player_drive.c delete mode 100644 src/player_drive.h delete mode 100644 src/player_model.h create mode 100644 src/save2.c create mode 100644 src/save2.h create mode 100644 src/scene_rigidbody.c delete mode 100644 src/serialized_replay.h delete mode 100644 src/skaterift.h create mode 100644 src/skaterift.hconf delete mode 100644 src/skaterift_script.c delete mode 100644 src/skaterift_script.h delete mode 100644 src/skeleton.h delete mode 100644 src/traffic.h create mode 100644 src/unit_skaterift.c diff --git a/.gitignore b/.gitignore index 7a84ac1..a0eb0b8 100755 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ dist/ models_src/boards/workshop ccflags/png icons/png +src.generated/ # auto generated code shaders/*.h diff --git a/build.c b/build.c index bedb1e0..a5150c3 100644 --- a/build.c +++ b/build.c @@ -1,231 +1,114 @@ -#include "vg/vg_tool.h" -#include "vg/vg_platform.h" -#include "vg/vg_log.h" -#include "vg/vg_opt.h" -#include "vg/vg_build.h" -#include "vg/vg_mem_pool.h" -#include "vg/vg_build_utils_shader.h" -#include "vg/vg_msg.h" -#include "src/addon_types.h" +#define VG_BUILD_TOOLS +#define VG_MATH +#define VG_MSG_TO_KVS +#include "vg/vg.hconf" -#include "vg/vg_m.h" -#include "src/model.h" -#include "src/model.c" -#include "src/array_file.c" +#define VG_IMPLEMENTATION +#include "vg/vg.hconf" +#undef VG_IMPLEMENTATION +#define VG_THIRDPARTY +#include "vg/vg.hconf" +#undef VG_THIRDPARTY -/* - * Addon metadata utilities - * -------------------------------------------------------------------------- */ - -void write_msg( vg_msg *msg, const char *path ){ - FILE *fp = fopen( path, "wb" ); - if( !fp ){ - vg_error( "Cannot open %s for writing.\n", path ); - exit(0); - } +#define SR_MODEL +#include "src/skaterift.hconf" - fwrite( msg->buf, msg->cur.co, 1, fp ); - fclose( fp ); - vg_success( "Written %s (%ub)\n", path, msg->cur ); -} +#define SR_IMPLEMENTATION +#include "src/skaterift.hconf" +#undef SR_IMPLEMENTATION -void write_generic_addon_inf( u32 type, const char *title, - const char *content, const char *dest, u32 flags ) +void build_shaders(void) { - u8 descriptor_buf[ 512 ]; - vg_msg descriptor = {0}; - descriptor.buf = descriptor_buf; - descriptor.max = sizeof(descriptor_buf); - vg_msg_frame( &descriptor, "workshop" ); - vg_msg_wkvstr( &descriptor, "title", title ); - vg_msg_wkvstr( &descriptor, "author", "Skaterift" ); - vg_msg_wkvnum( &descriptor, "type", k_vg_msg_u32, 1, &type ); - vg_msg_end_frame( &descriptor ); - vg_msg_wkvstr( &descriptor, "content", content ); - if( flags ) - vg_msg_wkvnum( &descriptor, "flags", k_vg_msg_u32, 1, &flags ); - write_msg( &descriptor, dest ); -} - -/* - * Compilation specifications - * -------------------------------------------------------------------------- */ + vg_info( "Compiling shader headers\n" ); + vg_shader_set_include_dir( "shaders" ); -/* operates in the local files, not in the bin folders */ -void build_game_metadata(void) -{ - vg_info( "Building game metadata\n" ); - write_generic_addon_inf( k_addon_type_board, - "Longboard", "board.mdl", - "content_skaterift/boards/skaterift_long/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_board, - "Fractal", "board.mdl", - "content_skaterift/boards/skaterift_fract/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_board, - "Striped", "board.mdl", - "content_skaterift/boards/skaterift_striped/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_board, - "Licco", "board.mdl", - "content_skaterift/boards/skaterift_licco/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_board, - "Hypno", "board.mdl", - "content_skaterift/boards/skaterift_spiral/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_board, - "Shark", "board.mdl", - "content_skaterift/boards/skaterift_shark/addon.inf", 0 ); - - write_generic_addon_inf( k_addon_type_player, - "De'folde", "ch_new.mdl", - "content_skaterift/playermodels/skaterift_new/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_player, - "Jordan", "ch_jordan.mdl", - "content_skaterift/playermodels/skaterift_jordan/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_player, - "Outlaw", "ch_outlaw.mdl", - "content_skaterift/playermodels/skaterift_outlaw/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_player, - "Chip", "ch_chip.mdl", - "content_skaterift/playermodels/skaterift_chip/addon.inf", ADDON_REG_HIDDEN ); - write_generic_addon_inf( k_addon_type_player, - "Aaron", "ch_aaron.mdl", - "content_skaterift/playermodels/skaterift_aaron/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_player, - "JC", "ch_john.mdl", - "content_skaterift/playermodels/skaterift_john/addon.inf", ADDON_REG_HIDDEN ); - write_generic_addon_inf( k_addon_type_player, - "Ela", "ch_ela.mdl", - "content_skaterift/playermodels/skaterift_ela/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_player, - "Custom", "ch_sr2t.mdl", - "content_skaterift/playermodels/sr2t/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_player, - "Pro", "ch_pro.mdl", - "content_skaterift/playermodels/skaterift_pro/addon.inf", 0 ); - write_generic_addon_inf( k_addon_type_player, - "Amin", "ch_amin.mdl", - "content_skaterift/playermodels/skaterift_amin/addon.inf", 0 ); - - write_generic_addon_inf( k_addon_type_player, - "Jesus", "ch_jesus.mdl", - "content_skaterift/playermodels/skaterift_jesus/addon.inf", ADDON_REG_HIDDEN ); - write_generic_addon_inf( k_addon_type_player, - "FBI", "ch_fbi.mdl", - "content_skaterift/playermodels/skaterift_fbi/addon.inf", ADDON_REG_HIDDEN ); - write_generic_addon_inf( k_addon_type_player, - "FBI2", "ch_fbi2.mdl", - "content_skaterift/playermodels/skaterift_fbi2/addon.inf", ADDON_REG_HIDDEN ); - write_generic_addon_inf( k_addon_type_player, - "President", "ch_president.mdl", - "content_skaterift/playermodels/skaterift_president/addon.inf", ADDON_REG_HIDDEN ); - - struct + struct { c8 *name, *vs, *fs; } shaders[] = { - const char *title, *location, *file; - u32 flags; - } - maps[] = - { - { "Mt.Zero Island", "Australia", "content_skaterift/maps/mp_mtzero/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_MTZERO | ADDON_REG_PREMIUM }, - { "Flat World", "...", "content_skaterift/maps/dev_flatworld/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_HIDDEN }, - { "Heaven", "...", "content_skaterift/maps/dev_heaven/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_HIDDEN }, - { "Valley", "Cambodia", "content_skaterift/maps/mp_line1/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_VALLEY | ADDON_REG_PREMIUM }, - { "Training Island", "Australia", "content_skaterift/maps/dev_tutorial/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_VOLC }, - { "Center Island", "Australia", "content_skaterift/maps/dev_hub/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_HUB }, - { "Downtown", "USA, Georgia", "content_skaterift/maps/mp_spawn/addon.inf", ADDON_REG_CAMPAIGN | ADDON_REG_CITY | ADDON_REG_PREMIUM }, - { "Moon", "Venus", "content_skaterift/maps/vm/addon.inf", ADDON_REG_VENUS | ADDON_REG_PREMIUM }, + /* TODO: We need to move this into a vg header */ + { "debug_lines", "vg/shaders/debug_lines.vs", "vg/shaders/debug_lines.fs" }, + { "debug_rigidbody", "vg/shaders/rigidbody_view.vs", "vg/shaders/rigidbody_view.fs" }, + { "vgui", "vg/shaders/ui.vs", "vg/shaders/ui.fs" }, + { "vgui_image", "vg/shaders/ui_image.vs", "vg/shaders/ui_image.fs" }, + { "vgui_image_grad", "vg/shaders/ui_image.vs", "vg/shaders/ui_image_grad.fs" }, + { "vgui_image_hsv", "vg/shaders/ui_image.vs", "vg/shaders/ui_image_hsv.fs" }, + { "vgloader", "vg/shaders/blit.vs", "vg/shaders/loader.fs" }, + + /* Scene */ + { "scene_standard", "shaders/scene.vs", "shaders/scene_standard.fs" }, + { "scene_standard_alphatest", "shaders/scene.vs", "shaders/scene_standard_alphatest.fs" }, + { "scene_foliage", "shaders/scene_foliage.vs", "shaders/scene_foliage.fs" }, + { "scene_override", "shaders/scene_override.vs", "shaders/scene_override.fs" }, + { "scene_preview", "shaders/scene_override.vs", "shaders/scene_preview.fs" }, + { "scene_fxglow", "shaders/scene_fxglow.vs", "shaders/scene_fxglow.fs" }, + { "scene_vertex_blend", "shaders/scene.vs", "shaders/scene_vertex_blend.fs" }, + { "scene_terrain", "shaders/scene.vs", "shaders/scene_terrain.fs" }, + { "scene_route", "shaders/scene_override.vs", "shaders/scene_route.fs" }, + { "scene_depth", "shaders/scene.vs", "shaders/scene_depth.fs" }, + { "scene_position", "shaders/scene.vs", "shaders/scene_position.fs" }, + { "scene_cubemapped", "shaders/scene.vs", "shaders/scene_cubemapped.fs" }, + { "scene_water", "shaders/scene.vs", "shaders/scene_water.fs" }, + { "scene_water_fast", "shaders/scene.vs", "shaders/scene_water_fast.fs" }, + { "scene_scoretext", "shaders/scene_sfd.vs", "shaders/scene_standard.fs" }, + { "scene_font", "shaders/model_font.vs", "shaders/scene_font.fs" }, + + /* Models */ + { "model_sky", "shaders/model.vs", "shaders/model_sky.fs" }, + { "model_sky_space", "shaders/model.vs", "shaders/model_sky_space.fs" }, + { "model_sky_cubemap", "shaders/model_sky.vs", "shaders/model_sky_cubemap.fs" }, + { "model_menu", "shaders/model.vs", "shaders/model_menu.fs" }, + { "model_character_view", "shaders/model_skinned.vs", "shaders/model_character_view.fs" }, + { "model_board_view", "shaders/model.vs", "shaders/model_character_view.fs" }, + { "model_entity", "shaders/model.vs", "shaders/model_entity.fs" }, + { "model_gate", "shaders/model.vs", "shaders/model_gate_lq.fs" }, + { "model_superworld", "shaders/model.vs", "shaders/model_superworld.fs" }, + { "model_gate_unlinked", "shaders/model.vs", "shaders/model_gate_unlinked.fs" }, + { "model_font", "shaders/model_font.vs", "shaders/model_font.fs" }, + + { "particle", "shaders/particle.vs", "shaders/particle.fs" }, + { "trail", "shaders/trail.vs", "shaders/trail.fs" }, + + /* 2D */ + { "workshop_compositor", "shaders/workshop_compositor.vs", "shaders/workshop_compositor.fs" }, + { "blit", "vg/shaders/blit.vs", "vg/shaders/blit_tex.fs" }, + { "blitblur", "vg/shaders/blit.vs", "vg/shaders/blit_blur.fs" }, + { "blitcolour", "vg/shaders/blit.vs", "vg/shaders/blit_colour.fs" }, + { "blit_transition", "vg/shaders/blit.vs", "shaders/blit_transition.fs" }, + { "compass", "shaders/compass.vs", "shaders/compass.fs" }, + { "routeui", "shaders/routeui.vs", "shaders/routeui.fs" }, }; - for( u32 i=0; iuid.buffer ); - vg_syscall( "mkdir -p bin/%s/savedata", proj->uid.buffer ); - vg_syscall( "mkdir -p bin/%s/tools", proj->uid.buffer ); - vg_syscall( "cp bin/skaterift_blender.zip bin/%s/tools/", proj->uid.buffer ); + FILE *hdr = fopen( "src.generated/control_overlay.h", "w" ); + VG_ASSERT( hdr ); + + vg_stack_allocator stack; + vg_stack_init( &stack, NULL, VG_MB(8), "Model buffer" ); + + vg_model model; + VG_ASSERT( vg_model_load( &model, VG_MODEL_CPU_METADATA, "content_skaterift/models/rs_overlay.mdl", &stack ) ); + + for( u32 i=0; ipstr_name ), mesh->submesh_start ); + } + vg_stack_free( &stack ); + fclose( hdr ); } - -#include "src/build_control_overlay.c" void build_game_bin( struct vg_project *proj, struct vg_compiler_env *env ) { @@ -234,12 +117,10 @@ void build_game_bin( struct vg_project *proj, struct vg_compiler_env *env ) { meta = 1; build_shaders(); - build_game_metadata(); + build_control_overlay(); vg_low( "\n\n" ); } - build_control_overlay(); - struct vg_compiler_conf conf = {0}; if( env->platform == k_platform_windows ) @@ -256,14 +137,63 @@ void build_game_bin( struct vg_project *proj, struct vg_compiler_env *env ) .steam_api = 1, .use_3d = 1, .custom_game_settings = 0, - .custom_shaders = 1, .multiplayer = 1 }, - env, &conf, "src/client.c", "skaterift" ); + env, &conf, "src/unit_skaterift.c", "skaterift" ); vg_add_controller_database( proj ); + vg_add_blob( proj, "steam_appid.txt", "" ); } +void build_game_content( struct vg_project *proj ) +{ + vg_symlink( proj, "content_skaterift/textures", "textures" ); + vg_symlink( proj, "content_skaterift/models", "models" ); + vg_symlink( proj, "content_skaterift/boards", "boards" ); + vg_symlink( proj, "content_skaterift/maps", "maps" ); + vg_symlink( proj, "content_skaterift/sound", "sound" ); + vg_symlink( proj, "content_skaterift/playermodels", "playermodels" ); + vg_symlink( proj, "content_skaterift/metascenes", "metascenes" ); + vg_syscall( "mkdir -p bin/%s/cfg", proj->uid.buffer ); + vg_syscall( "mkdir -p bin/%s/savedata", proj->uid.buffer ); + vg_syscall( "mkdir -p bin/%s/tools", proj->uid.buffer ); + vg_syscall( "cp bin/skaterift_blender.zip bin/%s/tools/", proj->uid.buffer ); +} + +void vg_build_scripts(void) +{ + if( vg_long_opt( "skaterift", "Make skaterift" ) ) + { + struct vg_project proj; + vg_project_init( &proj, "bin", "skaterift", NULL, 0 ); + + build_game_bin( &proj, &_vg_common_env ); + build_game_content( &proj ); + vg_add_blob( &proj, "steam_appid.txt", "" ); + } +} + +#if 0 +#include "vg/vg_tool.h" +#include "vg/vg_platform.h" +#include "vg/vg_log.h" +#include "vg/vg_opt.h" +#include "vg/vg_build.h" +#include "vg/vg_mem_pool.h" +#include "vg/vg_build_utils_shader.h" +#include "vg/vg_msg.h" +#include "src/addon_types.h" + +#include "vg/vg_m.h" +#include "src/model.h" +#include "src/model.c" +#include "src/array_file.c" + + +/* + * Addon metadata utilities + * -------------------------------------------------------------------------- */ + void build_crash_reporter( struct vg_project *proj, struct vg_compiler_env *env ) { struct vg_compiler_conf conf = {0}; @@ -470,7 +400,6 @@ void s_utest_build(void) .log_source_info = 1, .use_3d = 0, .custom_game_settings = 0, - .custom_shaders = 0, .multiplayer = 0 }, env, &conf, "src/utest.c", "utest" ); @@ -511,10 +440,9 @@ void s_dbtest_build(void) int main( int argc, const char *argv[] ) { - vg_log_init(); + _vg_log_pre_init(); _vg_opt_init( argc, argv ); - const char *arg; if( (arg = vg_long_opt_arg( "glsl-dir", "Specify output directory for preprocessed GLSL" )) ) @@ -566,3 +494,4 @@ int main( int argc, const char *argv[] ) vg_success( "All scripts completed\n" ); } +#endif diff --git a/build.sh b/build.sh index 4ad323c..7f4e7b2 100755 --- a/build.sh +++ b/build.sh @@ -1 +1 @@ -clang -fsanitize=address -O0 -I. -I./vg build.c vg/vg_tool.c -o /tmp/tmpsr && /tmp/tmpsr $@ +zig cc -lasan -fsanitize=address -O0 -I. build.c -o /tmp/build_sr && /tmp/build_sr $@ diff --git a/content_skaterift/boards/skaterift_fract/addon.inf b/content_skaterift/boards/skaterift_fract/addon.inf deleted file mode 100644 index 3c85c6491f9e6cddb621508075285c7f0d2082a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmV~$!3}^Q5Cp)*FTGfX4OqbmXD}c~&Narbl{*t2^LiBebEQ)bImE0~VnG diff --git a/content_skaterift/boards/skaterift_licco/addon.kv b/content_skaterift/boards/skaterift_licco/addon.kv new file mode 100644 index 0000000..44c0a25 --- /dev/null +++ b/content_skaterift/boards/skaterift_licco/addon.kv @@ -0,0 +1,7 @@ +workshop +{ + title Licco + author "Skate Rift" +} + +content board.mdl diff --git a/content_skaterift/boards/skaterift_long/addon.inf b/content_skaterift/boards/skaterift_long/addon.inf deleted file mode 100644 index daf6b76bb7157273648e119ac39cc30f6e956421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75 zcmW;C!3}^Q5Cp)*FTGfaKPx~vg@7D6*BHN6ZsNSh-D>4b+Tod51(UXY(O?liTuf@1 YOQ2ZZh?h?nH~@oRwNV=J-|>hQAG#zMPXGV_ diff --git a/content_skaterift/boards/skaterift_long/addon.kv b/content_skaterift/boards/skaterift_long/addon.kv new file mode 100644 index 0000000..f2e7248 --- /dev/null +++ b/content_skaterift/boards/skaterift_long/addon.kv @@ -0,0 +1,7 @@ +workshop +{ + title Longboard + author "Skate Rift" +} + +content board.mdl diff --git a/content_skaterift/boards/skaterift_shark/addon.inf b/content_skaterift/boards/skaterift_shark/addon.inf deleted file mode 100644 index 7f8c3fccc96069678d6349fe5595bc6be8053899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71 zcmV~$K@NZ*3h&N# UzEcqZEOEC%9mHnhc|CK-4@eajumAu6 diff --git a/content_skaterift/boards/skaterift_shark/addon.kv b/content_skaterift/boards/skaterift_shark/addon.kv new file mode 100644 index 0000000..bb06ef8 --- /dev/null +++ b/content_skaterift/boards/skaterift_shark/addon.kv @@ -0,0 +1,7 @@ +workshop +{ + title Shark + author "Skate Rift" +} + +content board.mdl diff --git a/content_skaterift/boards/skaterift_spiral/addon.inf b/content_skaterift/boards/skaterift_spiral/addon.inf deleted file mode 100644 index 6cc3ef53049124b98d452759e0d4a1620278d8ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71 zcmV~$%ME}a5Cy=8S9-Ay?^b}a2Eu2_`i$Xf<<7WQt=vfmJTt3co1-gyc$n0%mq4+6 W5g+FeH~@=3wNpBAXt21pSn&f)P!`1i diff --git a/content_skaterift/boards/skaterift_spiral/addon.kv b/content_skaterift/boards/skaterift_spiral/addon.kv new file mode 100644 index 0000000..6f4da15 --- /dev/null +++ b/content_skaterift/boards/skaterift_spiral/addon.kv @@ -0,0 +1,7 @@ +workshop +{ + title Hypno + author "Skate Rift" +} + +content board.mdl diff --git a/content_skaterift/boards/skaterift_striped/addon.inf b/content_skaterift/boards/skaterift_striped/addon.inf deleted file mode 100644 index 2c2ba4e45d54888607c14aae2545697914e63e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmV~$K@NZ*3qWfvs6PAQ1_W;I7@nc{j7 VAKxhm0G7DhpbTQO>}5Sm#}9;87m@$~ diff --git a/content_skaterift/boards/skaterift_striped/addon.kv b/content_skaterift/boards/skaterift_striped/addon.kv new file mode 100644 index 0000000..94a5c96 --- /dev/null +++ b/content_skaterift/boards/skaterift_striped/addon.kv @@ -0,0 +1,7 @@ +workshop +{ + title Striped + author "Skate Rift" +} + +content board.mdl diff --git a/content_skaterift/maps/dev_flatworld/addon.inf b/content_skaterift/maps/dev_flatworld/addon.inf deleted file mode 100644 index d4fef53f8fe7f4b5a2515cee4b3bbee51a44edc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmWN`F%m#95Czaro5~HGz%g7vq23`RV`VeRH%9B^y!JJ>m7@mBaEw%sQHA|%MOQev j7_4AAgucX$c==?H7C`G3OZ162C8ptA74N39S9Je=%eES% diff --git a/content_skaterift/maps/dev_flatworld/addon.kv b/content_skaterift/maps/dev_flatworld/addon.kv new file mode 100644 index 0000000..16ba10e --- /dev/null +++ b/content_skaterift/maps/dev_flatworld/addon.kv @@ -0,0 +1,10 @@ +workshop +{ + title "Flat World" + author "Skate Rift" +} + +content main.mdl +flags CAMPAIGN|HIDDEN + +location Nowhere diff --git a/content_skaterift/maps/dev_heaven/addon.inf b/content_skaterift/maps/dev_heaven/addon.inf deleted file mode 100644 index 95f251938b19adca44e56dd20b023787c51b152d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmWN`u@QhE3Jgv0LJb`ltqy#$dZqQ;S!x4^S>Wj2pLQO diff --git a/content_skaterift/maps/dev_heaven/addon.kv b/content_skaterift/maps/dev_heaven/addon.kv new file mode 100644 index 0000000..c4aa0a8 --- /dev/null +++ b/content_skaterift/maps/dev_heaven/addon.kv @@ -0,0 +1,10 @@ +workshop +{ + title "Heaven" + author "Skate Rift" +} + +content main.mdl +flags CAMPAIGN|HIDDEN + +location Nowhere diff --git a/content_skaterift/maps/dev_hub/addon.inf b/content_skaterift/maps/dev_hub/addon.inf deleted file mode 100644 index 691e963842e07d8dbb8ba6e6e354cf0385d58e94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmWN{yAgmO5Jl0aDTyUmflU}0TfvSj!tfnf$1$aHN$%@wDoQJoQV`3hqOFsmz%HwhxSv_&1zO`yAB8TJA5Czb$v7>PWCvXpIUEm@p7vLap#@IT!zW#N0uA%u{V3ajFY?WA8&S`0p n#KO>}K3A-P)KxwduRg`02hf{6i#k!HKh4QTyho(7VH|)DdRH8; diff --git a/content_skaterift/maps/dev_tutorial/addon.kv b/content_skaterift/maps/dev_tutorial/addon.kv new file mode 100644 index 0000000..410a9a5 --- /dev/null +++ b/content_skaterift/maps/dev_tutorial/addon.kv @@ -0,0 +1,10 @@ +workshop +{ + title "Training Island" + author "Skate Rift" +} + +content main.mdl +flags CAMPAIGN|VOLC + +location Australia diff --git a/content_skaterift/maps/mp_line1/addon.inf b/content_skaterift/maps/mp_line1/addon.inf deleted file mode 100644 index e7d0d6ce46a344a5ae99f0101b9defd12184d715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmV~$OAde_3voS0H>#kaqiy~7jd%gwB3q1py0e)YS8EOCk diff --git a/content_skaterift/maps/mp_line1/addon.kv b/content_skaterift/maps/mp_line1/addon.kv new file mode 100644 index 0000000..e898856 --- /dev/null +++ b/content_skaterift/maps/mp_line1/addon.kv @@ -0,0 +1,10 @@ +workshop +{ + title "Valley" + author "Skate Rift" +} + +content main.mdl +flags CAMPAIGN|VALLEY|PREMIUM + +location Cambodia diff --git a/content_skaterift/maps/mp_mtzero/addon.inf b/content_skaterift/maps/mp_mtzero/addon.inf deleted file mode 100644 index 39fda55f193cea3129a36f090181df3115af4c88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmWN`F%m#95Czarn;WQ{z&#Wyooi5v(3 diff --git a/content_skaterift/maps/mp_mtzero/addon.kv b/content_skaterift/maps/mp_mtzero/addon.kv new file mode 100644 index 0000000..c0ab0c7 --- /dev/null +++ b/content_skaterift/maps/mp_mtzero/addon.kv @@ -0,0 +1,10 @@ +workshop +{ + title "Mt.Zero Island" + author "Skate Rift" +} + +content main.mdl +flags CAMPAIGN|MTZERO|PREMIUM + +location Australia diff --git a/content_skaterift/maps/mp_spawn/addon.inf b/content_skaterift/maps/mp_spawn/addon.inf deleted file mode 100644 index 79e6c2651199ac77ad0d8efc754a2942b4c7d6b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmWN`%ME}a6a>JPD=k=qRoHLIF_vltNpGY(m-cmGHS_?v8ct5251H(INzB3Dg)@POfi#)1xi*pcT%dWyYo|aCBSHhCPvS di{3Eot&ADK><$%UF%*ijlrv-aOjpPH?*|{q7{vep diff --git a/content_skaterift/maps/vm/addon.kv b/content_skaterift/maps/vm/addon.kv new file mode 100644 index 0000000..000e56a --- /dev/null +++ b/content_skaterift/maps/vm/addon.kv @@ -0,0 +1,10 @@ +workshop +{ + title "Moon" + author "Skate Rift" +} + +content main.mdl +flags VENUS|PREMIUM + +location Venus diff --git a/content_skaterift/playermodels/skaterift_aaron/addon.inf b/content_skaterift/playermodels/skaterift_aaron/addon.inf deleted file mode 100644 index f357ede35d6f80516406636f21674c467a046796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 zcmWm4K@LDL5CzbWW$)q+&fowtVWdr~(~K`->*V6CUw515Gg?DnVo^-uRuSZ4G{>BU Z>S-rlK20$I=)-E2T8T9-^7rxB3O!&v08$XS4=KWfm+&E1bU=tz%7| Z()A!-K20zI7+tVRsYHmI|My(>j1O3{7X<(S diff --git a/content_skaterift/playermodels/skaterift_amin/addon.kv b/content_skaterift/playermodels/skaterift_amin/addon.kv new file mode 100644 index 0000000..f329d81 --- /dev/null +++ b/content_skaterift/playermodels/skaterift_amin/addon.kv @@ -0,0 +1,7 @@ +workshop +{ + title "Amin" + author "Skate Rift" +} + +content ch_amin.mdl diff --git a/content_skaterift/playermodels/skaterift_chip/addon.inf b/content_skaterift/playermodels/skaterift_chip/addon.inf deleted file mode 100644 index c8f4cbec50b45432a0645babb0a609fd9d9eb9f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83 zcmWN{!3}^Q3G9Co*|G;GN! fwHOqizLhWon5>tgR1}_fKlXAR8DGfm>@XwzYmFI` diff --git a/content_skaterift/playermodels/skaterift_chip/addon.kv b/content_skaterift/playermodels/skaterift_chip/addon.kv new file mode 100644 index 0000000..544607d --- /dev/null +++ b/content_skaterift/playermodels/skaterift_chip/addon.kv @@ -0,0 +1,8 @@ +workshop +{ + title "Chip" + author "Skate Rift" +} + +content ch_chip.mdl +flags HIDDEN diff --git a/content_skaterift/playermodels/skaterift_ela/addon.inf b/content_skaterift/playermodels/skaterift_ela/addon.inf deleted file mode 100644 index 54f5411a72363885bd392519ae2579c8d91a6d54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmV~$!3}^Q5Cp(gpY&oER$u|JA5CzbWmh9pX7ADpXU{DVsAV=Vgv1M|7?NbkzP#tGz@e&EsI76FT92YFX h2o-MyP2NoC0d#ujB$NcZTkYnD>xgJJnzKUv{{b9`7;OLm diff --git a/content_skaterift/playermodels/skaterift_fbi/addon.kv b/content_skaterift/playermodels/skaterift_fbi/addon.kv new file mode 100644 index 0000000..6d8e89a --- /dev/null +++ b/content_skaterift/playermodels/skaterift_fbi/addon.kv @@ -0,0 +1,8 @@ +workshop +{ + title "FBI" + author "Skate Rift" +} + +content ch_fbi.mdl +flags HIDDEN diff --git a/content_skaterift/playermodels/skaterift_fbi2/addon.inf b/content_skaterift/playermodels/skaterift_fbi2/addon.inf deleted file mode 100644 index 0705e5d2a18174cd11e626e0aba7b85a5db7cbd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83 zcmWN{u?>JA5CzbWmh57|2o@&R4qy-uAs`SqV{DyVU;V_LYiKSPNcJ2F(>Nwvp4C7Y2c{QAS#A~BI8pIzyM;92; diff --git a/content_skaterift/playermodels/skaterift_fbi2/addon.kv b/content_skaterift/playermodels/skaterift_fbi2/addon.kv new file mode 100644 index 0000000..c3c0288 --- /dev/null +++ b/content_skaterift/playermodels/skaterift_fbi2/addon.kv @@ -0,0 +1,8 @@ +workshop +{ + title "FBI2" + author "Skate Rift" +} + +content ch_fbi2.mdl +flags HIDDEN diff --git a/content_skaterift/playermodels/skaterift_j/addon.inf b/content_skaterift/playermodels/skaterift_j/addon.inf deleted file mode 100644 index 9e372d1e19bbd62ebed1fa847ff8cae5f1396cb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmV~$OAbIV6a~AD|gQDsFf>fhht(DEO7p2RKr?4#nM51 Ue7j%*FuI_P(ufeZJfC~T55uPvj{pDw diff --git a/content_skaterift/playermodels/skaterift_jesus/addon.inf b/content_skaterift/playermodels/skaterift_jesus/addon.inf deleted file mode 100644 index 18e258cb63f5247f5bed33ee8a10a271b31ca110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmWm4u?>JA5CzbWmh9pnwhmwj9-<&e;E1tha`n|u-CRQToT25ANSLX%3T>KrE?9yQ gDu)wvc`{)HFlft3C<&}z&%aOC7SUZadxiSO3$qg%p8x;= diff --git a/content_skaterift/playermodels/skaterift_jesus/addon.kv b/content_skaterift/playermodels/skaterift_jesus/addon.kv new file mode 100644 index 0000000..b7fba83 --- /dev/null +++ b/content_skaterift/playermodels/skaterift_jesus/addon.kv @@ -0,0 +1,8 @@ +workshop +{ + title "Jesus" + author "Skate Rift" +} + +content ch_jesus.mdl +flags HIDDEN diff --git a/content_skaterift/playermodels/skaterift_john/addon.inf b/content_skaterift/playermodels/skaterift_john/addon.inf deleted file mode 100644 index 1a03b82df1966f7c4059d04a5596ff2d030a62dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWN{u?>JA5CzbWmh9pZcD4>+2p)nUN8pUHWpaJ>QxDhJJQrvQk_gKTZEo>gu|^|Q fgA;Ul3tXv