rubidium@8144: /* $Id$ */ rubidium@8144: rubidium@8144: /** @vehicle.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@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@8144: typedef void *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); rubidium@8144: uint CountVehiclesInChain(const Vehicle *v); rubidium@8144: bool IsEngineCountable(const Vehicle *v); rubidium@8144: void DeleteVehicleChain(Vehicle *v); rubidium@8144: void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc); rubidium@8144: void *VehicleFromPosXY(int x, int y, void *data, VehicleFromPosProc *proc); rubidium@8144: void CallVehicleTicks(); rubidium@8144: Vehicle *FindVehicleOnTileZ(TileIndex tile, byte z); rubidium@8144: uint8 CalcPercentVehicleFilled(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); rubidium@8144: Vehicle *FindVehicleBetween(TileIndex from, TileIndex to, byte z, bool without_crashed = false); rubidium@8144: Vehicle *GetVehicleTunnelBridge(TileIndex tile, TileIndex endtile); rubidium@8144: rubidium@8144: Vehicle *CheckClickOnVehicle(const ViewPort *vp, int x, int y); 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: rubidium@8144: void TrainConsistChanged(Vehicle *v); rubidium@8144: void TrainPowerChanged(Vehicle *v); rubidium@8144: Money GetTrainRunningCost(const Vehicle *v); rubidium@8144: rubidium@8144: bool VehicleNeedsService(const Vehicle *v); rubidium@8144: rubidium@8144: uint GenerateVehicleSortList(const Vehicle*** sort_list, uint16 *length_of_array, VehicleType type, PlayerID owner, uint32 index, uint16 window_type); rubidium@8144: void BuildDepotVehicleList(VehicleType type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count); rubidium@8144: CommandCost SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id); rubidium@8144: void VehicleEnterDepot(Vehicle *v); rubidium@8144: rubidium@8144: CommandCost MaybeReplaceVehicle(Vehicle *v, bool check, bool display_costs); rubidium@8144: bool CanBuildVehicleInfrastructure(VehicleType type); rubidium@8144: rubidium@8144: void CcCloneVehicle(bool success, TileIndex tile, uint32 p1, uint32 p2); rubidium@8144: rubidium@8144: /* Flags to add to p2 for goto depot commands */ rubidium@8144: /* Note: bits 8-10 are used for VLW flags */ rubidium@8144: enum { rubidium@8144: DEPOT_SERVICE = (1 << 0), // The vehicle will leave the depot right after arrival (serivce only) rubidium@8144: DEPOT_MASS_SEND = (1 << 1), // Tells that it's a mass send to depot command (type in VLW flag) rubidium@8144: DEPOT_DONT_CANCEL = (1 << 2), // Don't cancel current goto depot command if any rubidium@8144: DEPOT_LOCATE_HANGAR = (1 << 3), // Find another airport if the target one lacks a hangar rubidium@8144: }; rubidium@8144: rubidium@8144: struct GetNewVehiclePosResult { rubidium@8144: int x, y; rubidium@8144: TileIndex old_tile; rubidium@8144: TileIndex new_tile; rubidium@8144: }; rubidium@8144: rubidium@8144: /* returns true if staying in the same tile */ rubidium@8144: GetNewVehiclePosResult GetNewVehiclePos(const Vehicle *v); rubidium@8144: Direction GetDirectionTowards(const Vehicle *v, int x, int y); rubidium@8144: rubidium@8144: static inline bool IsPlayerBuildableVehicleType(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@8144: static inline bool IsPlayerBuildableVehicleType(const BaseVehicle *v) rubidium@8144: { rubidium@8144: return IsPlayerBuildableVehicleType(v->type); rubidium@8144: } rubidium@8144: rubidium@8144: const struct Livery *GetEngineLivery(EngineID engine_type, PlayerID player, 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@8144: * @param player ID of player rubidium@8144: * @return A ready-to-use palette modifier rubidium@8144: */ rubidium@8144: SpriteID GetEnginePalette(EngineID engine_type, PlayerID player); 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: Vehicle *CreateEffectVehicle(int x, int y, int z, EffectVehicle type); rubidium@8144: Vehicle *CreateEffectVehicleAbove(int x, int y, int z, EffectVehicle type); rubidium@8144: Vehicle *CreateEffectVehicleRel(const Vehicle *v, int x, int y, int z, EffectVehicle type); rubidium@8144: rubidium@8144: extern VehicleID _vehicle_id_ctr_day; rubidium@8144: extern Vehicle *_place_clicked_vehicle; rubidium@8144: extern VehicleID _new_vehicle_id; rubidium@8144: extern uint16 _returned_refit_capacity; rubidium@8144: rubidium@8144: #endif /* VEHICLE_H */