Partially fix circuits and wires
parent
dd26d1f093
commit
e8ebe43de6
BIN
assets/tiles.png
BIN
assets/tiles.png
Binary file not shown.
Before Width: | Height: | Size: 654 B After Width: | Height: | Size: 655 B |
File diff suppressed because one or more lines are too long
139
src/circuit.zig
139
src/circuit.zig
|
@ -10,31 +10,37 @@ pub fn is_circuit(tile: u8) bool {
|
|||
}
|
||||
|
||||
pub fn is_plug(tile: u8) bool {
|
||||
return (tile >= 43 and tile <= 46) or tile == 41;
|
||||
return tile >= 17 and tile <= 20;
|
||||
}
|
||||
|
||||
pub fn is_conduit(tile: u8) bool {
|
||||
return (tile >= 23 and tile <= 26) or
|
||||
(tile >= 39 and tile <= 42) or
|
||||
(tile >= 55 and tile <= 58) or
|
||||
(tile >= 71 and tile <= 74);
|
||||
return tile >= 97 and tile <= 112;
|
||||
}
|
||||
|
||||
pub fn is_switch(tile: u8) bool {
|
||||
return tile >= 27 and tile <= 30;
|
||||
return tile >= 25 and tile <= 32;
|
||||
}
|
||||
|
||||
pub fn is_logic(tile: u8) bool {
|
||||
return tile >= 59 and tile <= 62;
|
||||
return tile >= 21 and tile <= 24;
|
||||
}
|
||||
|
||||
pub fn toggle_switch(tile: u8) u8 {
|
||||
return switch (tile) {
|
||||
// Tee west
|
||||
25 => 26,
|
||||
26 => 25,
|
||||
// Tee east
|
||||
27 => 28,
|
||||
28 => 27,
|
||||
// Vertical
|
||||
29 => 30,
|
||||
30 => 29,
|
||||
else => unreachable,
|
||||
// Horizontal
|
||||
31 => 32,
|
||||
32 => 21,
|
||||
// Not a switch, pass tile through
|
||||
else => tile,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -68,79 +74,47 @@ const Current = [4]bool;
|
|||
/// Returns sides that can conduct current
|
||||
fn get_inputs(tile: u8) Current {
|
||||
return switch (tile) {
|
||||
// Corners
|
||||
23 => .{ false, true, true, false },
|
||||
24 => .{ false, false, true, true },
|
||||
39 => .{ true, true, false, false },
|
||||
40 => .{ true, false, false, true },
|
||||
// Straight
|
||||
25 => .{ false, true, false, true },
|
||||
26 => .{ true, false, true, false },
|
||||
// Cross
|
||||
41 => .{ false, false, false, false },
|
||||
42 => .{ true, true, true, true },
|
||||
// Ends
|
||||
55 => .{ false, false, true, false },
|
||||
56 => .{ false, true, false, false },
|
||||
57 => .{ true, false, false, false },
|
||||
58 => .{ false, false, false, true },
|
||||
// Tees
|
||||
71 => .{ false, true, true, true },
|
||||
72 => .{ true, true, false, true },
|
||||
73 => .{ true, false, true, true },
|
||||
74 => .{ true, true, true, false },
|
||||
// Plugs
|
||||
43 => .{ false, false, true, false },
|
||||
44 => .{ true, false, false, false },
|
||||
45 => .{ false, false, false, true },
|
||||
46 => .{ false, true, false, false },
|
||||
// Switch
|
||||
27, 28, 29, 30 => .{ true, false, true, false },
|
||||
// Logic
|
||||
59 => .{ false, true, false, true },
|
||||
60 => .{ false, false, true, false },
|
||||
61 => .{ false, true, false, true },
|
||||
// Conduit recieves from every side
|
||||
17...20,
|
||||
43...47,
|
||||
97...113,
|
||||
=> .{ true, true, true, true },
|
||||
// Switch_On
|
||||
25,
|
||||
27,
|
||||
30,
|
||||
=> .{ true, false, true, false },
|
||||
// Switch_Off
|
||||
26,
|
||||
28,
|
||||
=> .{ false, false, true, true },
|
||||
// And, Xor
|
||||
21,
|
||||
23,
|
||||
=> .{ false, true, false, true },
|
||||
// Not
|
||||
22 => .{ false, false, true, false },
|
||||
else => .{ false, false, false, false },
|
||||
};
|
||||
}
|
||||
|
||||
fn get_outputs(tile: u8) Current {
|
||||
return switch (tile) {
|
||||
// Corners
|
||||
23 => .{ false, true, true, false },
|
||||
24 => .{ false, false, true, true },
|
||||
39 => .{ true, true, false, false },
|
||||
40 => .{ true, false, false, true },
|
||||
// Straight
|
||||
25 => .{ false, true, false, true },
|
||||
// Conduit goes out every side
|
||||
17...21,
|
||||
43...47,
|
||||
97...113,
|
||||
=> .{ true, true, true, true },
|
||||
// Switches
|
||||
// Tee west
|
||||
25 => .{ false, false, true, true },
|
||||
26 => .{ true, false, true, false },
|
||||
// Cross
|
||||
41 => .{ false, false, false, false },
|
||||
42 => .{ true, true, true, true },
|
||||
// Ends
|
||||
55 => .{ false, false, true, false },
|
||||
56 => .{ false, true, false, false },
|
||||
57 => .{ true, false, false, false },
|
||||
58 => .{ false, false, false, true },
|
||||
// Tees
|
||||
71 => .{ false, true, true, true },
|
||||
72 => .{ true, true, false, true },
|
||||
73 => .{ true, false, true, true },
|
||||
74 => .{ true, true, true, false },
|
||||
// Plugs
|
||||
43 => .{ false, false, true, false },
|
||||
44 => .{ true, false, false, false },
|
||||
45 => .{ false, false, false, true },
|
||||
46 => .{ false, true, false, false },
|
||||
// Switch
|
||||
27, 29 => .{ true, false, true, false },
|
||||
28 => .{ false, false, false, true },
|
||||
30 => .{ false, true, false, false },
|
||||
// Logic
|
||||
// Calculated in fill
|
||||
// 59 => .{ false, false, false, false },
|
||||
// 60 => .{ true, false, false, false },
|
||||
// 61 => .{ true, false, false, false },
|
||||
// Tee east
|
||||
27 => .{ false, true, true, false },
|
||||
28 => .{ true, false, true, false },
|
||||
// Vertical
|
||||
29 => .{ false, false, true, false },
|
||||
30 => .{ true, false, true, false },
|
||||
else => .{ false, false, false, false },
|
||||
};
|
||||
}
|
||||
|
@ -149,9 +123,9 @@ const Logic = union(enum) { Not, And, Xor };
|
|||
|
||||
fn get_logic(tile: u8) ?Logic {
|
||||
return switch (tile) {
|
||||
59 => .And,
|
||||
60 => .Not,
|
||||
61 => .Xor,
|
||||
21 => .And,
|
||||
22 => .Not,
|
||||
23 => .Xor,
|
||||
else => null,
|
||||
};
|
||||
}
|
||||
|
@ -160,13 +134,10 @@ const Plugs = [4]bool;
|
|||
/// Returns sides where wires may be plugged
|
||||
fn get_plugs(tile: u8) Plugs {
|
||||
return switch (tile) {
|
||||
// Plugs
|
||||
43 => .{ true, false, false, false },
|
||||
44 => .{ false, false, true, false },
|
||||
45 => .{ false, true, false, false },
|
||||
46 => .{ false, false, false, true },
|
||||
// Cross
|
||||
41 => .{ true, true, true, true },
|
||||
17 => .{ false, false, true, false },
|
||||
18 => .{ false, false, false, true },
|
||||
19 => .{ false, true, false, false },
|
||||
20 => .{ true, false, false, false },
|
||||
else => .{ false, false, false, false },
|
||||
};
|
||||
}
|
||||
|
|
|
@ -132,6 +132,8 @@ pub fn extractLevel(opt: Options) !void {
|
|||
const y = @divTrunc(i, width);
|
||||
const stride = width;
|
||||
|
||||
if (circuit_map[i] == .Source) circuit.addSource(.{@intCast(i32, x), @intCast(i32, y)});
|
||||
|
||||
if (circuit_map[i] == .None) {
|
||||
autotiles[i] = null;
|
||||
continue;
|
||||
|
@ -186,8 +188,8 @@ pub fn extractLevel(opt: Options) !void {
|
|||
.Switch_On => opt.switch_on.find(autotile),
|
||||
.Switch_Off => opt.switch_off.find(autotile),
|
||||
.Plug => opt.plug.find(autotile),
|
||||
.And => 60,
|
||||
.Xor => 62,
|
||||
.And => 21,
|
||||
.Xor => 23,
|
||||
else => 0,
|
||||
};
|
||||
circuit.map[i] = tile;
|
||||
|
|
|
@ -268,16 +268,19 @@ pub fn start() !void {
|
|||
_ = try wires.resize(0);
|
||||
var a: usize = 0;
|
||||
while (level.getWire(a)) |wire| : (a += 1) {
|
||||
const p1 = util.vec2ToVec2f(Vec2{ wire[0].x, wire[0].y } * tile_size + Vec2{ 4, 4 });
|
||||
const p2 = util.vec2ToVec2f(Vec2{ wire[1].x, wire[1].y } * tile_size + Vec2{ 4, 4 });
|
||||
|
||||
var w = try wires.addOne();
|
||||
_ = try w.nodes.resize(0);
|
||||
// const divisions = wire.divisions;
|
||||
const divisions = 10;
|
||||
var i: usize = 0;
|
||||
while (i <= divisions) : (i += 1) {
|
||||
try w.nodes.append(Pos.init(Vec2f{ 0, 0 }));
|
||||
try w.nodes.append(Pos.init(p1));
|
||||
}
|
||||
w.begin().pos = util.vec2ToVec2f(Vec2{ wire[0].x, wire[0].y } * tile_size);
|
||||
w.end().pos = util.vec2ToVec2f(Vec2{ wire[1].x, wire[1].y } * tile_size);
|
||||
w.begin().pos = p1;
|
||||
w.end().pos = p2;
|
||||
|
||||
w.begin().pinned = wire[0].kind == world.EntityKind.WireAnchor;
|
||||
w.end().pinned = wire[1].kind == world.EntityKind.WireEndAnchor;
|
||||
|
|
|
@ -95,37 +95,39 @@ fn make(step: *std.build.Step) !void {
|
|||
};
|
||||
try entity_array.append(world_entity);
|
||||
} else {
|
||||
const p1_x: i16 = @intCast(i16, entity.__grid[0]);
|
||||
const p1_y: i16 = @intCast(i16, entity.__grid[1]);
|
||||
var anchor1 = false;
|
||||
var anchor2 = false;
|
||||
var p2_x: i16 = p1_x;
|
||||
var p2_y: i16 = p1_y;
|
||||
for (entity.fieldInstances) |field| {
|
||||
if (std.mem.eql(u8, field.__identifier, "Anchor")) {
|
||||
const anchors = field.__value.Array.items;
|
||||
anchor1 = anchors[0].Bool;
|
||||
anchor2 = anchors[1].Bool;
|
||||
} else if (std.mem.eql(u8, field.__identifier, "Point")) {
|
||||
const end = field.__value.Array.items.len - 1;
|
||||
const endpoint = field.__value.Array.items[end];
|
||||
const x = endpoint.Object.get("cx").?;
|
||||
const y = endpoint.Object.get("cy").?;
|
||||
p2_x = @intCast(i16, x.Integer);
|
||||
p2_y = @intCast(i16, y.Integer);
|
||||
}
|
||||
}
|
||||
const wire_begin = world.Entity{
|
||||
.kind = .WireNode,
|
||||
.x = @intCast(i16, entity.__grid[0]),
|
||||
.y = @intCast(i16, entity.__grid[1]),
|
||||
.kind = if (anchor1) .WireAnchor else .WireNode,
|
||||
.x = p1_x,
|
||||
.y = p1_y,
|
||||
};
|
||||
try entity_array.append(wire_begin);
|
||||
|
||||
for (entity.fieldInstances) |field| {
|
||||
if (std.mem.eql(u8, field.__identifier, "Point")) {
|
||||
const end = field.__value.Array.items.len - 1;
|
||||
const endpoint = field.__value.Array.items[end];
|
||||
// const jstr = switch (endpoint) {
|
||||
// .Array => "Array",
|
||||
// .Object => "Object",
|
||||
// .Integer => "Integer",
|
||||
// else => "Other",
|
||||
// };
|
||||
// std.log.warn("{s}", .{jstr});
|
||||
// std.log.warn("{}", .{endpoint.Integer});
|
||||
// endpoint.dump();
|
||||
const x = endpoint.Object.get("cx").?;
|
||||
const y = endpoint.Object.get("cy").?;
|
||||
const wire_end = world.Entity{
|
||||
.kind = .WireEndNode,
|
||||
.x = @intCast(i16, x.Integer),
|
||||
.y = @intCast(i16, y.Integer),
|
||||
.kind = if (anchor2) .WireEndAnchor else .WireEndNode,
|
||||
.x = p2_x,
|
||||
.y = p2_y,
|
||||
};
|
||||
try entity_array.append(wire_end);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue