changeset 7442:60cf5845f300 draft

(svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
author rubidium <rubidium@openttd.org>
date Tue, 14 Aug 2007 17:05:33 +0000
parents 25df1c3356e9
children 823cd23494ea
files src/road_cmd.cpp
diffstat 1 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -673,7 +673,7 @@
 CommandCost CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	TileIndex start_tile, tile;
-	CommandCost cost, ret;
+	CommandCost cost, ret, money;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
@@ -695,6 +695,7 @@
 		p2 ^= IS_INT_INSIDE(p2 & 3, 1, 3) ? 3 : 0;
 	}
 
+	money.AddCost(GetAvailableMoneyForCommand());
 	tile = start_tile;
 	/* Start tile is the small number. */
 	for (;;) {
@@ -705,8 +706,18 @@
 
 		/* try to remove the halves. */
 		if (bits != 0) {
-			ret = DoCommand(tile, rt << 4 | bits, 0, flags, CMD_REMOVE_ROAD);
-			if (CmdSucceeded(ret)) cost.AddCost(ret);
+			ret = DoCommand(tile, rt << 4 | bits, 0, flags & ~DC_EXEC, CMD_REMOVE_ROAD);
+			if (CmdSucceeded(ret)) {
+				if (flags & DC_EXEC) {
+					money.AddCost(-ret.GetCost());
+					if (money.GetCost() < 0) {
+						_additional_cash_required = DoCommand(end_tile, start_tile, p2, flags & ~DC_EXEC, CMD_REMOVE_LONG_ROAD).GetCost();
+						return cost;
+					}
+					DoCommand(tile, rt << 4 | bits, 0, flags, CMD_REMOVE_ROAD);
+				}
+				cost.AddCost(ret);
+			}
 		}
 
 		if (tile == end_tile) break;