Metascene compiler & load in-game for player. (BREAKS NPC ANIMATIONS)
[carveJwlIkooP6JGAAIwe30JlM.git] / build.c
1 #include "vg/vg_tool.h"
2 #include "vg/vg_platform.h"
3 #include "vg/vg_log.h"
4 #include "vg/vg_opt.h"
5 #include "vg/vg_build.h"
6 #include "vg/vg_build_utils_shader.h"
7 #include "vg/vg_msg.h"
8 #include "src/addon_types.h"
9
10 #include "vg/vg_m.h"
11 #include "src/model.h"
12 #include "src/model.c"
13 #include "src/array_file.c"
14
15 /*
16 * Addon metadata utilities
17 * -------------------------------------------------------------------------- */
18
19 void write_msg( vg_msg *msg, const char *path ){
20 FILE *fp = fopen( path, "wb" );
21 if( !fp ){
22 vg_error( "Cannot open %s for writing.\n", path );
23 exit(0);
24 }
25
26 fwrite( msg->buf, msg->cur.co, 1, fp );
27 fclose( fp );
28 vg_success( "Written %s (%ub)\n", path, msg->cur );
29 }
30
31 void write_generic_addon_inf( u32 type, const char *title,
32 const char *content, const char *dest )
33 {
34 u8 descriptor_buf[ 512 ];
35 vg_msg descriptor = {0};
36 descriptor.buf = descriptor_buf;
37 descriptor.max = sizeof(descriptor_buf);
38 vg_msg_frame( &descriptor, "workshop" );
39 vg_msg_wkvstr( &descriptor, "title", title );
40 vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
41 vg_msg_wkvnum( &descriptor, "type", k_vg_msg_u32, 1, &type );
42 vg_msg_end_frame( &descriptor );
43 vg_msg_wkvstr( &descriptor, "content", content );
44 write_msg( &descriptor, dest );
45 }
46
47 /*
48 * Compilation specifications
49 * -------------------------------------------------------------------------- */
50
51 /* operates in the local files, not in the bin folders */
52 void build_game_metadata(void)
53 {
54 vg_info( "Building game metadata\n" );
55 write_generic_addon_inf( k_addon_type_board,
56 "Longboard", "board.mdl",
57 "content_skaterift/boards/skaterift_long/addon.inf");
58 write_generic_addon_inf( k_addon_type_board,
59 "Fractal", "board.mdl",
60 "content_skaterift/boards/skaterift_fract/addon.inf");
61 write_generic_addon_inf( k_addon_type_board,
62 "Striped", "board.mdl",
63 "content_skaterift/boards/skaterift_striped/addon.inf");
64 write_generic_addon_inf( k_addon_type_board,
65 "Licco", "board.mdl",
66 "content_skaterift/boards/skaterift_licco/addon.inf");
67 write_generic_addon_inf( k_addon_type_board,
68 "Hypno", "board.mdl",
69 "content_skaterift/boards/skaterift_spiral/addon.inf");
70 write_generic_addon_inf( k_addon_type_board,
71 "Shark", "board.mdl",
72 "content_skaterift/boards/skaterift_shark/addon.inf");
73
74 write_generic_addon_inf( k_addon_type_player,
75 "De'folde", "ch_new.mdl",
76 "content_skaterift/playermodels/skaterift_new/addon.inf" );
77 write_generic_addon_inf( k_addon_type_player,
78 "Jordan", "ch_jordan.mdl",
79 "content_skaterift/playermodels/skaterift_jordan/addon.inf" );
80 write_generic_addon_inf( k_addon_type_player,
81 "Outlaw", "ch_outlaw.mdl",
82 "content_skaterift/playermodels/skaterift_outlaw/addon.inf" );
83 write_generic_addon_inf( k_addon_type_player,
84 "Chip", "ch_chip.mdl",
85 "content_skaterift/playermodels/skaterift_chip/addon.inf" );
86 write_generic_addon_inf( k_addon_type_player,
87 "Aaron", "ch_aaron.mdl",
88 "content_skaterift/playermodels/skaterift_aaron/addon.inf" );
89 }
90
91 #define _S( NAME, VS, FS ) \
92 vg_build_shader( "shaders/" VS, "shaders/" FS, NULL, "shaders", NAME )
93
94 void build_shaders(void){
95 vg_info( "Compiling shader headers\n" );
96 vg_shader_set_include_dir( "shaders" );
97
98 /* Scene */
99 _S( "scene_standard", "scene.vs", "scene_standard.fs" );
100 _S( "scene_standard_alphatest", "scene.vs", "scene_standard_alphatest.fs" );
101 _S( "scene_foliage", "scene_foliage.vs", "scene_foliage.fs" );
102 _S( "scene_override", "scene_override.vs", "scene_override.fs" );
103 _S( "scene_fxglow", "scene_fxglow.vs", "scene_fxglow.fs" );
104 _S( "scene_vertex_blend", "scene.vs", "scene_vertex_blend.fs" );
105 _S( "scene_terrain", "scene.vs", "scene_terrain.fs" );
106 _S( "scene_route", "scene_override.vs", "scene_route.fs" );
107 _S( "scene_depth", "scene.vs", "scene_depth.fs" );
108 _S( "scene_position", "scene.vs", "scene_position.fs" );
109 _S( "scene_cubemapped", "scene.vs", "scene_cubemapped.fs" );
110 _S( "scene_water", "scene.vs", "scene_water.fs" );
111 _S( "scene_water_fast", "scene.vs", "scene_water_fast.fs" );
112 _S( "scene_scoretext", "scene_sfd.vs", "scene_standard.fs" );
113 _S( "scene_font", "model_font.vs","scene_font.fs" );
114
115 /* Models */
116 _S( "model_sky", "model.vs", "model_sky.fs" );
117 _S( "model_sky_space", "model.vs", "model_sky_space.fs" );
118 _S( "model_menu", "model.vs", "model_menu.fs" );
119 _S( "model_character_view", "model_skinned.vs", "model_character_view.fs" );
120 _S( "model_board_view", "model.vs", "model_character_view.fs" );
121 _S( "model_entity", "model.vs", "model_entity.fs" );
122 _S( "model_gate", "model.vs", "model_gate_lq.fs" );
123 _S( "model_gate_unlinked", "model.vs", "model_gate_unlinked.fs" );
124 _S( "model_font", "model_font.vs", "model_font.fs" );
125
126 _S( "particle", "particle.vs", "particle.fs" );
127 _S( "trail", "trail.vs", "trail.fs" );
128
129 /* 2D */
130 _S( "blit", "blit.vs", "blit.fs" );
131 _S( "blitblur", "blit.vs", "blitblur.fs" );
132 _S( "blitcolour","blit.vs", "colour.fs" );
133 _S( "blit_transition", "blit.vs", "blit_transition.fs" );
134 _S( "routeui", "routeui.vs", "routeui.fs" );
135
136 vg_build_shader_impl( "shaders/impl.c" );
137 }
138
139 void build_game_content( struct vg_project *proj )
140 {
141 vg_symlink( proj, "content_skaterift/textures", "textures" );
142 vg_symlink( proj, "content_skaterift/models", "models" );
143 vg_symlink( proj, "content_skaterift/boards", "boards" );
144 vg_symlink( proj, "content_skaterift/maps", "maps" );
145 vg_symlink( proj, "content_skaterift/sound", "sound" );
146 vg_symlink( proj, "content_skaterift/playermodels", "playermodels" );
147 vg_symlink( proj, "content_skaterift/metascenes", "metascenes" );
148 vg_syscall( "mkdir -p bin/%s/cfg", proj->uid.buffer );
149 vg_syscall( "mkdir -p bin/%s/savedata", proj->uid.buffer );
150 vg_syscall( "mkdir -p bin/%s/tools", proj->uid.buffer );
151 vg_syscall( "cp bin/skaterift_blender.zip bin/%s/tools/", proj->uid.buffer );
152 }
153
154 #include "src/build_control_overlay.c"
155
156 void build_game_bin( struct vg_project *proj, struct vg_compiler_env *env )
157 {
158 static int meta = 0;
159 if( !meta )
160 {
161 meta = 1;
162 build_shaders();
163 build_game_metadata();
164 vg_low( "\n\n" );
165 }
166
167 build_control_overlay();
168
169 struct vg_compiler_conf conf = {0};
170
171 if( env->platform == k_platform_windows )
172 {
173 vg_strcat( &conf.link, "-lws2_32 " );
174 }
175
176 vg_make_app( proj, &(struct vg_engine_config )
177 {
178 .fixed_update_hz = 60,
179 .legacy_support_vg_msg1 = 1,
180 .log_source_info = 1,
181 .steam_api = 1,
182 .use_3d = 1,
183 .custom_game_settings = 0,
184 .custom_shaders = 1
185 },
186 env, &conf, "src/client.c", "skaterift" );
187
188 vg_add_controller_database( proj );
189 }
190
191 struct compile_result
192 build_sqlite_for_env( struct vg_compiler_env *env )
193 {
194 struct vg_project sqlite_proj;
195 vg_project_init( &sqlite_proj, "bin", ".sqlite3", env, 0 );
196
197 struct vg_compiler_env sqlite_env = *env;
198 sqlite_env.optimization = 3; /* force optimization always */
199 sqlite_env.debug_asan = 0;
200
201 struct vg_compiler_conf conf = {0};
202 vg_strcat( &conf.link, "-ldl " );
203
204 return vg_compiler_run( &sqlite_proj, &sqlite_env, &conf,
205 "dep/sqlite3/sqlite3.c ", "sqlite3",
206 k_obj_type_obj );
207 }
208
209 void compile_server( struct vg_project *proj, struct vg_compiler_env *env )
210 {
211 struct compile_result sqlite = build_sqlite_for_env( env );
212
213 vg_str sources = {0};
214 vg_strcat( &sources, "gameserver.c vg/vg_tool.c vg/vg_steam.c \\\n " );
215 vg_strcat( &sources, sqlite.path.buffer );
216
217 struct vg_compiler_conf conf = {0};
218 vg_strcat( &conf.include, "-Isrc -I./dep " );
219 vg_strcat( &conf.library, "-L./vg/dep/steam " );
220 vg_strcat( &conf.link, "-ldl -lpthread -lm "
221 "-lsdkencryptedappticket -lsteam_api " );
222
223 vg_add_blob( proj, "vg/dep/steam/libsteam_api.so", "" );
224 vg_add_blob( proj, "vg/dep/steam/libsdkencryptedappticket.so", "" );
225
226 vg_compiler_run( proj, env, &conf, sources.buffer, "server", k_obj_type_exe );
227 }
228
229 struct compile_result
230 compile_tools( struct vg_project *proj, struct vg_compiler_env *env )
231 {
232 struct vg_compiler_conf conf = {0};
233 return vg_compiler_run( proj, env, &conf, "skaterift_lib.c", "skaterift",
234 k_obj_type_shared );
235 }
236
237 /*
238 * Scripts
239 * -------------------------------------------------------------------------- */
240
241 void s_compile_tools(void)
242 {
243 vg_info( "running script: s_compile_tools(void)\n" );
244
245 struct vg_project proj;
246 vg_project_init( &proj, "bin", "skaterift-tools", NULL, 0 );
247
248 struct vg_compiler_env env = vg_release_env;
249
250 env.platform = k_platform_linux;
251 struct compile_result r0 = compile_tools( &proj, &env );
252
253 env.platform = k_platform_windows;
254 struct compile_result r1 = compile_tools( &proj, &env );
255
256 vg_syscall("cp %s skaterift_blender/", r0.path );
257 vg_syscall("cp %s skaterift_blender/", r1.path );
258 vg_syscall( "zip -r bin/skaterift_blender.zip skaterift_blender/ "
259 "-x skaterift_blender/__pycache__/\\*");
260 }
261
262 void s_release_all(void)
263 {
264 vg_info( "running script: s_release_all(void)\n" );
265
266 struct vg_project content_proj, windows_proj, linux_proj;
267
268 struct vg_compiler_env env = vg_release_env;
269 env.platform = k_platform_anyplatform;
270 vg_project_init( &content_proj, "bin", "skaterift", &env, 1 );
271 build_game_content( &content_proj );
272
273 /* binaries for windows */
274 env = vg_release_env;
275 env.platform = k_platform_windows;
276 vg_project_init( &windows_proj, "bin", "skaterift", &env, 1 );
277 build_game_bin( &windows_proj, &env );
278
279 /* binaries for linux */
280 env = vg_release_env;
281 env.platform = k_platform_linux;
282 vg_project_init( &linux_proj, "bin", "skaterift", &env, 1 );
283 build_game_bin( &linux_proj, &env );
284
285 /* package them up for storage */
286 vg_tarball_project( &content_proj );
287 vg_tarball_project( &linux_proj );
288 vg_tarball_project( &windows_proj );
289
290 /* extreme DRM solutions */
291 FILE *fp = fopen( "dist/bin/DRM", "w" );
292 fputs( "blibby!", fp );
293 fclose( fp );
294 }
295
296 void s_testing_build(void)
297 {
298 vg_info( "running script: s_testing_build(void)\n" );
299
300 struct vg_project test_proj;
301 vg_project_init( &test_proj, "bin", "skaterift-test", NULL, 0 );
302
303 build_game_bin( &test_proj, &vg_test_env );
304 build_game_content( &test_proj );
305 vg_add_blob( &test_proj, "steam_appid.txt", "" );
306 }
307
308 void s_testing_server(void)
309 {
310 vg_info( "running script: s_testing_server(void)\n" );
311
312 struct vg_project test_proj;
313 vg_project_init( &test_proj, "bin", "skaterift-test-server", &vg_test_env, 0 );
314 compile_server( &test_proj, &vg_test_env );
315 }
316
317 int main( int argc, char *argv[] )
318 {
319 char *arg;
320 while( vg_argp( argc, argv ) ){
321 if( vg_long_opt( "release-all" ) )
322 s_release_all();
323
324 if( vg_long_opt( "testing-build" ) )
325 s_testing_build();
326
327 if( vg_long_opt( "testing-server" ) )
328 s_testing_server();
329
330 if( vg_long_opt( "tools" ) )
331 s_compile_tools();
332
333 if( vg_opt('r') )
334 vg_test_env.optimization = 3;
335 }
336
337 vg_success( "All scripts completed\n" );
338 }