@ -234,9 +234,12 @@ static int32 NPFRoadPathCost(AyStar* as, AyStarNode* current, OpenListNode* pare
break ;
}
/* Fall through if above if is false, it is a bridge
* then . We treat that as ordinary r ail */
* then . We treat that as ordinary r oad */
case MP_STREET :
cost = NPF_TILE_LENGTH ;
/* Increase the cost for level crossings */
if ( ( _map5 [ tile ] & 0xF0 ) = = 0x10 )
cost + = _patches . npf_crossing_penalty ;
break ;
default :
break ;
@ -524,16 +527,11 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
if ( IsTileType ( dst_tile , MP_TUNNELBRIDGE ) & & ( _map5 [ dst_tile ] & 0xF0 ) = = 0 & & GetTileZ ( dst_tile ) < GetTileZ ( src_tile ) )
return ;
/* check correct rail type (mono, maglev, etc)
* XXX : This now compares with the previous tile , which should not pose a
* problem , but it might be nicer to compare with the first tile , or even
* the type of the vehicle . . . Maybe an NPF_RAILTYPE userdata sometime ? */
/* check correct rail type (mono, maglev, etc) */
if ( type = = TRANSPORT_RAIL ) {
RailType src_type = GetTileRailType ( src_tile , src_trackdir ) ;
RailType dst_type = GetTileRailType ( dst_tile , TrackdirToExitdir ( src_trackdir ) ) ;
if ( src_type ! = dst_type ) {
RailType dst_type = GetTileRailType ( dst_tile , src_trackdir ) ;
if ( ! IsCompatibleRail ( aystar - > user_data [ NPF_RAILTYPE ] , dst_type ) )
return ;
}
}
/* Check the owner of the tile */
@ -604,7 +602,7 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
* multiple targets that are spread around , we should perform a breadth first
* search by specifiying CalcZero as our heuristic .
*/
static NPFFoundTargetData NPFRouteInternal ( AyStarNode * start1 , AyStarNode * start2 , NPFFindStationOrTileData * target , AyStar_EndNodeCheck target_proc , AyStar_CalculateH heuristic_proc , TransportType type , Owner owner , uint reverse_penalty )
static NPFFoundTargetData NPFRouteInternal ( AyStarNode * start1 , AyStarNode * start2 , NPFFindStationOrTileData * target , AyStar_EndNodeCheck target_proc , AyStar_CalculateH heuristic_proc , TransportType type , Owner owner , RailType railtype , uint reverse_penalty )
{
int r ;
NPFFoundTargetData result ;
@ -646,6 +644,7 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start
/* Initialize user_data */
_npf_aystar . user_data [ NPF_TYPE ] = type ;
_npf_aystar . user_data [ NPF_OWNER ] = owner ;
_npf_aystar . user_data [ NPF_RAILTYPE ] = railtype ;
/* GO! */
r = AyStarMain_Main ( & _npf_aystar ) ;
@ -663,7 +662,7 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start
return result ;
}
NPFFoundTargetData NPFRouteToStationOrTileTwoWay ( TileIndex tile1 , Trackdir trackdir1 , TileIndex tile2 , Trackdir trackdir2 , NPFFindStationOrTileData * target , TransportType type , Owner owner )
NPFFoundTargetData NPFRouteToStationOrTileTwoWay ( TileIndex tile1 , Trackdir trackdir1 , TileIndex tile2 , Trackdir trackdir2 , NPFFindStationOrTileData * target , TransportType type , Owner owner , RailType railtype )
{
AyStarNode start1 ;
AyStarNode start2 ;
@ -677,15 +676,15 @@ NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir track
start2 . direction = trackdir2 ;
start2 . user_data [ NPF_TRACKDIR_CHOICE ] = INVALID_TRACKDIR ;
return NPFRouteInternal ( & start1 , ( IsValidTile ( tile2 ) ? & start2 : NULL ) , target , NPFFindStationOrTile , NPFCalcStationOrTileHeuristic , type , owner , 0 ) ;
return NPFRouteInternal ( & start1 , ( IsValidTile ( tile2 ) ? & start2 : NULL ) , target , NPFFindStationOrTile , NPFCalcStationOrTileHeuristic , type , owner , railtype , 0 ) ;
}
NPFFoundTargetData NPFRouteToStationOrTile ( TileIndex tile , Trackdir trackdir , NPFFindStationOrTileData * target , TransportType type , Owner owner )
NPFFoundTargetData NPFRouteToStationOrTile ( TileIndex tile , Trackdir trackdir , NPFFindStationOrTileData * target , TransportType type , Owner owner , RailType railtype )
{
return NPFRouteToStationOrTileTwoWay ( tile , trackdir , INVALID_TILE , 0 , target , type , owner );
return NPFRouteToStationOrTileTwoWay ( tile , trackdir , INVALID_TILE , 0 , target , type , owner , railtype );
}
NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay ( TileIndex tile1 , Trackdir trackdir1 , TileIndex tile2 , Trackdir trackdir2 , TransportType type , Owner owner , uint reverse_penalty )
NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay ( TileIndex tile1 , Trackdir trackdir1 , TileIndex tile2 , Trackdir trackdir2 , TransportType type , Owner owner , RailType railtype , uint reverse_penalty )
{
AyStarNode start1 ;
AyStarNode start2 ;
@ -701,15 +700,15 @@ NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir t
/* perform a breadth first search. Target is NULL,
* since we are just looking for any depot . . . */
return NPFRouteInternal ( & start1 , ( IsValidTile ( tile2 ) ? & start2 : NULL ) , NULL , NPFFindDepot , NPFCalcZero , type , owner , r everse_penalty) ;
return NPFRouteInternal ( & start1 , ( IsValidTile ( tile2 ) ? & start2 : NULL ) , NULL , NPFFindDepot , NPFCalcZero , type , owner , r ailtype, r everse_penalty) ;
}
NPFFoundTargetData NPFRouteToDepotBreadthFirst ( TileIndex tile , Trackdir trackdir , TransportType type , Owner owner )
NPFFoundTargetData NPFRouteToDepotBreadthFirst ( TileIndex tile , Trackdir trackdir , TransportType type , Owner owner , RailType railtype )
{
return NPFRouteToDepotBreadthFirstTwoWay ( tile , trackdir , INVALID_TILE , 0 , type , owner , 0 ) ;
return NPFRouteToDepotBreadthFirstTwoWay ( tile , trackdir , INVALID_TILE , 0 , type , owner , railtype , 0 ) ;
}
NPFFoundTargetData NPFRouteToDepotTrialError ( TileIndex tile , Trackdir trackdir , TransportType type , Owner owner )
NPFFoundTargetData NPFRouteToDepotTrialError ( TileIndex tile , Trackdir trackdir , TransportType type , Owner owner , RailType railtype )
{
/* Okay, what we're gonna do. First, we look at all depots, calculate
* the manhatten distance to get to each depot . We then sort them by