Delete wires from database after loading

master
Louis Pearson 2022-08-08 22:19:28 -06:00
parent af85ae5ae7
commit cfbee44872
2 changed files with 18 additions and 3 deletions

View File

@ -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);

View File

@ -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;