Auto-tile circuits
parent
f88d689404
commit
60c6a5df8d
|
@ -14,6 +14,10 @@ pub const Options = struct {
|
|||
alloc: std.mem.Allocator,
|
||||
level: world.Level,
|
||||
tileset: world.AutoTileset,
|
||||
conduit: world.AutoTileset,
|
||||
plug: world.AutoTileset,
|
||||
switch_on: world.AutoTileset,
|
||||
switch_off: world.AutoTileset,
|
||||
};
|
||||
|
||||
fn is_solid(tile: u7) bool {
|
||||
|
@ -55,9 +59,10 @@ pub fn extractLevel(opt: Options) !void {
|
|||
var autotiles = try alloc.alloc(?AutoTile, size);
|
||||
defer alloc.free(autotiles);
|
||||
|
||||
// Auto generate walls
|
||||
{
|
||||
var i: usize = 0;
|
||||
while (i < level.tiles.len) : (i += 1) {
|
||||
while (i < size) : (i += 1) {
|
||||
const x = @mod(i, width);
|
||||
const y = @divTrunc(i, width);
|
||||
const stride = width;
|
||||
|
@ -111,10 +116,78 @@ pub fn extractLevel(opt: Options) !void {
|
|||
const li = autotile.to_u4();
|
||||
const tile = tileset.lookup[li];
|
||||
map.tiles[i] = tile;
|
||||
} else {
|
||||
}
|
||||
}
|
||||
|
||||
// Auto generate circuit
|
||||
// Re-use autotiles to save memory
|
||||
{
|
||||
var i: usize = 0;
|
||||
while (i < size) : (i += 1) {
|
||||
const x = @mod(i, width);
|
||||
const y = @divTrunc(i, width);
|
||||
w4.trace("{}, {}: {}", .{ x, y, map.tiles[i] });
|
||||
const stride = width;
|
||||
|
||||
if (circuit_map[i] == .None) {
|
||||
autotiles[i] = null;
|
||||
continue;
|
||||
}
|
||||
|
||||
const out_of_bounds = switch (circuit_map[i]) {
|
||||
.Join, .Source => true,
|
||||
else => false,
|
||||
};
|
||||
var north = false;
|
||||
var south = false;
|
||||
var west = false;
|
||||
var east = false;
|
||||
|
||||
// Check horizontal neighbors
|
||||
if (x == 0) {
|
||||
west = out_of_bounds;
|
||||
east = circuit_map[i + 1] != .None;
|
||||
} else if (x == width - 1) {
|
||||
west = circuit_map[i - 1] != .None;
|
||||
east = out_of_bounds;
|
||||
} else {
|
||||
west = circuit_map[i - 1] != .None;
|
||||
east = circuit_map[i + 1] != .None;
|
||||
}
|
||||
|
||||
// Check vertical neighbours
|
||||
if (y == 0) {
|
||||
north = out_of_bounds;
|
||||
south = circuit_map[i + stride] != .None;
|
||||
} else if (y == height - 1) {
|
||||
north = circuit_map[i - stride] != .None;
|
||||
south = out_of_bounds;
|
||||
} else {
|
||||
north = circuit_map[i - stride] != .None;
|
||||
south = circuit_map[i + stride] != .None;
|
||||
}
|
||||
|
||||
autotiles[i] = AutoTile{
|
||||
.North = north,
|
||||
.South = south,
|
||||
.West = west,
|
||||
.East = east,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
for (autotiles) |autotile_opt, i| {
|
||||
if (autotile_opt) |autotile| {
|
||||
const li = autotile.to_u4();
|
||||
const tile = switch (circuit_map[i]) {
|
||||
.Conduit, .Source, .Join => opt.conduit.lookup[li],
|
||||
.Switch_On => opt.switch_on.lookup[li],
|
||||
.Switch_Off => opt.switch_off.lookup[li],
|
||||
.Plug => opt.plug.lookup[li],
|
||||
.And => 60,
|
||||
.Xor => 62,
|
||||
else => 0,
|
||||
};
|
||||
circuit.map[i] = tile;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,6 +62,78 @@ pub fn start() !void {
|
|||
22, // South-East-West
|
||||
0, // South-East-West-North
|
||||
}},
|
||||
.conduit = world.AutoTileset{ .lookup = .{
|
||||
42, // Island
|
||||
58, // North
|
||||
59, // West
|
||||
41, // West-North
|
||||
57, // East
|
||||
40, // East-North
|
||||
26, // East-West
|
||||
73, // East-West-North
|
||||
56, // South
|
||||
27, // South-North
|
||||
25, // South-West
|
||||
74, // South-West-North
|
||||
24, // South-East
|
||||
75, // South-East-North
|
||||
72, // South-East-West
|
||||
43, // South-East-West-North
|
||||
} },
|
||||
.plug = world.AutoTileset{ .lookup = .{
|
||||
02, // Island
|
||||
45, // North
|
||||
46, // West
|
||||
02, // West-North
|
||||
47, // East
|
||||
02, // East-North
|
||||
02, // East-West
|
||||
02, // East-West-North
|
||||
44, // South
|
||||
02, // South-North
|
||||
02, // South-West
|
||||
02, // South-West-North
|
||||
02, // South-East
|
||||
02, // South-East-North
|
||||
02, // South-East-West
|
||||
02, // South-East-West-North
|
||||
} },
|
||||
.switch_off = world.AutoTileset{ .lookup = .{
|
||||
02, // Island
|
||||
02, // North
|
||||
02, // West
|
||||
02, // West-North
|
||||
02, // East
|
||||
02, // East-North
|
||||
02, // East-West
|
||||
02, // East-West-North
|
||||
02, // South
|
||||
32, // South-North
|
||||
02, // South-West
|
||||
29, // South-West-North
|
||||
02, // South-East
|
||||
31, // South-East-North
|
||||
02, // South-East-West
|
||||
02, // South-East-West-North
|
||||
} },
|
||||
.switch_on = world.AutoTileset{ .lookup = .{
|
||||
02, // Island
|
||||
02, // North
|
||||
02, // West
|
||||
02, // West-North
|
||||
02, // East
|
||||
02, // East-North
|
||||
02, // East-West
|
||||
02, // East-West-North
|
||||
02, // South
|
||||
48, // South-North
|
||||
02, // South-West
|
||||
28, // South-West-North
|
||||
02, // South-East
|
||||
02, // South-East-North
|
||||
30, // South-East-West
|
||||
02, // South-East-West-North
|
||||
} },
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue