rubidium@6872: /* $Id$ */ rubidium@6872: richk@10724: /** @file vehicle_func.h Functions related to vehicles. */ rubidium@6872: rubidium@6872: #ifndef VEHICLE_FUNC_H rubidium@6872: #define VEHICLE_FUNC_H rubidium@6872: rubidium@6872: #include "tile_type.h" rubidium@6872: #include "strings_type.h" rubidium@6872: #include "gfx_type.h" rubidium@6872: #include "direction_type.h" rubidium@6872: #include "cargo_type.h" rubidium@6872: #include "command_type.h" rubidium@6872: #include "vehicle_type.h" richk@10184: #include "engine_type.h" richk@10724: #include "transport_type.h" rubidium@6872: rubidium@6872: #define is_custom_sprite(x) (x >= 0xFD) rubidium@6872: #define IS_CUSTOM_FIRSTHEAD_SPRITE(x) (x == 0xFD) rubidium@6872: #define IS_CUSTOM_SECONDHEAD_SPRITE(x) (x == 0xFE) rubidium@6872: rubidium@6872: typedef void *VehicleFromPosProc(Vehicle *v, void *data); rubidium@6872: rubidium@6872: void VehicleServiceInDepot(Vehicle *v); rubidium@6872: void VehiclePositionChanged(Vehicle *v); rubidium@6872: Vehicle *GetLastVehicleInChain(Vehicle *v); richk@10731: const Vehicle *GetLastVehicleInChain(const Vehicle *v); rubidium@6872: uint CountVehiclesInChain(const Vehicle *v); rubidium@6872: bool IsEngineCountable(const Vehicle *v); rubidium@6872: void DeleteVehicleChain(Vehicle *v); rubidium@6872: void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc); rubidium@6872: void *VehicleFromPosXY(int x, int y, void *data, VehicleFromPosProc *proc); rubidium@6872: void CallVehicleTicks(); rubidium@6872: Vehicle *FindVehicleOnTileZ(TileIndex tile, byte z); richk@10724: uint8 CalcPercentVehicleFilled(const Vehicle *v, StringID *color); rubidium@6872: rubidium@6872: void InitializeTrains(); rubidium@6872: byte VehicleRandomBits(); rubidium@6872: void ResetVehiclePosHash(); rubidium@6872: void ResetVehicleColorMap(); rubidium@6872: rubidium@6872: bool CanRefitTo(EngineID engine_type, CargoID cid_to); rubidium@6872: CargoID FindFirstRefittableCargo(EngineID engine_type); rubidium@6872: CommandCost GetRefitCost(EngineID engine_type); rubidium@6872: rubidium@6872: void ViewportAddVehicles(DrawPixelInfo *dpi); rubidium@6872: rubidium@6872: SpriteID GetRotorImage(const Vehicle *v); rubidium@6872: rubidium@6872: uint32 VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y); rubidium@6872: rubidium@6872: StringID VehicleInTheWayErrMsg(const Vehicle* v); rubidium@6872: Vehicle *FindVehicleBetween(TileIndex from, TileIndex to, byte z, bool without_crashed = false); rubidium@6872: Vehicle *GetVehicleTunnelBridge(TileIndex tile, TileIndex endtile); rubidium@6872: rubidium@6872: void DecreaseVehicleValue(Vehicle *v); rubidium@6872: void CheckVehicleBreakdown(Vehicle *v); rubidium@6872: void AgeVehicle(Vehicle *v); rubidium@6872: void VehicleEnteredDepotThisTick(Vehicle *v); rubidium@6872: rubidium@6872: void BeginVehicleMove(const Vehicle *v); rubidium@6872: void EndVehicleMove(const Vehicle *v); rubidium@6872: void MarkSingleVehicleDirty(const Vehicle *v); rubidium@6872: rubidium@6872: UnitID GetFreeUnitNumber(VehicleType type); rubidium@6872: rubidium@6872: void TrainConsistChanged(Vehicle *v); rubidium@6872: void TrainPowerChanged(Vehicle *v); rubidium@6872: Money GetTrainRunningCost(const Vehicle *v); rubidium@6872: rubidium@6872: CommandCost SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id); rubidium@6872: void VehicleEnterDepot(Vehicle *v); rubidium@6872: richk@10274: CommandCost MaybeReplaceVehicle(Vehicle *v, uint32 flags, bool display_costs); rubidium@6872: bool CanBuildVehicleInfrastructure(VehicleType type); rubidium@6872: rubidium@6872: void CcCloneVehicle(bool success, TileIndex tile, uint32 p1, uint32 p2); rubidium@6872: rubidium@6872: rubidium@6872: struct GetNewVehiclePosResult { rubidium@6872: int x, y; rubidium@6872: TileIndex old_tile; rubidium@6872: TileIndex new_tile; rubidium@6872: }; rubidium@6872: rubidium@6872: /* returns true if staying in the same tile */ rubidium@6872: GetNewVehiclePosResult GetNewVehiclePos(const Vehicle *v); rubidium@6872: Direction GetDirectionTowards(const Vehicle *v, int x, int y); rubidium@6872: rubidium@6872: static inline bool IsPlayerBuildableVehicleType(VehicleType type) rubidium@6872: { rubidium@6872: switch (type) { rubidium@6872: case VEH_TRAIN: rubidium@6872: case VEH_ROAD: rubidium@6872: case VEH_SHIP: rubidium@6872: case VEH_AIRCRAFT: rubidium@6872: return true; rubidium@6872: rubidium@6872: default: return false; rubidium@6872: } rubidium@6872: } rubidium@6872: rubidium@6872: static inline bool IsPlayerBuildableVehicleType(const BaseVehicle *v) rubidium@6872: { rubidium@6872: return IsPlayerBuildableVehicleType(v->type); rubidium@6872: } rubidium@6872: rubidium@6872: const struct Livery *GetEngineLivery(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v); rubidium@6872: rubidium@6872: /** rubidium@6872: * Get the colour map for an engine. This used for unbuilt engines in the user interface. rubidium@6872: * @param engine_type ID of engine rubidium@6872: * @param player ID of player rubidium@6872: * @return A ready-to-use palette modifier rubidium@6872: */ rubidium@6872: SpriteID GetEnginePalette(EngineID engine_type, PlayerID player); rubidium@6872: rubidium@6872: /** rubidium@6872: * Get the colour map for a vehicle. rubidium@6872: * @param v Vehicle to get colour map for rubidium@6872: * @return A ready-to-use palette modifier rubidium@6872: */ rubidium@6872: SpriteID GetVehiclePalette(const Vehicle *v); rubidium@6872: rubidium@6872: extern const uint32 _veh_build_proc_table[]; rubidium@6872: extern const uint32 _veh_sell_proc_table[]; rubidium@6872: extern const uint32 _veh_refit_proc_table[]; rubidium@6872: extern const uint32 _send_to_depot_proc_table[]; rubidium@6872: rubidium@6872: /* Functions to find the right command for certain vehicle type */ rubidium@6872: static inline uint32 GetCmdBuildVeh(VehicleType type) rubidium@6872: { rubidium@6872: return _veh_build_proc_table[type]; rubidium@6872: } rubidium@6872: rubidium@6872: static inline uint32 GetCmdBuildVeh(const BaseVehicle *v) rubidium@6872: { rubidium@6872: return GetCmdBuildVeh(v->type); rubidium@6872: } rubidium@6872: rubidium@6872: static inline uint32 GetCmdSellVeh(VehicleType type) rubidium@6872: { rubidium@6872: return _veh_sell_proc_table[type]; rubidium@6872: } rubidium@6872: rubidium@6872: static inline uint32 GetCmdSellVeh(const BaseVehicle *v) rubidium@6872: { rubidium@6872: return GetCmdSellVeh(v->type); rubidium@6872: } rubidium@6872: rubidium@6872: static inline uint32 GetCmdRefitVeh(VehicleType type) rubidium@6872: { rubidium@6872: return _veh_refit_proc_table[type]; rubidium@6872: } rubidium@6872: rubidium@6872: static inline uint32 GetCmdRefitVeh(const BaseVehicle *v) rubidium@6872: { rubidium@6872: return GetCmdRefitVeh(v->type); rubidium@6872: } rubidium@6872: rubidium@6872: static inline uint32 GetCmdSendToDepot(VehicleType type) rubidium@6872: { rubidium@6872: return _send_to_depot_proc_table[type]; rubidium@6872: } rubidium@6872: rubidium@6872: static inline uint32 GetCmdSendToDepot(const BaseVehicle *v) rubidium@6872: { rubidium@6872: return GetCmdSendToDepot(v->type); rubidium@6872: } rubidium@6872: rubidium@6872: bool EnsureNoVehicleOnGround(TileIndex tile); rubidium@6872: void StopAllVehicles(); rubidium@6872: rubidium@6872: extern VehicleID _vehicle_id_ctr_day; richk@10731: extern const Vehicle *_place_clicked_vehicle; rubidium@6872: extern VehicleID _new_vehicle_id; rubidium@6872: extern uint16 _returned_refit_capacity; rubidium@6872: richk@10274: #endif /* VEHICLE_FUNC_H */