From 2df39b45f3e7cb3e14c438aea906888960da4b8c Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Sun, 7 Aug 2022 12:51:20 -0600 Subject: [PATCH] Copy And code to Xor --- tools/LDtkImport.zig | 46 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/tools/LDtkImport.zig b/tools/LDtkImport.zig index 35f3cfd..d7e1a19 100644 --- a/tools/LDtkImport.zig +++ b/tools/LDtkImport.zig @@ -468,11 +468,47 @@ pub fn buildCircuit(alloc: std.mem.Allocator, levels: []world.Level) !std.ArrayL }, .Xor => { // TODO: verify Xor gate is properly connected - next_node = @intCast(u16, nodes.items.len); - try nodes.append(.{ - .kind = .{ .Xor = .{ last_node, last_node } }, - .coord = coord, - }); + const last_coord = node.data.last_coord.?; + const Side = enum { O, L, R }; + const side: Side = + if (last_coord[0] == coord[0] - 1) + Side.L + else if (last_coord[0] == coord[0] + 1) + Side.R + else + Side.O; + // std.log.warn("{any}: {}", .{ coord, side }); + if (multi_input.get(coord)) |a| { + switch (side) { + .L => { + // std.log.warn("Filling left", .{}); + nodes.items[a].kind.Xor[0] = last_node; + }, + .R => { + // std.log.warn("Filling right", .{}); + nodes.items[a].kind.Xor[1] = last_node; + }, + else => {},// reverse connection + } + } else { + _ = visited.remove(coord); + if (side == .O) { + return error.OutputToSource; + } else if (side == .L) { + next_node = @intCast(u16, nodes.items.len); + try nodes.append(.{ + .kind = .{ .Xor = .{ last_node, 20000 } }, + .coord = coord, + }); + } else if (side == .R) { + next_node = @intCast(u16, nodes.items.len); + try nodes.append(.{ + .kind = .{ .Xor = .{ 20000, last_node } }, + .coord = coord, + }); + } + try multi_input.put(coord, next_node); + } }, else => continue, }