changeset 17180:e90e85c6504d draft

(svn r21919) -Fix: Converting an expensive rail type to a cheap one could give more money than removing and rebuilding cost
author planetmaker <planetmaker@openttd.org>
date Thu, 27 Jan 2011 00:38:12 +0000
parents 80f000454062
children 585401260dab
files src/rail.h
diffstat 1 files changed, 14 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/rail.h
+++ b/src/rail.h
@@ -337,26 +337,22 @@
  */
 static inline Money RailConvertCost(RailType from, RailType to)
 {
-	/* rail -> el. rail
-	 * calculate the price as 5 / 4 of (cost build el. rail) - (cost build rail)
-	 * (the price of workers to get to place is that 1/4)
-	 */
-	if (HasPowerOnRail(from, to)) {
-		Money cost = ((RailBuildCost(to) - RailBuildCost(from)) * 5) >> 2;
-		if (cost != 0) return cost;
+	/* Get the costs for removing and building anew
+	 * A conversion can never be more costly */
+	Money rebuildcost = RailBuildCost(to) + RailClearCost(from);
+
+	/* Conversion between somewhat compatible railtypes:
+	 * Pay 1/8 of the target rail cost (labour costs) and additionally any difference in the
+	 * build costs, if the target type is more expensive (material upgrade costs).
+	 * Upgrade can never be more expensive than re-building. */
+	if (HasPowerOnRail(from, to) || HasPowerOnRail(to, from)) {
+		Money upgradecost = RailBuildCost(to) / 8 + max((Money)0, RailBuildCost(to) - RailBuildCost(from));
+		return min(upgradecost, rebuildcost);
 	}
 
-	/* el. rail -> rail
-	 * calculate the price as 1 / 4 of (cost build el. rail) - (cost build rail)
-	 * (the price of workers is 1 / 4 + price of copper sold to a recycle center)
-	 */
-	if (HasPowerOnRail(to, from)) {
-		Money cost = (RailBuildCost(from) - RailBuildCost(to)) >> 2;
-		if (cost != 0) return cost;
-	}
-
-	/* make the price the same as remove + build new type */
-	return RailBuildCost(to) + RailClearCost(from);
+	/* make the price the same as remove + build new type for rail types
+	 * which are not compatible in any way */
+	return rebuildcost;
 }
 
 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);