diff --git a/rail_cmd.c b/rail_cmd.c index da7dcf1579..099c2a8593 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 e72cbb37ee..92e9742d26 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 56e03ea8c2..25e164e481 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 e02c9e4431..bb5698f4ca 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);