Mercurial > hg > openttd
changeset 8108:4faab45e2603 draft
(svn r11669) -Codechange: refactor tile.h -> tile_type.h and tile_map.h
line wrap: on
line diff
--- a/projects/openttd.vcproj +++ b/projects/openttd.vcproj @@ -372,7 +372,7 @@ RelativePath=".\..\src\thread.cpp"> </File> <File - RelativePath=".\..\src\tile.cpp"> + RelativePath=".\..\src\tile_map.cpp"> </File> <File RelativePath=".\..\src\vehicle.cpp">
--- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -728,7 +728,7 @@ > </File> <File - RelativePath=".\..\src\tile.cpp" + RelativePath=".\..\src\tile_map.cpp" > </File> <File
--- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -725,7 +725,7 @@ > </File> <File - RelativePath=".\..\src\tile.cpp" + RelativePath=".\..\src\tile_map.cpp" > </File> <File
--- a/source.list +++ b/source.list @@ -75,7 +75,7 @@ texteff.cpp tgp.cpp thread.cpp -tile.cpp +tile_map.cpp #if WIN32 #else #if WINCE
--- a/src/ai/default/default.cpp +++ b/src/ai/default/default.cpp @@ -11,7 +11,6 @@ #include "../../road_map.h" #include "../../roadveh.h" #include "../../station_map.h" -#include "../../tile.h" #include "../../player.h" #include "../../tunnel_map.h" #include "../../vehicle.h"
--- a/src/ai/trolly/build.cpp +++ b/src/ai/trolly/build.cpp @@ -6,7 +6,6 @@ #include "../../functions.h" #include "../../map.h" #include "../../road_map.h" -#include "../../tile.h" #include "../../vehicle.h" #include "../../command.h" #include "trolly.h"
--- a/src/ai/trolly/pathfinder.cpp +++ b/src/ai/trolly/pathfinder.cpp @@ -6,7 +6,6 @@ #include "../../debug.h" #include "../../functions.h" #include "../../map.h" -#include "../../tile.h" #include "../../command.h" #include "trolly.h" #include "../../depot.h"
--- a/src/ai/trolly/trolly.cpp +++ b/src/ai/trolly/trolly.cpp @@ -25,7 +25,6 @@ #include "../../station_map.h" #include "table/strings.h" #include "../../map.h" -#include "../../tile.h" #include "../../command.h" #include "trolly.h" #include "../../town.h"
--- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -13,7 +13,6 @@ #include "strings.h" #include "table/strings.h" #include "map.h" -#include "tile.h" #include "vehicle.h" #include "timetable.h" #include "depot.h"
--- a/src/bridge_map.h +++ b/src/bridge_map.h @@ -10,7 +10,6 @@ #include "map.h" #include "rail_type.h" #include "road_map.h" -#include "tile.h" /**
--- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -10,7 +10,6 @@ #include "functions.h" #include "map.h" #include "player.h" -#include "tile.h" #include "viewport.h" #include "command.h" #include "tunnel_map.h"
--- a/src/clear_map.h +++ b/src/clear_map.h @@ -6,7 +6,6 @@ #define CLEAR_MAP_H #include "macros.h" -#include "tile.h" #include "bridge_map.h" /**
--- a/src/command.cpp +++ b/src/command.cpp @@ -9,6 +9,7 @@ #include "functions.h" #include "landscape.h" #include "map.h" +#include "tile_map.h" #include "gui.h" #include "command.h" #include "player.h" @@ -16,7 +17,6 @@ #include "variables.h" #include "genworld.h" #include "newgrf_storage.h" -#include "tile.h" const char *_cmd_text = NULL;
--- a/src/depot.cpp +++ b/src/depot.cpp @@ -8,7 +8,6 @@ #include "depot.h" #include "functions.h" #include "landscape.h" -#include "tile.h" #include "map.h" #include "table/strings.h" #include "saveload.h"
--- a/src/depot.h +++ b/src/depot.h @@ -7,7 +7,6 @@ #include "direction_type.h" #include "oldpool.h" -#include "tile.h" #include "variables.h" #include "road_map.h" #include "rail_map.h"
--- a/src/disaster_cmd.cpp +++ b/src/disaster_cmd.cpp @@ -25,7 +25,6 @@ #include "table/strings.h" #include "strings.h" #include "map.h" -#include "tile.h" #include "vehicle.h" #include "command.h" #include "news.h"
--- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -8,6 +8,7 @@ #include "table/strings.h" #include "functions.h" #include "map.h" +#include "tile_map.h" #include "station.h" #include "gui.h" #include "window_gui.h"
--- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -48,7 +48,6 @@ #include "stdafx.h" #include "openttd.h" #include "station_map.h" -#include "tile.h" #include "viewport.h" #include "functions.h" /* We should REALLY get rid of this goddamn file, as it is butt-ugly */ #include "variables.h" /* ... same here */
--- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -12,7 +12,6 @@ #include "window_gui.h" #include "textbuf_gui.h" #include "gfx.h" -#include "tile.h" #include "strings.h" #include "gfxinit.h" #include "player.h"
--- a/src/gui.h +++ b/src/gui.h @@ -9,7 +9,7 @@ #include "window_type.h" #include "rail_type.h" #include "road_type.h" -#include "vehicle.h" +#include "vehicle_type.h" /* main_gui.cpp */ void CcPlaySound10(bool success, TileIndex tile, uint32 p1, uint32 p2);
--- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -12,7 +12,6 @@ #include "strings.h" #include "table/sprites.h" #include "map.h" -#include "tile.h" #include "train.h" #include "landscape.h" #include "viewport.h"
--- a/src/industry_map.h +++ b/src/industry_map.h @@ -7,7 +7,7 @@ #include "industry.h" #include "macros.h" -#include "tile.h" +#include "tile_map.h"
--- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -11,7 +11,6 @@ #include "player.h" #include "spritecache.h" #include "table/sprites.h" -#include "tile.h" #include <stdarg.h> #include "viewport.h" #include "command.h"
--- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -13,7 +13,6 @@ #include "table/sprites.h" #include "table/strings.h" #include "map.h" -#include "tile.h" #include "gui.h" #include "window_gui.h" #include "window_func.h"
--- a/src/map.h +++ b/src/map.h @@ -7,6 +7,7 @@ #include "stdafx.h" #include "direction_func.h" +#include "tile_type.h" extern uint _map_tile_mask; @@ -136,11 +137,6 @@ uint ScaleByMapSize1D(uint); /** - * The index/ID of a Tile. - */ -typedef uint32 TileIndex; - -/** * An offset value between to tiles. * * This value is used fro the difference between
--- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -17,6 +17,7 @@ #include "strings.h" #include "table/tree_land.h" #include "map.h" +#include "tile_map.h" #include "gui.h" #include "window_gui.h" #include "station_gui.h"
--- a/src/newgrf_canal.cpp +++ b/src/newgrf_canal.cpp @@ -10,6 +10,7 @@ #include "newgrf_commons.h" #include "newgrf_spritegroup.h" #include "newgrf_canal.h" +#include "tile_map.h" /** Table of canal 'feature' sprite groups */
--- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -12,6 +12,7 @@ #include "industry.h" #include "newgrf.h" #include "newgrf_commons.h" +#include "tile_map.h" /** Constructor of generic class * @param offset end of original data for this entity. i.e: houses = 110
--- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -10,7 +10,6 @@ #include "viewport.h" #include "landscape.h" #include "date.h" -#include "tile.h" #include "town.h" #include "town_map.h" #include "sound.h"
--- a/src/npf.cpp +++ b/src/npf.cpp @@ -14,7 +14,6 @@ #include "pathfind.h" #include "station.h" #include "station_map.h" -#include "tile.h" #include "depot.h" #include "tunnel_map.h" #include "network/network.h"
--- a/src/npf.h +++ b/src/npf.h @@ -9,7 +9,7 @@ #include "aystar.h" #include "station.h" #include "vehicle.h" -#include "tile.h" +#include "tile_type.h" /* mowing grass */ enum {
--- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -9,8 +9,6 @@ #include "driver.h" #include "saveload.h" #include "map.h" -#include "tile.h" -#include "void_map.h" #include "helpers.hpp" #include "openttd.h" @@ -79,6 +77,7 @@ #include "unmovable_map.h" #include "tree_map.h" #include "tunnelbridge_map.h" +#include "void_map.h" #include <stdarg.h>
--- a/src/openttd.h +++ b/src/openttd.h @@ -26,10 +26,10 @@ }; #include "map.h" -#include "slope.h" +#include "slope_type.h" +#include "vehicle_type.h" // Forward declarations of structs. -struct Vehicle; struct Depot; struct Waypoint; struct Station; @@ -55,7 +55,6 @@ typedef EngineID *EngineList; ///< engine list type placeholder acceptable for C code (see helpers.cpp) /* IDs used in Pools */ -typedef uint16 VehicleID; typedef uint16 StationID; static const StationID INVALID_STATION = 0xFFFF; typedef uint16 RoadStopID;
--- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -11,7 +11,6 @@ #include "strings.h" #include "functions.h" #include "map.h" -#include "tile.h" #include "gui.h" #include "window_gui.h" #include "gfx.h"
--- a/src/pathfind.cpp +++ b/src/pathfind.cpp @@ -10,7 +10,6 @@ #include "functions.h" #include "landscape.h" #include "map.h" -#include "tile.h" #include "pathfind.h" #include "rail_type.h" #include "debug.h"
--- a/src/players.cpp +++ b/src/players.cpp @@ -29,6 +29,7 @@ #include "group.h" #include "settings.h" #include "window_func.h" +#include "tile_map.h" /** * Sets the local player and updates the patch settings that are set on a
--- a/src/rail.h +++ b/src/rail.h @@ -8,7 +8,6 @@ #include "gfx.h" #include "rail_type.h" #include "track_type.h" -#include "tile.h" #include "variables.h" /** This struct contains all the info that is needed to draw and construct tracks. @@ -228,8 +227,6 @@ Foundation GetRailFoundation(Slope tileh, TrackBits bits); -void FloodHalftile(TileIndex t); - int32 SettingsDisableElrail(int32 p1); ///< _patches.disable_elrail callback #endif /* RAIL_H */
--- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -15,7 +15,6 @@ #include "table/strings.h" #include "map.h" #include "landscape.h" -#include "tile.h" #include "town_map.h" #include "tunnel_map.h" #include "vehicle.h"
--- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -11,7 +11,6 @@ #include "landscape.h" #include "date.h" #include "map.h" -#include "tile.h" #include "gui.h" #include "window_gui.h" #include "station_gui.h"
--- a/src/rail_map.h +++ b/src/rail_map.h @@ -8,7 +8,7 @@ #include "direction_func.h" #include "track_func.h" #include "rail.h" -#include "tile.h" +#include "tile_map.h" /** Different types of Rail-related tiles */
--- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -17,7 +17,6 @@ #include "functions.h" #include "map.h" #include "landscape.h" -#include "tile.h" #include "town_map.h" #include "vehicle.h" #include "viewport.h"
--- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -9,7 +9,6 @@ #include "strings.h" #include "functions.h" #include "map.h" -#include "tile.h" #include "gui.h" #include "window_gui.h" #include "station_gui.h"
--- a/src/road_map.h +++ b/src/road_map.h @@ -9,7 +9,7 @@ #include "track_func.h" #include "rail_type.h" #include "road_func.h" -#include "tile.h" +#include "tile_map.h" enum RoadTileType {
--- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -13,7 +13,6 @@ #include "table/strings.h" #include "strings.h" #include "map.h" -#include "tile.h" #include "vehicle.h" #include "timetable.h" #include "engine.h"
--- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -10,7 +10,6 @@ #include "functions.h" #include "landscape.h" #include "map.h" -#include "tile.h" #include "vehicle.h" #include "timetable.h" #include "command.h"
deleted file mode 100644 --- a/src/slope.h +++ /dev/null @@ -1,386 +0,0 @@ -/* $Id$ */ - -/** @file slope.h Definitions of a slope. - * This file defines the enumeration and helper functions for handling - * the slope info of a tile. - */ - -#ifndef SLOPE_H -#define SLOPE_H - -/** - * Enumeration of tile corners - */ -enum Corner { - CORNER_W = 0, - CORNER_S = 1, - CORNER_E = 2, - CORNER_N = 3, - CORNER_END, - CORNER_INVALID = 0xFF -}; - -/** - * Enumeration for the slope-type. - * - * This enumeration use the chars N,E,S,W corresponding the - * direction north, east, south and west. The top corner of a tile - * is the north-part of the tile. The whole slope is encoded with - * 5 bits, 4 bits for each corner and 1 bit for a steep-flag. - * - * For halftile slopes an extra 3 bits are used to represent this - * properly; 1 bit for a halftile-flag and 2 bits to encode which - * extra side (corner) is leveled when the slope of the first 5 - * bits is applied. This means that there can only be one leveled - * slope for steep slopes, which is logical because two leveled - * slopes would mean that it is not a steep slope as halftile - * slopes only span one height level. - */ -enum Slope { - SLOPE_FLAT = 0x00, ///< a flat tile - SLOPE_W = 0x01, ///< the west corner of the tile is raised - SLOPE_S = 0x02, ///< the south corner of the tile is raised - SLOPE_E = 0x04, ///< the east corner of the tile is raised - SLOPE_N = 0x08, ///< the north corner of the tile is raised - SLOPE_STEEP = 0x10, ///< indicates the slope is steep - SLOPE_NW = SLOPE_N | SLOPE_W, ///< north and west corner are raised - SLOPE_SW = SLOPE_S | SLOPE_W, ///< south and west corner are raised - SLOPE_SE = SLOPE_S | SLOPE_E, ///< south and east corner are raised - SLOPE_NE = SLOPE_N | SLOPE_E, ///< north and east corner are raised - SLOPE_EW = SLOPE_E | SLOPE_W, ///< east and west corner are raised - SLOPE_NS = SLOPE_N | SLOPE_S, ///< north and south corner are raised - SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, ///< all corner are raised, similar to SLOPE_FLAT - SLOPE_NWS = SLOPE_N | SLOPE_W | SLOPE_S, ///< north, west and south corner are raised - SLOPE_WSE = SLOPE_W | SLOPE_S | SLOPE_E, ///< west, south and east corner are raised - SLOPE_SEN = SLOPE_S | SLOPE_E | SLOPE_N, ///< south, east and north corner are raised - SLOPE_ENW = SLOPE_E | SLOPE_N | SLOPE_W, ///< east, north and west corner are raised - SLOPE_STEEP_W = SLOPE_STEEP | SLOPE_NWS, ///< a steep slope falling to east (from west) - SLOPE_STEEP_S = SLOPE_STEEP | SLOPE_WSE, ///< a steep slope falling to north (from south) - SLOPE_STEEP_E = SLOPE_STEEP | SLOPE_SEN, ///< a steep slope falling to west (from east) - SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW, ///< a steep slope falling to south (from north) - - SLOPE_HALFTILE = 0x20, ///< one halftile is leveled (non continuous slope) - SLOPE_HALFTILE_MASK = 0xE0, ///< three bits used for halftile slopes - SLOPE_HALFTILE_W = SLOPE_HALFTILE | (CORNER_W << 6), ///< the west halftile is leveled (non continuous slope) - SLOPE_HALFTILE_S = SLOPE_HALFTILE | (CORNER_S << 6), ///< the south halftile is leveled (non continuous slope) - SLOPE_HALFTILE_E = SLOPE_HALFTILE | (CORNER_E << 6), ///< the east halftile is leveled (non continuous slope) - SLOPE_HALFTILE_N = SLOPE_HALFTILE | (CORNER_N << 6), ///< the north halftile is leveled (non continuous slope) -}; - -/** - * Rangecheck for Corner enumeration. - * - * @param corner A #Corner. - * @return true iff corner is in a valid range. - */ -static inline bool IsValidCorner(Corner corner) -{ - return IsInsideMM(corner, 0, CORNER_END); -} - -/** - * Checks if a slope is steep. - * - * @param s The given #Slope. - * @return True if the slope is steep, else false. - */ -static inline bool IsSteepSlope(Slope s) -{ - return (s & SLOPE_STEEP) != 0; -} - -/** - * Checks for non-continuous slope on halftile foundations. - * - * @param s The given #Slope. - * @return True if the slope is non-continuous, else false. - */ -static inline bool IsHalftileSlope(Slope s) -{ - return (s & SLOPE_HALFTILE) != 0; -} - -/** - * Return the complement of a slope. - * - * This method returns the complement of a slope. The complement of a - * slope is a slope with raised corner which aren't raised in the given - * slope. - * - * @pre The slope must neither be steep nor a halftile slope. - * @param s The #Slope to get the complement. - * @return a complement Slope of the given slope. - */ -static inline Slope ComplementSlope(Slope s) -{ - assert(!IsSteepSlope(s) && !IsHalftileSlope(s)); - return (Slope)(0xF ^ s); -} - -/** - * Tests if a slope has a highest corner (i.e. one corner raised or a steep slope). - * - * Note: A halftile slope is ignored. - * - * @param s The #Slope. - * @return true iff the slope has a highest corner. - */ -static inline bool HasSlopeHighestCorner(Slope s) -{ - s = (Slope)(s & ~SLOPE_HALFTILE_MASK); - return IsSteepSlope(s) || (s == SLOPE_W) || (s == SLOPE_S) || (s == SLOPE_E) || (s == SLOPE_N); -} - -/** - * Returns the highest corner of a slope (one corner raised or a steep slope). - * - * @pre The slope must be a slope with one corner raised or a steep slope. A halftile slope is ignored. - * @param s The #Slope. - * @return Highest corner. - */ -static inline Corner GetHighestSlopeCorner(Slope s) -{ - switch (s & ~SLOPE_HALFTILE_MASK) { - case SLOPE_W: - case SLOPE_STEEP_W: return CORNER_W; - case SLOPE_S: - case SLOPE_STEEP_S: return CORNER_S; - case SLOPE_E: - case SLOPE_STEEP_E: return CORNER_E; - case SLOPE_N: - case SLOPE_STEEP_N: return CORNER_N; - default: NOT_REACHED(); - } -} - -/** - * Returns the leveled halftile of a halftile slope. - * - * @pre The slope must be a halftile slope. - * @param s The #Slope. - * @return The corner of the leveled halftile. - */ -static inline Corner GetHalftileSlopeCorner(Slope s) -{ - assert(IsHalftileSlope(s)); - return (Corner)((s >> 6) & 3); -} - -/** - * Returns the height of the highest corner of a slope relative to TileZ (= minimal height) - * - * @param s The #Slope. - * @return Relative height of highest corner. - */ -static inline uint GetSlopeMaxZ(Slope s) -{ - if (s == SLOPE_FLAT) return 0; - if (IsSteepSlope(s)) return 2 * TILE_HEIGHT; - return TILE_HEIGHT; -} - -/** - * Returns the opposite corner. - * - * @param corner A #Corner. - * @return The opposite corner to "corner". - */ -static inline Corner OppositeCorner(Corner corner) -{ - return (Corner)(corner ^ 2); -} - -/** - * Returns the slope with a specific corner raised. - * - * @param corner The #Corner. - * @return The #Slope with corner "corner" raised. - */ -static inline Slope SlopeWithOneCornerRaised(Corner corner) -{ - assert(IsValidCorner(corner)); - return (Slope)(1 << corner); -} - -/** - * Returns the slope with all except one corner raised. - * - * @param corner The #Corner. - * @return The #Slope with all corners but "corner" raised. - */ -static inline Slope SlopeWithThreeCornersRaised(Corner corner) -{ - return ComplementSlope(SlopeWithOneCornerRaised(corner)); -} - -/** - * Adds a halftile slope to a slope. - * - * @param s #Slope without a halftile slope. - * @param corner The #Corner of the halftile. - * @return The #Slope s with the halftile slope added. - */ -static inline Slope HalftileSlope(Slope s, Corner corner) -{ - assert(IsValidCorner(corner)); - return (Slope)(s | SLOPE_HALFTILE | (corner << 6)); -} - - -/** - * Enumeration for Foundations. - */ -enum Foundation { - FOUNDATION_NONE, ///< The tile has no foundation, the slope remains unchanged. - FOUNDATION_LEVELED, ///< The tile is leveled up to a flat slope. - FOUNDATION_INCLINED_X, ///< The tile has an along X-axis inclined foundation. - FOUNDATION_INCLINED_Y, ///< The tile has an along Y-axis inclined foundation. - FOUNDATION_STEEP_LOWER, ///< The tile has a steep slope. The lowest corner is raised by a foundation to allow building railroad on the lower halftile. - -/* Halftile foundations */ - FOUNDATION_STEEP_BOTH, ///< The tile has a steep slope. The lowest corner is raised by a foundation and the upper halftile is leveled. - FOUNDATION_HALFTILE_W, ///< Level west halftile non-continuously. - FOUNDATION_HALFTILE_S, ///< Level south halftile non-continuously. - FOUNDATION_HALFTILE_E, ///< Level east halftile non-continuously. - FOUNDATION_HALFTILE_N, ///< Level north halftile non-continuously. - -/* Special anti-zig-zag foundations for single horizontal/vertical track */ - FOUNDATION_RAIL_W, ///< Foundation for TRACK_BIT_LEFT, but not a leveled foundation. - FOUNDATION_RAIL_S, ///< Foundation for TRACK_BIT_LOWER, but not a leveled foundation. - FOUNDATION_RAIL_E, ///< Foundation for TRACK_BIT_RIGHT, but not a leveled foundation. - FOUNDATION_RAIL_N, ///< Foundation for TRACK_BIT_UPPER, but not a leveled foundation. - - FOUNDATION_INVALID = 0xFF ///< Used inside "rail_cmd.cpp" to indicate invalid slope/track combination. -}; - -/** - * Tests for FOUNDATION_NONE. - * - * @param f Maybe a #Foundation. - * @return true iff f is a foundation. - */ -static inline bool IsFoundation(Foundation f) -{ - return f != FOUNDATION_NONE; -} - -/** - * Tests if the foundation is a leveled foundation. - * - * @param f The #Foundation. - * @return true iff f is a leveled foundation. - */ -static inline bool IsLeveledFoundation(Foundation f) -{ - return f == FOUNDATION_LEVELED; -} - -/** - * Tests if the foundation is an inclined foundation. - * - * @param f The #Foundation. - * @return true iff f is an inclined foundation. - */ -static inline bool IsInclinedFoundation(Foundation f) -{ - return (f == FOUNDATION_INCLINED_X) || (f == FOUNDATION_INCLINED_Y); -} - -/** - * Tests if a foundation is a non-continuous foundation, i.e. halftile-foundation or FOUNDATION_STEEP_BOTH. - * - * @param f The #Foundation. - * @return true iff f is a non-continuous foundation - */ -static inline bool IsNonContinuousFoundation(Foundation f) -{ - return IsInsideMM(f, FOUNDATION_STEEP_BOTH, FOUNDATION_HALFTILE_N + 1); -} - -/** - * Returns the halftile corner of a halftile-foundation - * - * @pre f != FOUNDATION_STEEP_BOTH - * - * @param f The #Foundation. - * @return The #Corner with track. - */ -static inline Corner GetHalftileFoundationCorner(Foundation f) -{ - assert(IsInsideMM(f, FOUNDATION_HALFTILE_W, FOUNDATION_HALFTILE_N + 1)); - return (Corner)(f - FOUNDATION_HALFTILE_W); -} - -/** - * Tests if a foundation is a special rail foundation for single horizontal/vertical track. - * - * @param f The #Foundation. - * @return true iff f is a special rail foundation for single horizontal/vertical track. - */ -static inline bool IsSpecialRailFoundation(Foundation f) -{ - return IsInsideMM(f, FOUNDATION_RAIL_W, FOUNDATION_RAIL_N + 1); -} - -/** - * Returns the track corner of a special rail foundation - * - * @param f The #Foundation. - * @return The #Corner with track. - */ -static inline Corner GetRailFoundationCorner(Foundation f) -{ - assert(IsSpecialRailFoundation(f)); - return (Corner)(f - FOUNDATION_RAIL_W); -} - -/** - * Returns the foundation needed to flatten a slope. - * The returned foundation is either FOUNDATION_NONE if the tile was already flat, or FOUNDATION_LEVELED. - * - * @pre The slope must not be steep. - * @param s The current #Slope. - * @return The needed #Foundation. - */ -static inline Foundation FlatteningFoundation(Slope s) -{ - assert(!IsSteepSlope(s)); - return (s == SLOPE_FLAT ? FOUNDATION_NONE : FOUNDATION_LEVELED); -} - -/** - * Returns the along a specific axis inclined foundation. - * - * @param axis The #Axis. - * @return The needed #Foundation. - */ -static inline Foundation InclinedFoundation(Axis axis) -{ - return (axis == AXIS_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y); -} - -/** - * Returns the halftile foundation for single horizontal/vertical track. - * - * @param corner The #Corner with the track. - * @return The wanted #Foundation. - */ -static inline Foundation HalftileFoundation(Corner corner) -{ - assert(IsValidCorner(corner)); - return (Foundation)(FOUNDATION_HALFTILE_W + corner); -} - -/** - * Returns the special rail foundation for single horizontal/vertical track. - * - * @param corner The #Corner with the track. - * @return The wanted #Foundation. - */ -static inline Foundation SpecialRailFoundation(Corner corner) -{ - assert(IsValidCorner(corner)); - return (Foundation)(FOUNDATION_RAIL_W + corner); -} - -#endif /* SLOPE_H */
new file mode 100644 --- /dev/null +++ b/src/slope_func.h @@ -0,0 +1,302 @@ +/* $Id$ */ + +/** @file slope_func.h Functions related to slopes. */ + +#ifndef SLOPE_FUNC_H +#define SLOPE_FUNC_H + +#include "slope_type.h" +#include "direction_type.h" + +/** + * Rangecheck for Corner enumeration. + * + * @param corner A #Corner. + * @return true iff corner is in a valid range. + */ +static inline bool IsValidCorner(Corner corner) +{ + return IsInsideMM(corner, 0, CORNER_END); +} + + +/** + * Checks if a slope is steep. + * + * @param s The given #Slope. + * @return True if the slope is steep, else false. + */ +static inline bool IsSteepSlope(Slope s) +{ + return (s & SLOPE_STEEP) != 0; +} + +/** + * Checks for non-continuous slope on halftile foundations. + * + * @param s The given #Slope. + * @return True if the slope is non-continuous, else false. + */ +static inline bool IsHalftileSlope(Slope s) +{ + return (s & SLOPE_HALFTILE) != 0; +} + +/** + * Return the complement of a slope. + * + * This method returns the complement of a slope. The complement of a + * slope is a slope with raised corner which aren't raised in the given + * slope. + * + * @pre The slope must neither be steep nor a halftile slope. + * @param s The #Slope to get the complement. + * @return a complement Slope of the given slope. + */ +static inline Slope ComplementSlope(Slope s) +{ + assert(!IsSteepSlope(s) && !IsHalftileSlope(s)); + return (Slope)(0xF ^ s); +} + +/** + * Tests if a slope has a highest corner (i.e. one corner raised or a steep slope). + * + * Note: A halftile slope is ignored. + * + * @param s The #Slope. + * @return true iff the slope has a highest corner. + */ +static inline bool HasSlopeHighestCorner(Slope s) +{ + s = (Slope)(s & ~SLOPE_HALFTILE_MASK); + return IsSteepSlope(s) || (s == SLOPE_W) || (s == SLOPE_S) || (s == SLOPE_E) || (s == SLOPE_N); +} + +/** + * Returns the highest corner of a slope (one corner raised or a steep slope). + * + * @pre The slope must be a slope with one corner raised or a steep slope. A halftile slope is ignored. + * @param s The #Slope. + * @return Highest corner. + */ +static inline Corner GetHighestSlopeCorner(Slope s) +{ + switch (s & ~SLOPE_HALFTILE_MASK) { + case SLOPE_W: + case SLOPE_STEEP_W: return CORNER_W; + case SLOPE_S: + case SLOPE_STEEP_S: return CORNER_S; + case SLOPE_E: + case SLOPE_STEEP_E: return CORNER_E; + case SLOPE_N: + case SLOPE_STEEP_N: return CORNER_N; + default: NOT_REACHED(); + } +} + +/** + * Returns the leveled halftile of a halftile slope. + * + * @pre The slope must be a halftile slope. + * @param s The #Slope. + * @return The corner of the leveled halftile. + */ +static inline Corner GetHalftileSlopeCorner(Slope s) +{ + assert(IsHalftileSlope(s)); + return (Corner)((s >> 6) & 3); +} + +/** + * Returns the height of the highest corner of a slope relative to TileZ (= minimal height) + * + * @param s The #Slope. + * @return Relative height of highest corner. + */ +static inline uint GetSlopeMaxZ(Slope s) +{ + if (s == SLOPE_FLAT) return 0; + if (IsSteepSlope(s)) return 2 * TILE_HEIGHT; + return TILE_HEIGHT; +} + +/** + * Returns the opposite corner. + * + * @param corner A #Corner. + * @return The opposite corner to "corner". + */ +static inline Corner OppositeCorner(Corner corner) +{ + return (Corner)(corner ^ 2); +} + +/** + * Returns the slope with a specific corner raised. + * + * @param corner The #Corner. + * @return The #Slope with corner "corner" raised. + */ +static inline Slope SlopeWithOneCornerRaised(Corner corner) +{ + assert(IsValidCorner(corner)); + return (Slope)(1 << corner); +} + +/** + * Returns the slope with all except one corner raised. + * + * @param corner The #Corner. + * @return The #Slope with all corners but "corner" raised. + */ +static inline Slope SlopeWithThreeCornersRaised(Corner corner) +{ + return ComplementSlope(SlopeWithOneCornerRaised(corner)); +} + +/** + * Adds a halftile slope to a slope. + * + * @param s #Slope without a halftile slope. + * @param corner The #Corner of the halftile. + * @return The #Slope s with the halftile slope added. + */ +static inline Slope HalftileSlope(Slope s, Corner corner) +{ + assert(IsValidCorner(corner)); + return (Slope)(s | SLOPE_HALFTILE | (corner << 6)); +} + + +/** + * Tests for FOUNDATION_NONE. + * + * @param f Maybe a #Foundation. + * @return true iff f is a foundation. + */ +static inline bool IsFoundation(Foundation f) +{ + return f != FOUNDATION_NONE; +} + +/** + * Tests if the foundation is a leveled foundation. + * + * @param f The #Foundation. + * @return true iff f is a leveled foundation. + */ +static inline bool IsLeveledFoundation(Foundation f) +{ + return f == FOUNDATION_LEVELED; +} + +/** + * Tests if the foundation is an inclined foundation. + * + * @param f The #Foundation. + * @return true iff f is an inclined foundation. + */ +static inline bool IsInclinedFoundation(Foundation f) +{ + return (f == FOUNDATION_INCLINED_X) || (f == FOUNDATION_INCLINED_Y); +} + +/** + * Tests if a foundation is a non-continuous foundation, i.e. halftile-foundation or FOUNDATION_STEEP_BOTH. + * + * @param f The #Foundation. + * @return true iff f is a non-continuous foundation + */ +static inline bool IsNonContinuousFoundation(Foundation f) +{ + return IsInsideMM(f, FOUNDATION_STEEP_BOTH, FOUNDATION_HALFTILE_N + 1); +} + +/** + * Returns the halftile corner of a halftile-foundation + * + * @pre f != FOUNDATION_STEEP_BOTH + * + * @param f The #Foundation. + * @return The #Corner with track. + */ +static inline Corner GetHalftileFoundationCorner(Foundation f) +{ + assert(IsInsideMM(f, FOUNDATION_HALFTILE_W, FOUNDATION_HALFTILE_N + 1)); + return (Corner)(f - FOUNDATION_HALFTILE_W); +} + +/** + * Tests if a foundation is a special rail foundation for single horizontal/vertical track. + * + * @param f The #Foundation. + * @return true iff f is a special rail foundation for single horizontal/vertical track. + */ +static inline bool IsSpecialRailFoundation(Foundation f) +{ + return IsInsideMM(f, FOUNDATION_RAIL_W, FOUNDATION_RAIL_N + 1); +} + +/** + * Returns the track corner of a special rail foundation + * + * @param f The #Foundation. + * @return The #Corner with track. + */ +static inline Corner GetRailFoundationCorner(Foundation f) +{ + assert(IsSpecialRailFoundation(f)); + return (Corner)(f - FOUNDATION_RAIL_W); +} + +/** + * Returns the foundation needed to flatten a slope. + * The returned foundation is either FOUNDATION_NONE if the tile was already flat, or FOUNDATION_LEVELED. + * + * @pre The slope must not be steep. + * @param s The current #Slope. + * @return The needed #Foundation. + */ +static inline Foundation FlatteningFoundation(Slope s) +{ + assert(!IsSteepSlope(s)); + return (s == SLOPE_FLAT ? FOUNDATION_NONE : FOUNDATION_LEVELED); +} + +/** + * Returns the along a specific axis inclined foundation. + * + * @param axis The #Axis. + * @return The needed #Foundation. + */ +static inline Foundation InclinedFoundation(Axis axis) +{ + return (axis == AXIS_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y); +} + +/** + * Returns the halftile foundation for single horizontal/vertical track. + * + * @param corner The #Corner with the track. + * @return The wanted #Foundation. + */ +static inline Foundation HalftileFoundation(Corner corner) +{ + assert(IsValidCorner(corner)); + return (Foundation)(FOUNDATION_HALFTILE_W + corner); +} + +/** + * Returns the special rail foundation for single horizontal/vertical track. + * + * @param corner The #Corner with the track. + * @return The wanted #Foundation. + */ +static inline Foundation SpecialRailFoundation(Corner corner) +{ + assert(IsValidCorner(corner)); + return (Foundation)(FOUNDATION_RAIL_W + corner); +} + +#endif /* SLOPE_FUNC_H */
new file mode 100644 --- /dev/null +++ b/src/slope_type.h @@ -0,0 +1,101 @@ +/* $Id$ */ + +/** + * @file slope_type.h Definitions of a slope. + * This file defines the enumeration and helper functions for handling + * the slope info of a tile. + */ + +#ifndef SLOPE_TYPE_H +#define SLOPE_TYPE_H + +#include "core/enum_type.hpp" + +/** + * Enumeration of tile corners + */ +enum Corner { + CORNER_W = 0, + CORNER_S = 1, + CORNER_E = 2, + CORNER_N = 3, + CORNER_END, + CORNER_INVALID = 0xFF +}; + + +/** + * Enumeration for the slope-type. + * + * This enumeration use the chars N,E,S,W corresponding the + * direction north, east, south and west. The top corner of a tile + * is the north-part of the tile. The whole slope is encoded with + * 5 bits, 4 bits for each corner and 1 bit for a steep-flag. + * + * For halftile slopes an extra 3 bits are used to represent this + * properly; 1 bit for a halftile-flag and 2 bits to encode which + * extra side (corner) is leveled when the slope of the first 5 + * bits is applied. This means that there can only be one leveled + * slope for steep slopes, which is logical because two leveled + * slopes would mean that it is not a steep slope as halftile + * slopes only span one height level. + */ +enum Slope { + SLOPE_FLAT = 0x00, ///< a flat tile + SLOPE_W = 0x01, ///< the west corner of the tile is raised + SLOPE_S = 0x02, ///< the south corner of the tile is raised + SLOPE_E = 0x04, ///< the east corner of the tile is raised + SLOPE_N = 0x08, ///< the north corner of the tile is raised + SLOPE_STEEP = 0x10, ///< indicates the slope is steep + SLOPE_NW = SLOPE_N | SLOPE_W, ///< north and west corner are raised + SLOPE_SW = SLOPE_S | SLOPE_W, ///< south and west corner are raised + SLOPE_SE = SLOPE_S | SLOPE_E, ///< south and east corner are raised + SLOPE_NE = SLOPE_N | SLOPE_E, ///< north and east corner are raised + SLOPE_EW = SLOPE_E | SLOPE_W, ///< east and west corner are raised + SLOPE_NS = SLOPE_N | SLOPE_S, ///< north and south corner are raised + SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, ///< all corner are raised, similar to SLOPE_FLAT + SLOPE_NWS = SLOPE_N | SLOPE_W | SLOPE_S, ///< north, west and south corner are raised + SLOPE_WSE = SLOPE_W | SLOPE_S | SLOPE_E, ///< west, south and east corner are raised + SLOPE_SEN = SLOPE_S | SLOPE_E | SLOPE_N, ///< south, east and north corner are raised + SLOPE_ENW = SLOPE_E | SLOPE_N | SLOPE_W, ///< east, north and west corner are raised + SLOPE_STEEP_W = SLOPE_STEEP | SLOPE_NWS, ///< a steep slope falling to east (from west) + SLOPE_STEEP_S = SLOPE_STEEP | SLOPE_WSE, ///< a steep slope falling to north (from south) + SLOPE_STEEP_E = SLOPE_STEEP | SLOPE_SEN, ///< a steep slope falling to west (from east) + SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW, ///< a steep slope falling to south (from north) + + SLOPE_HALFTILE = 0x20, ///< one halftile is leveled (non continuous slope) + SLOPE_HALFTILE_MASK = 0xE0, ///< three bits used for halftile slopes + SLOPE_HALFTILE_W = SLOPE_HALFTILE | (CORNER_W << 6), ///< the west halftile is leveled (non continuous slope) + SLOPE_HALFTILE_S = SLOPE_HALFTILE | (CORNER_S << 6), ///< the south halftile is leveled (non continuous slope) + SLOPE_HALFTILE_E = SLOPE_HALFTILE | (CORNER_E << 6), ///< the east halftile is leveled (non continuous slope) + SLOPE_HALFTILE_N = SLOPE_HALFTILE | (CORNER_N << 6), ///< the north halftile is leveled (non continuous slope) +}; + + +/** + * Enumeration for Foundations. + */ +enum Foundation { + FOUNDATION_NONE, ///< The tile has no foundation, the slope remains unchanged. + FOUNDATION_LEVELED, ///< The tile is leveled up to a flat slope. + FOUNDATION_INCLINED_X, ///< The tile has an along X-axis inclined foundation. + FOUNDATION_INCLINED_Y, ///< The tile has an along Y-axis inclined foundation. + FOUNDATION_STEEP_LOWER, ///< The tile has a steep slope. The lowest corner is raised by a foundation to allow building railroad on the lower halftile. + + /* Halftile foundations */ + FOUNDATION_STEEP_BOTH, ///< The tile has a steep slope. The lowest corner is raised by a foundation and the upper halftile is leveled. + FOUNDATION_HALFTILE_W, ///< Level west halftile non-continuously. + FOUNDATION_HALFTILE_S, ///< Level south halftile non-continuously. + FOUNDATION_HALFTILE_E, ///< Level east halftile non-continuously. + FOUNDATION_HALFTILE_N, ///< Level north halftile non-continuously. + + /* Special anti-zig-zag foundations for single horizontal/vertical track */ + FOUNDATION_RAIL_W, ///< Foundation for TRACK_BIT_LEFT, but not a leveled foundation. + FOUNDATION_RAIL_S, ///< Foundation for TRACK_BIT_LOWER, but not a leveled foundation. + FOUNDATION_RAIL_E, ///< Foundation for TRACK_BIT_RIGHT, but not a leveled foundation. + FOUNDATION_RAIL_N, ///< Foundation for TRACK_BIT_UPPER, but not a leveled foundation. + + FOUNDATION_INVALID = 0xFF ///< Used inside "rail_cmd.cpp" to indicate invalid slope/track combination. +}; + +#endif /* SLOPE_TYPE_H */
--- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -15,7 +15,6 @@ #include "table/sprites.h" #include "landscape.h" #include "map.h" -#include "tile.h" #include "gui.h" #include "window_gui.h" #include "tree_map.h"
--- a/src/station.cpp +++ b/src/station.cpp @@ -11,7 +11,6 @@ #include "table/sprites.h" #include "table/strings.h" #include "map.h" -#include "tile.h" #include "station.h" #include "gfx.h" #include "viewport.h"
--- a/src/station.h +++ b/src/station.h @@ -9,7 +9,6 @@ #include "player.h" #include "oldpool.h" #include "sprite.h" -#include "tile.h" #include "road_type.h" #include "newgrf_station.h" #include "cargopacket.h"
--- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -15,7 +15,6 @@ #include "table/sprites.h" #include "table/strings.h" #include "map.h" -#include "tile.h" #include "station.h" #include "gfx.h" #include "viewport.h"
--- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -10,7 +10,6 @@ #include "table/strings.h" #include "functions.h" #include "player.h" -#include "tile.h" #include "gui.h" #include "window_gui.h" #include "viewport.h"
--- a/src/tgp.cpp +++ b/src/tgp.cpp @@ -10,7 +10,6 @@ #include "map.h" #include "table/strings.h" #include "clear_map.h" -#include "tile.h" #include "variables.h" #include "void_map.h" #include "tgp.h"
deleted file mode 100644 --- a/src/tile.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* $Id$ */ - -/** @file tile.cpp */ - -#include "stdafx.h" -#include "tile.h" - -Slope GetTileSlope(TileIndex tile, uint *h) -{ - uint a; - uint b; - uint c; - uint d; - uint min; - uint r; - - assert(tile < MapSize()); - - if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) { - if (h != NULL) *h = 0; - return SLOPE_FLAT; - } - - min = a = TileHeight(tile); - b = TileHeight(tile + TileDiffXY(1, 0)); - if (min > b) min = b; - c = TileHeight(tile + TileDiffXY(0, 1)); - if (min > c) min = c; - d = TileHeight(tile + TileDiffXY(1, 1)); - if (min > d) min = d; - - r = SLOPE_FLAT; - if ((a -= min) != 0) r += (--a << 4) + SLOPE_N; - if ((c -= min) != 0) r += (--c << 4) + SLOPE_E; - if ((d -= min) != 0) r += (--d << 4) + SLOPE_S; - if ((b -= min) != 0) r += (--b << 4) + SLOPE_W; - - if (h != NULL) *h = min * TILE_HEIGHT; - - return (Slope)r; -} - -uint GetTileZ(TileIndex tile) -{ - if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) return 0; - - uint h = TileHeight(tile); - h = min(h, TileHeight(tile + TileDiffXY(1, 0))); - h = min(h, TileHeight(tile + TileDiffXY(0, 1))); - h = min(h, TileHeight(tile + TileDiffXY(1, 1))); - - return h * TILE_HEIGHT; -} - - -uint GetTileMaxZ(TileIndex t) -{ - if (TileX(t) == MapMaxX() || TileY(t) == MapMaxY()) return 0; - - uint h = TileHeight(t); - h = max(h, TileHeight(t + TileDiffXY(1, 0))); - h = max(h, TileHeight(t + TileDiffXY(0, 1))); - h = max(h, TileHeight(t + TileDiffXY(1, 1))); - - return h * TILE_HEIGHT; -}
deleted file mode 100644 --- a/src/tile.h +++ /dev/null @@ -1,229 +0,0 @@ -/* $Id$ */ - -/** @file tile.h */ - -#ifndef TILE_H -#define TILE_H - -#include "macros.h" -#include "openttd.h" -#include "map.h" -#include "slope.h" - -/** Maximum allowed tile height */ -#define MAX_TILE_HEIGHT 15 - -/** Maximum allowed snowline height */ -#define MAX_SNOWLINE_HEIGHT (MAX_TILE_HEIGHT - 2) - -/** - * The different type of a tile. - * - * Each tile belongs to one type, according whatever is build on it. - * - * @note A railway with a crossing street is marked as MP_ROAD. - */ -enum TileType { - MP_CLEAR, ///< A tile without any structures, i.e. grass, rocks, farm fields etc. - MP_RAILWAY, ///< A railway - MP_ROAD, ///< A tile with road (or tram tracks) - MP_HOUSE, ///< A house by a town - MP_TREES, ///< Tile got trees - MP_STATION, ///< A tile of a station - MP_WATER, ///< Water tile - MP_VOID, ///< Invisible tiles at the SW and SE border - MP_INDUSTRY, ///< Part of an industry - MP_TUNNELBRIDGE, ///< Tunnel entry/exit and bridge heads - MP_UNMOVABLE, ///< Contains an object with cannot be removed like transmitters -}; - -/** - * Additional infos of a tile on a tropic game. - * - * Each non-water tile in a tropic game is either a rainforest tile or a - * desert one. - */ -enum TropicZone { - TROPICZONE_INVALID = 0, ///< Invalid tropiczone-type - TROPICZONE_DESERT = 1, ///< Tile is desert - TROPICZONE_RAINFOREST = 2, ///< Rainforest tile -}; - -Slope GetTileSlope(TileIndex tile, uint *h); -uint GetTileZ(TileIndex tile); -uint GetTileMaxZ(TileIndex tile); - -/** - * Returns the height of a tile - * - * This function returns the height of the northern corner of a tile. - * This is saved in the global map-array. It does not take affect by - * any slope-data of the tile. - * - * @param tile The tile to get the height from - * @return the height of the tile - * @pre tile < MapSize() - */ -static inline uint TileHeight(TileIndex tile) -{ - assert(tile < MapSize()); - return GB(_m[tile].type_height, 0, 4); -} - -/** - * Sets the height of a tile. - * - * This function sets the height of the northern corner of a tile. - * - * @param tile The tile to change the height - * @param height The new height value of the tile - * @pre tile < MapSize() - * @pre heigth <= MAX_TILE_HEIGHT - */ -static inline void SetTileHeight(TileIndex tile, uint height) -{ - assert(tile < MapSize()); - assert(height <= MAX_TILE_HEIGHT); - SB(_m[tile].type_height, 0, 4, height); -} - -/** - * Returns the height of a tile in pixels. - * - * This function returns the height of the northern corner of a tile in pixels. - * - * @param tile The tile to get the height - * @return The height of the tile in pixel - */ -static inline uint TilePixelHeight(TileIndex tile) -{ - return TileHeight(tile) * TILE_HEIGHT; -} - -/** - * Get the tiletype of a given tile. - * - * @param tile The tile to get the TileType - * @return The tiletype of the tile - * @pre tile < MapSize() - */ -static inline TileType GetTileType(TileIndex tile) -{ - assert(tile < MapSize()); - return (TileType)GB(_m[tile].type_height, 4, 4); -} - -/** - * Set the type of a tile - * - * This functions sets the type of a tile. If the type - * MP_VOID is selected the tile must be at the south-west or - * south-east edges of the map and vice versa. - * - * @param tile The tile to save the new type - * @param type The type to save - * @pre tile < MapSize() - * @pre type MP_VOID <=> tile is on the south-east or south-west edge. - */ -static inline void SetTileType(TileIndex tile, TileType type) -{ - assert(tile < MapSize()); - /* VOID tiles (and no others) are exactly allowed at the lower left and right - * edges of the map */ - assert((TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) == (type == MP_VOID)); - SB(_m[tile].type_height, 4, 4, type); -} - -/** - * Checks if a tile is a give tiletype. - * - * This function checks if a tile got the given tiletype. - * - * @param tile The tile to check - * @param type The type to check agains - * @return true If the type matches agains the type of the tile - */ -static inline bool IsTileType(TileIndex tile, TileType type) -{ - return GetTileType(tile) == type; -} - -/** - * Returns the owner of a tile - * - * This function returns the owner of a tile. This cannot used - * for tiles which type is one of MP_HOUSE, MP_VOID and MP_INDUSTRY - * as no player owned any of these buildings. - * - * @param tile The tile to check - * @return The owner of the tile - * @pre tile < MapSize() - * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY - */ -static inline Owner GetTileOwner(TileIndex tile) -{ - assert(tile < MapSize()); - assert(!IsTileType(tile, MP_HOUSE)); - assert(!IsTileType(tile, MP_VOID)); - assert(!IsTileType(tile, MP_INDUSTRY)); - - return (Owner)_m[tile].m1; -} - -/** - * Sets the owner of a tile - * - * This function sets the owner status of a tile. Note that you cannot - * set a owner for tiles of type MP_HOUSE, MP_VOID and MP_INDUSTRY. - * - * @param tile The tile to change the owner status. - * @param owner The new owner. - * @pre tile < MapSize() - * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY - */ -static inline void SetTileOwner(TileIndex tile, Owner owner) -{ - assert(tile < MapSize()); - assert(!IsTileType(tile, MP_HOUSE)); - assert(!IsTileType(tile, MP_VOID)); - assert(!IsTileType(tile, MP_INDUSTRY)); - - _m[tile].m1 = owner; -} - -/** - * Checks if a tile belongs to the given owner - * - * @param tile The tile to check - * @param owner The owner to check agains - * @return True if a tile belongs the the given owner - */ -static inline bool IsTileOwner(TileIndex tile, Owner owner) -{ - return GetTileOwner(tile) == owner; -} - -/** - * Set the tropic zone - * @param tile the tile to set the zone of - * @param type the new type - * @pre assert(tile < MapSize()); - */ -static inline void SetTropicZone(TileIndex tile, TropicZone type) -{ - assert(tile < MapSize()); - SB(_m[tile].m6, 0, 2, type); -} - -/** - * Get the tropic zone - * @param tile the tile to get the zone of - * @pre assert(tile < MapSize()); - * @return the zone type - */ -static inline TropicZone GetTropicZone(TileIndex tile) -{ - assert(tile < MapSize()); - return (TropicZone)GB(_m[tile].m6, 0, 2); -} -#endif /* TILE_H */
new file mode 100644 --- /dev/null +++ b/src/tile_map.cpp @@ -0,0 +1,67 @@ +/* $Id$ */ + +/** @file tile.cpp */ + +#include "stdafx.h" +#include "openttd.h" +#include "tile_map.h" + +Slope GetTileSlope(TileIndex tile, uint *h) +{ + uint a; + uint b; + uint c; + uint d; + uint min; + uint r; + + assert(tile < MapSize()); + + if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) { + if (h != NULL) *h = 0; + return SLOPE_FLAT; + } + + min = a = TileHeight(tile); + b = TileHeight(tile + TileDiffXY(1, 0)); + if (min > b) min = b; + c = TileHeight(tile + TileDiffXY(0, 1)); + if (min > c) min = c; + d = TileHeight(tile + TileDiffXY(1, 1)); + if (min > d) min = d; + + r = SLOPE_FLAT; + if ((a -= min) != 0) r += (--a << 4) + SLOPE_N; + if ((c -= min) != 0) r += (--c << 4) + SLOPE_E; + if ((d -= min) != 0) r += (--d << 4) + SLOPE_S; + if ((b -= min) != 0) r += (--b << 4) + SLOPE_W; + + if (h != NULL) *h = min * TILE_HEIGHT; + + return (Slope)r; +} + +uint GetTileZ(TileIndex tile) +{ + if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) return 0; + + uint h = TileHeight(tile); + h = min(h, TileHeight(tile + TileDiffXY(1, 0))); + h = min(h, TileHeight(tile + TileDiffXY(0, 1))); + h = min(h, TileHeight(tile + TileDiffXY(1, 1))); + + return h * TILE_HEIGHT; +} + + +uint GetTileMaxZ(TileIndex t) +{ + if (TileX(t) == MapMaxX() || TileY(t) == MapMaxY()) return 0; + + uint h = TileHeight(t); + h = max(h, TileHeight(t + TileDiffXY(1, 0))); + h = max(h, TileHeight(t + TileDiffXY(0, 1))); + h = max(h, TileHeight(t + TileDiffXY(1, 1))); + + return h * TILE_HEIGHT; +}
new file mode 100644 --- /dev/null +++ b/src/tile_map.h @@ -0,0 +1,190 @@ +/* $Id$ */ + +/** @file tile_map.h Map writing/reading functions for tiles. */ + +#ifndef TILE_MAP_H +#define TILE_MAP_H + +#include "tile_type.h" +#include "slope_type.h" +#include "map.h" + +/** + * Returns the height of a tile + * + * This function returns the height of the northern corner of a tile. + * This is saved in the global map-array. It does not take affect by + * any slope-data of the tile. + * + * @param tile The tile to get the height from + * @return the height of the tile + * @pre tile < MapSize() + */ +static inline uint TileHeight(TileIndex tile) +{ + assert(tile < MapSize()); + return GB(_m[tile].type_height, 0, 4); +} + +/** + * Sets the height of a tile. + * + * This function sets the height of the northern corner of a tile. + * + * @param tile The tile to change the height + * @param height The new height value of the tile + * @pre tile < MapSize() + * @pre heigth <= MAX_TILE_HEIGHT + */ +static inline void SetTileHeight(TileIndex tile, uint height) +{ + assert(tile < MapSize()); + assert(height <= MAX_TILE_HEIGHT); + SB(_m[tile].type_height, 0, 4, height); +} + +/** + * Returns the height of a tile in pixels. + * + * This function returns the height of the northern corner of a tile in pixels. + * + * @param tile The tile to get the height + * @return The height of the tile in pixel + */ +static inline uint TilePixelHeight(TileIndex tile) +{ + return TileHeight(tile) * TILE_HEIGHT; +} + +/** + * Get the tiletype of a given tile. + * + * @param tile The tile to get the TileType + * @return The tiletype of the tile + * @pre tile < MapSize() + */ +static inline TileType GetTileType(TileIndex tile) +{ + assert(tile < MapSize()); + return (TileType)GB(_m[tile].type_height, 4, 4); +} + +/** + * Set the type of a tile + * + * This functions sets the type of a tile. If the type + * MP_VOID is selected the tile must be at the south-west or + * south-east edges of the map and vice versa. + * + * @param tile The tile to save the new type + * @param type The type to save + * @pre tile < MapSize() + * @pre type MP_VOID <=> tile is on the south-east or south-west edge. + */ +static inline void SetTileType(TileIndex tile, TileType type) +{ + assert(tile < MapSize()); + /* VOID tiles (and no others) are exactly allowed at the lower left and right + * edges of the map */ + assert((TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) == (type == MP_VOID)); + SB(_m[tile].type_height, 4, 4, type); +} + +/** + * Checks if a tile is a give tiletype. + * + * This function checks if a tile got the given tiletype. + * + * @param tile The tile to check + * @param type The type to check agains + * @return true If the type matches agains the type of the tile + */ +static inline bool IsTileType(TileIndex tile, TileType type) +{ + return GetTileType(tile) == type; +} + +/** + * Returns the owner of a tile + * + * This function returns the owner of a tile. This cannot used + * for tiles which type is one of MP_HOUSE, MP_VOID and MP_INDUSTRY + * as no player owned any of these buildings. + * + * @param tile The tile to check + * @return The owner of the tile + * @pre tile < MapSize() + * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY + */ +static inline Owner GetTileOwner(TileIndex tile) +{ + assert(tile < MapSize()); + assert(!IsTileType(tile, MP_HOUSE)); + assert(!IsTileType(tile, MP_VOID)); + assert(!IsTileType(tile, MP_INDUSTRY)); + + return (Owner)_m[tile].m1; +} + +/** + * Sets the owner of a tile + * + * This function sets the owner status of a tile. Note that you cannot + * set a owner for tiles of type MP_HOUSE, MP_VOID and MP_INDUSTRY. + * + * @param tile The tile to change the owner status. + * @param owner The new owner. + * @pre tile < MapSize() + * @pre The type of the tile must not be MP_HOUSE, MP_VOID and MP_INDUSTRY + */ +static inline void SetTileOwner(TileIndex tile, Owner owner) +{ + assert(tile < MapSize()); + assert(!IsTileType(tile, MP_HOUSE)); + assert(!IsTileType(tile, MP_VOID)); + assert(!IsTileType(tile, MP_INDUSTRY)); + + _m[tile].m1 = owner; +} + +/** + * Checks if a tile belongs to the given owner + * + * @param tile The tile to check + * @param owner The owner to check agains + * @return True if a tile belongs the the given owner + */ +static inline bool IsTileOwner(TileIndex tile, Owner owner) +{ + return GetTileOwner(tile) == owner; +} + +/** + * Set the tropic zone + * @param tile the tile to set the zone of + * @param type the new type + * @pre assert(tile < MapSize()); + */ +static inline void SetTropicZone(TileIndex tile, TropicZone type) +{ + assert(tile < MapSize()); + SB(_m[tile].m6, 0, 2, type); +} + +/** + * Get the tropic zone + * @param tile the tile to get the zone of + * @pre assert(tile < MapSize()); + * @return the zone type + */ +static inline TropicZone GetTropicZone(TileIndex tile) +{ + assert(tile < MapSize()); + return (TropicZone)GB(_m[tile].m6, 0, 2); +} + +Slope GetTileSlope(TileIndex tile, uint *h); +uint GetTileZ(TileIndex tile); +uint GetTileMaxZ(TileIndex tile); + +#endif /* TILE_TYPE_H */
new file mode 100644 --- /dev/null +++ b/src/tile_type.h @@ -0,0 +1,54 @@ +/* $Id$ */ + +/** @file tile_type.h Types related to tiles. */ + +#ifndef TILE_TYPE_H +#define TILE_TYPE_H + +#include "core/enum_type.hpp" + +/** Maximum allowed tile height */ +#define MAX_TILE_HEIGHT 15 + +/** Maximum allowed snowline height */ +#define MAX_SNOWLINE_HEIGHT (MAX_TILE_HEIGHT - 2) + +/** + * The different type of a tile. + * + * Each tile belongs to one type, according whatever is build on it. + * + * @note A railway with a crossing street is marked as MP_ROAD. + */ +enum TileType { + MP_CLEAR, ///< A tile without any structures, i.e. grass, rocks, farm fields etc. + MP_RAILWAY, ///< A railway + MP_ROAD, ///< A tile with road (or tram tracks) + MP_HOUSE, ///< A house by a town + MP_TREES, ///< Tile got trees + MP_STATION, ///< A tile of a station + MP_WATER, ///< Water tile + MP_VOID, ///< Invisible tiles at the SW and SE border + MP_INDUSTRY, ///< Part of an industry + MP_TUNNELBRIDGE, ///< Tunnel entry/exit and bridge heads + MP_UNMOVABLE, ///< Contains an object with cannot be removed like transmitters +}; + +/** + * Additional infos of a tile on a tropic game. + * + * Each non-water tile in a tropic game is either a rainforest tile or a + * desert one. + */ +enum TropicZone { + TROPICZONE_INVALID = 0, ///< Invalid tropiczone-type + TROPICZONE_DESERT = 1, ///< Tile is desert + TROPICZONE_RAINFOREST = 2, ///< Rainforest tile +}; + +/** + * The index/ID of a Tile. + */ +typedef uint32 TileIndex; + +#endif /* TILE_TYPE_H */
--- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -13,7 +13,6 @@ #include "table/sprites.h" #include "map.h" #include "landscape.h" -#include "tile.h" #include "town_map.h" #include "tunnel_map.h" #include "viewport.h"
--- a/src/town_map.h +++ b/src/town_map.h @@ -7,6 +7,7 @@ #include "town.h" #include "date.h" +#include "tile_map.h" /** * Get the index of which town this house/street is attached to.
--- a/src/track_func.h +++ b/src/track_func.h @@ -7,6 +7,7 @@ #include "track_type.h" #include "direction_type.h" +#include "slope_func.h" /** * Convert an Axis to the corresponding Track
--- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -13,7 +13,6 @@ #include "table/strings.h" #include "strings.h" #include "map.h" -#include "tile.h" #include "tunnel_map.h" #include "vehicle.h" #include "timetable.h"
--- a/src/tree_cmd.cpp +++ b/src/tree_cmd.cpp @@ -12,7 +12,6 @@ #include "functions.h" #include "map.h" #include "landscape.h" -#include "tile.h" #include "tree_map.h" #include "viewport.h" #include "command.h"
--- a/src/tunnel_map.cpp +++ b/src/tunnel_map.cpp @@ -4,7 +4,6 @@ #include "stdafx.h" #include "openttd.h" -#include "tile.h" #include "tunnel_map.h" #include "tunnelbridge_map.h"
--- a/src/tunnel_map.h +++ b/src/tunnel_map.h @@ -10,6 +10,7 @@ #include "map.h" #include "rail_type.h" #include "road_type.h" +#include "tile_map.h" /**
--- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -16,7 +16,6 @@ #include "functions.h" #include "map.h" #include "landscape.h" -#include "tile.h" #include "tunnel_map.h" #include "unmovable_map.h" #include "vehicle.h"
--- a/src/tunnelbridge_map.h +++ b/src/tunnelbridge_map.h @@ -8,7 +8,7 @@ #include "direction_func.h" #include "core/bitmath_func.hpp" /* GB, HasBit, SB */ #include "map.h" /* Tile, TileIndex */ -#include "tile.h" /* TileType, IsTileType */ +#include "tile_map.h" /* TileType, IsTileType */ #include "openttd.h" /* TransportType */
--- a/src/unmovable_cmd.cpp +++ b/src/unmovable_cmd.cpp @@ -9,7 +9,6 @@ #include "functions.h" #include "landscape.h" #include "map.h" -#include "tile.h" #include "command.h" #include "viewport.h" #include "player.h"
--- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -13,7 +13,6 @@ #include "functions.h" #include "landscape.h" #include "map.h" -#include "tile.h" #include "vehicle.h" #include "timetable.h" #include "gfx.h"
--- a/src/vehicle.h +++ b/src/vehicle.h @@ -5,6 +5,7 @@ #ifndef VEHICLE_H #define VEHICLE_H +#include "vehicle_type.h" #include "oldpool.h" #include "order.h" #include "track_type.h" @@ -69,20 +70,6 @@ RVSB_ROAD_STOP_TRACKDIR_MASK = 0x09 ///< Only bits 0 and 3 are used to encode the trackdir for road stops }; -enum VehicleType { - VEH_TRAIN, - VEH_ROAD, - VEH_SHIP, - VEH_AIRCRAFT, - VEH_SPECIAL, - VEH_DISASTER, - VEH_END, - VEH_INVALID = 0xFF, -}; -DECLARE_POSTFIX_INCREMENT(VehicleType); -template <> struct EnumPropsT<VehicleType> : MakeEnumPropsT<VehicleType, byte, VEH_TRAIN, VEH_END, VEH_INVALID> {}; -typedef TinyEnumT<VehicleType> VehicleTypeByte; - enum VehStatus { VS_HIDDEN = 0x01, VS_STOPPED = 0x02, @@ -218,7 +205,6 @@ TrackBitsByte state; }; -struct Vehicle; DECLARE_OLD_POOL(Vehicle, Vehicle, 9, 125) /* Some declarations of functions, so we can make them friendly */
new file mode 100644 --- /dev/null +++ b/src/vehicle_type.h @@ -0,0 +1,28 @@ +/* $Id$ */ + +/** @file vehicle_type.h Types related to vehicles. */ + +#ifndef VEHICLE_TYPE_H +#define VEHICLE_TYPE_H + +#include "core/enum_type.hpp" + +typedef uint16 VehicleID; + +enum VehicleType { + VEH_TRAIN, + VEH_ROAD, + VEH_SHIP, + VEH_AIRCRAFT, + VEH_SPECIAL, + VEH_DISASTER, + VEH_END, + VEH_INVALID = 0xFF, +}; +DECLARE_POSTFIX_INCREMENT(VehicleType); +template <> struct EnumPropsT<VehicleType> : MakeEnumPropsT<VehicleType, byte, VEH_TRAIN, VEH_END, VEH_INVALID> {}; +typedef TinyEnumT<VehicleType> VehicleTypeByte; + +struct Vehicle; + +#endif /* VEHICLE_TYPE_H */
--- a/src/void_map.h +++ b/src/void_map.h @@ -5,6 +5,8 @@ #ifndef VOID_MAP_H #define VOID_MAP_H +#include "tile_map.h" + /** * Make a nice void tile ;) * @param t the tile to make void
--- a/src/water.h +++ b/src/water.h @@ -10,5 +10,6 @@ void DrawCanalWater(TileIndex tile); void MakeWaterOrCanalDependingOnOwner(TileIndex tile, Owner o); void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o); +void FloodHalftile(TileIndex t); #endif /* WATER_H */
--- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -14,7 +14,6 @@ #include "functions.h" #include "landscape.h" #include "map.h" -#include "tile.h" #include "vehicle.h" #include "viewport.h" #include "command.h" @@ -25,6 +24,7 @@ #include "vehicle_gui.h" #include "train.h" #include "roadveh.h" +#include "water.h" #include "water_map.h" #include "industry_map.h" #include "newgrf.h"