Get saving working better

master
Louis Pearson 2022-01-31 00:31:02 -07:00
parent 6d83dd0535
commit b1b25753a3
7 changed files with 105 additions and 32 deletions

View File

@ -107,6 +107,12 @@
"x":16, "x":16,
"y":0 "y":0
}], }],
"properties":[
{
"name":"divisions",
"type":"int",
"value":5
}],
"rotation":0, "rotation":0,
"type":"wire", "type":"wire",
"visible":true, "visible":true,

View File

@ -148,6 +148,9 @@
<polyline points="32,-64 -2,-46"/> <polyline points="32,-64 -2,-46"/>
</object> </object>
<object id="5" type="wire" x="20" y="436"> <object id="5" type="wire" x="20" y="436">
<properties>
<property name="divisions" type="int" value="5"/>
</properties>
<polyline points="0,0 16,0"/> <polyline points="0,0 16,0"/>
</object> </object>
<object id="6" type="door" x="84" y="468"> <object id="6" type="door" x="84" y="468">

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,10 +1,10 @@
const std = @import("std"); const std = @import("std");
const PropertyType = enum { @"bool" }; const PropertyType = enum { @"bool", @"int" };
const Property = struct { const Property = struct {
name: []const u8 = &.{}, name: []const u8 = &.{},
@"type": PropertyType = .@"bool", @"type": PropertyType = .@"bool",
value: union(PropertyType) { @"bool": bool }, value: union(PropertyType) { @"bool": bool, @"int": i64 },
}; };
const Point = struct { const Point = struct {
@ -110,7 +110,7 @@ pub fn do() !void {
try outlist.appendSlice("const std = @import(\"std\");\n"); try outlist.appendSlice("const std = @import(\"std\");\n");
try outlist.appendSlice("const Vec2 = std.meta.Vector(2,i32);\n"); try outlist.appendSlice("const Vec2 = std.meta.Vector(2,i32);\n");
try outlist.appendSlice("const AABB = struct {pos: Vec2, size: Vec2};\n"); try outlist.appendSlice("const AABB = struct {pos: Vec2, size: Vec2};\n");
try outlist.appendSlice("const Wire = struct { p1: Vec2, p2: Vec2, a1: bool, a2: bool };\n"); try outlist.appendSlice("const Wire = struct { p1: Vec2, p2: Vec2, a1: bool, a2: bool, divisions: u8 };\n");
var outbuffer: [16 * KB]u8 = undefined; var outbuffer: [16 * KB]u8 = undefined;
for (map.layers) |layer| { for (map.layers) |layer| {
@ -163,26 +163,42 @@ pub fn do() !void {
} }
} }
pub fn length(vec: std.meta.Vector(2, i64)) i64 {
var squared = vec * vec;
return @intCast(i64, std.math.sqrt(@intCast(u64, @reduce(.Add, squared))));
}
pub fn appendWires(outlist: *std.ArrayList(u8), wirelist: std.ArrayList(Object)) !void { pub fn appendWires(outlist: *std.ArrayList(u8), wirelist: std.ArrayList(Object)) !void {
var outbuffer: [4 * KB]u8 = undefined; var outbuffer: [4 * KB]u8 = undefined;
var outcontent = try std.fmt.bufPrint(&outbuffer, "pub const wire: [{}]Wire = [_]Wire{{", .{wirelist.items.len}); var outcontent = try std.fmt.bufPrint(&outbuffer, "pub const wire: [{}]Wire = [_]Wire{{", .{wirelist.items.len});
try outlist.appendSlice(outcontent); try outlist.appendSlice(outcontent);
for (wirelist.items) |obj| { for (wirelist.items) |obj| {
try outlist.appendSlice(".{");
var a1 = true; var a1 = true;
var a2 = true; var a2 = true;
var p1: std.meta.Vector(2, i64) = .{ 0, 0 };
var p2: std.meta.Vector(2, i64) = .{ 0, 0 };
var divisions: ?i64 = null;
for (obj.properties) |p| { for (obj.properties) |p| {
if (std.mem.eql(u8, p.name, "anchor1")) a1 = p.value.@"bool"; if (std.mem.eql(u8, p.name, "anchor1")) a1 = p.value.@"bool";
if (std.mem.eql(u8, p.name, "anchor2")) a2 = p.value.@"bool"; if (std.mem.eql(u8, p.name, "anchor2")) a2 = p.value.@"bool";
if (std.mem.eql(u8, p.name, "divisions")) divisions = p.value.@"int";
} }
var of = try std.fmt.bufPrint(&outbuffer, ".a1 = {}, .a2 = {},", .{ a1, a2 });
try outlist.appendSlice(of);
for (obj.polyline) |point, i| { for (obj.polyline) |point, i| {
var pointf = try std.fmt.bufPrint(&outbuffer, ".p{} = Vec2{{ {}, {} }},", .{ i + 1, @floatToInt(i32, obj.x + point.x), @floatToInt(i32, obj.y + point.y) }); switch (i) {
try outlist.appendSlice(pointf); 0 => p1 = .{ @floatToInt(i64, obj.x + point.x), @floatToInt(i64, obj.y + point.y) },
1 => p2 = .{ @floatToInt(i64, obj.x + point.x), @floatToInt(i64, obj.y + point.y) },
else => return error.TooManyPoints,
} }
try outlist.appendSlice("}, "); }
divisions = divisions orelse std.math.max(2, @divTrunc(length(p2 - p1), 6));
var of = try std.fmt.bufPrint(
&outbuffer,
".{{ .a1 = {}, .a2 = {}, .divisions = {}, .p1 = Vec2{{ {}, {} }}, .p2 = Vec2{{ {}, {} }} }}, ",
.{ a1, a2, divisions, p1[0], p1[1], p2[0], p2[1] },
);
try outlist.appendSlice(of);
} }
try outlist.appendSlice("};\n"); try outlist.appendSlice("};\n");
} }

View File

@ -60,7 +60,7 @@ const Kinematic = struct {
} }
}; };
const Wire = struct { const Wire = struct {
nodes: std.BoundedArray(Pos, 32), nodes: std.BoundedArray(Pos, 32) = std.BoundedArray(Pos, 32).init(0),
enabled: bool = false, enabled: bool = false,
pub fn begin(this: *@This()) *Pos { pub fn begin(this: *@This()) *Pos {
@ -70,6 +70,16 @@ const Wire = struct {
pub fn end(this: *@This()) *Pos { pub fn end(this: *@This()) *Pos {
return &this.nodes.slice()[this.nodes.len - 1]; return &this.nodes.slice()[this.nodes.len - 1];
} }
pub fn straighten(this: *@This()) void {
const b = this.begin().pos;
const e = this.end().pos;
const size = e - b;
for (this.nodes.slice()) |*node, i| {
if (i == 0 or i == this.nodes.len - 1) continue;
node.pos = b + @splat(2, @intToFloat(f32, i)) * size / @splat(2, @intToFloat(f32, this.nodes.len));
}
}
}; };
const Physics = struct { gravity: Vec2f, friction: Vec2f }; const Physics = struct { gravity: Vec2f, friction: Vec2f };
const Player = struct { const Player = struct {
@ -234,21 +244,19 @@ export fn start() void {
}; };
for (assets.wire) |wire| { for (assets.wire) |wire| {
const begin = vec2tovec2f(wire.p1); var w = wires.addOne() catch showErr("New wire");
const end = vec2tovec2f(wire.p2); const divisions = wire.divisions;
const size = end - begin;
var nodes = std.BoundedArray(Pos, 32).init(0) catch showErr("Nodes");
var i: usize = 0; var i: usize = 0;
const divisions = @floatToInt(usize, util.lengthf(size) / 6);
while (i <= divisions) : (i += 1) { while (i <= divisions) : (i += 1) {
const pos = begin + @splat(2, @intToFloat(f32, i)) * size / @splat(2, @intToFloat(f32, divisions)); w.nodes.append(Pos.init(Vec2f{ 0, 0 })) catch showErr("Appending nodes");
nodes.append(Pos.init(pos)) catch showErr("Appending nodes");
} }
if (wire.a1) nodes.slice()[0].pinned = true; w.begin().pos = util.vec2ToVec2f(wire.p1);
if (wire.a2) nodes.slice()[nodes.len - 1].pinned = true; w.end().pos = util.vec2ToVec2f(wire.p2);
const w = Wire{ .nodes = nodes };
wires.append(w) catch showErr("Appending wire"); w.begin().pinned = wire.a1;
w.end().pinned = wire.a2;
w.straighten();
} }
for (assets.sources) |source| { for (assets.sources) |source| {
@ -259,6 +267,7 @@ export fn start() void {
circuit.addDoor(door); circuit.addDoor(door);
} }
// _ = w4.diskw("", 0);
if (!load()) { if (!load()) {
for (assets.coins) |coin| { for (assets.coins) |coin| {
coins.append(.{ coins.append(.{
@ -480,21 +489,25 @@ fn load() bool {
var begin = wires.slice()[id].begin(); var begin = wires.slice()[id].begin();
begin.* = pos; begin.* = pos;
begin.pinned = true; begin.pinned = true;
wires.slice()[id].straighten();
}, },
.WireBeginLoose => { .WireBeginLoose => {
var begin = wires.slice()[id].begin(); var begin = wires.slice()[id].begin();
begin.* = pos; begin.* = pos;
begin.pinned = false; begin.pinned = false;
wires.slice()[id].straighten();
}, },
.WireEndPinned => { .WireEndPinned => {
var end = wires.slice()[id].end(); var end = wires.slice()[id].end();
end.* = pos; end.* = pos;
end.pinned = true; end.pinned = true;
wires.slice()[id].straighten();
}, },
.WireEndLoose => { .WireEndLoose => {
var end = wires.slice()[id].end(); var end = wires.slice()[id].end();
end.* = pos; end.* = pos;
end.pinned = false; end.pinned = false;
wires.slice()[id].straighten();
}, },
} }
} }

View File

@ -45,7 +45,7 @@ pub fn vec2ToVec2f(vec2: Vec2) Vec2f {
} }
pub fn vec2fToVec2(vec2f: Vec2f) Vec2 { pub fn vec2fToVec2(vec2f: Vec2f) Vec2 {
return Vec2{ @floatToInt(i32, vec2f[0]), @floatToInt(i32, vec2f[1]) }; return Vec2{ @floatToInt(i32, @floor(vec2f[0])), @floatToInt(i32, @floor(vec2f[1])) };
} }
pub const AABB = struct { pub const AABB = struct {
@ -80,4 +80,3 @@ pub fn Queue(comptime T: type, len: usize) type {
} }
}; };
} }