Implemented removal of cars if the node they're on gets removed

This commit is contained in:
2026-04-27 15:29:16 +02:00
parent 205c630dbf
commit da5c60d76b
5 changed files with 44 additions and 23 deletions

View File

@@ -76,6 +76,15 @@ delete_entity :: proc(self: ^Simulator, entity_index: u32, type: common.Entity)
switch type {
case .Node:
// get cars that are on that node
for i in 0..<len(self.cars) {
pos := self.cars[i].pos
if pos.type != .Node || pos.ref != entity_index do continue
delete_entity(self, u32(i), .Car)
}
unordered_remove(&self.nodes, entity_index)
if !swap_made do return {}, false
@@ -103,15 +112,13 @@ get_free_node :: proc(self: ^Simulator) -> Maybe(u32) {
car_occupied_nodes: [dynamic]u32
for car in self.cars {
node, ok := car.node_pos.?
if !ok do continue
if car.pos.type != .Node do continue
if common.list_contains(car_occupied_nodes[:], node) do continue
append(&car_occupied_nodes, node)
if common.list_contains(car_occupied_nodes[:], car.pos.ref) do continue
append(&car_occupied_nodes, car.pos.ref)
}
if len(car_occupied_nodes) == len(self.nodes) do return nil
for {
node := rand.uint32_max(u32(len(self.nodes)))