Loading

Revision differences

Old revision #pav92t6hlNew revision #pqejnxxvj
1/**  1/**  
2 * Is this tile a target for ships to get to a nearby dock?  2 * Ensure this tile is not a target for ships to get to a nearby dock.
   3 * @note Also takes into account Oil Rigs, even those under construction.
3 * @param tile Tile to query  4 * @param tile Tile to query  
4 * @param diagdir Diagonal direction to compare against or INVALID_DIAGDIR  5 * @param diagdir Optional diagonal direction to look for axis compatibility.
5 * @return True if is a target for ships to get to this tile  6 * @return Succeeded if the tile is not a ship docking area of a nearby dock,
   7 *         or an error message if the tile is a ship docking area of a nearby
   8           dock.
   9 * @note If the axis of a provided diagdir is equal to the axis of a nearby
   10 *       docking area, it returns Succeeded. If diagdir is not provided, only
   11 *       the docking area location is ensured.
6 */  12 */  
7static inline bool IsTileDock(TileIndex tile, DiagDirection diagdir = INVALID_DIAGDIR)  7static CommandCost EnsureNoDockingTile(TileIndex tile, DiagDirection diagdir = INVALID_DIAGDIR)
8{  14{  
9    Axis axis = diagdir == INVALID_DIAGDIR ? INVALID_AXIS : DiagDirToAxis(diagdir);  15    Axis axis = diagdir == INVALID_DIAGDIR ? INVALID_AXIS : DiagDirToAxis(diagdir);  
10  16  
  
14            Station *dock = Station::GetByTile(tc);  20            Station *dock = Station::GetByTile(tc);  
15            TileIndex docking_location = TILE_ADD(dock->dock_tile, ToTileIndexDiff(GetDockOffset(dock->dock_tile)));  21            TileIndex docking_location = TILE_ADD(dock->dock_tile, ToTileIndexDiff(GetDockOffset(dock->dock_tile)));  
16            if (axis == INVALID_AXIS) {  22            if (axis == INVALID_AXIS) {  
17                return tile == docking_location;  17                return_cmd_error(STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK);
18            }  18            } else {
19            else {    
20                if (tile == docking_location) {  25                if (tile == docking_location) {  
21                    Axis axis_tc = DiagDirToAxis(rot);  26                    Axis axis_tc = DiagDirToAxis(rot);  
22                    return axis != axis_tc;  27                    if (axis != axis_tc) {
   28                        return_cmd_error(STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK);
   29                    }
23                }  30                }  
24            }  31            }  
25        }  32        }  
26        if (rot == DIAGDIR_NE && IsTileType(tc + TileDiffXY(-1, 0), MP_INDUSTRY) && GetIndustryGfx(tc + TileDiffXY(-1, 0)) == GFX_OILRIG_1) return true;  33        if (axis != AXIS_X && DiagDirToAxis(rot) == AXIS_X) {
   34            if (IsTileType(tc + TileDiffXY(-1, 0), MP_INDUSTRY) && GetIndustryGfx(tc + TileDiffXY(-1, 0)) == GFX_OILRIG_1) {
   35                return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
   36            }
   37        }
27    }  38    }  
28  39  
29    return false;  29    return CommandCost();
30} 41}