00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "station_map.h"
00014 #include "tunnelbridge_map.h"
00015 #include "date_func.h"
00016 #include "company_func.h"
00017 #include "company_base.h"
00018 #include "engine_base.h"
00019
00020
00021
00022
00023 extern const byte _signal_along_trackdir[TRACKDIR_END] = {
00024 0x8, 0x8, 0x8, 0x2, 0x4, 0x1, 0, 0,
00025 0x4, 0x4, 0x4, 0x1, 0x8, 0x2
00026 };
00027
00028
00029
00030 extern const byte _signal_against_trackdir[TRACKDIR_END] = {
00031 0x4, 0x4, 0x4, 0x1, 0x8, 0x2, 0, 0,
00032 0x8, 0x8, 0x8, 0x2, 0x4, 0x1
00033 };
00034
00035
00036
00037 extern const byte _signal_on_track[] = {
00038 0xC, 0xC, 0xC, 0x3, 0xC, 0x3
00039 };
00040
00041
00042
00043
00044 extern const TrackdirBits _exitdir_reaches_trackdirs[] = {
00045 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_LEFT_N,
00046 TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_UPPER_E,
00047 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_RIGHT_S,
00048 TRACKDIR_BIT_Y_NW | TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_W
00049 };
00050
00051 extern const Trackdir _next_trackdir[TRACKDIR_END] = {
00052 TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_LOWER_E, TRACKDIR_UPPER_E, TRACKDIR_RIGHT_S, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR,
00053 TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_LOWER_W, TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N
00054 };
00055
00056
00057 extern const TrackdirBits _track_crosses_trackdirs[TRACKDIR_END] = {
00058 TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_Y_NW,
00059 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_X_SW,
00060 TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S,
00061 TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S,
00062 TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E,
00063 TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E
00064 };
00065
00066
00067 extern const TrackBits _track_crosses_tracks[] = {
00068 TRACK_BIT_Y,
00069 TRACK_BIT_X,
00070 TRACK_BIT_VERT,
00071 TRACK_BIT_VERT,
00072 TRACK_BIT_HORZ,
00073 TRACK_BIT_HORZ
00074 };
00075
00076
00077
00078 extern const DiagDirection _trackdir_to_exitdir[TRACKDIR_END] = {
00079 DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_NE,
00080 DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE,
00081 };
00082
00083 extern const Trackdir _track_exitdir_to_trackdir[][DIAGDIR_END] = {
00084 {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR},
00085 {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW},
00086 {TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W},
00087 {INVALID_TRACKDIR, TRACKDIR_LOWER_E, TRACKDIR_LOWER_W, INVALID_TRACKDIR},
00088 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, TRACKDIR_LEFT_N},
00089 {TRACKDIR_RIGHT_N, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR}
00090 };
00091
00092 extern const Trackdir _track_enterdir_to_trackdir[][DIAGDIR_END] = {
00093 {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR},
00094 {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW},
00095 {INVALID_TRACKDIR, TRACKDIR_UPPER_E, TRACKDIR_UPPER_W, INVALID_TRACKDIR},
00096 {TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W},
00097 {TRACKDIR_LEFT_N, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR},
00098 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, TRACKDIR_RIGHT_N}
00099 };
00100
00101 extern const Trackdir _track_direction_to_trackdir[][DIR_END] = {
00102 {INVALID_TRACKDIR, TRACKDIR_X_NE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR, INVALID_TRACKDIR},
00103 {INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_NW},
00104 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W, INVALID_TRACKDIR},
00105 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W, INVALID_TRACKDIR},
00106 {TRACKDIR_LEFT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR},
00107 {TRACKDIR_RIGHT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR}
00108 };
00109
00110 extern const Trackdir _dir_to_diag_trackdir[] = {
00111 TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW,
00112 };
00113
00114 extern const TrackBits _corner_to_trackbits[] = {
00115 TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER,
00116 };
00117
00118 extern const TrackdirBits _uphill_trackdirs[] = {
00119 TRACKDIR_BIT_NONE ,
00120 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW,
00121 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE,
00122 TRACKDIR_BIT_X_SW ,
00123 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE,
00124 TRACKDIR_BIT_NONE ,
00125 TRACKDIR_BIT_Y_SE ,
00126 TRACKDIR_BIT_NONE ,
00127 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW,
00128 TRACKDIR_BIT_Y_NW ,
00129 TRACKDIR_BIT_NONE ,
00130 TRACKDIR_BIT_NONE ,
00131 TRACKDIR_BIT_X_NE ,
00132 TRACKDIR_BIT_NONE ,
00133 TRACKDIR_BIT_NONE ,
00134 TRACKDIR_BIT_NONE ,
00135 TRACKDIR_BIT_NONE ,
00136 TRACKDIR_BIT_NONE ,
00137 TRACKDIR_BIT_NONE ,
00138 TRACKDIR_BIT_NONE ,
00139 TRACKDIR_BIT_NONE ,
00140 TRACKDIR_BIT_NONE ,
00141 TRACKDIR_BIT_NONE ,
00142 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE,
00143 TRACKDIR_BIT_NONE ,
00144 TRACKDIR_BIT_NONE ,
00145 TRACKDIR_BIT_NONE ,
00146 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW,
00147 TRACKDIR_BIT_NONE ,
00148 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW,
00149 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE,
00150 };
00151
00155 RailType GetTileRailType(TileIndex tile)
00156 {
00157 switch (GetTileType(tile)) {
00158 case MP_RAILWAY:
00159 return GetRailType(tile);
00160
00161 case MP_ROAD:
00162
00163 if (IsLevelCrossing(tile)) return GetRailType(tile);
00164 break;
00165
00166 case MP_STATION:
00167 if (HasStationRail(tile)) return GetRailType(tile);
00168 break;
00169
00170 case MP_TUNNELBRIDGE:
00171 if (GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL) return GetRailType(tile);
00172 break;
00173
00174 default:
00175 break;
00176 }
00177 return INVALID_RAILTYPE;
00178 }
00179
00186 bool HasRailtypeAvail(const CompanyID company, const RailType railtype)
00187 {
00188 return HasBit(Company::Get(company)->avail_railtypes, railtype);
00189 }
00190
00196 bool ValParamRailtype(const RailType rail)
00197 {
00198 return rail < RAILTYPE_END && HasRailtypeAvail(_current_company, rail);
00199 }
00200
00208 RailType GetBestRailtype(const CompanyID company)
00209 {
00210 if (HasRailtypeAvail(company, RAILTYPE_MAGLEV)) return RAILTYPE_MAGLEV;
00211 if (HasRailtypeAvail(company, RAILTYPE_MONO)) return RAILTYPE_MONO;
00212 if (HasRailtypeAvail(company, RAILTYPE_ELECTRIC)) return RAILTYPE_ELECTRIC;
00213 return RAILTYPE_RAIL;
00214 }
00215
00223 RailTypes AddDateIntroducedRailTypes(RailTypes current, Date date)
00224 {
00225 RailTypes rts = current;
00226
00227 for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
00228 const RailtypeInfo *rti = GetRailTypeInfo(rt);
00229
00230 if (rti->label == 0) continue;
00231
00232
00233 if (!IsInsideMM(rti->introduction_date, 0, MAX_DAY)) continue;
00234
00235
00236 if (rti->introduction_date > date) continue;
00237
00238
00239 RailTypes required = rti->introduction_required_railtypes;
00240 if ((rts & required) != required) continue;
00241
00242 rts |= rti->introduces_railtypes;
00243 }
00244
00245
00246
00247 return rts == current ? rts : AddDateIntroducedRailTypes(rts, date);
00248 }
00249
00255 RailTypes GetCompanyRailtypes(CompanyID company)
00256 {
00257 RailTypes rts = RAILTYPES_NONE;
00258
00259 Engine *e;
00260 FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
00261 const EngineInfo *ei = &e->info;
00262
00263 if (HasBit(ei->climates, _settings_game.game_creation.landscape) &&
00264 (HasBit(e->company_avail, company) || _date >= e->intro_date + DAYS_IN_YEAR)) {
00265 const RailVehicleInfo *rvi = &e->u.rail;
00266
00267 if (rvi->railveh_type != RAILVEH_WAGON) {
00268 assert(rvi->railtype < RAILTYPE_END);
00269 rts |= GetRailTypeInfo(rvi->railtype)->introduces_railtypes;
00270 }
00271 }
00272 }
00273
00274 return AddDateIntroducedRailTypes(rts, _date);
00275 }
00276
00282 RailType GetRailTypeByLabel(RailTypeLabel label)
00283 {
00284
00285 for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) {
00286 const RailtypeInfo *rti = GetRailTypeInfo(r);
00287 if (rti->label == label) return r;
00288 }
00289
00290
00291 return INVALID_RAILTYPE;
00292 }