diff options
author | rubidium <rubidium@openttd.org> | 2007-08-14 17:05:33 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-08-14 17:05:33 +0000 |
commit | b169fceabc420305384679755620f4d464e2a9ac (patch) | |
tree | 74e101a132d80ca035119a9e590f5c1b44677315 | |
parent | e474b58d2fae23918ca8d7fe61d14c1aba9c3943 (diff) | |
download | openttd-b169fceabc420305384679755620f4d464e2a9ac.tar.xz |
(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.
-rw-r--r-- | src/road_cmd.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index c79d263d9..d0a65fea4 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -673,7 +673,7 @@ CommandCost CmdBuildLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 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 @@ CommandCost CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint3 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 @@ CommandCost CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint3 /* 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; |