(svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges

This commit is contained in:
smatz 2008-02-18 16:11:31 +00:00
parent a0a225ab02
commit 29125c0e68
13 changed files with 68 additions and 30 deletions

View File

@ -315,7 +315,7 @@ static void ClickTile_Clear(TileIndex tile)
/* not used */ /* not used */
} }
static uint32 GetTileTrackStatus_Clear(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Clear(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
return 0; return 0;
} }

View File

@ -64,7 +64,7 @@ static void ChangeTileOwner_Dummy(TileIndex tile, PlayerID old_player, PlayerID
/* not used */ /* not used */
} }
static uint32 GetTileTrackStatus_Dummy(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Dummy(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
return 0; return 0;
} }

View File

@ -815,7 +815,7 @@ static void ClickTile_Industry(TileIndex tile)
ShowIndustryViewWindow(GetIndustryIndex(tile)); ShowIndustryViewWindow(GetIndustryIndex(tile));
} }
static uint32 GetTileTrackStatus_Industry(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Industry(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
return 0; return 0;
} }

View File

@ -437,9 +437,18 @@ void DoClearSquare(TileIndex tile)
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
} }
uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode) /** Returns trackdirbits in lower two bytes and additional info about track status in upper two bytes
* If there is any trackbit at 'side', return all trackdirbits.
* For TRANSPORT_ROAD, return 0 if there is no roadbit (of given subtype) at given side.
* @param tile tile to get info about
* @param mode transport type
* @param sub_mode for TRANSPORT_ROAD, roadtypes to check
* @param side side we are entering from, INVALID_DIAGDIR to return all trackbits
* @return trackdirbits and other info depending on 'mode'
*/
uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode, sub_mode); return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode, sub_mode, side);
} }
void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player) void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player)

View File

@ -2083,17 +2083,14 @@ set_ground:
} }
static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
if (mode != TRANSPORT_RAIL) return 0; if (mode != TRANSPORT_RAIL) return 0;
switch (GetRailTileType(tile)) { switch (GetRailTileType(tile)) {
default: NOT_REACHED(); default: NOT_REACHED();
case RAIL_TILE_NORMAL: { case RAIL_TILE_NORMAL:
TrackBits rails = GetTrackBits(tile); return GetTrackBits(tile) * 0x101;
uint32 ret = rails * 0x101;
return (rails == TRACK_BIT_CROSS) ? ret | 0x40 : ret;
}
case RAIL_TILE_SIGNALS: { case RAIL_TILE_SIGNALS: {
uint32 ret = GetTrackBits(tile) * 0x101; uint32 ret = GetTrackBits(tile) * 0x101;
@ -2117,8 +2114,16 @@ static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint
return ret; return ret;
} }
case RAIL_TILE_DEPOT: return AxisToTrackBits(DiagDirToAxis(GetRailDepotDirection(tile))) * 0x101; case RAIL_TILE_DEPOT: {
case RAIL_TILE_WAYPOINT: return GetRailWaypointBits(tile) * 0x101; DiagDirection dir = GetRailDepotDirection(tile);
if (side != INVALID_DIAGDIR && side != dir) return 0;
return AxisToTrackBits(DiagDirToAxis(dir)) * 0x101;
}
case RAIL_TILE_WAYPOINT:
return GetRailWaypointBits(tile) * 0x101;
} }
} }

View File

@ -1314,7 +1314,7 @@ static const byte _road_trackbits[16] = {
0x0, 0x0, 0x0, 0x10, 0x0, 0x2, 0x8, 0x1A, 0x0, 0x4, 0x1, 0x15, 0x20, 0x26, 0x29, 0x3F, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2, 0x8, 0x1A, 0x0, 0x4, 0x1, 0x15, 0x20, 0x26, 0x29, 0x3F,
}; };
static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
switch (mode) { switch (mode) {
@ -1326,22 +1326,35 @@ static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint s
if ((GetRoadTypes(tile) & sub_mode) == 0) return 0; if ((GetRoadTypes(tile) & sub_mode) == 0) return 0;
switch (GetRoadTileType(tile)) { switch (GetRoadTileType(tile)) {
case ROAD_TILE_NORMAL: { case ROAD_TILE_NORMAL: {
RoadType rt = (RoadType)FindFirstBit(sub_mode);
const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 }; const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 };
RoadType rt = (RoadType)FindFirstBit(sub_mode);
RoadBits bits = GetRoadBits(tile, rt);
/* no roadbit at this side of tile, return 0 */
if (side != INVALID_DIAGDIR && DiagDirToRoadBits(side) & bits == 0) return 0;
uint multiplier = drd_to_multiplier[rt == ROADTYPE_TRAM ? DRD_NONE : GetDisallowedRoadDirections(tile)]; uint multiplier = drd_to_multiplier[rt == ROADTYPE_TRAM ? DRD_NONE : GetDisallowedRoadDirections(tile)];
return HasRoadWorks(tile) ? 0 : _road_trackbits[GetRoadBits(tile, rt)] * multiplier; return HasRoadWorks(tile) ? 0 : _road_trackbits[bits] * multiplier;
} }
case ROAD_TILE_CROSSING: { case ROAD_TILE_CROSSING: {
uint32 r = AxisToTrackBits(GetCrossingRoadAxis(tile)) * 0x101; Axis axis = GetCrossingRoadAxis(tile);
if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) return 0;
uint32 r = AxisToTrackBits(axis) * 0x101;
if (IsCrossingBarred(tile)) r *= 0x10001; if (IsCrossingBarred(tile)) r *= 0x10001;
return r; return r;
} }
default: default:
case ROAD_TILE_DEPOT: case ROAD_TILE_DEPOT: {
return AxisToTrackBits(DiagDirToAxis(GetRoadDepotDirection(tile))) * 0x101; DiagDirection dir = GetRoadDepotDirection(tile);
if (side != INVALID_DIAGDIR && side != dir) return 0;
return AxisToTrackBits(DiagDirToAxis(dir)) * 0x101;
}
} }
break; break;

View File

@ -2280,7 +2280,7 @@ static void GetTileDesc_Station(TileIndex tile, TileDesc *td)
} }
static uint32 GetTileTrackStatus_Station(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Station(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
switch (mode) { switch (mode) {
case TRANSPORT_RAIL: case TRANSPORT_RAIL:
@ -2302,8 +2302,15 @@ static uint32 GetTileTrackStatus_Station(TileIndex tile, TransportType mode, uin
break; break;
case TRANSPORT_ROAD: case TRANSPORT_ROAD:
if ((GetRoadTypes(tile) & sub_mode) != 0 && IsRoadStopTile(tile)) { if ((GetRoadTypes(tile) & sub_mode) != 0 && IsRoadStop(tile)) {
return AxisToTrackBits(DiagDirToAxis(GetRoadStopDir(tile))) * 0x101; DiagDirection dir = GetRoadStopDir(tile);
Axis axis = DiagDirToAxis(dir);
if (side != INVALID_DIAGDIR) {
if (axis != DiagDirToAxis(side) || (IsStandardRoadStopTile(tile) && dir != side)) return 0;
}
return AxisToTrackBits(axis) * 0x101;
} }
break; break;

View File

@ -13,6 +13,7 @@
#include "strings_type.h" #include "strings_type.h"
#include "date_type.h" #include "date_type.h"
#include "player_type.h" #include "player_type.h"
#include "direction_type.h"
/** The returned bits of VehicleEnterTile. */ /** The returned bits of VehicleEnterTile. */
enum VehicleEnterTileStatus { enum VehicleEnterTileStatus {
@ -81,7 +82,7 @@ typedef void GetTileDescProc(TileIndex tile, TileDesc *td);
* @param sub_mode used to differentiate between different kinds within the mode * @param sub_mode used to differentiate between different kinds within the mode
* @return the above mentions track status information * @return the above mentions track status information
*/ */
typedef uint32 GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode); typedef uint32 GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side);
typedef void GetProducedCargoProc(TileIndex tile, CargoID *b); typedef void GetProducedCargoProc(TileIndex tile, CargoID *b);
typedef void ClickTileProc(TileIndex tile); typedef void ClickTileProc(TileIndex tile);
typedef void AnimateTileProc(TileIndex tile); typedef void AnimateTileProc(TileIndex tile);
@ -126,7 +127,7 @@ struct TileTypeProcs {
extern const TileTypeProcs * const _tile_type_procs[16]; extern const TileTypeProcs * const _tile_type_procs[16];
uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode); uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR);
void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac); void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac);
void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player); void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player);
void AnimateTile(TileIndex tile); void AnimateTile(TileIndex tile);

View File

@ -592,7 +592,7 @@ static void GetTileDesc_Town(TileIndex tile, TileDesc *td)
td->owner = OWNER_TOWN; td->owner = OWNER_TOWN;
} }
static uint32 GetTileTrackStatus_Town(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Town(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
/* not used */ /* not used */
return 0; return 0;

View File

@ -747,7 +747,7 @@ static void ClickTile_Trees(TileIndex tile)
/* not used */ /* not used */
} }
static uint32 GetTileTrackStatus_Trees(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Trees(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
return 0; return 0;
} }

View File

@ -1193,11 +1193,14 @@ static void ClickTile_TunnelBridge(TileIndex tile)
} }
static uint32 GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
TransportType transport_type = GetTunnelBridgeTransportType(tile); TransportType transport_type = GetTunnelBridgeTransportType(tile);
if (transport_type != mode || (transport_type == TRANSPORT_ROAD && (GetRoadTypes(tile) & sub_mode) == 0)) return 0; if (transport_type != mode || (transport_type == TRANSPORT_ROAD && (GetRoadTypes(tile) & sub_mode) == 0)) return 0;
return AxisToTrackBits(DiagDirToAxis(GetTunnelBridgeDirection(tile))) * 0x101;
DiagDirection dir = GetTunnelBridgeDirection(tile);
if (side != INVALID_DIAGDIR && side != ReverseDiagDir(dir)) return 0;
return AxisToTrackBits(DiagDirToAxis(dir)) * 0x101;
} }
static void ChangeTileOwner_TunnelBridge(TileIndex tile, PlayerID old_player, PlayerID new_player) static void ChangeTileOwner_TunnelBridge(TileIndex tile, PlayerID old_player, PlayerID new_player)

View File

@ -348,7 +348,7 @@ static void TileLoop_Unmovable(TileIndex tile)
} }
static uint32 GetTileTrackStatus_Unmovable(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Unmovable(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
return 0; return 0;
} }

View File

@ -1104,7 +1104,7 @@ void ConvertGroundTilesIntoWaterTiles()
} }
} }
static uint32 GetTileTrackStatus_Water(TileIndex tile, TransportType mode, uint sub_mode) static uint32 GetTileTrackStatus_Water(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
{ {
static const byte coast_tracks[] = {0, 32, 4, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0}; static const byte coast_tracks[] = {0, 32, 4, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0};