rail.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #ifndef RAIL_H
00013 #define RAIL_H
00014
00015 #include "rail_type.h"
00016 #include "track_type.h"
00017 #include "vehicle_type.h"
00018 #include "gfx_type.h"
00019 #include "core/bitmath_func.hpp"
00020 #include "economy_func.h"
00021 #include "slope_type.h"
00022 #include "strings_type.h"
00023
00024 enum RailTypeFlag {
00025 RTF_CATENARY = 0,
00026 };
00027
00028 enum RailTypeFlags {
00029 RTFB_NONE = 0,
00030 RTFB_CATENARY = 1 << RTF_CATENARY,
00031 };
00032 DECLARE_ENUM_AS_BIT_SET(RailTypeFlags);
00033
00037 enum RailFenceOffset {
00038 RFO_FLAT_X,
00039 RFO_FLAT_Y,
00040 RFO_FLAT_VERT,
00041 RFO_FLAT_HORZ,
00042 RFO_SLOPE_SW,
00043 RFO_SLOPE_SE,
00044 RFO_SLOPE_NE,
00045 RFO_SLOPE_NW,
00046 };
00047
00050 struct RailtypeInfo {
00053 struct {
00054 SpriteID track_y;
00055 SpriteID track_ns;
00056 SpriteID ground;
00057 SpriteID single_x;
00058 SpriteID single_y;
00059 SpriteID single_n;
00060 SpriteID single_s;
00061 SpriteID single_e;
00062 SpriteID single_w;
00063 SpriteID single_sloped;
00064 SpriteID crossing;
00065 SpriteID tunnel;
00066 } base_sprites;
00067
00070 struct {
00071 SpriteID build_ns_rail;
00072 SpriteID build_x_rail;
00073 SpriteID build_ew_rail;
00074 SpriteID build_y_rail;
00075 SpriteID auto_rail;
00076 SpriteID build_depot;
00077 SpriteID build_tunnel;
00078 SpriteID convert_rail;
00079 } gui_sprites;
00080
00081 struct {
00082 CursorID rail_ns;
00083 CursorID rail_swne;
00084 CursorID rail_ew;
00085 CursorID rail_nwse;
00086 CursorID autorail;
00087 CursorID depot;
00088 CursorID tunnel;
00089 CursorID convert;
00090 } cursor;
00091
00092 struct {
00093 StringID toolbar_caption;
00094 StringID menu_text;
00095 StringID build_caption;
00096 StringID replace_text;
00097 StringID new_loco;
00098 } strings;
00099
00101 SpriteID snow_offset;
00102
00104 RailTypes powered_railtypes;
00105
00107 RailTypes compatible_railtypes;
00108
00117 SpriteID total_offset;
00118
00122 SpriteID bridge_offset;
00123
00127 byte custom_ground_offset;
00128
00132 byte curve_speed;
00133
00137 RailTypeFlags flags;
00138
00142 uint8 cost_multiplier;
00143
00147 RailTypeLabel label;
00148 };
00149
00150
00156 static inline const RailtypeInfo *GetRailTypeInfo(RailType railtype)
00157 {
00158 extern RailtypeInfo _railtypes[RAILTYPE_END];
00159 assert(railtype < RAILTYPE_END);
00160 return &_railtypes[railtype];
00161 }
00162
00171 static inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
00172 {
00173 return HasBit(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
00174 }
00175
00184 static inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
00185 {
00186 return HasBit(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
00187 }
00188
00194 static inline Money RailBuildCost(RailType railtype)
00195 {
00196 assert(railtype < RAILTYPE_END);
00197 return (_price[PR_BUILD_RAIL] * GetRailTypeInfo(railtype)->cost_multiplier) >> 3;
00198 }
00199
00206 static inline Money RailConvertCost(RailType from, RailType to)
00207 {
00208
00209
00210
00211
00212 if (HasPowerOnRail(from, to)) {
00213 Money cost = ((RailBuildCost(to) - RailBuildCost(from)) * 5) >> 2;
00214 if (cost != 0) return cost;
00215 }
00216
00217
00218
00219
00220
00221 if (HasPowerOnRail(to, from)) {
00222 Money cost = (RailBuildCost(from) - RailBuildCost(to)) >> 2;
00223 if (cost != 0) return cost;
00224 }
00225
00226
00227 return RailBuildCost(to) + _price[PR_CLEAR_RAIL];
00228 }
00229
00230 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
00231 Vehicle *EnsureNoTrainOnTrackProc(Vehicle *v, void *data);
00232 int TicksToLeaveDepot(const Train *v);
00233
00234 Foundation GetRailFoundation(Slope tileh, TrackBits bits);
00235
00236
00243 bool HasRailtypeAvail(const CompanyID company, const RailType railtype);
00244
00250 bool ValParamRailtype(const RailType rail);
00251
00259 RailType GetBestRailtype(const CompanyID company);
00260
00266 RailTypes GetCompanyRailtypes(const CompanyID c);
00267
00273 RailType GetRailTypeByLabel(RailTypeLabel label);
00274
00278 void ResetRailTypes();
00279
00280 #endif