OpenTTD/road_map.h

135 lines
2.6 KiB
C
Raw Normal View History

/* $Id$ */
#ifndef ROAD_MAP_H
#define ROAD_MAP_H
#include "macros.h"
#include "rail.h"
#include "tile.h"
typedef enum RoadBits {
ROAD_NW = 1,
ROAD_SW = 2,
ROAD_SE = 4,
ROAD_NE = 8,
ROAD_X = ROAD_SW | ROAD_NE,
ROAD_Y = ROAD_NW | ROAD_SE,
ROAD_ALL = ROAD_X | ROAD_Y
} RoadBits;
static inline RoadBits ComplementRoadBits(RoadBits r)
{
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);
}
static inline void SetRoadBits(TileIndex tile, RoadBits r)
{
SB(_m[tile].m5, 0, 4, r);
}
static inline Axis GetCrossingRoadAxis(TileIndex tile)
{
return (Axis)GB(_m[tile].m5, 3, 1);
}
static inline RoadBits GetCrossingRoadBits(TileIndex tile)
{
return GetCrossingRoadAxis(tile) == AXIS_X ? ROAD_X : ROAD_Y;
}
static inline TrackBits GetCrossingRailBits(TileIndex tile)
{
return GetCrossingRoadAxis(tile) == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X;
}
// TODO swap owner of road and rail
static inline Owner GetCrossingRoadOwner(TileIndex t)
{
return (Owner)_m[t].m3;
}
static inline void SetCrossingRoadOwner(TileIndex t, Owner o)
{
_m[t].m3 = o;
}
typedef enum RoadType {
ROAD_NORMAL,
ROAD_CROSSING,
ROAD_DEPOT
} RoadType;
static inline RoadType GetRoadType(TileIndex tile)
{
return GB(_m[tile].m5, 4, 4);
}
static inline DiagDirection GetRoadDepotDirection(TileIndex tile)
{
return (DiagDirection)GB(_m[tile].m5, 0, 2);
}
/**
* 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: start of the ramp is treated as road piece
* - bridge middle parts: bridge itself is ignored
*/
RoadBits GetAnyRoadBits(TileIndex);
TrackBits GetAnyRoadTrackBits(TileIndex tile);
static inline void MakeRoadNormal(TileIndex t, Owner owner, RoadBits bits, uint town)
{
SetTileType(t, MP_STREET);
SetTileOwner(t, owner);
_m[t].m2 = town;
_m[t].m3 = 0;
_m[t].m4 = 0 << 7 | 0 << 4 | 0;
_m[t].m5 = ROAD_NORMAL << 4 | bits;
}
static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner rail, Axis roaddir, RailType rt, uint town)
{
SetTileType(t, MP_STREET);
SetTileOwner(t, rail);
_m[t].m2 = town;
_m[t].m3 = road;
_m[t].m4 = 0 << 7 | 0 << 4 | rt;
_m[t].m5 = ROAD_CROSSING << 4 | roaddir << 3 | 0 << 2;
}
static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir)
{
SetTileType(t, MP_STREET);
SetTileOwner(t, owner);
_m[t].m2 = 0;
_m[t].m3 = 0;
_m[t].m4 = 0;
_m[t].m5 = ROAD_DEPOT << 4 | dir;
}
#endif