Cheers for all of the input, and I agree with most of the recommendations.
As for making the API user friendly, thats my biggest priority. I was thinking having it as simple as requesting pathing from A(x,y,z) to B(x,y,z) and it would return a path object with some kind of follow routine.
Thief^ mentioned that the current pathfinding is done synchronously, which I had thought of and is a big concern. The most optimal solution is for Toady to modify his code slightly so as a pathing request can be sent and then retreived, however this puts a decent bit of work on him.
What I was thinking instead is that the path object (which is returned immediately) would internally be waiting on a pathing task asynchronously, and the follow routine would do nothing the first time it was used (next frame the task has to be finished and then it will start).
Obviously this entails dwarves pausing slightly (for the length of one frame) before they move off anywhere, but this is actually a common method used in games and isn't noticeable.
Dae: thats an interesting point you bring up about making node information modular, so for example you would have a list of modifiers and in that list would be the user-definable pathing cost, effect of liquids or whatever (I don't actually know if dwarves wade slower than they walk) but its a better idea than I had, I was thinking just making the map information pluggable so that it could be replaced with a wrapper around toady's existing map implementation.
Thief^ what you said about dynamic maps messing with asynchronous work is definately a concern - its the biggest internal issue with this method, but I think I know how I'm going to deal with it.
Also on the different types on pathing (those which can swim etc), thats not too much effort, they would just have a bitmask of their capabilities and nodes in the graph would have a correspending bitmask for what types can pass through it.
A few notes on my planned implementation however:
Thief^ you are correct in that this would not be a liquid pathfinder - bear in the mind that liquids don't use A* they use Dijkstra so theres no way to use heuristics to optimise it.
As to the mentioned of caching - thats not the way that this will work.
If you think about the kind of pathfinding done by dwarf fortress, caching would not be optimal as the miss rate would most likely be below 10% which would actually make it slower than a standard implementation.
My method is based on heirarchical node graphs - that is, nodes that represent large areas, split up internally into nodes that represent smaller areas and so on. This can cause the final output paths to be slightly sub optimal (within 5% however). Here is an interesting paper on the subject
http://aigamedev.com/open/reviews/near-optimal-hierarchical-pathfinding/Obviously this generated node graph algorithm could not work in adventure mode, it would only be suitable for fortress mode as it depends on having a finite space to work in.