mirror of https://github.com/OpenTTD/OpenTTD
(svn r3766) Add a function to get the RoadBits from an arbitrary tile
parent
ebec656110
commit
f007ad282c
1
Makefile
1
Makefile
|
@ -672,6 +672,7 @@ SRCS += rail_gui.c
|
||||||
SRCS += rev.c
|
SRCS += rev.c
|
||||||
SRCS += road_cmd.c
|
SRCS += road_cmd.c
|
||||||
SRCS += road_gui.c
|
SRCS += road_gui.c
|
||||||
|
SRCS += road_map.c
|
||||||
SRCS += roadveh_cmd.c
|
SRCS += roadveh_cmd.c
|
||||||
SRCS += roadveh_gui.c
|
SRCS += roadveh_gui.c
|
||||||
SRCS += saveload.c
|
SRCS += saveload.c
|
||||||
|
|
40
road_cmd.c
40
road_cmd.c
|
@ -27,38 +27,6 @@ static bool _road_special_gettrackstatus;
|
||||||
void RoadVehEnterDepot(Vehicle *v);
|
void RoadVehEnterDepot(Vehicle *v);
|
||||||
|
|
||||||
|
|
||||||
static bool HasTileRoadAt(TileIndex tile, int i)
|
|
||||||
{
|
|
||||||
RoadBits b;
|
|
||||||
|
|
||||||
switch (GetTileType(tile)) {
|
|
||||||
case MP_STREET:
|
|
||||||
switch (GetRoadType(tile)) {
|
|
||||||
case ROAD_NORMAL: b = GetRoadBits(tile); break;
|
|
||||||
case ROAD_CROSSING: b = GetCrossingRoadBits(tile); break;
|
|
||||||
case ROAD_DEPOT: return (~_m[tile].m5 & 3) == i;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MP_STATION:
|
|
||||||
return
|
|
||||||
IS_BYTE_INSIDE(_m[tile].m5, 0x43, 0x43 + 8) &&
|
|
||||||
(~(_m[tile].m5 - 0x43) & 3) == i;
|
|
||||||
|
|
||||||
case MP_TUNNELBRIDGE:
|
|
||||||
// bail out, if not a bridge middle part with road underneath
|
|
||||||
if ((_m[tile].m5 & 0xF8) != 0xE8) return false;
|
|
||||||
// road direction perpendicular to bridge
|
|
||||||
b = (_m[tile].m5 & 0x01) ? ROAD_X : ROAD_Y;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HASBIT(b, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool CheckAllowRemoveRoad(TileIndex tile, uint br, bool *edge_road)
|
static bool CheckAllowRemoveRoad(TileIndex tile, uint br, bool *edge_road)
|
||||||
{
|
{
|
||||||
int blocks;
|
int blocks;
|
||||||
|
@ -90,10 +58,10 @@ static bool CheckAllowRemoveRoad(TileIndex tile, uint br, bool *edge_road)
|
||||||
|
|
||||||
// Get a bitmask of which neighbouring roads has a tile
|
// Get a bitmask of which neighbouring roads has a tile
|
||||||
n = 0;
|
n = 0;
|
||||||
if (blocks&0x25 && HasTileRoadAt(TILE_ADDXY(tile,-1, 0), 1)) n |= 8;
|
if (blocks & 0x25 && GetAnyRoadBits(TILE_ADDXY(tile,-1, 0)) & ROAD_SW) n |= 8;
|
||||||
if (blocks&0x2A && HasTileRoadAt(TILE_ADDXY(tile, 0, 1), 0)) n |= 4;
|
if (blocks & 0x2A && GetAnyRoadBits(TILE_ADDXY(tile, 0, 1)) & ROAD_NW) n |= 4;
|
||||||
if (blocks&0x19 && HasTileRoadAt(TILE_ADDXY(tile, 1, 0), 3)) n |= 2;
|
if (blocks & 0x19 && GetAnyRoadBits(TILE_ADDXY(tile, 1, 0)) & ROAD_NE) n |= 2;
|
||||||
if (blocks&0x16 && HasTileRoadAt(TILE_ADDXY(tile, 0,-1), 2)) n |= 1;
|
if (blocks & 0x16 && GetAnyRoadBits(TILE_ADDXY(tile, 0,-1)) & ROAD_SE) n |= 1;
|
||||||
|
|
||||||
// If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
|
// If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
|
||||||
// then allow it
|
// then allow it
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include "openttd.h"
|
||||||
|
#include "road_map.h"
|
||||||
|
#include "station.h"
|
||||||
|
|
||||||
|
|
||||||
|
RoadBits GetAnyRoadBits(TileIndex tile)
|
||||||
|
{
|
||||||
|
switch (GetTileType(tile)) {
|
||||||
|
case MP_STREET:
|
||||||
|
switch (GetRoadType(tile)) {
|
||||||
|
default:
|
||||||
|
case ROAD_NORMAL: return GetRoadBits(tile);
|
||||||
|
case ROAD_CROSSING: return GetCrossingRoadBits(tile);
|
||||||
|
case ROAD_DEPOT: return DiagDirToRoadBits(GB(_m[tile].m5, 0, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
case MP_STATION:
|
||||||
|
if (!IsRoadStationTile(tile)) return 0;
|
||||||
|
return DiagDirToRoadBits(GetRoadStationDir(tile));
|
||||||
|
|
||||||
|
case MP_TUNNELBRIDGE:
|
||||||
|
if (_m[tile].m5 & 0x80) {
|
||||||
|
// bridge
|
||||||
|
if (_m[tile].m5 & 0x40) {
|
||||||
|
// middle part
|
||||||
|
if ((_m[tile].m5 & 0x38) != 0x28) return 0; // no road under bridge
|
||||||
|
return _m[tile].m5 & 1 ? ROAD_X : ROAD_Y;
|
||||||
|
} else {
|
||||||
|
// ending
|
||||||
|
if (GB(_m[tile].m5, 1, 2) != TRANSPORT_ROAD) return 0; // not a road bridge
|
||||||
|
return _m[tile].m5 & 1 ? ROAD_Y : ROAD_X;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// tunnel
|
||||||
|
if (GB(_m[tile].m5, 2, 2) != TRANSPORT_ROAD) return 0; // not a road tunnel
|
||||||
|
return DiagDirToRoadBits(ReverseDiagDir(GB(_m[tile].m5, 0, 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
17
road_map.h
17
road_map.h
|
@ -22,6 +22,12 @@ static inline RoadBits ComplementRoadBits(RoadBits r)
|
||||||
return ROAD_ALL ^ r;
|
return ROAD_ALL ^ r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline RoadBits DiagDirToRoadBits(DiagDirection d)
|
||||||
|
{
|
||||||
|
return 1 << (3 ^ d);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline RoadBits GetRoadBits(TileIndex tile)
|
static inline RoadBits GetRoadBits(TileIndex tile)
|
||||||
{
|
{
|
||||||
return GB(_m[tile].m5, 0, 4);
|
return GB(_m[tile].m5, 0, 4);
|
||||||
|
@ -50,6 +56,17 @@ static inline RoadType GetRoadType(TileIndex tile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the RoadBits on an arbitrary tile
|
||||||
|
* Special behavior:
|
||||||
|
* - road depots: entrance is treated as road piece
|
||||||
|
* - road tunnels: entrance is treated as road piece
|
||||||
|
* - bridge ramps: treated as straight road
|
||||||
|
* - bridge middle parts: bridge itself is ignored
|
||||||
|
*/
|
||||||
|
RoadBits GetAnyRoadBits(TileIndex);
|
||||||
|
|
||||||
|
|
||||||
static inline void MakeRoadNormal(TileIndex t, Owner owner, RoadBits bits, uint town)
|
static inline void MakeRoadNormal(TileIndex t, Owner owner, RoadBits bits, uint town)
|
||||||
{
|
{
|
||||||
SetTileType(t, MP_STREET);
|
SetTileType(t, MP_STREET);
|
||||||
|
|
|
@ -244,7 +244,7 @@ static inline bool IsBuoyTile(TileIndex tile)
|
||||||
|
|
||||||
/* Get's the direction the station exit points towards. Ie, returns 0 for a
|
/* Get's the direction the station exit points towards. Ie, returns 0 for a
|
||||||
* station with the exit NE. */
|
* station with the exit NE. */
|
||||||
static inline byte GetRoadStationDir(TileIndex tile)
|
static inline DiagDirection GetRoadStationDir(TileIndex tile)
|
||||||
{
|
{
|
||||||
assert(IsRoadStationTile(tile));
|
assert(IsRoadStationTile(tile));
|
||||||
return (_m[tile].m5 - 0x43) & 3;
|
return (_m[tile].m5 - 0x43) & 3;
|
||||||
|
|
6
tile.h
6
tile.h
|
@ -44,6 +44,12 @@ typedef enum DiagonalDirections {
|
||||||
INVALID_DIAGDIR = 0xFF,
|
INVALID_DIAGDIR = 0xFF,
|
||||||
} DiagDirection;
|
} DiagDirection;
|
||||||
|
|
||||||
|
static inline DiagDirection ReverseDiagDir(DiagDirection d)
|
||||||
|
{
|
||||||
|
return 2 ^ d;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* the 2 axis */
|
/* the 2 axis */
|
||||||
typedef enum Axis {
|
typedef enum Axis {
|
||||||
AXIS_X = 0,
|
AXIS_X = 0,
|
||||||
|
|
Loading…
Reference in New Issue