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); |