…and found it.
So here’s what happens: In MT2’s pathfinding system, there are two main processes interacting. One piece is an exploration agent which builds a graph of nodes of potentially interesting places where a subscriber might want to walk to, while travelling from one place to another.
(For the technies out there, I’m doing a standard A* search across this graph, but I’m building the graph at the same time that I’m doing the search, instead of the more traditional approach of having a static, pre-built graph that searches are then run across)
For example, the explorer typically begins by creating points where the subscriber is now, at the eventual destination, at the nearest point on a road to the starting point, at the nearest point on a road to the finish point, and several other spots. As it starts evaluating how much it wants to reach each of these spots, it starts picking where it might want to go to next, from whichever point it’s evaluating right now. For example, if it’s standing in the middle of a road, it adds a point for each end of the road, and also for the nearest point on the road to the destination.
The second main part in the system is involved with deciding how much it wants to consider each of those positions that the explorer has noted. It assigns a “cost” to each. The eventual path that’s chosen by the subscriber is the path which will get from the starting point to the desired destination using the lowest “cost”. This is why subscribers prefer to take roads; taking roads has a lower “cost” than walking the same distance across normal terrain, and so they’re willing to travel further, if it means they can take a road. (Right now, travelling on a road is considered to be one tenth the cost of travelling across terrain. That’s absurdly low; players in MMORPGs typically don’t stick to roads that strongly. I should really make it closer to half, or even two-thirds.)
Anyhow. The bug was in the logic around traversing across an intersection. The explorer would say “I’m at the start of this road, therefore I’m on its start intersection, and therefore I will consider traveling to the far end every road which also meets this intersection.” Which is just fine, except that the system which is deciding how much each move costs looked at that move and said “Oh, you’re going to travel from the start of this road to the end of that road? Let me just check if that’s movement along a road. Hey, wait a minute, those two points aren’t remotely close to each other, and aren’t even on the same road; that would just be traveling across regular ground, so I’m not giving you the on-road bonus”. And so subscribers were effectively losing that road bonus, when crossing that intersection. Really, the explorer shouldn’t have been adding the far end of the connecting road, it should have been adding the near end of the connecting road, so that the costing agent could correctly realise that yes, we’re still traveling over a road.
So that explains why players don’t want to use that road. But it doesn’t explain why they’re happy to use every other road; why they only broke with this specific road.
Well, it turns out that I’m an idiot. It just so happens that this is a bug I’d noticed before, back in August. And I fixed it for the case where the explorer agent was traveling over the end of a road, but forgot to do it when it was traveling over the start of a road. (Roads have both a ‘start’ and an ‘end’, based upon where you started drawing them from. This makes no difference, in general, except for this specific bug). It just so happens that getting onto that one winding road here involved traveling over the “start” of the mountain pass, or over the “start” of that circular street on the left, and so was failing in both these cases, but not in the other cases.
It’s all now fixed, finally. Debugging is fun!