changeset 6541:b6b454522d0b draft

(svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
author maedhros <maedhros@openttd.org>
date Fri, 27 Apr 2007 21:35:02 +0000
parents b71c1ad2239c
children 46292dc90131
files src/newgrf.cpp src/newgrf.h src/road_cmd.cpp
diffstat 3 files changed, 38 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -3764,7 +3764,7 @@
 		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 @@
 	/* Call any functions that should be run after GRFs have been loaded. */
 	AfterLoadGRFs();
 }
+
+bool HasGrfMiscBit(GrfMiscBit bit)
+{
+	return HASBIT(_misc_grf_features, bit);
+}
--- a/src/newgrf.h
+++ b/src/newgrf.h
@@ -23,6 +23,14 @@
 
 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 CDECL grfmsg(int severity, const char *str, ...);
 
+bool HasGrfMiscBit(GrfMiscBit bit);
+
 #endif /* NEWGRF_H */
--- 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 @@
 };
 
 /**
+ * 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 @@
 
 	roadside = GetRoadside(ti->tile);
 
-	if (IsOnSnow(ti->tile)) {
+	if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) {
 		image += 19;
 	} else {
 		switch (roadside) {
@@ -729,6 +747,7 @@
 		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 @@
 			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