Skip to content

Commit 77a5e7b

Browse files
committed
initial implementation
0 parents  commit 77a5e7b

File tree

4 files changed

+378
-0
lines changed

4 files changed

+378
-0
lines changed

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.zig text eol=lf
2+
*.zon text eol=lf

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.zig-cache/
2+
zig-out/

build.zig

Lines changed: 322 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,322 @@
1+
const std = @import("std");
2+
const Build = std.Build;
3+
4+
pub fn build(b: *Build) void {
5+
const target = b.standardTargetOptions(.{});
6+
const optimize = b.standardOptimizeOption(.{});
7+
8+
const VVVVVV_dep = b.dependency("VVVVVV", .{});
9+
const sdl_dep = b.dependency("sdl", .{
10+
.target = target,
11+
.optimize = optimize,
12+
});
13+
const physfs_dep = b.dependency("physfs", .{});
14+
const zipcmdline_dep = b.dependency("zipcmdline", .{});
15+
const makeandplay_dep = b.dependency("makeandplay", .{});
16+
17+
const exe = b.addExecutable(.{
18+
.name = "VVVVVV",
19+
.target = target,
20+
.optimize = optimize,
21+
});
22+
23+
exe.addIncludePath(physfs_dep.path("src"));
24+
exe.addIncludePath(physfs_dep.path("extras"));
25+
26+
exe.addCSourceFiles(.{
27+
.root = VVVVVV_dep.path("."),
28+
.files = &src,
29+
});
30+
exe.addCSourceFiles(.{
31+
.root = physfs_dep.path("."),
32+
.files = &physfs_src,
33+
});
34+
35+
// TODO: if steam enabled add SteamNetwork.c
36+
// TODO: if GOG enabled add GOGNetwork.c
37+
38+
exe.linkLibCpp();
39+
exe.linkLibrary(addPhysfs(b, target, optimize));
40+
{
41+
const sdl = sdl_dep.artifact("SDL2");
42+
exe.linkLibrary(sdl);
43+
const header_tree = sdl.installed_headers_include_tree orelse @panic("?");
44+
exe.addIncludePath(header_tree.getDirectory().path(b, "SDL2"));
45+
exe.linkLibrary(addFAudio(b, target, optimize, sdl));
46+
}
47+
exe.linkLibrary(addTinyXml2(b, target, optimize));
48+
exe.linkLibrary(addCHashmap(b, target, optimize));
49+
exe.linkLibrary(addSheenBidi(b, target, optimize));
50+
exe.linkLibrary(addLodepng(b, target, optimize));
51+
52+
b.installArtifact(exe);
53+
54+
{
55+
const zip_exe = zipcmdline_dep.artifact("zip");
56+
const run_zip = b.addRunArtifact(zip_exe);
57+
const out_zip_file = run_zip.addOutputFileArg("data.zip");
58+
run_zip.addDirectoryArg(makeandplay_dep.path("."));
59+
b.getInstallStep().dependOn(
60+
&b.addInstallBinFile(out_zip_file, "data.zip").step
61+
);
62+
}
63+
64+
const run_cmd = b.addRunArtifact(exe);
65+
run_cmd.step.dependOn(b.getInstallStep());
66+
if (b.args) |args| {
67+
run_cmd.addArgs(args);
68+
}
69+
const run_step = b.step("run", "Run the app");
70+
run_step.dependOn(&run_cmd.step);
71+
}
72+
73+
fn addPhysfs(
74+
b: *Build,
75+
target: Build.ResolvedTarget,
76+
optimize: std.builtin.OptimizeMode,
77+
) *Build.Step.Compile {
78+
const dep = b.dependency("physfs", .{});
79+
const root = dep.path(".");
80+
const lib = b.addStaticLibrary(.{
81+
.name = "physfs",
82+
.target = target,
83+
.optimize = optimize,
84+
});
85+
lib.addCSourceFiles(.{
86+
.root = root,
87+
.files = &.{
88+
"src/physfs.c",
89+
"src/physfs_archiver_dir.c",
90+
"src/physfs_archiver_unpacked.c",
91+
"src/physfs_archiver_zip.c",
92+
"src/physfs_byteorder.c",
93+
"src/physfs_unicode.c",
94+
"src/physfs_platform_posix.c",
95+
"src/physfs_platform_unix.c",
96+
"src/physfs_platform_windows.c",
97+
"src/physfs_platform_haiku.cpp",
98+
"src/physfs_platform_android.c",
99+
},
100+
.flags = &.{
101+
"-DPHYSFS_SUPPORTS_DEFAULT=0",
102+
"-DPHYSFS_SUPPORTS_ZIP=1",
103+
},
104+
});
105+
lib.linkLibCpp();
106+
return lib;
107+
}
108+
109+
110+
fn addTinyXml2(
111+
b: *Build,
112+
target: Build.ResolvedTarget,
113+
optimize: std.builtin.OptimizeMode,
114+
) *Build.Step.Compile {
115+
const dep = b.dependency("tinyxml2", .{});
116+
const root = dep.path(".");
117+
const lib = b.addStaticLibrary(.{
118+
.name = "tinyxml2",
119+
.target = target,
120+
.optimize = optimize,
121+
});
122+
lib.addCSourceFiles(.{
123+
.root = root,
124+
.files = &.{
125+
"tinyxml2.cpp",
126+
},
127+
});
128+
lib.installHeader(
129+
root.path(b, "tinyxml2.h"),
130+
"tinyxml2.h",
131+
);
132+
lib.linkLibCpp();
133+
return lib;
134+
}
135+
136+
fn addCHashmap(
137+
b: *Build,
138+
target: Build.ResolvedTarget,
139+
optimize: std.builtin.OptimizeMode,
140+
) *Build.Step.Compile {
141+
const dep = b.dependency("c_hashmap", .{});
142+
const root = dep.path(".");
143+
const lib = b.addStaticLibrary(.{
144+
.name = "c-hashmap",
145+
.target = target,
146+
.optimize = optimize,
147+
});
148+
lib.addCSourceFiles(.{
149+
.root = root,
150+
.files = &.{
151+
"map.c",
152+
},
153+
});
154+
lib.installHeader(
155+
root.path(b, "map.h"),
156+
"c-hashmap/map.h",
157+
);
158+
lib.linkLibCpp();
159+
return lib;
160+
}
161+
162+
fn addSheenBidi(
163+
b: *Build,
164+
target: Build.ResolvedTarget,
165+
optimize: std.builtin.OptimizeMode,
166+
) *Build.Step.Compile {
167+
const dep = b.dependency("sheen_bidi", .{});
168+
const root = dep.path(".");
169+
const lib = b.addStaticLibrary(.{
170+
.name = "sheenbidi",
171+
.target = target,
172+
.optimize = optimize,
173+
});
174+
const headers_path = root.path(b, "Headers");
175+
lib.addIncludePath(headers_path);
176+
lib.addCSourceFiles(.{
177+
.root = root,
178+
.files = &.{
179+
"Source/SheenBidi.c",
180+
},
181+
.flags = &.{ "-DSB_CONFIG_UNITY" },
182+
});
183+
lib.installHeadersDirectory(headers_path, ".", .{});
184+
lib.linkLibCpp();
185+
return lib;
186+
}
187+
188+
fn addFAudio(
189+
b: *Build,
190+
target: Build.ResolvedTarget,
191+
optimize: std.builtin.OptimizeMode,
192+
sdl: *Build.Step.Compile,
193+
) *Build.Step.Compile {
194+
const dep = b.dependency("faudio", .{});
195+
const root = dep.path(".");
196+
const lib = b.addStaticLibrary(.{
197+
.name = "faudio",
198+
.target = target,
199+
.optimize = optimize,
200+
});
201+
const include_path = root.path(b, "include");
202+
lib.addIncludePath(include_path);
203+
const header_tree = sdl.installed_headers_include_tree orelse @panic("?");
204+
lib.addIncludePath(header_tree.getDirectory().path(b, "SDL2"));
205+
206+
lib.addCSourceFiles(.{
207+
.root = root,
208+
.files = &.{
209+
"src/FAudio.c",
210+
"src/FAudio_internal.c",
211+
"src/FAudio_internal_simd.c",
212+
"src/FAudio_operationset.c",
213+
"src/FAudio_platform_sdl2.c",
214+
},
215+
});
216+
lib.installHeadersDirectory(include_path, ".", .{});
217+
lib.installHeadersDirectory(root.path(b, "src"), ".", .{});
218+
lib.linkLibCpp();
219+
lib.linkLibrary(sdl);
220+
221+
return lib;
222+
}
223+
224+
fn addLodepng(
225+
b: *Build,
226+
target: Build.ResolvedTarget,
227+
optimize: std.builtin.OptimizeMode,
228+
) *Build.Step.Compile {
229+
const dep = b.dependency("lodepng", .{});
230+
const root = dep.path(".");
231+
const lib = b.addStaticLibrary(.{
232+
.name = "lodepng",
233+
.target = target,
234+
.optimize = optimize,
235+
});
236+
lib.addIncludePath(root);
237+
238+
// The Lore:
239+
// we generate a ".c" file and use it to include lodepng.cpp so that
240+
// it gets compiled as a C file and doesn't mangle the symbols. We don't
241+
// want the symbols mangled becuase VVVVVV decided it was better to copy
242+
// the 3 function prototypes it's using from lodepng and wrap them in
243+
// extern "C" rather than just using their header file.
244+
const generate_files = b.addWriteFiles();
245+
const c_wrapper = generate_files.add(
246+
"lodepng.c",
247+
"#include <lodepng.cpp>",
248+
);
249+
250+
// workaround bug in Zig build system (TODO: create a minimal reproduction and file a bug)
251+
lib.step.dependOn(&generate_files.step);
252+
253+
lib.addCSourceFiles(.{
254+
.root = c_wrapper.dirname(),
255+
.files = &.{
256+
"lodepng.c",
257+
},
258+
.flags = &.{
259+
"-DLODEPNG_NO_COMPILE_ALLOCATORS",
260+
"-DLODEPNG_NO_COMPILE_DISK",
261+
},
262+
});
263+
lib.linkLibCpp();
264+
return lib;
265+
}
266+
267+
const src = [_][]const u8 {
268+
"desktop_version/src/BinaryBlob.cpp",
269+
"desktop_version/src/BlockV.cpp",
270+
"desktop_version/src/ButtonGlyphs.cpp",
271+
"desktop_version/src/CustomLevels.cpp",
272+
"desktop_version/src/CWrappers.cpp",
273+
"desktop_version/src/Editor.cpp",
274+
"desktop_version/src/Ent.cpp",
275+
"desktop_version/src/Entity.cpp",
276+
"desktop_version/src/FileSystemUtils.cpp",
277+
"desktop_version/src/Finalclass.cpp",
278+
"desktop_version/src/Font.cpp",
279+
"desktop_version/src/FontBidi.cpp",
280+
"desktop_version/src/Game.cpp",
281+
"desktop_version/src/Graphics.cpp",
282+
"desktop_version/src/GraphicsResources.cpp",
283+
"desktop_version/src/GraphicsUtil.cpp",
284+
"desktop_version/src/Input.cpp",
285+
"desktop_version/src/KeyPoll.cpp",
286+
"desktop_version/src/Labclass.cpp",
287+
"desktop_version/src/LevelDebugger.cpp",
288+
"desktop_version/src/Localization.cpp",
289+
"desktop_version/src/LocalizationMaint.cpp",
290+
"desktop_version/src/LocalizationStorage.cpp",
291+
"desktop_version/src/Logic.cpp",
292+
"desktop_version/src/Map.cpp",
293+
"desktop_version/src/Music.cpp",
294+
"desktop_version/src/Otherlevel.cpp",
295+
"desktop_version/src/preloader.cpp",
296+
"desktop_version/src/Render.cpp",
297+
"desktop_version/src/RenderFixed.cpp",
298+
"desktop_version/src/RoomnameTranslator.cpp",
299+
"desktop_version/src/Screen.cpp",
300+
"desktop_version/src/Script.cpp",
301+
"desktop_version/src/Scripts.cpp",
302+
"desktop_version/src/Spacestation2.cpp",
303+
"desktop_version/src/TerminalScripts.cpp",
304+
"desktop_version/src/Textbox.cpp",
305+
"desktop_version/src/Tower.cpp",
306+
"desktop_version/src/UtilityClass.cpp",
307+
"desktop_version/src/WarpClass.cpp",
308+
"desktop_version/src/XMLUtils.cpp",
309+
"desktop_version/src/main.cpp",
310+
"desktop_version/src/DeferCallbacks.c",
311+
"desktop_version/src/GlitchrunnerMode.c",
312+
"desktop_version/src/Network.c",
313+
"desktop_version/src/Textbook.c",
314+
"desktop_version/src/ThirdPartyDeps.c",
315+
"desktop_version/src/UTF8.c",
316+
"desktop_version/src/VFormat.c",
317+
"desktop_version/src/Vlogging.c",
318+
"desktop_version/src/Xoshiro.c",
319+
};
320+
const physfs_src = [_][]const u8 {
321+
"extras/physfsrwops.c",
322+
};

build.zig.zon

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
.{
2+
.name = "VVVVVV",
3+
.version = "0.0.0",
4+
.dependencies = .{
5+
.VVVVVV = .{
6+
.url = "https://github.com/TerryCavanagh/VVVVVV/archive/6df7d5df8af6787e3aee1f4df6639b5aa8e3884c.tar.gz",
7+
.hash = "12205a24de32aa7d0c9857320b6fb5d644b7c7af1d60dff4f5e0257881f9b0c98f3d",
8+
},
9+
.sdl = .{
10+
.url = "https://github.com/allyourcodebase/SDL/archive/d3ce72923ada60041a6a4a92628408b0908ce4e0.tar.gz",
11+
.hash = "1220c8b7fffe055e95a991cbaf5d86b4d5ea380294b0b4326b2ee46110613cf7972e",
12+
},
13+
// TODO: add a command that maybe checks and/or updates this dependency if/when we update VVVVVV
14+
.physfs = .{
15+
.url = "https://github.com/icculus/physfs/archive/bfa7997c671957eb0a340ff1cf3c634e6269904a.tar.gz",
16+
.hash = "12206d6eb8b5166a4ab0ae2552c847c6f85cf3400e60dfe3943c526a735dd203dde7",
17+
},
18+
.tinyxml2 = .{
19+
.url = "https://github.com/leethomason/tinyxml2/archive/e45d9d16d430a3f5d3eee9fe40d5e194e1e5e63a.tar.gz",
20+
.hash = "1220937985193cd00baee7d76d588eaca8eb5d015e9b7949567a6370c8810a2187d7",
21+
},
22+
.c_hashmap = .{
23+
.url = "https://github.com/Mashpoe/c-hashmap/archive/dedf70e0a769bc52a17a36da840d96770fc26d12.tar.gz",
24+
.hash = "12204e526203ab02f71541200bf3b6d3196cd18d2bf2289f160f07d43d6ea6acbfe8",
25+
},
26+
.sheen_bidi = .{
27+
.url = "https://github.com/Tehreer/SheenBidi/archive/e667eb3a63ee704194f8d94834d8e12b18db5b21.tar.gz",
28+
.hash = "1220f803c083768789d9e2f123d8d349662b8b01c9db621faf006f4763597ed44da2",
29+
},
30+
.faudio = .{
31+
.url = "https://github.com/FNA-XNA/FAudio/archive/38e9da7264641c9cc69a80d09082f166d9b8eaf9.tar.gz",
32+
.hash = "122074cfa2d5ead7ce2907c81142ba41bb2da74a4996c4f7c418241a05eb72619eba",
33+
},
34+
.lodepng = .{
35+
.url = "https://github.com/lvandeve/lodepng/archive/18964554bc769255401942e0e6dfd09f2fab2093.tar.gz",
36+
.hash = "1220521ded1568db149ba4bd4e51aef847d31b760f402b6719137c1fa4b67d2c17e9",
37+
},
38+
.zipcmdline = .{
39+
.url = "https://github.com/marler8997/zipcmdline/archive/436c68f8993a355f6ef0c65b43fd7d56d06bcedc.tar.gz",
40+
.hash = "12203409341d97b9ed71926213814b88c3d3181ea944192278fc73357a2de6ca22dc",
41+
},
42+
.makeandplay = .{
43+
.url = "https://thelettervsixtim.es/makeandplay/data.zip",
44+
.hash = "12205532e83dce4f3ad60bf45d9f4386961bdf7d1754404b6714fefaf3e7e6ef18de",
45+
},
46+
},
47+
48+
.paths = .{
49+
"build.zig",
50+
"build.zig.zon",
51+
},
52+
}

0 commit comments

Comments
 (0)