rubidium@8144: /* $Id$ */ rubidium@8144: rubidium@9111: /** @file vehicle_func.h Functions related to vehicles. */ rubidium@8144: rubidium@8144: #ifndef VEHICLE_FUNC_H rubidium@8144: #define VEHICLE_FUNC_H rubidium@8144: rubidium@8144: #include "tile_type.h" rubidium@8144: #include "strings_type.h" rubidium@8144: #include "gfx_type.h" rubidium@8144: #include "direction_type.h" rubidium@8144: #include "cargo_type.h" rubidium@8144: #include "command_type.h" rubidium@8144: #include "vehicle_type.h" rubidium@8777: #include "engine_type.h" rubidium@9126: #include "transport_type.h" rubidium@8144: rubidium@8144: #define is_custom_sprite(x) (x >= 0xFD) rubidium@8144: #define IS_CUSTOM_FIRSTHEAD_SPRITE(x) (x == 0xFD) rubidium@8144: #define IS_CUSTOM_SECONDHEAD_SPRITE(x) (x == 0xFE) rubidium@8144: rubidium@9775: typedef Vehicle *VehicleFromPosProc(Vehicle *v, void *data); rubidium@8144: rubidium@8144: void VehicleServiceInDepot(Vehicle *v); rubidium@8144: void VehiclePositionChanged(Vehicle *v); rubidium@8144: Vehicle *GetLastVehicleInChain(Vehicle *v); peter1138@9344: const Vehicle *GetLastVehicleInChain(const Vehicle *v); rubidium@8144: uint CountVehiclesInChain(const Vehicle *v); rubidium@8144: bool IsEngineCountable(const Vehicle *v); rubidium@8144: void DeleteVehicleChain(Vehicle *v); rubidium@10083: void FindVehicleOnPos(TileIndex tile, void *data, VehicleFromPosProc *proc); rubidium@10083: void FindVehicleOnPosXY(int x, int y, void *data, VehicleFromPosProc *proc); rubidium@10083: bool HasVehicleOnPos(TileIndex tile, void *data, VehicleFromPosProc *proc); rubidium@10083: bool HasVehicleOnPosXY(int x, int y, void *data, VehicleFromPosProc *proc); rubidium@8144: void CallVehicleTicks(); peter1138@9221: uint8 CalcPercentVehicleFilled(const Vehicle *v, StringID *color); rubidium@8144: rubidium@8144: void InitializeTrains(); rubidium@8144: byte VehicleRandomBits(); rubidium@8144: void ResetVehiclePosHash(); rubidium@8144: void ResetVehicleColorMap(); rubidium@8144: rubidium@8144: bool CanRefitTo(EngineID engine_type, CargoID cid_to); rubidium@8144: CargoID FindFirstRefittableCargo(EngineID engine_type); rubidium@8144: CommandCost GetRefitCost(EngineID engine_type); rubidium@8144: rubidium@8144: void ViewportAddVehicles(DrawPixelInfo *dpi); rubidium@8144: rubidium@8144: SpriteID GetRotorImage(const Vehicle *v); rubidium@8144: rubidium@8144: uint32 VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y); rubidium@8144: rubidium@8144: StringID VehicleInTheWayErrMsg(const Vehicle* v); michi_cc@10103: bool HasVehicleOnTunnelBridge(TileIndex tile, TileIndex endtile, const Vehicle *ignore = NULL); rubidium@8144: rubidium@8144: void DecreaseVehicleValue(Vehicle *v); rubidium@8144: void CheckVehicleBreakdown(Vehicle *v); rubidium@8144: void AgeVehicle(Vehicle *v); rubidium@8144: void VehicleEnteredDepotThisTick(Vehicle *v); rubidium@8144: smatz@8317: void BeginVehicleMove(const Vehicle *v); smatz@8317: void EndVehicleMove(const Vehicle *v); smatz@8317: void MarkSingleVehicleDirty(const Vehicle *v); rubidium@8144: rubidium@8144: UnitID GetFreeUnitNumber(VehicleType type); rubidium@8144: smatz@9704: void TrainConsistChanged(Vehicle *v, bool same_length); rubidium@8144: void TrainPowerChanged(Vehicle *v); rubidium@8144: Money GetTrainRunningCost(const Vehicle *v); rubidium@8144: rubidium@10207: CommandCost SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, Owner owner, uint16 vlw_flag, uint32 id); rubidium@8144: void VehicleEnterDepot(Vehicle *v); rubidium@8144: rubidium@8144: bool CanBuildVehicleInfrastructure(VehicleType type); rubidium@8144: rubidium@8144: void CcCloneVehicle(bool success, TileIndex tile, uint32 p1, uint32 p2); rubidium@8144: rubidium@10260: /** Position information of a vehicle after it moved */ rubidium@8144: struct GetNewVehiclePosResult { rubidium@10260: int x, y; ///< x and y position of the vehicle after moving rubidium@10260: TileIndex old_tile; ///< Current tile of the vehicle rubidium@10260: TileIndex new_tile; ///< Tile of the vehicle after moving rubidium@8144: }; rubidium@8144: rubidium@8144: GetNewVehiclePosResult GetNewVehiclePos(const Vehicle *v); rubidium@8144: Direction GetDirectionTowards(const Vehicle *v, int x, int y); rubidium@8144: rubidium@10207: static inline bool IsCompanyBuildableVehicleType(VehicleType type) rubidium@8144: { rubidium@8144: switch (type) { rubidium@8144: case VEH_TRAIN: rubidium@8144: case VEH_ROAD: rubidium@8144: case VEH_SHIP: rubidium@8144: case VEH_AIRCRAFT: rubidium@8144: return true; rubidium@8144: rubidium@8144: default: return false; rubidium@8144: } rubidium@8144: } rubidium@8144: rubidium@10207: static inline bool IsCompanyBuildableVehicleType(const BaseVehicle *v) rubidium@8144: { rubidium@10207: return IsCompanyBuildableVehicleType(v->type); rubidium@8144: } rubidium@8144: rubidium@10207: const struct Livery *GetEngineLivery(EngineID engine_type, CompanyID company, EngineID parent_engine_type, const Vehicle *v); rubidium@8144: rubidium@8144: /** rubidium@8144: * Get the colour map for an engine. This used for unbuilt engines in the user interface. rubidium@8144: * @param engine_type ID of engine rubidium@10207: * @param company ID of company rubidium@8144: * @return A ready-to-use palette modifier rubidium@8144: */ rubidium@10207: SpriteID GetEnginePalette(EngineID engine_type, CompanyID company); rubidium@8144: rubidium@8144: /** rubidium@8144: * Get the colour map for a vehicle. rubidium@8144: * @param v Vehicle to get colour map for rubidium@8144: * @return A ready-to-use palette modifier rubidium@8144: */ rubidium@8144: SpriteID GetVehiclePalette(const Vehicle *v); rubidium@8144: rubidium@8144: extern const uint32 _veh_build_proc_table[]; rubidium@8144: extern const uint32 _veh_sell_proc_table[]; rubidium@8144: extern const uint32 _veh_refit_proc_table[]; rubidium@8144: extern const uint32 _send_to_depot_proc_table[]; rubidium@8144: rubidium@8144: /* Functions to find the right command for certain vehicle type */ rubidium@8144: static inline uint32 GetCmdBuildVeh(VehicleType type) rubidium@8144: { rubidium@8144: return _veh_build_proc_table[type]; rubidium@8144: } rubidium@8144: rubidium@8144: static inline uint32 GetCmdBuildVeh(const BaseVehicle *v) rubidium@8144: { rubidium@8144: return GetCmdBuildVeh(v->type); rubidium@8144: } rubidium@8144: rubidium@8144: static inline uint32 GetCmdSellVeh(VehicleType type) rubidium@8144: { rubidium@8144: return _veh_sell_proc_table[type]; rubidium@8144: } rubidium@8144: rubidium@8144: static inline uint32 GetCmdSellVeh(const BaseVehicle *v) rubidium@8144: { rubidium@8144: return GetCmdSellVeh(v->type); rubidium@8144: } rubidium@8144: rubidium@8144: static inline uint32 GetCmdRefitVeh(VehicleType type) rubidium@8144: { rubidium@8144: return _veh_refit_proc_table[type]; rubidium@8144: } rubidium@8144: rubidium@8144: static inline uint32 GetCmdRefitVeh(const BaseVehicle *v) rubidium@8144: { rubidium@8144: return GetCmdRefitVeh(v->type); rubidium@8144: } rubidium@8144: rubidium@8144: static inline uint32 GetCmdSendToDepot(VehicleType type) rubidium@8144: { rubidium@8144: return _send_to_depot_proc_table[type]; rubidium@8144: } rubidium@8144: rubidium@8144: static inline uint32 GetCmdSendToDepot(const BaseVehicle *v) rubidium@8144: { rubidium@8144: return GetCmdSendToDepot(v->type); rubidium@8144: } rubidium@8144: rubidium@8144: bool EnsureNoVehicleOnGround(TileIndex tile); rubidium@8144: void StopAllVehicles(); rubidium@8144: rubidium@8144: extern VehicleID _vehicle_id_ctr_day; peter1138@9344: extern const Vehicle *_place_clicked_vehicle; rubidium@8144: extern VehicleID _new_vehicle_id; rubidium@8144: extern uint16 _returned_refit_capacity; rubidium@8144: rubidium@9009: #endif /* VEHICLE_FUNC_H */