tron@2186: /* $Id$ */ tron@2186: rubidium@8640: /** @vehicle.h Functions related to vehicles. */ truelight@1024: rubidium@8640: #ifndef VEHICLE_FUNC_H rubidium@8640: #define VEHICLE_FUNC_H rubidium@7631: rubidium@8640: #include "tile_type.h" rubidium@8640: #include "strings_type.h" rubidium@8640: #include "gfx_type.h" rubidium@8640: #include "direction_type.h" rubidium@8640: #include "cargo_type.h" rubidium@8640: #include "command_type.h" rubidium@8640: #include "vehicle_type.h" truelight@0: Darkvater@1765: #define is_custom_sprite(x) (x >= 0xFD) Darkvater@1765: #define IS_CUSTOM_FIRSTHEAD_SPRITE(x) (x == 0xFD) Darkvater@1765: #define IS_CUSTOM_SECONDHEAD_SPRITE(x) (x == 0xFE) truelight@0: truelight@0: typedef void *VehicleFromPosProc(Vehicle *v, void *data); truelight@0: bjarni@578: void VehicleServiceInDepot(Vehicle *v); truelight@0: void VehiclePositionChanged(Vehicle *v); truelight@0: Vehicle *GetLastVehicleInChain(Vehicle *v); rubidium@7814: uint CountVehiclesInChain(const Vehicle *v); bjarni@4574: bool IsEngineCountable(const Vehicle *v); truelight@0: void DeleteVehicleChain(Vehicle *v); truelight@0: void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc); peter1138@7367: void *VehicleFromPosXY(int x, int y, void *data, VehicleFromPosProc *proc); rubidium@6573: void CallVehicleTicks(); truelight@1605: Vehicle *FindVehicleOnTileZ(TileIndex tile, byte z); truelight@7510: uint8 CalcPercentVehicleFilled(Vehicle *v, StringID *color); truelight@0: rubidium@6573: void InitializeTrains(); rubidium@6573: byte VehicleRandomBits(); rubidium@6573: void ResetVehiclePosHash(); glx@8298: void ResetVehicleColorMap(); truelight@0: peter1138@2704: bool CanRefitTo(EngineID engine_type, CargoID cid_to); peter1138@3973: CargoID FindFirstRefittableCargo(EngineID engine_type); rubidium@7439: CommandCost GetRefitCost(EngineID engine_type); truelight@0: truelight@0: void ViewportAddVehicles(DrawPixelInfo *dpi); truelight@0: Darkvater@6117: SpriteID GetRotorImage(const Vehicle *v); truelight@0: tron@1977: uint32 VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y); truelight@0: tron@3881: StringID VehicleInTheWayErrMsg(const Vehicle* v); rubidium@6191: Vehicle *FindVehicleBetween(TileIndex from, TileIndex to, byte z, bool without_crashed = false); smatz@8568: Vehicle *GetVehicleTunnelBridge(TileIndex tile, TileIndex endtile); truelight@0: tron@2116: Vehicle *CheckClickOnVehicle(const ViewPort *vp, int x, int y); truelight@0: truelight@0: void DecreaseVehicleValue(Vehicle *v); truelight@0: void CheckVehicleBreakdown(Vehicle *v); truelight@0: void AgeVehicle(Vehicle *v); bjarni@2574: void VehicleEnteredDepotThisTick(Vehicle *v); truelight@0: smatz@8813: void BeginVehicleMove(const Vehicle *v); smatz@8813: void EndVehicleMove(const Vehicle *v); smatz@8813: void MarkSingleVehicleDirty(const Vehicle *v); truelight@0: rubidium@7137: UnitID GetFreeUnitNumber(VehicleType type); truelight@0: hackykid@1905: void TrainConsistChanged(Vehicle *v); celestar@3355: void TrainPowerChanged(Vehicle *v); rubidium@7449: Money GetTrainRunningCost(const Vehicle *v); truelight@0: rubidium@7137: uint GenerateVehicleSortList(const Vehicle*** sort_list, uint16 *length_of_array, VehicleType type, PlayerID owner, uint32 index, uint16 window_type); rubidium@7137: 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@7439: CommandCost SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id); bjarni@4725: void VehicleEnterDepot(Vehicle *v); bjarni@4506: rubidium@7439: CommandCost MaybeReplaceVehicle(Vehicle *v, bool check, bool display_costs); rubidium@7582: bool CanBuildVehicleInfrastructure(VehicleType type); bjarni@6590: rubidium@7974: void CcCloneVehicle(bool success, TileIndex tile, uint32 p1, uint32 p2); rubidium@7974: bjarni@4506: /* Flags to add to p2 for goto depot commands */ bjarni@4506: /* Note: bits 8-10 are used for VLW flags */ bjarni@4506: enum { rubidium@6988: DEPOT_SERVICE = (1 << 0), // The vehicle will leave the depot right after arrival (serivce only) bjarni@4506: DEPOT_MASS_SEND = (1 << 1), // Tells that it's a mass send to depot command (type in VLW flag) bjarni@4506: DEPOT_DONT_CANCEL = (1 << 2), // Don't cancel current goto depot command if any bjarni@4506: DEPOT_LOCATE_HANGAR = (1 << 3), // Find another airport if the target one lacks a hangar bjarni@4506: }; bjarni@4463: rubidium@6574: struct GetNewVehiclePosResult { rubidium@7814: int x, y; tron@1977: TileIndex old_tile; tron@1977: TileIndex new_tile; rubidium@6574: }; truelight@0: truelight@0: /* returns true if staying in the same tile */ tron@6479: GetNewVehiclePosResult GetNewVehiclePos(const Vehicle *v); rubidium@7814: Direction GetDirectionTowards(const Vehicle *v, int x, int y); truelight@0: rubidium@7137: static inline bool IsPlayerBuildableVehicleType(VehicleType type) bjarni@5997: { bjarni@6026: switch (type) { rubidium@6585: case VEH_TRAIN: rubidium@6585: case VEH_ROAD: rubidium@6585: case VEH_SHIP: rubidium@6585: case VEH_AIRCRAFT: bjarni@5997: return true; rubidium@7137: rubidium@7137: default: return false; bjarni@5997: } bjarni@5997: } bjarni@5997: rubidium@8640: static inline bool IsPlayerBuildableVehicleType(const BaseVehicle *v) bjarni@6026: { bjarni@6026: return IsPlayerBuildableVehicleType(v->type); bjarni@6026: } bjarni@6026: peter1138@7012: const struct Livery *GetEngineLivery(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v); peter1138@7012: peter1138@3105: /** peter1138@3105: * Get the colour map for an engine. This used for unbuilt engines in the user interface. peter1138@3105: * @param engine_type ID of engine peter1138@3105: * @param player ID of player peter1138@3105: * @return A ready-to-use palette modifier peter1138@3105: */ peter1138@5919: SpriteID GetEnginePalette(EngineID engine_type, PlayerID player); peter1138@3040: peter1138@3105: /** peter1138@3105: * Get the colour map for a vehicle. peter1138@3105: * @param v Vehicle to get colour map for peter1138@3105: * @return A ready-to-use palette modifier peter1138@3105: */ peter1138@5919: SpriteID GetVehiclePalette(const Vehicle *v); peter1138@3040: bjarni@6043: extern const uint32 _veh_build_proc_table[]; bjarni@6043: extern const uint32 _veh_sell_proc_table[]; bjarni@6043: extern const uint32 _veh_refit_proc_table[]; Darkvater@4494: extern const uint32 _send_to_depot_proc_table[]; bjarni@6043: bjarni@6043: /* Functions to find the right command for certain vehicle type */ rubidium@7137: static inline uint32 GetCmdBuildVeh(VehicleType type) bjarni@6043: { bjarni@6206: return _veh_build_proc_table[type]; bjarni@6043: } bjarni@6043: rubidium@8640: static inline uint32 GetCmdBuildVeh(const BaseVehicle *v) bjarni@6043: { bjarni@6043: return GetCmdBuildVeh(v->type); bjarni@6043: } bjarni@6043: rubidium@7137: static inline uint32 GetCmdSellVeh(VehicleType type) bjarni@6043: { bjarni@6206: return _veh_sell_proc_table[type]; bjarni@6043: } bjarni@6043: rubidium@8640: static inline uint32 GetCmdSellVeh(const BaseVehicle *v) bjarni@6043: { bjarni@6043: return GetCmdSellVeh(v->type); bjarni@6043: } bjarni@6043: rubidium@7137: static inline uint32 GetCmdRefitVeh(VehicleType type) bjarni@6043: { bjarni@6206: return _veh_refit_proc_table[type]; bjarni@6043: } bjarni@6043: rubidium@8640: static inline uint32 GetCmdRefitVeh(const BaseVehicle *v) bjarni@6043: { bjarni@6043: return GetCmdRefitVeh(v->type); bjarni@6043: } bjarni@6043: rubidium@7137: static inline uint32 GetCmdSendToDepot(VehicleType type) bjarni@6043: { bjarni@6206: return _send_to_depot_proc_table[type]; bjarni@6043: } bjarni@6043: rubidium@8640: static inline uint32 GetCmdSendToDepot(const BaseVehicle *v) bjarni@6043: { bjarni@6043: return GetCmdSendToDepot(v->type); bjarni@6043: } bjarni@4451: rubidium@8627: bool EnsureNoVehicleOnGround(TileIndex tile); rubidium@8640: void StopAllVehicles(); rubidium@8627: rubidium@8640: Vehicle *CreateEffectVehicle(int x, int y, int z, EffectVehicle type); rubidium@8640: Vehicle *CreateEffectVehicleAbove(int x, int y, int z, EffectVehicle type); rubidium@8640: Vehicle *CreateEffectVehicleRel(const Vehicle *v, int x, int y, int z, EffectVehicle type); rubidium@8615: rubidium@8640: extern VehicleID _vehicle_id_ctr_day; rubidium@8640: extern Vehicle *_place_clicked_vehicle; rubidium@8640: extern VehicleID _new_vehicle_id; rubidium@8640: extern uint16 _returned_refit_capacity; rubidium@8615: truelight@0: #endif /* VEHICLE_H */