(svn r11265) -Feature: Make more advanced rail types more expensive to build.
authormaedhros
Sun, 14 Oct 2007 21:20:12 +0000
changeset 8226 c66a40c8e9bf
parent 8225 7cf635a89c7d
child 8227 9529f32a20fa
(svn r11265) -Feature: Make more advanced rail types more expensive to build.
src/newgrf.cpp
src/rail.cpp
src/rail.h
src/rail_cmd.cpp
src/road_cmd.cpp
src/station_cmd.cpp
src/tunnelbridge_cmd.cpp
--- a/src/newgrf.cpp	Sun Oct 14 20:24:42 2007 +0000
+++ b/src/newgrf.cpp	Sun Oct 14 21:20:12 2007 +0000
@@ -4192,8 +4192,19 @@
 			_traininfo_vehicle_pitch = res;
 			break;
 
+		case 0x8F: // Rail track type cost factors
+			_railtype_cost_multiplier[0] = GB(res, 0, 8);
+			if (_patches.disable_elrails) {
+				_railtype_cost_multiplier[1] = GB(res, 0, 8);
+				_railtype_cost_multiplier[2] = GB(res, 8, 8);
+			} else {
+				_railtype_cost_multiplier[1] = GB(res, 8, 8);
+				_railtype_cost_multiplier[2] = GB(res, 16, 8);
+			}
+			_railtype_cost_multiplier[3] = GB(res, 16, 8);
+			break;
+
 		/* @todo implement */
-		case 0x8F: // Rail track type cost factors
 		case 0x93: // Tile refresh offset to left
 		case 0x94: // Tile refresh offset to right
 		case 0x95: // Tile refresh offset upwards
@@ -4696,7 +4707,7 @@
 	                   |                                        (1 << 0x19)  // newships
 	                   |                                        (1 << 0x1A)  // newplanes
 	                   |           ((_patches.signal_side ? 1 : 0) << 0x1B)  // signalsontrafficside
-	                   |                                        (1 << 0x1C); // electrifiedrailway
+	                   |       ((_patches.disable_elrails ? 0 : 1) << 0x1C); // electrifiedrailway
 
 	_ttdpatch_flags[2] =                                        (1 << 0x01)  // loadallgraphics - obsolote
 	                   |                                        (1 << 0x03)  // semaphores
@@ -4708,7 +4719,7 @@
 	                   |                                        (0 << 0x10)  // moreindustriesperclimate - obsolete
 	                   |                                        (0 << 0x11)  // moretoylandfeatures
 	                   |                                        (1 << 0x12)  // newstations
-	                   |                                        (0 << 0x13)  // tracktypecostdiff
+	                   |                                        (1 << 0x13)  // tracktypecostdiff
 	                   |                                        (1 << 0x14)  // manualconvert
 	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x15)  // buildoncoasts
 	                   |                                        (1 << 0x16)  // canals
@@ -4968,6 +4979,9 @@
 	_traininfo_vehicle_pitch = 0;
 	_traininfo_vehicle_width = 29;
 
+	/* Reset track cost multipliers. */
+	memcpy(&_railtype_cost_multiplier, &_default_railtype_cost_multiplier, sizeof(_default_railtype_cost_multiplier));
+
 	_loaded_newgrf_features.has_2CC           = false;
 	_loaded_newgrf_features.has_newhouses     = false;
 	_loaded_newgrf_features.has_newindustries = false;
--- a/src/rail.cpp	Sun Oct 14 20:24:42 2007 +0000
+++ b/src/rail.cpp	Sun Oct 14 21:20:12 2007 +0000
@@ -107,6 +107,12 @@
 	TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER,
 };
 
+/* The default multiplier for the cost of building different types of railway
+ * track, which will be divided by 8. Can be changed by newgrf files. */
+const int _default_railtype_cost_multiplier[RAILTYPE_END] = {
+	8, 12, 16, 24,
+};
+int _railtype_cost_multiplier[RAILTYPE_END];
 
 RailType GetTileRailType(TileIndex tile)
 {
--- a/src/rail.h	Sun Oct 14 20:24:42 2007 +0000
+++ b/src/rail.h	Sun Oct 14 21:20:12 2007 +0000
@@ -8,6 +8,7 @@
 #include "gfx.h"
 #include "direction.h"
 #include "tile.h"
+#include "variables.h"
 
 /**
  * Enumeration for all possible railtypes.
@@ -791,6 +792,21 @@
 	return bits != TRACK_BIT_HORZ && bits != TRACK_BIT_VERT;
 }
 
+
+extern int _railtype_cost_multiplier[RAILTYPE_END];
+extern const int _default_railtype_cost_multiplier[RAILTYPE_END];
+
+/**
+ * Returns the cost of building the specified railtype.
+ * @param railtype The railtype being built.
+ * @return The cost multiplier.
+ */
+static inline Money RailBuildCost(RailType railtype)
+{
+	assert(railtype < RAILTYPE_END);
+	return (_price.build_rail * _railtype_cost_multiplier[railtype]) >> 3;
+}
+
 void *UpdateTrainPowerProc(Vehicle *v, void *data);
 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
 void DrawDefaultWaypointSprite(int x, int y, RailType railtype);
--- a/src/rail_cmd.cpp	Sun Oct 14 20:24:42 2007 +0000
+++ b/src/rail_cmd.cpp	Sun Oct 14 21:20:12 2007 +0000
@@ -394,7 +394,7 @@
 		YapfNotifyTrackLayoutChange(tile, track);
 	}
 
-	return cost.AddCost(_price.build_rail);
+	return cost.AddCost(RailBuildCost(railtype));
 }
 
 /** Remove a single piece of track
@@ -1092,7 +1092,7 @@
 		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
-	return CommandCost(_price.build_rail / 2);
+	return CommandCost(RailBuildCost(totype) / 2);
 }
 
 extern CommandCost DoConvertStationRail(TileIndex tile, RailType totype, bool exec);
--- a/src/road_cmd.cpp	Sun Oct 14 20:24:42 2007 +0000
+++ b/src/road_cmd.cpp	Sun Oct 14 21:20:12 2007 +0000
@@ -605,7 +605,7 @@
 		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
-	return CommandCost(_price.build_rail / 2);
+	return CommandCost(RailBuildCost(totype) / 2);
 }
 
 
--- a/src/station_cmd.cpp	Sun Oct 14 20:24:42 2007 +0000
+++ b/src/station_cmd.cpp	Sun Oct 14 21:20:12 2007 +0000
@@ -1245,7 +1245,7 @@
 		VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
 	}
 
-	return CommandCost(_price.build_rail / 2);
+	return CommandCost(RailBuildCost(totype) / 2);
 }
 
 /**
--- a/src/tunnelbridge_cmd.cpp	Sun Oct 14 20:24:42 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp	Sun Oct 14 21:20:12 2007 +0000
@@ -773,7 +773,7 @@
 			VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
 		}
 
-		return CommandCost((length + 1) * (_price.build_rail >> 1));
+		return CommandCost((length + 1) * (RailBuildCost(totype) / 2));
 	} else if (IsBridge(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL) {
 		TileIndex endtile = GetOtherBridgeEnd(tile);
 		byte bridge_height = GetBridgeHeight(tile);
@@ -805,7 +805,7 @@
 			}
 		}
 
-		return CommandCost((DistanceManhattan(tile, endtile) + 1) * (_price.build_rail >> 1));
+		return CommandCost((DistanceManhattan(tile, endtile) + 1) * (RailBuildCost(totype) / 2));
 	} else {
 		return CMD_ERROR;
 	}