00001
00002
00005 #include "stdafx.h"
00006 #include "openttd.h"
00007 #include "bridge_map.h"
00008 #include "rail.h"
00009 #include "station_map.h"
00010 #include "tunnel_map.h"
00011 #include "tunnelbridge_map.h"
00012 #include "settings_type.h"
00013 #include "date_func.h"
00014 #include "player_func.h"
00015 #include "player_base.h"
00016
00017
00018
00019
00020
00021 extern const byte _signal_along_trackdir[TRACKDIR_END] = {
00022 0x8, 0x8, 0x8, 0x2, 0x4, 0x1, 0, 0,
00023 0x4, 0x4, 0x4, 0x1, 0x8, 0x2
00024 };
00025
00026
00027
00028 extern const byte _signal_against_trackdir[TRACKDIR_END] = {
00029 0x4, 0x4, 0x4, 0x1, 0x8, 0x2, 0, 0,
00030 0x8, 0x8, 0x8, 0x2, 0x4, 0x1
00031 };
00032
00033
00034
00035 extern const byte _signal_on_track[] = {
00036 0xC, 0xC, 0xC, 0x3, 0xC, 0x3
00037 };
00038
00039
00040
00041
00042 extern const TrackdirBits _exitdir_reaches_trackdirs[] = {
00043 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_LEFT_N,
00044 TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_UPPER_E,
00045 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_RIGHT_S,
00046 TRACKDIR_BIT_Y_NW | TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_W
00047 };
00048
00049 extern const Trackdir _next_trackdir[TRACKDIR_END] = {
00050 TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_LOWER_E, TRACKDIR_UPPER_E, TRACKDIR_RIGHT_S, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR,
00051 TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_LOWER_W, TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N
00052 };
00053
00054
00055 extern const TrackdirBits _track_crosses_trackdirs[TRACKDIR_END] = {
00056 TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_Y_NW,
00057 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_X_SW,
00058 TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S,
00059 TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S,
00060 TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E,
00061 TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E
00062 };
00063
00064
00065 extern const TrackBits _track_crosses_tracks[] = {
00066 TRACK_BIT_Y,
00067 TRACK_BIT_X,
00068 TRACK_BIT_VERT,
00069 TRACK_BIT_VERT,
00070 TRACK_BIT_HORZ,
00071 TRACK_BIT_HORZ
00072 };
00073
00074
00075
00076 extern const DiagDirection _trackdir_to_exitdir[TRACKDIR_END] = {
00077 DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_NE,
00078 DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE,
00079 };
00080
00081 extern const Trackdir _track_exitdir_to_trackdir[][DIAGDIR_END] = {
00082 {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR},
00083 {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW},
00084 {TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W},
00085 {INVALID_TRACKDIR, TRACKDIR_LOWER_E, TRACKDIR_LOWER_W, INVALID_TRACKDIR},
00086 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, TRACKDIR_LEFT_N},
00087 {TRACKDIR_RIGHT_N, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR}
00088 };
00089
00090 extern const Trackdir _track_enterdir_to_trackdir[][DIAGDIR_END] = {
00091 {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR},
00092 {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW},
00093 {INVALID_TRACKDIR, TRACKDIR_UPPER_E, TRACKDIR_UPPER_W, INVALID_TRACKDIR},
00094 {TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W},
00095 {TRACKDIR_LEFT_N, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR},
00096 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, TRACKDIR_RIGHT_N}
00097 };
00098
00099 extern const Trackdir _track_direction_to_trackdir[][DIR_END] = {
00100 {INVALID_TRACKDIR, TRACKDIR_X_NE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR, INVALID_TRACKDIR},
00101 {INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_NW},
00102 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W, INVALID_TRACKDIR},
00103 {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W, INVALID_TRACKDIR},
00104 {TRACKDIR_LEFT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR},
00105 {TRACKDIR_RIGHT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR}
00106 };
00107
00108 extern const Trackdir _dir_to_diag_trackdir[] = {
00109 TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW,
00110 };
00111
00112 extern const TrackBits _corner_to_trackbits[] = {
00113 TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER,
00114 };
00115
00116 extern const TrackdirBits _uphill_trackdirs[] = {
00117 TRACKDIR_BIT_NONE ,
00118 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW,
00119 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE,
00120 TRACKDIR_BIT_X_SW ,
00121 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE,
00122 TRACKDIR_BIT_NONE ,
00123 TRACKDIR_BIT_Y_SE ,
00124 TRACKDIR_BIT_NONE ,
00125 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW,
00126 TRACKDIR_BIT_Y_NW ,
00127 TRACKDIR_BIT_NONE ,
00128 TRACKDIR_BIT_NONE ,
00129 TRACKDIR_BIT_X_NE ,
00130 TRACKDIR_BIT_NONE ,
00131 TRACKDIR_BIT_NONE ,
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_X_SW | TRACKDIR_BIT_Y_SE,
00141 TRACKDIR_BIT_NONE ,
00142 TRACKDIR_BIT_NONE ,
00143 TRACKDIR_BIT_NONE ,
00144 TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW,
00145 TRACKDIR_BIT_NONE ,
00146 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW,
00147 TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE,
00148 };
00149
00150
00151
00152 const int _default_railtype_cost_multiplier[RAILTYPE_END] = {
00153 8, 12, 16, 24,
00154 };
00155 int _railtype_cost_multiplier[RAILTYPE_END];
00156
00157 RailType GetTileRailType(TileIndex tile)
00158 {
00159 switch (GetTileType(tile)) {
00160 case MP_RAILWAY:
00161 return GetRailType(tile);
00162
00163 case MP_ROAD:
00164
00165 if (IsLevelCrossing(tile)) return GetRailType(tile);
00166 break;
00167
00168 case MP_STATION:
00169 if (IsRailwayStationTile(tile)) return GetRailType(tile);
00170 break;
00171
00172 case MP_TUNNELBRIDGE:
00173 if (GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL) return GetRailType(tile);
00174 break;
00175
00176 default:
00177 break;
00178 }
00179 return INVALID_RAILTYPE;
00180 }
00181
00182 bool HasRailtypeAvail(const PlayerID p, const RailType railtype)
00183 {
00184 return HasBit(GetPlayer(p)->avail_railtypes, railtype);
00185 }
00186
00187 bool ValParamRailtype(const RailType rail)
00188 {
00189 return HasRailtypeAvail(_current_player, rail);
00190 }
00191
00192 RailType GetBestRailtype(const PlayerID p)
00193 {
00194 if (HasRailtypeAvail(p, RAILTYPE_MAGLEV)) return RAILTYPE_MAGLEV;
00195 if (HasRailtypeAvail(p, RAILTYPE_MONO)) return RAILTYPE_MONO;
00196 if (HasRailtypeAvail(p, RAILTYPE_ELECTRIC)) return RAILTYPE_ELECTRIC;
00197 return RAILTYPE_RAIL;
00198 }
00199
00200 RailTypes GetPlayerRailtypes(PlayerID p)
00201 {
00202 RailTypes rt = RAILTYPES_NONE;
00203
00204 EngineID i;
00205 FOR_ALL_ENGINEIDS_OF_TYPE(i, VEH_TRAIN) {
00206 const Engine* e = GetEngine(i);
00207 const EngineInfo *ei = EngInfo(i);
00208
00209 if (HasBit(ei->climates, _opt.landscape) &&
00210 (HasBit(e->player_avail, p) || _date >= e->intro_date + 365)) {
00211 const RailVehicleInfo *rvi = RailVehInfo(i);
00212
00213 if (rvi->railveh_type != RAILVEH_WAGON) {
00214 assert(rvi->railtype < RAILTYPE_END);
00215 SetBit(rt, rvi->railtype);
00216 }
00217 }
00218 }
00219
00220 return rt;
00221 }