Changeset - r3099:4c0775639e0c
[Not reviewed]
master
0 4 0
tron - 19 years ago 2006-02-28 21:19:50
tron@openttd.org
(svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
4 files changed with 52 insertions and 34 deletions:
0 comments (0 inline, 0 general)
rail_cmd.c
Show inline comments
 
@@ -351,16 +351,13 @@ int32 CmdBuildSingleRail(int x, int y, u
 

	
 
			if (GetRoadType(tile) == ROAD_NORMAL && (
 
						(track == TRACK_DIAG1 && m5 == ROAD_Y) ||
 
						(track == TRACK_DIAG2 && m5 == ROAD_X) // correct direction?
 
					)) {
 
				if (flags & DC_EXEC) {
 
					_m[tile].m3 = GetTileOwner(tile);
 
					SetTileOwner(tile, _current_player);
 
					_m[tile].m4 = p1;
 
					_m[tile].m5 = 0x10 | (track == TRACK_DIAG1 ? 0x08 : 0x00); // level crossing
 
					MakeRoadCrossing(tile, GetTileOwner(tile), _current_player, (track == TRACK_DIAG1 ? AXIS_Y : AXIS_X), p1, _m[tile].m2);
 
				}
 
				break;
 
			}
 

	
 
			if (IsLevelCrossing(tile) && (m5 & 0x08 ? TRACK_DIAG1 : TRACK_DIAG2) == track)
 
				return_cmd_error(STR_1007_ALREADY_BUILT);
 
@@ -457,15 +454,13 @@ int32 CmdRemoveSingleRail(int x, int y, 
 
				bits = ROAD_X;
 
			}
 

	
 
			if (!(flags & DC_EXEC))
 
				return _price.remove_rail;
 

	
 
			SetTileOwner(tile, _m[tile].m3);
 
			_m[tile].m2 = 0;
 
			_m[tile].m5 = (ROAD_NORMAL << 4) | bits;
 
			MakeRoadNormal(tile, _m[tile].m3, bits, 0);
 
			break;
 
		}
 

	
 
		case MP_RAILWAY:
 
			if (!IsPlainRailTile(tile))
 
				return CMD_ERROR;
road.h
Show inline comments
 
/* $Id$ */
 

	
 
#ifndef ROAD_H
 
#define ROAD_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,
 
@@ -33,7 +35,40 @@ typedef enum RoadType {
 

	
 
static inline RoadType GetRoadType(TileIndex tile)
 
{
 
	return GB(_m[tile].m5, 4, 4);
 
}
 

	
 

	
 
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
road_cmd.c
Show inline comments
 
@@ -383,41 +383,34 @@ int32 CmdBuildRoad(int x, int y, uint32 
 
				case ROAD_DEPOT:
 
					goto do_clear;
 
			}
 
			break;
 

	
 
		case MP_RAILWAY: {
 
			byte m5;
 
			Axis roaddir;
 

	
 
			if (IsSteepTileh(ti.tileh)) { // very steep tile
 
				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 
			}
 

	
 
			if (!_valid_tileh_slopes_road[2][ti.tileh]) { // prevent certain slopes
 
				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 
			}
 

	
 
			if (ti.map5 == 2) {
 
				if (pieces & ROAD_Y) goto do_clear;
 
				m5 = 0x10;
 
				roaddir = AXIS_X;
 
			} else if (ti.map5 == 1) {
 
				if (pieces & ROAD_X) goto do_clear;
 
				m5 = 0x18;
 
				roaddir = AXIS_Y;
 
			} else {
 
				goto do_clear;
 
			}
 

	
 
			if (flags & DC_EXEC) {
 
				ModifyTile(tile,
 
					MP_SETTYPE(MP_STREET) |
 
					MP_MAP2 | MP_MAP3LO | MP_MAP3HI | MP_MAP5,
 
					p2,
 
					_current_player, /* map3_lo */
 
					_m[tile].m3 & 0xF, /* map3_hi */
 
					m5 /* map5 */
 
				);
 
				MakeRoadCrossing(tile, _current_player, GetTileOwner(tile), roaddir, GB(_m[tile].m3, 0, 4), p2);
 
			}
 
			return _price.build_road * 2;
 
		}
 

	
 
		case MP_TUNNELBRIDGE:
 
			/* check for flat land */
 
@@ -476,20 +469,17 @@ do_clear:;
 
			t >>= 1;
 
		}
 
	}
 

	
 
	if (flags & DC_EXEC) {
 
		if (ti.type != MP_STREET) {
 
			SetTileType(tile, MP_STREET);
 
			_m[tile].m5 = 0;
 
			_m[tile].m2 = p2;
 
			SetTileOwner(tile, _current_player);
 
			MakeRoadNormal(tile, _current_player, pieces, p2);
 
		} else {
 
			_m[tile].m5 |= pieces;
 
		}
 

	
 
		_m[tile].m5 |= pieces;
 

	
 
		MarkTileDirtyByTile(tile);
 
	}
 
	return cost;
 
}
 

	
 
int32 DoConvertStreetRail(TileIndex tile, uint totype, bool exec)
 
@@ -665,18 +655,13 @@ int32 CmdBuildRoadDepot(int x, int y, ui
 
	if (flags & DC_EXEC) {
 
		if (IsLocalPlayer()) _last_built_road_depot_tile = tile;
 

	
 
		dep->xy = tile;
 
		dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 

	
 
		ModifyTile(tile,
 
			MP_SETTYPE(MP_STREET) |
 
			MP_MAPOWNER_CURRENT | MP_MAP5,
 
			(ROAD_DEPOT << 4) | p1 /* map5 */
 
		);
 

	
 
		MakeRoadDepot(tile, _current_player, p1);
 
	}
 
	return cost + _price.build_road_depot;
 
}
 

	
 
static int32 RemoveRoadDepot(TileIndex tile, uint32 flags)
 
{
 
@@ -1212,16 +1197,13 @@ static void ChangeTileOwner_Road(TileInd
 
		switch (GetRoadType(tile)) {
 
			case ROAD_NORMAL:
 
				SetTileOwner(tile, OWNER_NONE);
 
				break;
 

	
 
			case ROAD_CROSSING:
 
				SetTileOwner(tile, _m[tile].m3);
 
				_m[tile].m3 = 0;
 
				_m[tile].m4 &= 0x80;
 
				_m[tile].m5 = (ROAD_NORMAL << 4) | GetCrossingRoadBits(tile);
 
				MakeRoadNormal(tile, _m[tile].m3, GetCrossingRoadBits(tile), _m[tile].m2);
 
				break;
 

	
 
			default:
 
			case ROAD_DEPOT:
 
				DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
 
				break;
tile.h
Show inline comments
 
@@ -41,12 +41,18 @@ typedef enum DiagonalDirections {
 
	DIAGDIR_SW  = 2,
 
	DIAGDIR_NW  = 3,
 
	DIAGDIR_END,
 
	INVALID_DIAGDIR = 0xFF,
 
} DiagDirection;
 

	
 
/* the 2 axis */
 
typedef enum Axis {
 
	AXIS_X = 0,
 
	AXIS_Y = 1
 
} Axis;
 

	
 
void SetMapExtraBits(TileIndex tile, byte flags);
 
uint GetMapExtraBits(TileIndex tile);
 

	
 
uint GetTileSlope(TileIndex tile, uint *h);
 
uint GetTileZ(TileIndex tile);
 

	
0 comments (0 inline, 0 general)