mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r242) -Fix: Pathfinding bug for road vehicles introduced in r160 fixed (blathijs)
-Fix: Pathfinding under bridges bug for ships introduced in r160 fixed (Darkvater)
This commit is contained in:
parent
72457bac0d
commit
bf703a0e82
|
@ -212,10 +212,9 @@ FindLengthOfTunnelResult FindLengthOfTunnel(uint tile, int direction)
|
||||||
tile = TILE_FROM_XY(x,y);
|
tile = TILE_FROM_XY(x,y);
|
||||||
|
|
||||||
if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) &&
|
if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) &&
|
||||||
(_map5[tile] & 0xF0) == 0 &&
|
(_map5[tile] & 0xF0) == 0 && // tunnel entrance/exit
|
||||||
//((_map5[tile]>>2)&3) == type && // This is
|
//((_map5[tile]>>2)&3) == type && // rail/road-tunnel <-- This is not necesary to check, right?
|
||||||
//not necesary to check, right?
|
((_map5[tile] & 3)^2) == direction && // entrance towards: 0 = NE, 1 = SE, 2 = SW, 3 = NW
|
||||||
((_map5[tile] & 3)^2) == direction &&
|
|
||||||
GetSlopeZ(x+8, y+8) == z)
|
GetSlopeZ(x+8, y+8) == z)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -263,7 +262,7 @@ void TPFMode1(TrackPathFinder *tpf, uint tile, int direction)
|
||||||
uint tile_org = tile;
|
uint tile_org = tile;
|
||||||
|
|
||||||
if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) && (_map5[tile] & 0xF0)==0) {
|
if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) && (_map5[tile] & 0xF0)==0) {
|
||||||
if ((_map5[tile] & 3) != direction || ((_map5[tile]>>1)&6) != tpf->tracktype)
|
if ((_map5[tile] & 3) != direction || ((_map5[tile]>>2)&3) != tpf->tracktype)
|
||||||
return;
|
return;
|
||||||
tile = SkipToEndOfTunnel(tpf, tile, direction);
|
tile = SkipToEndOfTunnel(tpf, tile, direction);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1047,13 +1047,6 @@ static uint32 GetTileTrackStatus_Road(uint tile, TransportType mode) {
|
||||||
r *= 0x10001;
|
r *= 0x10001;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
} else if ((b&0xF0) == 0x20) {
|
|
||||||
/* Depot */
|
|
||||||
/* We reverse the dir because it points out of the
|
|
||||||
* exit, and we want to get in. Maybe we should return
|
|
||||||
* both dirs here? */
|
|
||||||
byte dir = _reverse_dir[b&3];
|
|
||||||
return 1 << _dir_to_straight_trackdir[dir];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1028,17 +1028,28 @@ static int RoadFindPathToDest(Vehicle *v, uint tile, int direction)
|
||||||
bitmask = (uint16)r;
|
bitmask = (uint16)r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_TILETYPE(tile, MP_STREET)) {
|
||||||
/* Most of the checks that used to be here, are now integrated into
|
if ((_map5[tile]&0xF0) == 0x20 && v->owner == _map_owner[tile])
|
||||||
* GetTileTrackStatus now. The only thing still remaining is the
|
/* Road crossing */
|
||||||
* owner check for stations and depots, since GetTileTrackStatus
|
bitmask |= _road_veh_fp_ax_or[_map5[tile]&3];
|
||||||
* doesn't know about owner */
|
} else if (IS_TILETYPE(tile, MP_STATION)) {
|
||||||
if (IS_TILETYPE(tile, MP_STREET) && (_map5[tile]&0xF0) == 0x20 && v->owner != _map_owner[tile])
|
if (_map_owner[tile] == OWNER_NONE || _map_owner[tile] == v->owner) {
|
||||||
/* Depot not owned by us */
|
/* Our station */
|
||||||
bitmask = 0;
|
Station *st = DEREF_STATION(_map2[tile]);
|
||||||
if (IS_TILETYPE(tile, MP_STATION) && _map_owner[tile] != OWNER_NONE && _map_owner[tile] != v->owner)
|
byte val = _map5[tile];
|
||||||
/* Station not owned by us */
|
if (v->cargo_type != CT_PASSENGERS) {
|
||||||
bitmask = 0;
|
if (IS_BYTE_INSIDE(val, 0x43, 0x47) && (_patches.roadveh_queue || st->truck_stop_status&3))
|
||||||
|
bitmask |= _road_veh_fp_ax_or[(val-0x43)&3];
|
||||||
|
} else {
|
||||||
|
if (IS_BYTE_INSIDE(val, 0x47, 0x4B) && (_patches.roadveh_queue || st->bus_stop_status&3))
|
||||||
|
bitmask |= _road_veh_fp_ax_or[(val-0x47)&3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* The above lookups should be moved to GetTileTrackStatus in the
|
||||||
|
* future, but that requires more changes to the pathfinder and other
|
||||||
|
* stuff, probably even more arguments to GTTS.
|
||||||
|
*/
|
||||||
|
|
||||||
/* remove unreachable tracks */
|
/* remove unreachable tracks */
|
||||||
bitmask &= _road_veh_fp_ax_and[direction];
|
bitmask &= _road_veh_fp_ax_and[direction];
|
||||||
|
|
4
ttd.h
4
ttd.h
|
@ -106,8 +106,8 @@ typedef enum TransportTypes {
|
||||||
*/
|
*/
|
||||||
TRANSPORT_RAIL = 0,
|
TRANSPORT_RAIL = 0,
|
||||||
TRANSPORT_ROAD = 1,
|
TRANSPORT_ROAD = 1,
|
||||||
TRANSPORT_WATER,
|
TRANSPORT_WATER, // = 2
|
||||||
TRANSPORT_MAX
|
TRANSPORT_MAX // = 3
|
||||||
} TransportType;
|
} TransportType;
|
||||||
|
|
||||||
typedef struct TileInfo {
|
typedef struct TileInfo {
|
||||||
|
|
|
@ -1318,7 +1318,7 @@ static uint32 GetTileTrackStatus_TunnelBridge(uint tile, TransportType mode)
|
||||||
/* Bridge middle part */
|
/* Bridge middle part */
|
||||||
if (!(m5 & 0x20)) {
|
if (!(m5 & 0x20)) {
|
||||||
/* Clear ground or water underneath */
|
/* Clear ground or water underneath */
|
||||||
if ((m5 &= 0x18) != 8)
|
if ((m5 & 0x18) != 8)
|
||||||
/* Clear ground */
|
/* Clear ground */
|
||||||
return result;
|
return result;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue