smatz@8091: /* $Id$ */ smatz@8091: rubidium@9111: /** @file road.cpp Generic road related functions. */ rubidium@9111: rubidium@7641: #include "stdafx.h" rubidium@7641: #include "openttd.h" rubidium@7641: #include "rail_map.h" rubidium@7641: #include "road_map.h" rubidium@8102: #include "road_internal.h" rubidium@7641: #include "water_map.h" rubidium@8236: #include "genworld.h" rubidium@10208: #include "company_func.h" rubidium@10208: #include "company_base.h" rubidium@8786: #include "engine_func.h" peter1138@9070: #include "engine_base.h" rubidium@8236: #include "settings_type.h" rubidium@8236: #include "date_func.h" rubidium@7641: rubidium@7641: bool IsPossibleCrossing(const TileIndex tile, Axis ax) rubidium@7641: { rubidium@7641: return (IsTileType(tile, MP_RAILWAY) && rubidium@7641: !HasSignals(tile) && rubidium@7641: GetTrackBits(tile) == (ax == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X) && rubidium@7641: GetTileSlope(tile, NULL) == SLOPE_FLAT); rubidium@7641: } rubidium@7641: rubidium@7641: RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb) rubidium@7641: { rubidium@7641: for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) { rubidium@7641: const TileIndex neighbor_tile = TileAddByDiagDir(tile, dir); rubidium@7641: rubidium@7641: /* Get the Roadbit pointing to the neighbor_tile */ rubidium@7641: const RoadBits target_rb = DiagDirToRoadBits(dir); rubidium@7641: rubidium@7641: /* If the roadbit is in the current plan */ rubidium@7641: if (org_rb & target_rb) { rubidium@7641: bool connective = false; rubidium@7641: const RoadBits mirrored_rb = MirrorRoadBits(target_rb); rubidium@7641: rubidium@7641: switch (GetTileType(neighbor_tile)) { rubidium@7641: /* Allways connective ones */ rubidium@7641: case MP_CLEAR: case MP_TREES: rubidium@7641: connective = true; rubidium@7641: break; rubidium@7641: rubidium@7641: /* The conditionaly connective ones */ rubidium@7641: case MP_TUNNELBRIDGE: rubidium@7641: case MP_STATION: rubidium@7641: case MP_ROAD: { rubidium@7641: const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, ROADTYPE_ROAD) | GetAnyRoadBits(neighbor_tile, ROADTYPE_TRAM); rubidium@7641: rubidium@7641: /* Accept only connective tiles */ rubidium@7641: connective = (neighbor_rb & mirrored_rb) || // Neighbor has got the fitting RoadBit truelight@7832: CountBits(neighbor_rb) == 1; // Neighbor has got only one Roadbit rubidium@7641: rubidium@7641: } break; rubidium@7641: rubidium@7641: case MP_RAILWAY: rubidium@7641: connective = IsPossibleCrossing(neighbor_tile, DiagDirToAxis(dir)); rubidium@7641: break; rubidium@7641: rubidium@7641: case MP_WATER: rubidium@7641: /* Check for real water tile */ rubidium@7641: connective = !IsWater(neighbor_tile); rubidium@7641: break; rubidium@7641: rubidium@7641: /* The defentetly not connective ones */ rubidium@7641: default: break; rubidium@7641: } rubidium@7641: rubidium@7641: /* If the neighbor tile is inconnective remove the planed road connection to it */ rubidium@7641: if (!connective) org_rb ^= target_rb; rubidium@7641: rubidium@7641: } rubidium@7641: } rubidium@7641: rubidium@7641: return org_rb; rubidium@7641: } rubidium@8236: rubidium@10207: bool HasRoadTypesAvail(const CompanyID company, const RoadTypes rts) rubidium@8236: { rubidium@8236: RoadTypes avail_roadtypes; rubidium@8236: rubidium@10207: if (company == OWNER_TOWN || _game_mode == GM_EDITOR || IsGeneratingWorld()) { rubidium@8236: avail_roadtypes = ROADTYPES_ROAD; rubidium@8236: } else { rubidium@10207: if (!IsValidCompanyID(company)) return false; rubidium@10207: avail_roadtypes = (RoadTypes)GetCompany(company)->avail_roadtypes | ROADTYPES_ROAD; // road is available for always for everybody rubidium@8236: } rubidium@8236: return (rts & ~avail_roadtypes) == 0; rubidium@8236: } rubidium@8236: rubidium@8236: bool ValParamRoadType(const RoadType rt) rubidium@8236: { rubidium@10207: return HasRoadTypesAvail(_current_company, RoadTypeToRoadTypes(rt)); rubidium@8236: } rubidium@8236: rubidium@10207: RoadTypes GetCompanyRoadtypes(CompanyID company) rubidium@8236: { rubidium@8236: RoadTypes rt = ROADTYPES_NONE; rubidium@8236: peter1138@9070: Engine *e; peter1138@9070: FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) { peter1138@9070: const EngineInfo *ei = &e->info; rubidium@8236: rubidium@9413: if (HasBit(ei->climates, _settings_game.game_creation.landscape) && rubidium@10207: (HasBit(e->company_avail, company) || _date >= e->intro_date + 365)) { rubidium@8236: SetBit(rt, HasBit(ei->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD); rubidium@8236: } rubidium@8236: } rubidium@8236: rubidium@8236: return rt; rubidium@8236: }