src/road_map.h
author rubidium
Thu, 15 Nov 2007 18:07:30 +0000
changeset 7887 b72ef3f45a38
parent 7370 41adc721b1fa
child 7928 63e18de69e50
permissions -rw-r--r--
(svn r11438) -Change: do not create shores in canyons. Based on a patch by LeviathNL.
3069
9a1fd047b595 (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents:
diff changeset
     1
/* $Id$ */
9a1fd047b595 (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents:
diff changeset
     2
6393
e1e4939d19b5 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6390
diff changeset
     3
/** @file road_map.h */
e1e4939d19b5 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6390
diff changeset
     4
3145
e833d7a78887 (svn r3765) Fix some naming glitches in r3763 and add missing svn properties
tron
parents: 3144
diff changeset
     5
#ifndef ROAD_MAP_H
e833d7a78887 (svn r3765) Fix some naming glitches in r3763 and add missing svn properties
tron
parents: 3144
diff changeset
     6
#define ROAD_MAP_H
3069
9a1fd047b595 (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents:
diff changeset
     7
9a1fd047b595 (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents:
diff changeset
     8
#include "macros.h"
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
     9
#include "rail.h"
3518
c1e19f08fc25 (svn r4374) Never directly commit something you prepared the evening before, mysteriously it will break in the morning, fix r4373
tron
parents: 3497
diff changeset
    10
#include "road.h"
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
    11
#include "tile.h"
3069
9a1fd047b595 (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents:
diff changeset
    12
3146
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
    13
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6172
diff changeset
    14
enum RoadTileType {
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
    15
	ROAD_TILE_NORMAL,
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
    16
	ROAD_TILE_CROSSING,
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
    17
	ROAD_TILE_DEPOT
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6172
diff changeset
    18
};
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
    19
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
    20
static inline RoadTileType GetRoadTileType(TileIndex t)
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    21
	{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
    22
	assert(IsTileType(t, MP_ROAD));
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    23
	return (RoadTileType)GB(_m[t].m5, 6, 2);
3150
729951cb5448 (svn r3773) Shove some semantics down ottd's throat by replacing ints and magic numbers by enums and some related changes
tron
parents: 3146
diff changeset
    24
}
729951cb5448 (svn r3773) Shove some semantics down ottd's throat by replacing ints and magic numbers by enums and some related changes
tron
parents: 3146
diff changeset
    25
3497
154080838ed1 (svn r4348) Move IsLevelCrossing() from rail.h to road_map.h
tron
parents: 3430
diff changeset
    26
static inline bool IsLevelCrossing(TileIndex t)
154080838ed1 (svn r4348) Move IsLevelCrossing() from rail.h to road_map.h
tron
parents: 3430
diff changeset
    27
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
    28
	return GetRoadTileType(t) == ROAD_TILE_CROSSING;
3497
154080838ed1 (svn r4348) Move IsLevelCrossing() from rail.h to road_map.h
tron
parents: 3430
diff changeset
    29
}
154080838ed1 (svn r4348) Move IsLevelCrossing() from rail.h to road_map.h
tron
parents: 3430
diff changeset
    30
3560
b2fcf1898eec (svn r4435) - Fix: an assertion triggered when trying to remove a bridge with the remove-tool (r4348 surfaced this). In CmdRemoveRoad tiletype was not checked for ownership. Intorudce IsLevelCrossingTile() which checks if a tile is a crossing without knowing the type. Suggested by peter1138 and Tron.
Darkvater
parents: 3518
diff changeset
    31
static inline bool IsLevelCrossingTile(TileIndex t)
b2fcf1898eec (svn r4435) - Fix: an assertion triggered when trying to remove a bridge with the remove-tool (r4348 surfaced this). In CmdRemoveRoad tiletype was not checked for ownership. Intorudce IsLevelCrossingTile() which checks if a tile is a crossing without knowing the type. Suggested by peter1138 and Tron.
Darkvater
parents: 3518
diff changeset
    32
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
    33
	return IsTileType(t, MP_ROAD) && IsLevelCrossing(t);
3560
b2fcf1898eec (svn r4435) - Fix: an assertion triggered when trying to remove a bridge with the remove-tool (r4348 surfaced this). In CmdRemoveRoad tiletype was not checked for ownership. Intorudce IsLevelCrossingTile() which checks if a tile is a crossing without knowing the type. Suggested by peter1138 and Tron.
Darkvater
parents: 3518
diff changeset
    34
}
3150
729951cb5448 (svn r3773) Shove some semantics down ottd's throat by replacing ints and magic numbers by enums and some related changes
tron
parents: 3146
diff changeset
    35
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    36
static inline RoadBits GetRoadBits(TileIndex t, RoadType rt)
3272
b3e2d8e19937 (svn r3984) Add a function to get the road axis of a level crossing
tron
parents: 3196
diff changeset
    37
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
    38
	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    39
	switch (rt) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    40
		default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    41
		case ROADTYPE_ROAD: return (RoadBits)GB(_m[t].m4, 0, 4);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    42
		case ROADTYPE_TRAM: return (RoadBits)GB(_m[t].m4, 4, 4);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    43
		case ROADTYPE_HWAY: return (RoadBits)GB(_m[t].m6, 2, 4);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    44
	}
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
    45
}
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
    46
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    47
static inline RoadBits GetAllRoadBits(TileIndex tile)
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    48
{
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    49
	return GetRoadBits(tile, ROADTYPE_ROAD) | GetRoadBits(tile, ROADTYPE_TRAM) | GetRoadBits(tile, ROADTYPE_HWAY);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    50
}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    51
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    52
static inline void SetRoadBits(TileIndex t, RoadBits r, RoadType rt)
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
    53
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
    54
	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL); // XXX incomplete
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    55
	switch (rt) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    56
		default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    57
		case ROADTYPE_ROAD: SB(_m[t].m4, 0, 4, r); break;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    58
		case ROADTYPE_TRAM: SB(_m[t].m4, 4, 4, r); break;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    59
		case ROADTYPE_HWAY: SB(_m[t].m6, 2, 4, r); break;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    60
	}
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
    61
}
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
    62
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    63
static inline RoadTypes GetRoadTypes(TileIndex t)
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    64
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
    65
	if (IsTileType(t, MP_ROAD)) {
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    66
		return (RoadTypes)GB(_me[t].m7, 5, 3);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    67
	} else {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    68
		return (RoadTypes)GB(_m[t].m3, 0, 3);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    69
	}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    70
}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    71
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    72
static inline void SetRoadTypes(TileIndex t, RoadTypes rt)
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    73
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
    74
	if (IsTileType(t, MP_ROAD)) {
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    75
		SB(_me[t].m7, 5, 3, rt);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    76
	} else {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    77
		assert(IsTileType(t, MP_STATION) || IsTileType(t, MP_TUNNELBRIDGE));
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    78
		SB(_m[t].m3, 0, 2, rt);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    79
	}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    80
}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    81
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    82
static inline Owner GetRoadOwner(TileIndex t, RoadType rt)
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    83
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
    84
	if (!IsTileType(t, MP_ROAD)) return GetTileOwner(t);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    85
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    86
	switch (GetRoadTileType(t)) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    87
		default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    88
		case ROAD_TILE_NORMAL:
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    89
			switch (rt) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    90
				default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    91
				case ROADTYPE_ROAD: return (Owner)GB( _m[t].m1, 0, 5);
6764
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
    92
				case ROADTYPE_TRAM: {
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
    93
					/* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
    94
					 * to OWNER_TOWN makes it use one bit less */
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
    95
					Owner o = (Owner)GB( _m[t].m5, 0, 4);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
    96
					return o == OWNER_TOWN ? OWNER_NONE : o;
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
    97
				}
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    98
				case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
    99
			}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   100
		case ROAD_TILE_CROSSING:
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   101
			switch (rt) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   102
				default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   103
				case ROADTYPE_ROAD: return (Owner)GB( _m[t].m4, 0, 5);
6764
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   104
				case ROADTYPE_TRAM: {
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   105
					/* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   106
					 * to OWNER_TOWN makes it use one bit less */
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   107
					Owner o = (Owner)GB( _m[t].m5, 0, 4);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   108
					return o == OWNER_TOWN ? OWNER_NONE : o;
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   109
				}
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   110
				case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   111
			}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   112
		case ROAD_TILE_DEPOT: return GetTileOwner(t);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   113
	}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   114
}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   115
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   116
static inline void SetRoadOwner(TileIndex t, RoadType rt, Owner o)
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   117
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
   118
	if (!IsTileType(t, MP_ROAD)) return SetTileOwner(t, o);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   119
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   120
	switch (GetRoadTileType(t)) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   121
		default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   122
		case ROAD_TILE_NORMAL:
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   123
			switch (rt) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   124
				default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   125
				case ROADTYPE_ROAD: SB( _m[t].m1, 0, 5, o); break;
6764
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   126
				case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   127
				case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   128
			}
6662
ea30b3497d9a (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 6661
diff changeset
   129
			break;
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   130
		case ROAD_TILE_CROSSING:
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   131
			switch (rt) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   132
				default: NOT_REACHED();
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   133
				case ROADTYPE_ROAD: SB( _m[t].m4, 0, 5, o); break;
6764
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   134
				/* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   135
				 * to OWNER_TOWN makes it use one bit less */
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   136
				case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   137
				case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   138
			}
6662
ea30b3497d9a (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 6661
diff changeset
   139
			break;
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   140
		case ROAD_TILE_DEPOT: return SetTileOwner(t, o);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   141
	}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   142
}
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
   143
6764
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   144
/** Which directions are disallowed ? */
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   145
enum DisallowedRoadDirections {
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   146
	DRD_NONE,       ///< None of the directions are disallowed
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   147
	DRD_SOUTHBOUND, ///< All southbound traffic is disallowed
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   148
	DRD_NORTHBOUND, ///< All northbound traffic is disallowed
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   149
	DRD_BOTH,       ///< All directions are disallowed
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   150
	DRD_END
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   151
};
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   152
DECLARE_ENUM_AS_BIT_SET(DisallowedRoadDirections);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   153
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   154
/**
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   155
 * Gets the disallowed directions
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   156
 * @param t the tile to get the directions from
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   157
 * @return the disallowed directions
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   158
 */
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   159
static inline DisallowedRoadDirections GetDisallowedRoadDirections(TileIndex t)
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   160
{
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   161
	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   162
	return (DisallowedRoadDirections)GB(_m[t].m5, 4, 2);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   163
}
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   164
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   165
/**
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   166
 * Sets the disallowed directions
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   167
 * @param t   the tile to set the directions for
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   168
 * @param drd the disallowed directions
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   169
 */
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   170
static inline void SetDisallowedRoadDirections(TileIndex t, DisallowedRoadDirections drd)
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   171
{
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   172
	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   173
	assert(drd < DRD_END);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   174
	SB(_m[t].m5, 4, 2, drd);
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   175
}
d09d8d618a07 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 6662
diff changeset
   176
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
   177
static inline Axis GetCrossingRoadAxis(TileIndex t)
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
   178
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
   179
	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   180
	return (Axis)GB(_m[t].m4, 6, 1);
3272
b3e2d8e19937 (svn r3984) Add a function to get the road axis of a level crossing
tron
parents: 3196
diff changeset
   181
}
b3e2d8e19937 (svn r3984) Add a function to get the road axis of a level crossing
tron
parents: 3196
diff changeset
   182
3070
980529af506f (svn r3659) Add function to get the road bits of a level crossing
tron
parents: 3069
diff changeset
   183
static inline RoadBits GetCrossingRoadBits(TileIndex tile)
980529af506f (svn r3659) Add function to get the road bits of a level crossing
tron
parents: 3069
diff changeset
   184
{
3272
b3e2d8e19937 (svn r3984) Add a function to get the road axis of a level crossing
tron
parents: 3196
diff changeset
   185
	return GetCrossingRoadAxis(tile) == AXIS_X ? ROAD_X : ROAD_Y;
3070
980529af506f (svn r3659) Add function to get the road bits of a level crossing
tron
parents: 3069
diff changeset
   186
}
980529af506f (svn r3659) Add function to get the road bits of a level crossing
tron
parents: 3069
diff changeset
   187
3103
c0681c720481 (svn r3698) Add GetCrossingRailBits() and ComplementRoadBits(). Simplify the code by using them
tron
parents: 3099
diff changeset
   188
static inline TrackBits GetCrossingRailBits(TileIndex tile)
c0681c720481 (svn r3698) Add GetCrossingRailBits() and ComplementRoadBits(). Simplify the code by using them
tron
parents: 3099
diff changeset
   189
{
4158
91ff9bb84ced (svn r5582) Add and use AxisToTrack{Bits,}()
tron
parents: 4048
diff changeset
   190
	return AxisToTrackBits(OtherAxis(GetCrossingRoadAxis(tile)));
3103
c0681c720481 (svn r3698) Add GetCrossingRailBits() and ComplementRoadBits(). Simplify the code by using them
tron
parents: 3099
diff changeset
   191
}
c0681c720481 (svn r3698) Add GetCrossingRailBits() and ComplementRoadBits(). Simplify the code by using them
tron
parents: 3099
diff changeset
   192
c0681c720481 (svn r3698) Add GetCrossingRailBits() and ComplementRoadBits(). Simplify the code by using them
tron
parents: 3099
diff changeset
   193
3322
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   194
static inline void UnbarCrossing(TileIndex t)
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   195
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
   196
	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   197
	CLRBIT(_m[t].m4, 5);
3322
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   198
}
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   199
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   200
static inline void BarCrossing(TileIndex t)
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   201
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
   202
	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   203
	SETBIT(_m[t].m4, 5);
3322
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   204
}
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   205
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   206
static inline bool IsCrossingBarred(TileIndex t)
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   207
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
   208
	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   209
	return HASBIT(_m[t].m4, 5);
3322
41b4d25b126d (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3274
diff changeset
   210
}
3274
555f8f5006fb (svn r3986) Add [GS]etCrossingRoadOwner
tron
parents: 3272
diff changeset
   211
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   212
#define IsOnDesert IsOnSnow
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   213
static inline bool IsOnSnow(TileIndex t)
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   214
{
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 5475
diff changeset
   215
	return HASBIT(_m[t].m3, 7);
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   216
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   217
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   218
#define ToggleDesert ToggleSnow
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   219
static inline void ToggleSnow(TileIndex t)
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   220
{
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 5475
diff changeset
   221
	TOGGLEBIT(_m[t].m3, 7);
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   222
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   223
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   224
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6172
diff changeset
   225
enum Roadside {
4048
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   226
	ROADSIDE_BARREN           = 0,
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   227
	ROADSIDE_GRASS            = 1,
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   228
	ROADSIDE_PAVED            = 2,
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   229
	ROADSIDE_STREET_LIGHTS    = 3,
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   230
	ROADSIDE_TREES            = 5,
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   231
	ROADSIDE_GRASS_ROAD_WORKS = 6,
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   232
	ROADSIDE_PAVED_ROAD_WORKS = 7
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6172
diff changeset
   233
};
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   234
4048
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   235
static inline Roadside GetRoadside(TileIndex tile)
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   236
{
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 5475
diff changeset
   237
	return (Roadside)GB(_m[tile].m3, 4, 3);
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   238
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   239
4048
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   240
static inline void SetRoadside(TileIndex tile, Roadside s)
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   241
{
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 5475
diff changeset
   242
	SB(_m[tile].m3, 4, 3, s);
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   243
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   244
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   245
static inline bool HasRoadWorks(TileIndex t)
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   246
{
4048
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   247
	return GetRoadside(t) >= ROADSIDE_GRASS_ROAD_WORKS;
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   248
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   249
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   250
static inline bool IncreaseRoadWorksCounter(TileIndex t)
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   251
{
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 5475
diff changeset
   252
	AB(_m[t].m3, 0, 4, 1);
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   253
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 5475
diff changeset
   254
	return GB(_m[t].m3, 0, 4) == 15;
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   255
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   256
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   257
static inline void StartRoadWorks(TileIndex t)
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   258
{
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   259
	assert(!HasRoadWorks(t));
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   260
	/* Remove any trees or lamps in case or roadwork */
4048
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   261
	switch (GetRoadside(t)) {
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   262
		case ROADSIDE_BARREN:
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   263
		case ROADSIDE_GRASS:  SetRoadside(t, ROADSIDE_GRASS_ROAD_WORKS); break;
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   264
		default:              SetRoadside(t, ROADSIDE_PAVED_ROAD_WORKS); break;
4045
9eda219bc134 (svn r5314) -Regression: When road works started on a road tile with barren roadside the road side turned into trees (caused by r4258)
tron
parents: 4000
diff changeset
   265
	}
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   266
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   267
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   268
static inline void TerminateRoadWorks(TileIndex t)
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   269
{
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   270
	assert(HasRoadWorks(t));
4048
5d653b47d349 (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4045
diff changeset
   271
	SetRoadside(t, (Roadside)(GetRoadside(t) - ROADSIDE_GRASS_ROAD_WORKS + ROADSIDE_GRASS));
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   272
	/* Stop the counter */
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 5475
diff changeset
   273
	SB(_m[t].m3, 0, 4, 0);
3430
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   274
}
fcc344e41319 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3369
diff changeset
   275
3069
9a1fd047b595 (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents:
diff changeset
   276
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
   277
static inline DiagDirection GetRoadDepotDirection(TileIndex t)
3069
9a1fd047b595 (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents:
diff changeset
   278
{
3793
7fe24e10ea63 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3560
diff changeset
   279
	assert(GetRoadTileType(t) == ROAD_TILE_DEPOT);
3369
cab209754317 (svn r4166) Sprinkle several map accessors with assert()s
tron
parents: 3322
diff changeset
   280
	return (DiagDirection)GB(_m[t].m5, 0, 2);
3167
8323c2ccd029 (svn r3795) Add a function to request the orientation of a depot
tron
parents: 3150
diff changeset
   281
}
8323c2ccd029 (svn r3795) Add a function to request the orientation of a depot
tron
parents: 3150
diff changeset
   282
8323c2ccd029 (svn r3795) Add a function to request the orientation of a depot
tron
parents: 3150
diff changeset
   283
3146
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
   284
/**
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
   285
 * Returns the RoadBits on an arbitrary tile
6390
802629b3c7f1 (svn r9520) -Codechange: Add the notion of Industry behaviour. It means what an industry can do (plant fields, cut trees, do not change production), what can be done to it (disasters like mine subsidence, jet/chopper attack), when it can be built etc...
belugas
parents: 6248
diff changeset
   286
 * Special behaviour:
3146
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
   287
 * - road depots: entrance is treated as road piece
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
   288
 * - road tunnels: entrance is treated as road piece
3196
5cec26c5ab75 (svn r3857) Add and use GetBridgeRampDirection()
tron
parents: 3167
diff changeset
   289
 * - bridge ramps: start of the ramp is treated as road piece
3146
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
   290
 * - bridge middle parts: bridge itself is ignored
6418
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   291
 * @param tile the tile to get the road bits for
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   292
 * @param rt   the road type to get the road bits form
6418
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   293
 * @return the road bits of the given tile
3146
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
   294
 */
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   295
RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt);
3146
8d95593c5ff0 (svn r3766) Add a function to get the RoadBits from an arbitrary tile
tron
parents: 3145
diff changeset
   296
6418
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   297
/**
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   298
 * Get the accessible track bits for the given tile.
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   299
 * Special behaviour:
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   300
 *  - road depots: no track bits
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   301
 *  - non-drive-through stations: no track bits
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   302
 * @param tile the tile to get the track bits for
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   303
 * @return the track bits for the given tile
e04693bbe82a (svn r9554) -Documentation: add documentation to some map accessors.
rubidium
parents: 6393
diff changeset
   304
 */
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   305
TrackBits GetAnyRoadTrackBits(TileIndex tile, RoadType rt);
3150
729951cb5448 (svn r3773) Shove some semantics down ottd's throat by replacing ints and magic numbers by enums and some related changes
tron
parents: 3146
diff changeset
   306
729951cb5448 (svn r3773) Shove some semantics down ottd's throat by replacing ints and magic numbers by enums and some related changes
tron
parents: 3146
diff changeset
   307
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   308
static inline void MakeRoadNormal(TileIndex t, RoadBits bits, RoadTypes rot, TownID town, Owner road, Owner tram, Owner hway)
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   309
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
   310
	SetTileType(t, MP_ROAD);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   311
	SetTileOwner(t, road);
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   312
	_m[t].m2 = town;
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   313
	_m[t].m3 = 0;
6662
ea30b3497d9a (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 6661
diff changeset
   314
	_m[t].m4 = (HASBIT(rot, ROADTYPE_TRAM) ? bits : 0) << 4 | (HASBIT(rot, ROADTYPE_ROAD) ? bits : 0);
6778
58189151ce4f (svn r10014) -Fix: roads became automatically one way in the scenario editor.
rubidium
parents: 6764
diff changeset
   315
	_m[t].m5 = ROAD_TILE_NORMAL << 6;
58189151ce4f (svn r10014) -Fix: roads became automatically one way in the scenario editor.
rubidium
parents: 6764
diff changeset
   316
	SetRoadOwner(t, ROADTYPE_TRAM, tram);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   317
	SB(_m[t].m6, 2, 4, HASBIT(rot, ROADTYPE_HWAY) ? bits : 0);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   318
	_me[t].m7 = rot << 5 | hway;
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   319
}
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   320
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   321
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   322
static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner tram, Owner hway, Owner rail, Axis roaddir, RailType rat, RoadTypes rot, uint town)
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   323
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
   324
	SetTileType(t, MP_ROAD);
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   325
	SetTileOwner(t, rail);
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   326
	_m[t].m2 = town;
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   327
	_m[t].m3 = rat;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   328
	_m[t].m4 = roaddir << 6 | road;
6778
58189151ce4f (svn r10014) -Fix: roads became automatically one way in the scenario editor.
rubidium
parents: 6764
diff changeset
   329
	_m[t].m5 = ROAD_TILE_CROSSING << 6;
58189151ce4f (svn r10014) -Fix: roads became automatically one way in the scenario editor.
rubidium
parents: 6764
diff changeset
   330
	SetRoadOwner(t, ROADTYPE_TRAM, tram);
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   331
	SB(_m[t].m6, 2, 4, 0);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   332
	_me[t].m7 = rot << 5 | hway;
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   333
}
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   334
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   335
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   336
static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir, RoadType rt)
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   337
{
7370
41adc721b1fa (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 6778
diff changeset
   338
	SetTileType(t, MP_ROAD);
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   339
	SetTileOwner(t, owner);
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   340
	_m[t].m2 = 0;
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   341
	_m[t].m3 = 0;
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   342
	_m[t].m4 = 0;
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   343
	_m[t].m5 = ROAD_TILE_DEPOT << 6 | dir;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   344
	SB(_m[t].m6, 2, 4, 0);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6418
diff changeset
   345
	_me[t].m7 = RoadTypeToRoadTypes(rt) << 5;
3099
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   346
}
571719b2cee3 (svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
tron
parents: 3070
diff changeset
   347
4666
172a0cdf28a6 (svn r6560) - Codechange: Minor fix; add missing #include guards and comments, and correct svn properties on bmp.[ch]
peter1138
parents: 4158
diff changeset
   348
#endif /* ROAD_MAP_H */