road.cpp
Go to the documentation of this file.00001
00002
00005 #include "stdafx.h"
00006 #include "openttd.h"
00007 #include "rail_map.h"
00008 #include "road_map.h"
00009 #include "water_map.h"
00010 #include "genworld.h"
00011 #include "company_func.h"
00012 #include "company_base.h"
00013 #include "engine_base.h"
00014 #include "date_func.h"
00015 #include "settings_type.h"
00016 #include "landscape.h"
00017
00018 bool IsPossibleCrossing(const TileIndex tile, Axis ax)
00019 {
00020 return (IsTileType(tile, MP_RAILWAY) &&
00021 GetRailTileType(tile) == RAIL_TILE_NORMAL &&
00022 GetTrackBits(tile) == (ax == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X) &&
00023 GetFoundationSlope(tile, NULL) == SLOPE_FLAT);
00024 }
00025
00026 RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb)
00027 {
00028 if (!IsValidTile(tile)) return ROAD_NONE;
00029 for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
00030 const TileIndex neighbor_tile = TileAddByDiagDir(tile, dir);
00031
00032
00033 const RoadBits target_rb = DiagDirToRoadBits(dir);
00034
00035
00036 if (org_rb & target_rb) {
00037 bool connective = false;
00038 const RoadBits mirrored_rb = MirrorRoadBits(target_rb);
00039
00040 switch (GetTileType(neighbor_tile)) {
00041
00042 case MP_CLEAR: case MP_TREES:
00043 connective = true;
00044 break;
00045
00046
00047 case MP_TUNNELBRIDGE:
00048 case MP_STATION:
00049 case MP_ROAD: {
00050 const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, ROADTYPE_ROAD) | GetAnyRoadBits(neighbor_tile, ROADTYPE_TRAM);
00051
00052
00053 connective = (neighbor_rb & mirrored_rb) ||
00054 CountBits(neighbor_rb) == 1;
00055
00056 } break;
00057
00058 case MP_RAILWAY:
00059 connective = IsPossibleCrossing(neighbor_tile, DiagDirToAxis(dir));
00060 break;
00061
00062 case MP_WATER:
00063
00064 connective = !IsWater(neighbor_tile);
00065 break;
00066
00067
00068 default: break;
00069 }
00070
00071
00072 if (!connective) org_rb ^= target_rb;
00073
00074 }
00075 }
00076
00077 return org_rb;
00078 }
00079
00080 bool HasRoadTypesAvail(const CompanyID company, const RoadTypes rts)
00081 {
00082 RoadTypes avail_roadtypes;
00083
00084 if (company == OWNER_TOWN || _game_mode == GM_EDITOR || IsGeneratingWorld()) {
00085 avail_roadtypes = ROADTYPES_ROAD;
00086 } else {
00087 if (!IsValidCompanyID(company)) return false;
00088 avail_roadtypes = (RoadTypes)GetCompany(company)->avail_roadtypes | ROADTYPES_ROAD;
00089 }
00090 return (rts & ~avail_roadtypes) == 0;
00091 }
00092
00093 bool ValParamRoadType(const RoadType rt)
00094 {
00095 return HasRoadTypesAvail(_current_company, RoadTypeToRoadTypes(rt));
00096 }
00097
00098 RoadTypes GetCompanyRoadtypes(CompanyID company)
00099 {
00100 RoadTypes rt = ROADTYPES_NONE;
00101
00102 Engine *e;
00103 FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
00104 const EngineInfo *ei = &e->info;
00105
00106 if (HasBit(ei->climates, _settings_game.game_creation.landscape) &&
00107 (HasBit(e->company_avail, company) || _date >= e->intro_date + DAYS_IN_YEAR)) {
00108 SetBit(rt, HasBit(ei->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
00109 }
00110 }
00111
00112 return rt;
00113 }