rubidium@8119: /* $Id$ */ rubidium@8119: rubidium@8119: /** @file tile_cmd.h Generic 'commands' that can be performed on all tiles. */ rubidium@8119: rubidium@8119: #ifndef TILE_CMD_H rubidium@8119: #define TILE_CMD_H rubidium@8119: rubidium@8119: #include "slope_type.h" rubidium@8138: #include "tile_type.h" rubidium@8119: #include "command_type.h" rubidium@8119: #include "vehicle_type.h" rubidium@8119: #include "cargo_type.h" rubidium@8138: #include "strings_type.h" rubidium@8140: #include "date_type.h" rubidium@10208: #include "company_type.h" smatz@8596: #include "direction_type.h" frosch@8616: #include "track_type.h" rubidium@9126: #include "transport_type.h" rubidium@8119: rubidium@8119: /** The returned bits of VehicleEnterTile. */ rubidium@8119: enum VehicleEnterTileStatus { rubidium@8119: VETS_ENTERED_STATION = 1, ///< The vehicle entered a station rubidium@8119: VETS_ENTERED_WORMHOLE = 2, ///< The vehicle either entered a bridge, tunnel or depot tile (this includes the last tile of the bridge/tunnel) rubidium@8119: VETS_CANNOT_ENTER = 3, ///< The vehicle cannot enter the tile rubidium@8119: rubidium@8119: /** rubidium@8119: * Shift the VehicleEnterTileStatus this many bits rubidium@8119: * to the right to get the station ID when rubidium@8119: * VETS_ENTERED_STATION is set rubidium@8119: */ rubidium@8119: VETS_STATION_ID_OFFSET = 8, rubidium@8373: VETS_STATION_MASK = 0xFFFF << VETS_STATION_ID_OFFSET, rubidium@8119: rubidium@8119: /** Bit sets of the above specified bits */ rubidium@8119: VETSB_CONTINUE = 0, ///< The vehicle can continue normally rubidium@8119: VETSB_ENTERED_STATION = 1 << VETS_ENTERED_STATION, ///< The vehicle entered a station rubidium@8119: 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) rubidium@8119: VETSB_CANNOT_ENTER = 1 << VETS_CANNOT_ENTER, ///< The vehicle cannot enter the tile rubidium@8119: }; rubidium@8119: DECLARE_ENUM_AS_BIT_SET(VehicleEnterTileStatus); rubidium@8119: rubidium@10260: /** Tile information, used while rendering the tile */ rubidium@8138: struct TileInfo { rubidium@10260: uint x; ///< X position of the tile in unit coordinates rubidium@10260: uint y; ///< Y position of the tile in unit coordinates rubidium@10260: Slope tileh; ///< Slope of the tile rubidium@10260: TileIndex tile; ///< Tile index rubidium@10260: uint z; ///< Height rubidium@8138: }; rubidium@8138: rubidium@10260: /** Tile description for the 'land area information' tool */ rubidium@8138: struct TileDesc { rubidium@10260: StringID str; ///< Description of the tile rubidium@10260: Owner owner[4]; ///< Name of the owner(s) rubidium@10260: StringID owner_type[4]; ///< Type of each owner rubidium@10260: Date build_date; ///< Date of construction of tile contents rubidium@10260: StringID station_class; ///< Class of station rubidium@10260: StringID station_name; ///< Type of station within the class rubidium@10260: const char *grf; ///< newGRF used for the tile contents rubidium@10260: uint64 dparam[2]; ///< Parameters of the \a str string rubidium@8138: }; rubidium@8138: rubidium@10260: /** rubidium@10260: * Tile callback function signature for drawing a tile and its contents to the screen rubidium@10260: * @param ti Information about the tile to draw rubidium@10260: */ rubidium@8119: typedef void DrawTileProc(TileInfo *ti); rubidium@8119: typedef uint GetSlopeZProc(TileIndex tile, uint x, uint y); rubidium@8119: typedef CommandCost ClearTileProc(TileIndex tile, byte flags); rubidium@10260: rubidium@10260: /** rubidium@10260: * Tile callback function signature for obtaining accepted carog of a tile rubidium@10260: * @param tile Tile queried for its accepted cargo rubidium@10260: * @param res Storage destination of the cargo accepted rubidium@10260: */ rubidium@8119: typedef void GetAcceptedCargoProc(TileIndex tile, AcceptedCargo res); rubidium@10260: rubidium@10260: /** rubidium@10260: * Tile callback function signature for obtaining a tile description rubidium@10260: * @param tile Tile being queried rubidium@10260: * @param td Storage pointer for returned tile description rubidium@10260: */ rubidium@8119: typedef void GetTileDescProc(TileIndex tile, TileDesc *td); rubidium@8119: rubidium@8119: /** rubidium@10260: * Tile callback function signature for getting the possible tracks frosch@8616: * that can be taken on a given tile by a given transport. rubidium@10260: * frosch@8616: * The return value contains the existing trackdirs and signal states. rubidium@8119: * frosch@8616: * see track_func.h for usage of TrackStatus. rubidium@8119: * rubidium@8119: * @param tile the tile to get the track status from rubidium@8119: * @param mode the mode of transportation rubidium@8119: * @param sub_mode used to differentiate between different kinds within the mode frosch@8616: * @return the track status information rubidium@8119: */ frosch@8616: typedef TrackStatus GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side); rubidium@10260: rubidium@10260: /** rubidium@10260: * Tile callback function signature for obtaining the produced cargo of a tile. rubidium@10260: * @param tile Tile being queried rubidium@10260: * @param b Destination array of produced cargo rubidium@10260: */ rubidium@8119: typedef void GetProducedCargoProc(TileIndex tile, CargoID *b); rubidium@8119: typedef void ClickTileProc(TileIndex tile); rubidium@8119: typedef void AnimateTileProc(TileIndex tile); rubidium@8119: typedef void TileLoopProc(TileIndex tile); rubidium@10207: typedef void ChangeTileOwnerProc(TileIndex tile, Owner old_owner, Owner new_owner); rubidium@8119: rubidium@8119: /** @see VehicleEnterTileStatus to see what the return values mean */ rubidium@8119: typedef VehicleEnterTileStatus VehicleEnterTileProc(Vehicle *v, TileIndex tile, int x, int y); rubidium@8119: typedef Foundation GetFoundationProc(TileIndex tile, Slope tileh); rubidium@8119: rubidium@8119: /** rubidium@10260: * Tile callback function signature of the terraforming callback. rubidium@10260: * rubidium@10260: * The function is called when a tile is affected by a terraforming operation. rubidium@10260: * It has to check if terraforming of the tile is allowed and return extra terraform-cost that depend on the tiletype. rubidium@10260: * With DC_EXEC in \a flags it has to perform tiletype-specific actions (like clearing land etc., but not the terraforming itself). rubidium@8119: * rubidium@8119: * @note The terraforming has not yet taken place. So GetTileZ() and GetTileSlope() refer to the landscape before the terraforming operation. rubidium@8119: * rubidium@8119: * @param tile The involved tile. rubidium@8119: * @param flags Command flags passed to the terraform command (DC_EXEC, DC_QUERY_COST, etc.). rubidium@8119: * @param z_new TileZ after terraforming. rubidium@8119: * @param tileh_new Slope after terraforming. rubidium@8119: * @return Error code or extra cost for terraforming (like clearing land, building foundations, etc., but not the terraforming itself.) rubidium@8119: */ rubidium@8119: typedef CommandCost TerraformTileProc(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new); rubidium@8119: rubidium@10233: /** rubidium@10233: * Set of callback functions for performing tile operations of a given tile type. rubidium@10233: * @see TileType */ rubidium@8119: struct TileTypeProcs { rubidium@10260: DrawTileProc *draw_tile_proc; ///< Called to render the tile and its contents to the screen rubidium@8119: GetSlopeZProc *get_slope_z_proc; rubidium@8119: ClearTileProc *clear_tile_proc; rubidium@10260: GetAcceptedCargoProc *get_accepted_cargo_proc; ///< Return accepted cargo of the tile rubidium@10260: GetTileDescProc *get_tile_desc_proc; ///< Get a description of a tile (for the 'land area information' tool) rubidium@10260: GetTileTrackStatusProc *get_tile_track_status_proc; ///< Get available tracks and status of a tile rubidium@10260: ClickTileProc *click_tile_proc; ///< Called when tile is clicked rubidium@8119: AnimateTileProc *animate_tile_proc; rubidium@8119: TileLoopProc *tile_loop_proc; rubidium@8119: ChangeTileOwnerProc *change_tile_owner_proc; rubidium@10260: GetProducedCargoProc *get_produced_cargo_proc; ///< Return produced cargo of the tile rubidium@10260: VehicleEnterTileProc *vehicle_enter_tile_proc; ///< Called when a vehicle enters a tile rubidium@8119: GetFoundationProc *get_foundation_proc; rubidium@10260: TerraformTileProc *terraform_tile_proc; ///< Called when a terraforming operation is about to take place rubidium@8119: }; rubidium@8119: rubidium@8119: extern const TileTypeProcs * const _tile_type_procs[16]; rubidium@8119: frosch@8616: TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR); rubidium@8119: void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac); rubidium@10207: void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner); rubidium@8119: void AnimateTile(TileIndex tile); rubidium@8119: void ClickTile(TileIndex tile); rubidium@8119: void GetTileDesc(TileIndex tile, TileDesc *td); rubidium@8119: rubidium@8119: #endif /* TILE_CMD_H */