rail.h

Go to the documentation of this file.
00001 /* $Id: rail.h 18972 2010-01-31 13:17:29Z peter1138 $ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00012 #ifndef RAIL_H
00013 #define RAIL_H
00014 
00015 #include "rail_type.h"
00016 #include "track_type.h"
00017 #include "gfx_type.h"
00018 #include "core/bitmath_func.hpp"
00019 #include "economy_func.h"
00020 #include "slope_type.h"
00021 #include "strings_type.h"
00022 
00023 enum RailTypeFlag {
00024   RTF_CATENARY = 0,  
00025 };
00026 
00027 enum RailTypeFlags {
00028   RTFB_NONE     = 0,
00029   RTFB_CATENARY = 1 << RTF_CATENARY,
00030 };
00031 DECLARE_ENUM_AS_BIT_SET(RailTypeFlags);
00032 
00036 enum RailFenceOffset {
00037   RFO_FLAT_X,
00038   RFO_FLAT_Y,
00039   RFO_FLAT_VERT,
00040   RFO_FLAT_HORZ,
00041   RFO_SLOPE_SW,
00042   RFO_SLOPE_SE,
00043   RFO_SLOPE_NE,
00044   RFO_SLOPE_NW,
00045 };
00046 
00049 struct RailtypeInfo {
00052   struct {
00053     SpriteID track_y;      
00054     SpriteID track_ns;     
00055     SpriteID ground;       
00056     SpriteID single_x;     
00057     SpriteID single_y;     
00058     SpriteID single_n;     
00059     SpriteID single_s;     
00060     SpriteID single_e;     
00061     SpriteID single_w;     
00062     SpriteID single_sloped;
00063     SpriteID crossing;     
00064     SpriteID tunnel;       
00065   } base_sprites;
00066 
00069   struct {
00070     SpriteID build_ns_rail;      
00071     SpriteID build_x_rail;       
00072     SpriteID build_ew_rail;      
00073     SpriteID build_y_rail;       
00074     SpriteID auto_rail;          
00075     SpriteID build_depot;        
00076     SpriteID build_tunnel;       
00077     SpriteID convert_rail;       
00078   } gui_sprites;
00079 
00080   struct {
00081     CursorID rail_ns;    
00082     CursorID rail_swne;  
00083     CursorID rail_ew;    
00084     CursorID rail_nwse;  
00085     CursorID autorail;   
00086     CursorID depot;      
00087     CursorID tunnel;     
00088     CursorID convert;    
00089   } cursor;
00090 
00091   struct {
00092     StringID toolbar_caption;
00093     StringID menu_text;
00094     StringID build_caption;
00095     StringID replace_text;
00096     StringID new_loco;
00097   } strings;
00098 
00100   SpriteID snow_offset;
00101 
00103   RailTypes powered_railtypes;
00104 
00106   RailTypes compatible_railtypes;
00107 
00116   SpriteID total_offset;
00117 
00121   SpriteID bridge_offset;
00122 
00126   byte custom_ground_offset;
00127 
00131   byte curve_speed;
00132 
00136   RailTypeFlags flags;
00137 
00141   uint8 cost_multiplier;
00142 
00146   uint8 acceleration_type;
00147 
00151   uint16 max_speed;
00152 
00156   RailTypeLabel label;
00157 };
00158 
00159 
00165 static inline const RailtypeInfo *GetRailTypeInfo(RailType railtype)
00166 {
00167   extern RailtypeInfo _railtypes[RAILTYPE_END];
00168   assert(railtype < RAILTYPE_END);
00169   return &_railtypes[railtype];
00170 }
00171 
00180 static inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
00181 {
00182   return HasBit(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
00183 }
00184 
00193 static inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
00194 {
00195   return HasBit(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
00196 }
00197 
00203 static inline Money RailBuildCost(RailType railtype)
00204 {
00205   assert(railtype < RAILTYPE_END);
00206   return (_price[PR_BUILD_RAIL] * GetRailTypeInfo(railtype)->cost_multiplier) >> 3;
00207 }
00208 
00215 static inline Money RailConvertCost(RailType from, RailType to)
00216 {
00217   /* rail -> el. rail
00218    * calculate the price as 5 / 4 of (cost build el. rail) - (cost build rail)
00219    * (the price of workers to get to place is that 1/4)
00220    */
00221   if (HasPowerOnRail(from, to)) {
00222     Money cost = ((RailBuildCost(to) - RailBuildCost(from)) * 5) >> 2;
00223     if (cost != 0) return cost;
00224   }
00225 
00226   /* el. rail -> rail
00227    * calculate the price as 1 / 4 of (cost build el. rail) - (cost build rail)
00228    * (the price of workers is 1 / 4 + price of copper sold to a recycle center)
00229    */
00230   if (HasPowerOnRail(to, from)) {
00231     Money cost = (RailBuildCost(from) - RailBuildCost(to)) >> 2;
00232     if (cost != 0) return cost;
00233   }
00234 
00235   /* make the price the same as remove + build new type */
00236   return RailBuildCost(to) + _price[PR_CLEAR_RAIL];
00237 }
00238 
00239 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
00240 Vehicle *EnsureNoTrainOnTrackProc(Vehicle *v, void *data);
00241 int TicksToLeaveDepot(const Train *v);
00242 
00243 Foundation GetRailFoundation(Slope tileh, TrackBits bits);
00244 
00245 
00252 bool HasRailtypeAvail(const CompanyID company, const RailType railtype);
00253 
00259 bool ValParamRailtype(const RailType rail);
00260 
00268 RailType GetBestRailtype(const CompanyID company);
00269 
00275 RailTypes GetCompanyRailtypes(const CompanyID c);
00276 
00282 RailType GetRailTypeByLabel(RailTypeLabel label);
00283 
00287 void ResetRailTypes();
00288 
00292 RailType AllocateRailType(RailTypeLabel label);
00293 
00294 #endif /* RAIL_H */

Generated on Thu Feb 4 17:20:27 2010 for OpenTTD by  doxygen 1.5.6