rubidium@9723: /* $Id$ */ rubidium@9723: rubidium@9723: /** @file tile_cmd.h Generic 'commands' that can be performed on all tiles. */ rubidium@9723: rubidium@9723: #ifndef TILE_CMD_H rubidium@9723: #define TILE_CMD_H rubidium@9723: rubidium@9723: #include "slope_type.h" rubidium@9723: #include "tile_type.h" rubidium@9723: #include "command_type.h" rubidium@9723: #include "vehicle_type.h" rubidium@9723: #include "cargo_type.h" rubidium@9723: #include "strings_type.h" rubidium@9723: #include "date_type.h" rubidium@9724: #include "player_type.h" glx@9732: #include "direction_type.h" glx@9732: #include "track_type.h" rubidium@9723: rubidium@9723: /** The returned bits of VehicleEnterTile. */ rubidium@9723: enum VehicleEnterTileStatus { rubidium@9723: VETS_ENTERED_STATION = 1, ///< The vehicle entered a station rubidium@9723: VETS_ENTERED_WORMHOLE = 2, ///< The vehicle either entered a bridge, tunnel or depot tile (this includes the last tile of the bridge/tunnel) rubidium@9723: VETS_CANNOT_ENTER = 3, ///< The vehicle cannot enter the tile rubidium@9723: rubidium@9723: /** rubidium@9723: * Shift the VehicleEnterTileStatus this many bits rubidium@9723: * to the right to get the station ID when rubidium@9723: * VETS_ENTERED_STATION is set rubidium@9723: */ rubidium@9723: VETS_STATION_ID_OFFSET = 8, rubidium@9724: VETS_STATION_MASK = 0xFFFF << VETS_STATION_ID_OFFSET, rubidium@9723: rubidium@9723: /** Bit sets of the above specified bits */ rubidium@9723: VETSB_CONTINUE = 0, ///< The vehicle can continue normally rubidium@9723: VETSB_ENTERED_STATION = 1 << VETS_ENTERED_STATION, ///< The vehicle entered a station rubidium@9723: 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@9723: VETSB_CANNOT_ENTER = 1 << VETS_CANNOT_ENTER, ///< The vehicle cannot enter the tile rubidium@9723: }; rubidium@9723: DECLARE_ENUM_AS_BIT_SET(VehicleEnterTileStatus); rubidium@9723: rubidium@9723: struct TileInfo { rubidium@9723: uint x; rubidium@9723: uint y; rubidium@9723: Slope tileh; rubidium@9723: TileIndex tile; rubidium@9723: uint z; rubidium@9723: }; rubidium@9723: rubidium@9723: struct TileDesc { rubidium@9723: StringID str; rubidium@9723: Owner owner; rubidium@9723: Date build_date; rubidium@9723: uint64 dparam[2]; rubidium@9723: }; rubidium@9723: rubidium@9723: typedef void DrawTileProc(TileInfo *ti); rubidium@9723: typedef uint GetSlopeZProc(TileIndex tile, uint x, uint y); rubidium@9723: typedef CommandCost ClearTileProc(TileIndex tile, byte flags); rubidium@9723: typedef void GetAcceptedCargoProc(TileIndex tile, AcceptedCargo res); rubidium@9723: typedef void GetTileDescProc(TileIndex tile, TileDesc *td); rubidium@9723: rubidium@9723: /** rubidium@9723: * GetTileTrackStatusProcs return a value that contains the possible tracks glx@9732: * that can be taken on a given tile by a given transport. glx@9732: * The return value contains the existing trackdirs and signal states. rubidium@9723: * glx@9732: * see track_func.h for usage of TrackStatus. rubidium@9723: * rubidium@9723: * @param tile the tile to get the track status from rubidium@9723: * @param mode the mode of transportation rubidium@9723: * @param sub_mode used to differentiate between different kinds within the mode glx@9732: * @return the track status information rubidium@9723: */ glx@9732: typedef TrackStatus GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side); rubidium@9723: typedef void GetProducedCargoProc(TileIndex tile, CargoID *b); rubidium@9723: typedef void ClickTileProc(TileIndex tile); rubidium@9723: typedef void AnimateTileProc(TileIndex tile); rubidium@9723: typedef void TileLoopProc(TileIndex tile); rubidium@9723: typedef void ChangeTileOwnerProc(TileIndex tile, PlayerID old_player, PlayerID new_player); rubidium@9723: rubidium@9723: /** @see VehicleEnterTileStatus to see what the return values mean */ rubidium@9723: typedef VehicleEnterTileStatus VehicleEnterTileProc(Vehicle *v, TileIndex tile, int x, int y); rubidium@9723: typedef Foundation GetFoundationProc(TileIndex tile, Slope tileh); rubidium@9723: rubidium@9723: /** rubidium@9723: * Called when a tile is affected by a terraforming operation. rubidium@9723: * The function has to check if terraforming of the tile is allowed and return extra terraform-cost that depend on the tiletype. rubidium@9723: * With DC_EXEC in flags it has to perform tiletype-specific actions (like clearing land etc., but not the terraforming itself). rubidium@9723: * rubidium@9723: * @note The terraforming has not yet taken place. So GetTileZ() and GetTileSlope() refer to the landscape before the terraforming operation. rubidium@9723: * rubidium@9723: * @param tile The involved tile. rubidium@9723: * @param flags Command flags passed to the terraform command (DC_EXEC, DC_QUERY_COST, etc.). rubidium@9723: * @param z_new TileZ after terraforming. rubidium@9723: * @param tileh_new Slope after terraforming. rubidium@9723: * @return Error code or extra cost for terraforming (like clearing land, building foundations, etc., but not the terraforming itself.) rubidium@9723: */ rubidium@9723: typedef CommandCost TerraformTileProc(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new); rubidium@9723: rubidium@9723: struct TileTypeProcs { rubidium@9723: DrawTileProc *draw_tile_proc; rubidium@9723: GetSlopeZProc *get_slope_z_proc; rubidium@9723: ClearTileProc *clear_tile_proc; rubidium@9723: GetAcceptedCargoProc *get_accepted_cargo_proc; rubidium@9723: GetTileDescProc *get_tile_desc_proc; rubidium@9723: GetTileTrackStatusProc *get_tile_track_status_proc; rubidium@9723: ClickTileProc *click_tile_proc; rubidium@9723: AnimateTileProc *animate_tile_proc; rubidium@9723: TileLoopProc *tile_loop_proc; rubidium@9723: ChangeTileOwnerProc *change_tile_owner_proc; rubidium@9723: GetProducedCargoProc *get_produced_cargo_proc; rubidium@9723: VehicleEnterTileProc *vehicle_enter_tile_proc; rubidium@9723: GetFoundationProc *get_foundation_proc; rubidium@9723: TerraformTileProc *terraform_tile_proc; rubidium@9723: }; rubidium@9723: rubidium@9723: extern const TileTypeProcs * const _tile_type_procs[16]; rubidium@9723: glx@9732: TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR); rubidium@9723: void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac); rubidium@9723: void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player); rubidium@9723: void AnimateTile(TileIndex tile); rubidium@9723: void ClickTile(TileIndex tile); rubidium@9723: void GetTileDesc(TileIndex tile, TileDesc *td); rubidium@9723: rubidium@9723: #endif /* TILE_CMD_H */