Skip to content

Commit 9231bb8

Browse files
committed
More work on level layout procgen
1 parent b4afcff commit 9231bb8

File tree

6 files changed

+179
-9
lines changed

6 files changed

+179
-9
lines changed

assets/levels/ends/1.map

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@
5555
{
5656
"classname" "info_landmark"
5757
"origin" "0 64 8"
58-
"angle" "90"
58+
"angle" "270"
5959
}
6060
// entity 2
6161
{
6262
"classname" "prop_text"
63-
"origin" "24 -528 104"
64-
"angle" "180"
63+
"origin" "32 -520 104"
64+
"angle" "90"
6565
"text" "End Room"
6666
}
6767
// entity 3

assets/levels/halls/1.map

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
{
3838
"classname" "info_landmark"
3939
"origin" "0 64 8"
40-
"angle" "90"
40+
"angle" "270"
4141
}
4242
// entity 2
4343
{
@@ -49,8 +49,8 @@
4949
// entity 3
5050
{
5151
"classname" "prop_text"
52-
"origin" "88 -296 120"
53-
"angle" "180"
52+
"origin" "104 -296 120"
53+
"angle" "90"
5454
"text" "Hallway"
5555
}
5656
// entity 4

assets/levels/halls/2.map

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Game: Generic
2+
// Format: Standard
3+
// entity 0
4+
{
5+
"classname" "worldspawn"
6+
"_tb_def" "external:../../SuperBoardingParty.fgd"
7+
"message" ""
8+
// brush 0
9+
{
10+
( -64 -32 -16 ) ( -64 -31 -16 ) ( -64 -32 -15 ) greybox-green 0 0 0 1 1
11+
( -64 -704 -16 ) ( -64 -704 -15 ) ( -63 -704 -16 ) greybox-green 0 0 0 1 1
12+
( -64 -32 -16 ) ( -63 -32 -16 ) ( -64 -31 -16 ) greybox-green 0 0 0 1 1
13+
( 64 64 0 ) ( 64 65 0 ) ( 65 64 0 ) greybox-green 0 0 0 1 1
14+
( 64 64 0 ) ( 65 64 0 ) ( 64 64 1 ) greybox-green 0 0 0 1 1
15+
( 64 64 0 ) ( 64 64 1 ) ( 64 65 0 ) greybox-green 0 0 0 1 1
16+
}
17+
// brush 1
18+
{
19+
( 56 -48 0 ) ( 56 -47 0 ) ( 56 -48 1 ) greybox-wall 0 0 0 1 1
20+
( 56 -576 0 ) ( 56 -576 1 ) ( 57 -576 0 ) greybox-wall 0 0 0 1 1
21+
( 56 -48 0 ) ( 57 -48 0 ) ( 56 -47 0 ) greybox-wall 0 0 0 1 1
22+
( 64 64 32 ) ( 64 65 32 ) ( 65 64 32 ) greybox-wall 0 0 0 1 1
23+
( 64 64 8 ) ( 65 64 8 ) ( 64 64 9 ) greybox-wall 0 0 0 1 1
24+
( 64 64 8 ) ( 64 64 9 ) ( 64 65 8 ) greybox-wall 0 0 0 1 1
25+
}
26+
// brush 2
27+
{
28+
( -64 -48 0 ) ( -64 -47 0 ) ( -64 -48 1 ) greybox-wall 0 0 0 1 1
29+
( -64 -704 0 ) ( -64 -704 1 ) ( -63 -704 0 ) greybox-wall -8 0 0 1 1
30+
( -64 -48 0 ) ( -63 -48 0 ) ( -64 -47 0 ) greybox-wall -8 0 0 1 1
31+
( -56 64 32 ) ( -56 65 32 ) ( -55 64 32 ) greybox-wall -8 0 0 1 1
32+
( -56 64 8 ) ( -55 64 8 ) ( -56 64 9 ) greybox-wall -8 0 0 1 1
33+
( -56 64 8 ) ( -56 64 9 ) ( -56 65 8 ) greybox-wall 0 0 0 1 1
34+
}
35+
// brush 3
36+
{
37+
( 64 -32 -16 ) ( 64 -31 -16 ) ( 64 -32 -15 ) greybox-green 0 0 0 1 1
38+
( 64 -704 -16 ) ( 64 -704 -15 ) ( 65 -704 -16 ) greybox-green 0 0 0 1 1
39+
( 64 -32 -16 ) ( 65 -32 -16 ) ( 64 -31 -16 ) greybox-green 0 0 0 1 1
40+
( 192 64 0 ) ( 192 65 0 ) ( 193 64 0 ) greybox-green 0 0 0 1 1
41+
( 192 -576 0 ) ( 193 -576 0 ) ( 192 -576 1 ) greybox-green 0 0 0 1 1
42+
( 272 64 0 ) ( 272 64 1 ) ( 272 65 0 ) greybox-green 0 0 0 1 1
43+
}
44+
// brush 4
45+
{
46+
( 56 -576 8 ) ( 56 -575 8 ) ( 56 -576 9 ) greybox-wall 0 0 0 1 1
47+
( 168 -584 0 ) ( 167 -584 0 ) ( 168 -584 1 ) greybox-wall -8 0 180.00002 1 -1
48+
( 168 -584 0 ) ( 168 -583 0 ) ( 167 -584 0 ) greybox-wall 0 8 90 1 1
49+
( 56 -576 32 ) ( 55 -576 32 ) ( 56 -575 32 ) greybox-wall 0 8 90 1 1
50+
( 56 -576 8 ) ( 56 -576 9 ) ( 55 -576 8 ) greybox-wall -8 0 180.00002 1 -1
51+
( 272 -584 0 ) ( 272 -584 1 ) ( 272 -583 0 ) greybox-wall 0 0 0 1 1
52+
}
53+
// brush 5
54+
{
55+
( -56 -696 8 ) ( -56 -695 8 ) ( -56 -696 9 ) greybox-wall 120 0 0 1 1
56+
( 168 -704 0 ) ( 167 -704 0 ) ( 168 -704 1 ) greybox-wall -8 0 180.00002 1 -1
57+
( 168 -704 0 ) ( 168 -703 0 ) ( 167 -704 0 ) greybox-wall 120 8 90 1 1
58+
( 56 -696 32 ) ( 55 -696 32 ) ( 56 -695 32 ) greybox-wall 120 8 90 1 1
59+
( 56 -696 8 ) ( 56 -696 9 ) ( 55 -696 8 ) greybox-wall -8 0 180.00002 1 -1
60+
( 272 -704 0 ) ( 272 -704 1 ) ( 272 -703 0 ) greybox-wall 120 0 0 1 1
61+
}
62+
}
63+
// entity 1
64+
{
65+
"classname" "info_landmark"
66+
"origin" "0 64 8"
67+
"angle" "270"
68+
}
69+
// entity 2
70+
{
71+
"classname" "info_streaming_level"
72+
"origin" "272 -640 8"
73+
"angle" "0"
74+
"level" "assets/levels/rooms"
75+
}
76+
// entity 3
77+
{
78+
"classname" "prop_text"
79+
"origin" "104 -296 120"
80+
"angle" "90"
81+
"text" "Hallway"
82+
}
83+
// entity 4
84+
{
85+
"classname" "light"
86+
"origin" "8 -296 56"
87+
"radius" "15"
88+
}

assets/levels/rooms/1.map

+39-3
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,48 @@
3232
( -376 64 8 ) ( -375 64 8 ) ( -376 64 9 ) greybox-wall 56 0 0 1 1
3333
( -376 64 8 ) ( -376 64 9 ) ( -376 65 8 ) greybox-wall 0 0 0 1 1
3434
}
35+
// brush 3
36+
{
37+
( 104 48 0 ) ( 104 49 0 ) ( 104 48 1 ) greybox-wall-player 0 0 0 1 1
38+
( 104 48 0 ) ( 104 48 1 ) ( 105 48 0 ) greybox-wall-player -8 0 0 1 1
39+
( 104 48 0 ) ( 105 48 0 ) ( 104 49 0 ) greybox-wall-player -8 0 0 1 1
40+
( 248 64 128 ) ( 248 65 128 ) ( 249 64 128 ) greybox-wall-player -8 0 0 1 1
41+
( 248 64 16 ) ( 249 64 16 ) ( 248 64 17 ) greybox-wall-player -8 0 0 1 1
42+
( 248 64 16 ) ( 248 64 17 ) ( 248 65 16 ) greybox-wall-player 0 0 0 1 1
43+
}
44+
// brush 4
45+
{
46+
( -376 48 0 ) ( -376 49 0 ) ( -376 48 1 ) greybox-wall-player 0 0 0 1 1
47+
( -376 48 0 ) ( -376 48 1 ) ( -375 48 0 ) greybox-wall-player 88 0 0 1 1
48+
( -376 48 0 ) ( -375 48 0 ) ( -376 49 0 ) greybox-wall-player 88 0 0 1 1
49+
( -232 64 128 ) ( -232 65 128 ) ( -231 64 128 ) greybox-wall-player 88 0 0 1 1
50+
( -232 64 16 ) ( -231 64 16 ) ( -232 64 17 ) greybox-wall-player 88 0 0 1 1
51+
( -232 64 16 ) ( -232 64 17 ) ( -232 65 16 ) greybox-wall-player 0 0 0 1 1
52+
}
53+
// brush 5
54+
{
55+
( -376 -704 16 ) ( -376 -704 17 ) ( -376 -705 16 ) greybox-wall-player 0 0 179.99998 1 -1
56+
( -376 -704 16 ) ( -377 -704 16 ) ( -376 -704 17 ) greybox-wall-player -8 0 180.00002 1 -1
57+
( -232 -688 0 ) ( -233 -688 0 ) ( -232 -689 0 ) greybox-wall-player -8 0 179.99998 1 1
58+
( -376 -704 128 ) ( -376 -705 128 ) ( -377 -704 128 ) greybox-wall-player -8 0 179.99998 1 1
59+
( -232 -688 0 ) ( -232 -688 1 ) ( -233 -688 0 ) greybox-wall-player -8 0 180.00002 1 -1
60+
( -232 -688 0 ) ( -232 -689 0 ) ( -232 -688 1 ) greybox-wall-player 0 0 179.99998 1 -1
61+
}
62+
// brush 6
63+
{
64+
( 104 -704 16 ) ( 104 -704 17 ) ( 104 -705 16 ) greybox-wall-player 0 0 179.99998 1 -1
65+
( 104 -704 16 ) ( 103 -704 16 ) ( 104 -704 17 ) greybox-wall-player -40 0 180.00002 1 -1
66+
( 248 -688 0 ) ( 247 -688 0 ) ( 248 -689 0 ) greybox-wall-player -40 0 179.99998 1 1
67+
( 104 -704 128 ) ( 104 -705 128 ) ( 103 -704 128 ) greybox-wall-player -40 0 179.99998 1 1
68+
( 248 -688 0 ) ( 248 -688 1 ) ( 247 -688 0 ) greybox-wall-player -40 0 180.00002 1 -1
69+
( 248 -688 0 ) ( 248 -689 0 ) ( 248 -688 1 ) greybox-wall-player 0 0 179.99998 1 -1
70+
}
3571
}
3672
// entity 1
3773
{
3874
"classname" "info_landmark"
3975
"origin" "0 64 8"
40-
"angle" "90"
76+
"angle" "270"
4177
}
4278
// entity 2
4379
{
@@ -49,8 +85,8 @@
4985
// entity 3
5086
{
5187
"classname" "prop_text"
52-
"origin" "8 -280 72"
53-
"angle" "180"
88+
"origin" "24 -280 72"
89+
"angle" "90"
5490
"text" "Room"
5591
}
5692
// entity 4

assets/test.map

+7
Original file line numberDiff line numberDiff line change
@@ -2557,3 +2557,10 @@
25572557
"radius" "4"
25582558
"brightness" "1"
25592559
}
2560+
// entity 65
2561+
{
2562+
"classname" "info_streaming_level"
2563+
"origin" "1488 -666 -120"
2564+
"angle" "270"
2565+
"level" "assets/levels/halls"
2566+
}

entities/quakemap.zig

+39
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ pub const QuakeMapComponent = struct {
114114
self.owner_id = self.owner.id;
115115
}
116116

117+
self.findLevel() catch {
118+
delve.debug.log("Could not find random level!", .{});
119+
};
120+
117121
self.init_world() catch {
118122
delve.debug.log("Could not init quake map component!", .{});
119123
};
@@ -177,6 +181,41 @@ pub const QuakeMapComponent = struct {
177181
return anim_textures;
178182
}
179183

184+
pub fn findLevel(self: *QuakeMapComponent) !void {
185+
var rand = std.rand.DefaultPrng.init(@bitCast(std.time.milliTimestamp()));
186+
var random = rand.random();
187+
188+
// Read through the filename to check if it's a directory, then list files
189+
var dir = try std.fs.cwd().openDir(self.filename.str, .{ .iterate = true });
190+
defer dir.close();
191+
192+
var found_maps = std.ArrayList([]const u8).init(delve.mem.getAllocator());
193+
defer found_maps.deinit();
194+
195+
var it = dir.iterate();
196+
while (try it.next()) |entry| {
197+
if (entry.kind == .file) {
198+
if (!std.mem.endsWith(u8, entry.name, ".map"))
199+
continue;
200+
201+
try found_maps.append(entry.name);
202+
}
203+
}
204+
205+
if (found_maps.items.len == 0)
206+
return;
207+
208+
const picked_index = random.intRangeAtMost(usize, 0, found_maps.items.len - 1);
209+
const picked_file = found_maps.items[picked_index];
210+
delve.debug.log("Picked random map file: {s}", .{picked_file});
211+
212+
var new_path = std.ArrayList(u8).init(delve.mem.getAllocator());
213+
defer new_path.deinit();
214+
215+
try new_path.writer().print("{s}/{s}", .{ self.filename.str, picked_file });
216+
self.filename.set(new_path.items);
217+
}
218+
180219
pub fn init_world(self: *QuakeMapComponent) !void {
181220
const allocator = delve.mem.getAllocator();
182221

0 commit comments

Comments
 (0)