changeset 3099:5f58ebf999f0 draft

(svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
author tron <tron@openttd.org>
date Tue, 28 Feb 2006 21:19:50 +0000
parents f746e2c344d7
children e46de0b5308a
files rail_cmd.c road.h road_cmd.c tile.h
diffstat 4 files changed, 52 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/rail_cmd.c
+++ b/rail_cmd.c
@@ -354,10 +354,7 @@
 						(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;
 			}
@@ -460,9 +457,7 @@
 			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;
 		}
 
--- a/road.h
+++ b/road.h
@@ -4,6 +4,8 @@
 #define ROAD_H
 
 #include "macros.h"
+#include "rail.h"
+#include "tile.h"
 
 typedef enum RoadBits {
 	ROAD_NW  = 1,
@@ -36,4 +38,37 @@
 	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
--- a/road_cmd.c
+++ b/road_cmd.c
@@ -386,7 +386,7 @@
 			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);
@@ -398,23 +398,16 @@
 
 			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;
 		}
@@ -479,14 +472,11 @@
 
 	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;
@@ -668,12 +658,7 @@
 		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;
 }
@@ -1215,10 +1200,7 @@
 				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:
--- a/tile.h
+++ b/tile.h
@@ -44,6 +44,12 @@
 	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);