summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortron <tron@openttd.org>2006-02-28 21:19:50 +0000
committertron <tron@openttd.org>2006-02-28 21:19:50 +0000
commit0d044cabca9a1dcae15892de613dd418bfe093f7 (patch)
treef0429fb414017152fbcad0a79e27238992e53f6d
parent530a44436ceb6095c37c7d45eaa65a78cd45e428 (diff)
downloadopenttd-0d044cabca9a1dcae15892de613dd418bfe093f7.tar.xz
(svn r3689) Add functions to turn a tile into either a normal road tile, a level crossing or a road depot
-rw-r--r--rail_cmd.c9
-rw-r--r--road.h35
-rw-r--r--road_cmd.c36
-rw-r--r--tile.h6
4 files changed, 52 insertions, 34 deletions
diff --git a/rail_cmd.c b/rail_cmd.c
index da7dcf157..099c2a859 100644
--- a/rail_cmd.c
+++ b/rail_cmd.c
@@ -354,10 +354,7 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
(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 @@ int32 CmdRemoveSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
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;
}
diff --git a/road.h b/road.h
index e72cbb37e..92e9742d2 100644
--- 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 @@ 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
diff --git a/road_cmd.c b/road_cmd.c
index 56e03ea8c..25e164e48 100644
--- a/road_cmd.c
+++ b/road_cmd.c
@@ -386,7 +386,7 @@ int32 CmdBuildRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
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 @@ int32 CmdBuildRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
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 @@ do_clear:;
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 @@ int32 CmdBuildRoadDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
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 @@ static void ChangeTileOwner_Road(TileIndex tile, PlayerID old_player, PlayerID n
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:
diff --git a/tile.h b/tile.h
index e02c9e443..bb5698f4c 100644
--- a/tile.h
+++ b/tile.h
@@ -44,6 +44,12 @@ typedef enum DiagonalDirections {
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);