Changeset - r3146:b3862f32db0e
[Not reviewed]
master
0 5 1
tron - 19 years ago 2006-03-05 12:22:20
tron@openttd.org
(svn r3766) Add a function to get the RoadBits from an arbitrary tile
6 files changed with 73 insertions and 37 deletions:
0 comments (0 inline, 0 general)
Makefile
Show inline comments
 
@@ -672,6 +672,7 @@ SRCS += rail_gui.c
 
SRCS += rev.c
 
SRCS += road_cmd.c
 
SRCS += road_gui.c
 
SRCS += road_map.c
 
SRCS += roadveh_cmd.c
 
SRCS += roadveh_gui.c
 
SRCS += saveload.c
road_cmd.c
Show inline comments
 
@@ -27,38 +27,6 @@ static bool _road_special_gettrackstatus
 
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)
 
{
 
	int blocks;
 
@@ -90,10 +58,10 @@ static bool CheckAllowRemoveRoad(TileInd
 

	
 
	// Get a bitmask of which neighbouring roads has a tile
 
	n = 0;
 
	if (blocks&0x25 && HasTileRoadAt(TILE_ADDXY(tile,-1, 0), 1)) n |= 8;
 
	if (blocks&0x2A && HasTileRoadAt(TILE_ADDXY(tile, 0, 1), 0)) n |= 4;
 
	if (blocks&0x19 && HasTileRoadAt(TILE_ADDXY(tile, 1, 0), 3)) n |= 2;
 
	if (blocks&0x16 && HasTileRoadAt(TILE_ADDXY(tile, 0,-1), 2)) n |= 1;
 
	if (blocks & 0x25 && GetAnyRoadBits(TILE_ADDXY(tile,-1, 0)) & ROAD_SW) n |= 8;
 
	if (blocks & 0x2A && GetAnyRoadBits(TILE_ADDXY(tile, 0, 1)) & ROAD_NW) n |= 4;
 
	if (blocks & 0x19 && GetAnyRoadBits(TILE_ADDXY(tile, 1, 0)) & ROAD_NE) n |= 2;
 
	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,
 
	// then allow it
road_map.c
Show inline comments
 
new file 100644
 
/* $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;
 
	}
 
}
road_map.h
Show inline comments
 
@@ -22,6 +22,12 @@ static inline RoadBits ComplementRoadBit
 
	return ROAD_ALL ^ r;
 
}
 

	
 
static inline RoadBits DiagDirToRoadBits(DiagDirection d)
 
{
 
	return 1 << (3 ^ d);
 
}
 

	
 

	
 
static inline RoadBits GetRoadBits(TileIndex tile)
 
{
 
	return GB(_m[tile].m5, 0, 4);
 
@@ -50,6 +56,17 @@ static inline RoadType GetRoadType(TileI
 
}
 

	
 

	
 
/**
 
 * 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)
 
{
 
	SetTileType(t, MP_STREET);
station.h
Show inline comments
 
@@ -244,7 +244,7 @@ static inline bool IsBuoyTile(TileIndex 
 

	
 
/* Get's the direction the station exit points towards. Ie, returns 0 for a
 
 * station with the exit NE. */
 
static inline byte GetRoadStationDir(TileIndex tile)
 
static inline DiagDirection GetRoadStationDir(TileIndex tile)
 
{
 
	assert(IsRoadStationTile(tile));
 
	return (_m[tile].m5 - 0x43) & 3;
tile.h
Show inline comments
 
@@ -44,6 +44,12 @@ typedef enum DiagonalDirections {
 
	INVALID_DIAGDIR = 0xFF,
 
} DiagDirection;
 

	
 
static inline DiagDirection ReverseDiagDir(DiagDirection d)
 
{
 
	return 2 ^ d;
 
}
 

	
 

	
 
/* the 2 axis */
 
typedef enum Axis {
 
	AXIS_X = 0,
0 comments (0 inline, 0 general)