From 3074bca136dc9a7848d4897d7236baed51406bd3 Mon Sep 17 00:00:00 2001 From: rubidium Date: Fri, 21 Dec 2007 22:50:51 +0000 Subject: (svn r11680) -Codechange: refactor more out of openttd.h and functions.h. --- src/tile_cmd.h | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/tile_cmd.h (limited to 'src/tile_cmd.h') diff --git a/src/tile_cmd.h b/src/tile_cmd.h new file mode 100644 index 000000000..60f8940ce --- /dev/null +++ b/src/tile_cmd.h @@ -0,0 +1,116 @@ +/* $Id$ */ + +/** @file tile_cmd.h Generic 'commands' that can be performed on all tiles. */ + +#ifndef TILE_CMD_H +#define TILE_CMD_H + +#include "slope_type.h" +#include "command_type.h" +#include "vehicle_type.h" +#include "cargo_type.h" + +/** The returned bits of VehicleEnterTile. */ +enum VehicleEnterTileStatus { + VETS_ENTERED_STATION = 1, ///< The vehicle entered a station + VETS_ENTERED_WORMHOLE = 2, ///< The vehicle either entered a bridge, tunnel or depot tile (this includes the last tile of the bridge/tunnel) + VETS_CANNOT_ENTER = 3, ///< The vehicle cannot enter the tile + + /** + * Shift the VehicleEnterTileStatus this many bits + * to the right to get the station ID when + * VETS_ENTERED_STATION is set + */ + VETS_STATION_ID_OFFSET = 8, + + /** Bit sets of the above specified bits */ + VETSB_CONTINUE = 0, ///< The vehicle can continue normally + VETSB_ENTERED_STATION = 1 << VETS_ENTERED_STATION, ///< The vehicle entered a station + VETSB_ENTERED_WORMHOLE = 1 << VETS_ENTERED_WORMHOLE, ///< The vehicle either entered a bridge, tunnel or depot tile (this includes the last tile of the bridge/tunnel) + VETSB_CANNOT_ENTER = 1 << VETS_CANNOT_ENTER, ///< The vehicle cannot enter the tile +}; +DECLARE_ENUM_AS_BIT_SET(VehicleEnterTileStatus); + +typedef void DrawTileProc(TileInfo *ti); +typedef uint GetSlopeZProc(TileIndex tile, uint x, uint y); +typedef CommandCost ClearTileProc(TileIndex tile, byte flags); +typedef void GetAcceptedCargoProc(TileIndex tile, AcceptedCargo res); +typedef void GetTileDescProc(TileIndex tile, TileDesc *td); + +/** + * GetTileTrackStatusProcs return a value that contains the possible tracks + * that can be taken on a given tile by a given transport. The return value is + * composed as follows: 0xaabbccdd. ccdd and aabb are bitmasks of trackdirs, + * where bit n corresponds to trackdir n. ccdd are the trackdirs that are + * present in the tile (1==present, 0==not present), aabb is the signal + * status, if applicable (0==green/no signal, 1==red, note that this is + * reversed from map3/2[tile] for railway signals). + * + * The result (let's call it ts) is often used as follows: + * tracks = (byte)(ts | ts >>8) + * This effectively converts the present part of the result (ccdd) to a + * track bitmask, which disregards directions. Normally, this is the same as just + * doing (byte)ts I think, although I am not really sure + * + * A trackdir is combination of a track and a dir, where the lower three bits + * are a track, the fourth bit is the direction. these give 12 (or 14) + * possible options: 0-5 and 8-13, so we need 14 bits for a trackdir bitmask + * above. + * @param tile the tile to get the track status from + * @param mode the mode of transportation + * @param sub_mode used to differentiate between different kinds within the mode + * @return the above mentions track status information + */ +typedef uint32 GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode); +typedef void GetProducedCargoProc(TileIndex tile, CargoID *b); +typedef void ClickTileProc(TileIndex tile); +typedef void AnimateTileProc(TileIndex tile); +typedef void TileLoopProc(TileIndex tile); +typedef void ChangeTileOwnerProc(TileIndex tile, PlayerID old_player, PlayerID new_player); + +/** @see VehicleEnterTileStatus to see what the return values mean */ +typedef VehicleEnterTileStatus VehicleEnterTileProc(Vehicle *v, TileIndex tile, int x, int y); +typedef Foundation GetFoundationProc(TileIndex tile, Slope tileh); + +/** + * Called when a tile is affected by a terraforming operation. + * The function has to check if terraforming of the tile is allowed and return extra terraform-cost that depend on the tiletype. + * With DC_EXEC in flags it has to perform tiletype-specific actions (like clearing land etc., but not the terraforming itself). + * + * @note The terraforming has not yet taken place. So GetTileZ() and GetTileSlope() refer to the landscape before the terraforming operation. + * + * @param tile The involved tile. + * @param flags Command flags passed to the terraform command (DC_EXEC, DC_QUERY_COST, etc.). + * @param z_new TileZ after terraforming. + * @param tileh_new Slope after terraforming. + * @return Error code or extra cost for terraforming (like clearing land, building foundations, etc., but not the terraforming itself.) + */ +typedef CommandCost TerraformTileProc(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new); + +struct TileTypeProcs { + DrawTileProc *draw_tile_proc; + GetSlopeZProc *get_slope_z_proc; + ClearTileProc *clear_tile_proc; + GetAcceptedCargoProc *get_accepted_cargo_proc; + GetTileDescProc *get_tile_desc_proc; + GetTileTrackStatusProc *get_tile_track_status_proc; + ClickTileProc *click_tile_proc; + AnimateTileProc *animate_tile_proc; + TileLoopProc *tile_loop_proc; + ChangeTileOwnerProc *change_tile_owner_proc; + GetProducedCargoProc *get_produced_cargo_proc; + VehicleEnterTileProc *vehicle_enter_tile_proc; + GetFoundationProc *get_foundation_proc; + TerraformTileProc *terraform_tile_proc; +}; + +extern const TileTypeProcs * const _tile_type_procs[16]; + +uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode); +void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac); +void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player); +void AnimateTile(TileIndex tile); +void ClickTile(TileIndex tile); +void GetTileDesc(TileIndex tile, TileDesc *td); + +#endif /* TILE_CMD_H */ -- cgit v1.2.3-54-g00ecf