src/road_cmd.cpp
changeset 7938 ee704bc1c5d3
parent 7924 7ceb46058085
child 7988 6075538f6111
equal deleted inserted replaced
7937:a65b8906ba7f 7938:ee704bc1c5d3
   671  * - p2 = (bit 3 + 4) - road type
   671  * - p2 = (bit 3 + 4) - road type
   672  */
   672  */
   673 CommandCost CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
   673 CommandCost CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
   674 {
   674 {
   675 	TileIndex start_tile, tile;
   675 	TileIndex start_tile, tile;
   676 	CommandCost cost, ret;
   676 	CommandCost cost, ret, money;
   677 
   677 
   678 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
   678 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
   679 
   679 
   680 	if (p1 >= MapSize()) return CMD_ERROR;
   680 	if (p1 >= MapSize()) return CMD_ERROR;
   681 
   681 
   693 		start_tile = end_tile;
   693 		start_tile = end_tile;
   694 		end_tile = t;
   694 		end_tile = t;
   695 		p2 ^= IS_INT_INSIDE(p2 & 3, 1, 3) ? 3 : 0;
   695 		p2 ^= IS_INT_INSIDE(p2 & 3, 1, 3) ? 3 : 0;
   696 	}
   696 	}
   697 
   697 
       
   698 	money.AddCost(GetAvailableMoneyForCommand());
   698 	tile = start_tile;
   699 	tile = start_tile;
   699 	/* Start tile is the small number. */
   700 	/* Start tile is the small number. */
   700 	for (;;) {
   701 	for (;;) {
   701 		RoadBits bits = HASBIT(p2, 2) ? ROAD_Y : ROAD_X;
   702 		RoadBits bits = HASBIT(p2, 2) ? ROAD_Y : ROAD_X;
   702 
   703 
   703 		if (tile == end_tile && !HASBIT(p2, 1)) bits &= ROAD_NW | ROAD_NE;
   704 		if (tile == end_tile && !HASBIT(p2, 1)) bits &= ROAD_NW | ROAD_NE;
   704 		if (tile == start_tile && HASBIT(p2, 0)) bits &= ROAD_SE | ROAD_SW;
   705 		if (tile == start_tile && HASBIT(p2, 0)) bits &= ROAD_SE | ROAD_SW;
   705 
   706 
   706 		/* try to remove the halves. */
   707 		/* try to remove the halves. */
   707 		if (bits != 0) {
   708 		if (bits != 0) {
   708 			ret = DoCommand(tile, rt << 4 | bits, 0, flags, CMD_REMOVE_ROAD);
   709 			ret = DoCommand(tile, rt << 4 | bits, 0, flags & ~DC_EXEC, CMD_REMOVE_ROAD);
   709 			if (CmdSucceeded(ret)) cost.AddCost(ret);
   710 			if (CmdSucceeded(ret)) {
       
   711 				if (flags & DC_EXEC) {
       
   712 					money.AddCost(-ret.GetCost());
       
   713 					if (money.GetCost() < 0) {
       
   714 						_additional_cash_required = DoCommand(end_tile, start_tile, p2, flags & ~DC_EXEC, CMD_REMOVE_LONG_ROAD).GetCost();
       
   715 						return cost;
       
   716 					}
       
   717 					DoCommand(tile, rt << 4 | bits, 0, flags, CMD_REMOVE_ROAD);
       
   718 				}
       
   719 				cost.AddCost(ret);
       
   720 			}
   710 		}
   721 		}
   711 
   722 
   712 		if (tile == end_tile) break;
   723 		if (tile == end_tile) break;
   713 
   724 
   714 		tile += HASBIT(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
   725 		tile += HASBIT(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);