Files
odin-road-pathfinding/src/pathfinding.odin
2026-04-27 09:52:31 +02:00

43 lines
1.4 KiB
Odin

package main
import "common"
import inf "infrastructure"
// Returns path to destination node => road => node
get_path_to_destination :: proc(self: ^Simulator, source: u32, destination: u32) -> []u32 {
source_node := self.nodes[source]
destination_node := self.nodes[destination]
return nil
}
// Returns if path is reachable from node => destination
get_destination_reachable :: proc(self: ^Simulator, node_to_search: u32, destination: u32, nodes_to_ignore: ^[dynamic]u32) -> bool {
if !self.nodes[node_to_search].enabled || common.list_contains(nodes_to_ignore[:], node_to_search) do return false
append(nodes_to_ignore, node_to_search)
if node_to_search == destination do return true
for node in get_neighbouring_nodes(self, node_to_search) {
if get_destination_reachable(self, node, destination, nodes_to_ignore) do return true
}
return false
}
@(private="file")
get_neighbouring_nodes :: proc(self: ^Simulator, node_index: u32) -> []u32 {
node := self.nodes[node_index]
neighbour_nodes := make([dynamic]u32, 0, len(node.roads))
for road_index in node.roads {
road := self.roads[road_index]
// We pick the node that is not the original node with which we reached the node
// But rather the other node, on the end
next_node := road.nodes[0] == node_index ? road.nodes[1] : road.nodes[0]
if !common.list_contains(neighbour_nodes[:], next_node) do append(&neighbour_nodes, next_node)
}
return neighbour_nodes[:]
}