From cfbee44872a603f8529bf5b54ce14b3ede39352e Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Mon, 8 Aug 2022 22:19:28 -0600 Subject: [PATCH] Delete wires from database after loading --- src/game.zig | 4 +++- src/world.zig | 17 +++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/game.zig b/src/game.zig index 4a9cfb9..17ad90f 100644 --- a/src/game.zig +++ b/src/game.zig @@ -226,7 +226,9 @@ fn loadLevel(lvl: usize) !void { { _ = try wires.resize(0); var a: usize = 0; - while (db.getWire(level, a)) |wireSlice| : (a += 1) { + while (db.findWire(level, 0)) |wireArr| : (a += 1) { + defer db.deleteWire(wireArr); + const wireSlice = db.getWire(wireArr); const wire = try world.Wire.getEnds(wireSlice); const coord0 = wire[0].coord.subC(levelc); const coord1 = wire[1].coord.subC(levelc); diff --git a/src/world.zig b/src/world.zig index 9d27c36..5a1f05a 100644 --- a/src/world.zig +++ b/src/world.zig @@ -857,7 +857,20 @@ pub const Database = struct { db.entities[coin].kind = .Collected; } - pub fn getWire(database: *Database, level: Level, num: usize) ?[]Wire { + /// Remove a wire slice from the wires array. Invalidates handles returned from findWire + pub fn deleteWire(database: *Database, wire: [2]usize) void { + const wire_size = wire[1] - wire[0]; + std.mem.rotate(Wire, database.wires, wire_size); + database.wire_count -= wire_size; + } + + /// Retrieve the slice of the wire from findWire + pub fn getWire(database: *Database, wire: [2]usize) []Wire { + return database.wires[wire[0]..wire[1]]; + } + + /// Find a wire within the limits of a given level + pub fn findWire(database: *Database, level: Level, num: usize) ?[2]usize { const nw = Coord.fromWorld(level.world_x, level.world_y); const se = nw.add(.{ 20, 20 }); var node_begin: ?usize = null; @@ -878,7 +891,7 @@ pub const Database = struct { .End => { if (node_begin) |node| { if (wire_count == num) { - return database.wires[node..i + 1]; + return [2]usize{node, i + 1}; } wire_count += 1; node_begin = null;