From e8ebe43de6b3598c0ddb9ac4a0a11d3d12b3976e Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Thu, 4 Aug 2022 22:16:33 -0600 Subject: [PATCH] Partially fix circuits and wires --- assets/tiles.png | Bin 654 -> 655 bytes assets/tiles.zig | 2 +- src/circuit.zig | 139 +++++++++++++++++-------------------------- src/extract.zig | 6 +- src/game.zig | 9 ++- tools/LDtkImport.zig | 56 ++++++++--------- 6 files changed, 95 insertions(+), 117 deletions(-) diff --git a/assets/tiles.png b/assets/tiles.png index 88519fe00fc441a0e41850b34931daa5c3e963e8..aa3ad04dfe1aa5a7d45ed560c57f34f15facafd3 100644 GIT binary patch delta 590 zcmV-U0I4c1poh|Z>s_WVr%ztd&xQ3mVysPv`rR> z1YALk+F_t}uQqb>S>)rHOZ^#v-j~Y*hr&(t3Ajm4h@Hx0+=M{wdYDVS9{z4a*+0S$*F^BbL$Xg=Af8fZV<~I z6e85yVQdec2rL8)N+8TL=>4JCe8nv7ew;%gP?~h@O%g1iw^&frjD2)z7X(;5cOLa; z`s)N@hz7}F3x8Bdhts{k+=40G77cQl!2P!(5V+J|b7-I16c-%d067ete5x|rM+qeB z|2zQ}|5>CCy*|{dw;kW%7|yPWe}lr2UmDGUH4@I zR&p_op{k)4rmVxH(2p^fmqtv24Xdcg|b^hAmHjm7(sZ5BgpsAvZ{n6RKl{9DVCx_p^AouPqScW z6HE!XVn>_S2Gt+b(Kt>#5|9Y9M%)gP=8M_(!ZuCDbx-Mfpb$A{VC6y9w?<_&Bnj=c c2u=w60BI%(1)h?=T>t<807*qoM6N<$g4D?n*8l(j delta 589 zcmV-T04JppE77!lrN)%>Y-)39&<&%o`Bchi=Vfzh3@@LE}ae zuS*0Z(h~&QwXHuRKxW5DbuiNo92^0@Kmd=*9upAYP}?aIQGWt@>gKi}5bzG7L-jyy z`#~RV!O0=4#|dS!=N!iAMHH1AuVF`kA_0oy0;HvsuFFCC-zA3*hTU~QlxVn^UTzS} z9TXze>tU=99T8YUi3l~2Qpe}@z$okb(92d$yG|t#T zl?@H|Wus9Nh^3!xB36S~D7z&D0= 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 }, }; } diff --git a/src/extract.zig b/src/extract.zig index 7fc120e..4d41445 100644 --- a/src/extract.zig +++ b/src/extract.zig @@ -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; diff --git a/src/game.zig b/src/game.zig index e8faf44..ee8e325 100644 --- a/src/game.zig +++ b/src/game.zig @@ -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; diff --git a/tools/LDtkImport.zig b/tools/LDtkImport.zig index 5ca0a6e..158b485 100644 --- a/tools/LDtkImport.zig +++ b/tools/LDtkImport.zig @@ -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), - }; - try entity_array.append(wire_end); - break; - } - } + const wire_end = world.Entity{ + .kind = if (anchor2) .WireEndAnchor else .WireEndNode, + .x = p2_x, + .y = p2_y, + }; + try entity_array.append(wire_end); } } }