Actually, I have covered that.
But people don't like to give my method any merit, despite the fact that it's the only way that even makes sense. We go side tracked on this "bitmask" think which is pointless and useless. All that's really doing is covering how the navigation mesh is stored in memory (which is irrelevant) and not how it's built or used.
That's not true, I assume something basically the same as what you are talking about (although I'm not sure of why the workshops need to be their own node) when I'm talking about any of these things. If I don't say I support it, it's just because I was assuming that was true.
So you're saying that it's a method of searching through zones created by other means? I.e. we can use it on whichever grouping method other come up with? In that case, it's pretty cool, even though I don't really understand it.
In this vein, a short while after editing my wall of text for the second time, I realized that you can actually re-apply Niseg's algorithm on top of itself -- that is, group a cube of cubes of tiles into cubes of nodes, and search those, and create a massive tree structure that lends itself to recursive use of A* -- this would allow both the optimality of 2x2x2 cubes, and the abstraction and swiftness of 16x16x16 cubes, and also possibly make the idea of BFSing for the nearest (larger) node that contains a target material for item searching much more feasible, by then simply using nearest manhattan distance on a list of all items within that large node. There would be additional overhead for both, of course, but I believe it would be worth it, due to the sheer amount of pathfinding done in a mature fortress.
What you are talking about is multi-tiered pathfinding - something that can make sense, based upon certain assumptions of how complex a map will be.
What I'm talking about with a tree data structure, however, is a
tree data structure, which means it's inherently hierarchical. Trees contain branch nodes which are fully functional as smaller trees, themselves.
It's not all that complicated if you consider it - Once you have a grand list of nodes that you have cut the map up into, you have to start organizing them. You pick some arbitrary node near the middle of the map (you would need to be able to "balance" the tree later on, anyway, so starting from an arbitrary point is fine for now), and make that the root node. Let me use an older diagram for this:
The root node here is the central stairwell that is in bright red.
Pointers are stored in a vector (a sad necessity, as you can have arbitrary numbers of connections) to all nodes the root node can connect to.
These are the doors that splay out from the central stairwell (darker red).
These connect to branch nodes, themselves (the red-orange square hallway around the central stairway), and then to other nodes (the orange hallways leading away from the central stairwell), then to others (yellow-orange doors and minor hallways), then to others (some of the yellow rooms or doors off of minor hallways), etc.
Now, you have a data structure where connectivity is implied through the presence of pointers to given nodes. This isn't all that different from most other meshes or other means of pathfinding at this point, except that we don't really care about the relative locations of any given nodes (east, west, up, down, doesn't matter, just connection matters).
Now, we need to put in the two things we need that lets us actually do the basic pathfinding.
Each node needs to store with its pointers the length of the path through it, the width of the path through it, and the type of movement it requires (I.E. walking, swimming, flying).
Further, in order to make the search possible without advanced pathfinding, each branch node needs to store some form of list (maybe a hash to be faster?) that contains all of the leaves and branches that are "higher up" ("higher" means away from the roots, towards leaves) the tree from itself that it can connect to through only moving up the tree from where it is.
This last point is where this method becomes faster, but also takes up more memory than other pathfinding methods, the hash list would involve lots of duplicate references to nodes. This would have to be as compressed as possible (Just a reference to a specific node) to save on memory.
Now, in order to search this tree, you start from the starting node, and search the hash list of branches and leaves connected to the starting node. If the destination node is not in that list, you go down a node on the tree, and search the lower node that connects to the starting node, and see if you can reach the destination node by only going up from there. If that doesn't work, you keep going down the tree all the way to the roots until you can find a path to the destination node.
Once you find a branch with a connection to the destination node, you just go up the tree, testing which branches will have connections to the destination node, until you finally strike the destination node, itself.
The list of nodes you had to go down and then up is a valid path to the destination.