diff options
-rw-r--r-- | src/newgrf.cpp | 7 | ||||
-rw-r--r-- | src/newgrf.h | 10 | ||||
-rw-r--r-- | src/road_cmd.cpp | 25 |
3 files changed, 38 insertions, 4 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 6ee9be4ac..381a35bae 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -3764,7 +3764,7 @@ static void ParamSet(byte *buf, int len) case 0x9E: // Miscellaneous GRF features _misc_grf_features = res; /* Set train list engine width */ - _traininfo_vehicle_width = HASBIT(res, 3) ? 32 : 29; + _traininfo_vehicle_width = HasGrfMiscBit(GMB_TRAIN_WIDTH_32_PIXELS) ? 32 : 29; break; default: @@ -4811,3 +4811,8 @@ void LoadNewGRF(uint load_index, uint file_index) /* Call any functions that should be run after GRFs have been loaded. */ AfterLoadGRFs(); } + +bool HasGrfMiscBit(GrfMiscBit bit) +{ + return HASBIT(_misc_grf_features, bit); +} diff --git a/src/newgrf.h b/src/newgrf.h index 28972df30..0ee155af0 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -23,6 +23,14 @@ enum GrfLoadingStage { DECLARE_POSTFIX_INCREMENT(GrfLoadingStage); +enum GrfMiscBit { + GMB_DESERT_TREES_FIELDS = 0, // Unsupported. + GMB_DESERT_PAVED_ROADS = 1, + GMB_FIELD_BOUNDING_BOX = 2, // Unsupported. + GMB_TRAIN_WIDTH_32_PIXELS = 3, + GMB_AMBIENT_SOUND_CALLBACK = 4, // Unsupported. + GMB_CATENARY_ON_3RD_TRACK = 5, // Unsupported. +}; struct GRFLabel { byte label; @@ -85,4 +93,6 @@ void ReloadNewGRFData(); // in openttd.cpp void CDECL grfmsg(int severity, const char *str, ...); +bool HasGrfMiscBit(GrfMiscBit bit); + #endif /* NEWGRF_H */ diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 32a9b1fb3..2577e9b9c 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -26,6 +26,7 @@ #include "sound.h" #include "yapf/yapf.h" #include "depot.h" +#include "newgrf.h" static uint CountRoadBits(RoadBits r) @@ -662,6 +663,23 @@ const byte _road_sloped_sprites[14] = { }; /** + * Whether to draw unpaved roads regardless of the town zone. + * By default, OpenTTD always draws roads as unpaved if they are on a desert + * tile or above the snowline. Newgrf files, however, can set a bit that allows + * paved roads to be built on desert tiles as they would be on grassy tiles. + * + * @param tile The tile the road is on + * @param roadside What sort of road this is + * @return True if the road should be drawn unpaved regardless of the roadside. + */ +static bool AlwaysDrawUnpavedRoads(TileIndex tile, Roadside roadside) +{ + return (IsOnSnow(tile) && + !(_opt.landscape == LT_TROPIC && HasGrfMiscBit(GMB_DESERT_PAVED_ROADS) && + roadside != ROADSIDE_BARREN && roadside != ROADSIDE_GRASS && roadside != ROADSIDE_GRASS_ROAD_WORKS)); +} + +/** * Draw ground sprite and road pieces * @param ti TileInfo */ @@ -687,7 +705,7 @@ static void DrawRoadBits(TileInfo* ti) roadside = GetRoadside(ti->tile); - if (IsOnSnow(ti->tile)) { + if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) { image += 19; } else { switch (roadside) { @@ -729,6 +747,7 @@ static void DrawTile_Road(TileInfo *ti) case ROAD_TILE_CROSSING: { SpriteID image; SpriteID pal = PAL_NONE; + Roadside roadside = GetRoadside(ti->tile); if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); @@ -737,10 +756,10 @@ static void DrawTile_Road(TileInfo *ti) if (GetCrossingRoadAxis(ti->tile) == AXIS_X) image++; if (IsCrossingBarred(ti->tile)) image += 2; - if (IsOnSnow(ti->tile)) { + if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) { image += 8; } else { - switch (GetRoadside(ti->tile)) { + switch (roadside) { case ROADSIDE_BARREN: pal = PALETTE_TO_BARE_LAND; break; case ROADSIDE_GRASS: break; default: image += 4; break; // Paved |