private boolean routeBetween(Tile a, Tile b) {
    if (a == b) return false ;
    //
    //  Firstly, determine the correct current route.
    //  TODO:  Allow the road search to go through arbitrary Boardables, and
    //  screen out any non-tiles or blocked tiles?
    final Route route = new Route(a, b) ;
    final RoadSearch search = new RoadSearch(
      route.start, route.end, Element.FIXTURE_OWNS
    ) ;
    search.doSearch() ;
    route.path = search.fullPath(Tile.class) ;
    route.cost = search.totalCost() ;
    //
    //  If the new route differs from the old, delete it.  Otherwise return.
    final Route oldRoute = allRoutes.get(route) ;
    if (roadsEqual(route, oldRoute)) return false ;
    
    if (verbose) {
      I.say("Route between "+a+" and "+b+" has changed!") ;
      this.reportPath("Old route", oldRoute) ;
      this.reportPath("New route", route   ) ;
    }
    
    //
    //  If the route needs an update, clear the tiles and store the data.
    if (oldRoute != null) deleteRoute(oldRoute) ;
    if (search.success()) {
      allRoutes.put(route, route) ;
      toggleRoute(route, route.start, true) ;
      toggleRoute(route, route.end  , true) ;
      world.terrain().maskAsPaved(route.path, true) ;
      clearRoad(route.path) ;
    }
    return true ;
  }