Loading

Revision differences

Old revision #pjtgnjoanNew revision #pb70f60wf
44        if (rem > 0) rem--;  44        if (rem > 0) rem--;  
45        tile_next += delta;  45        tile_next += delta;  
46        if (built_lock) {  46        if (built_lock) {  
  47            /* A lock was built on the last iteration, which means  
  48             * this iteration's tile belongs to the lock. */  
47            built_lock = false;  49            built_lock = false;  
48            continue;  50            continue;  
49        }  51        }  
50        Slope slope = GetTileSlope(tile);  52        Slope slope = GetTileSlope(tile);  
51        Slope slope_next = GetTileSlope(tile_next);    
52  53  
53        if (slope != SLOPE_FLAT && !IsInclinedSlope(slope)) {  54        if (slope != SLOPE_FLAT && !IsInclinedSlope(slope)) {  
54            return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);  55            return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);  
55        }  56        }  
  57        /* From here on, slope is either flat or inclined. */  
56  58  
57        /* Can't make water of water! */  59        /* Can't make water of water! */  
58        if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || wc == WATER_CLASS_SEA)) continue;  60        if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || wc == WATER_CLASS_SEA)) continue;  
  
60        CommandCost ret;  62        CommandCost ret;  
61        bool river = HasTileWaterClass(tile) && GetWaterClass(tile) == WATER_CLASS_RIVER;  63        bool river = HasTileWaterClass(tile) && GetWaterClass(tile) == WATER_CLASS_RIVER;  
62  64  
  65        Slope slope_next = GetTileSlope(tile_next);  
63        if (rem > 0 && wc == WATER_CLASS_CANAL && slope == SLOPE_FLAT && IsInclinedSlope(slope_next) && DiagDirToAxis(GetInclinedSlopeDirection(slope_next)) == axis) {  66        if (rem > 0 && wc == WATER_CLASS_CANAL && slope == SLOPE_FLAT && IsInclinedSlope(slope_next) && DiagDirToAxis(GetInclinedSlopeDirection(slope_next)) == axis) {  
64            /* The conditions indicate a lock might be built on next iteration. Don't clear this tile and skip to the next iteration now. */  67            /* The conditions indicate a lock might be built on next iteration.
   68             * Don't clear this tile and skip to the next iteration now. */
65            continue;  69            continue;  
66        } else {  70        } else {  
67            /* From here on, slope is either flat or inclined. */  67            bool water = IsWaterTile(tile);
68            if (rem >= 0) { // Single-line or single-clicking.  72            if (rem >= 0) { // Single-line or single-clicking.  
69                if (wc == WATER_CLASS_CANAL && IsInclinedSlope(slope)) {  73                if (wc == WATER_CLASS_CANAL && IsInclinedSlope(slope)) {  
70                    /* Try to build a lock on inclined tile. */  74                    /* Try to build a lock on inclined tile. */  
71                    if ((axis == INVALID_AXIS || DiagDirToAxis(GetInclinedSlopeDirection(slope)) == axis)) {  75                    if ((axis == INVALID_AXIS || DiagDirToAxis(GetInclinedSlopeDirection(slope)) == axis)) {  
72                        if (rem == 0 && axis == INVALID_AXIS || IsTileFlat(tile + TileOffsByDiagDir(GetInclinedSlopeDirection(slope))) && IsTileFlat(tile - TileOffsByDiagDir(GetInclinedSlopeDirection(slope)))) {  76                        int tile_delta = TileOffsByDiagDir(GetInclinedSlopeDirection(slope));
   77                        if (rem == 0 && axis == INVALID_AXIS || IsTileFlat(tile + tile_delta) && IsTileFlat(tile - tile_delta)) {
73                            ret = DoCommand(tile, 0, 0, flags, CMD_BUILD_LOCK);  78                            ret = DoCommand(tile, 0, 0, flags, CMD_BUILD_LOCK);  
74                            if (ret.Failed()) return ret;  79                            if (ret.Failed()) return ret;  
75                            cost.AddCost(ret);  80                            cost.AddCost(ret);  
  
83                        }  88                        }  
84                    }  89                    }  
85                } else {  90                } else {  
86                    bool water = IsWaterTile(tile);    
87                    ret = DoCommand(tile, 0, 0, flags | DC_FORCE_CLEAR_TILE, CMD_LANDSCAPE_CLEAR);  91                    ret = DoCommand(tile, 0, 0, flags | DC_FORCE_CLEAR_TILE, CMD_LANDSCAPE_CLEAR);  
88                    if (ret.Failed()) return ret;  92                    if (ret.Failed()) return ret;  
89                    if (!water) cost.AddCost(ret);  93                    if (!water) cost.AddCost(ret);  
  
92                if (wc == WATER_CLASS_CANAL && IsInclinedSlope(slope)) {  96                if (wc == WATER_CLASS_CANAL && IsInclinedSlope(slope)) {  
93                    return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);  97                    return_cmd_error(STR_ERROR_FLAT_LAND_REQUIRED);  
94                } else {  98                } else {  
95                    bool water = IsWaterTile(tile);    
96                    ret = DoCommand(tile, 0, 0, flags | DC_FORCE_CLEAR_TILE, CMD_LANDSCAPE_CLEAR);  99                    ret = DoCommand(tile, 0, 0, flags | DC_FORCE_CLEAR_TILE, CMD_LANDSCAPE_CLEAR);  
97                    if (ret.Failed()) return ret;  100                    if (ret.Failed()) return ret;  
98                    if (!water) cost.AddCost(ret);  101                    if (!water) cost.AddCost(ret);