MCPcopy Create free account
hub / github.com/OpenLoco/OpenLoco / companyGetAvailableRoads

Function companyGetAvailableRoads

src/OpenLoco/src/World/Company.cpp:413–473  ·  view source on GitHub ↗

0x00478265 * Creates a vector of all the available road track (roads {no trams} and tracks with no rails??) for a company * Roads are marked with a (1<<7) flag within the uint8_t */

Source from the content-addressed store, hash-verified

411 * Roads are marked with a (1<<7) flag within the uint8_t
412 */
413 AvailableTracksAndRoads companyGetAvailableRoads(const CompanyId id)
414 {
415 AvailableTracksAndRoads result;
416
417 const auto* company = CompanyManager::get(id);
418 sfl::static_unordered_set<uint8_t, Limits::kMaxRoadObjects> roads;
419 for (auto i = 0u; i < ObjectManager::getMaxObjects(ObjectType::vehicle); ++i)
420 {
421 const auto* vehObj = ObjectManager::get<VehicleObject>(i);
422 if (vehObj == nullptr)
423 {
424 continue;
425 }
426
427 if (company->isVehicleIndexUnlocked(i) && vehObj->mode == TransportMode::road && vehObj->trackType != 0xFFU)
428 {
429 roads.insert(vehObj->trackType | (1U << 7));
430 }
431 }
432
433 for (auto i = 0u; i < ObjectManager::getMaxObjects(ObjectType::road); ++i)
434 {
435 const auto* roadObj = ObjectManager::get<RoadObject>(i);
436 if (roadObj == nullptr)
437 {
438 continue;
439 }
440
441 if (roadObj->hasFlags(RoadObjectFlags::anyRoadTypeCompatible))
442 {
443 roads.insert(i | (1U << 7));
444 }
445 }
446
447 std::copy_if(std::begin(roads), std::end(roads), std::back_inserter(result), [](uint8_t roadId) {
448 const auto* roadObj = ObjectManager::get<RoadObject>(roadId & ~(1U << 7));
449 return !roadObj->hasFlags(RoadObjectFlags::isRail);
450 });
451
452 sfl::static_unordered_set<uint8_t, Limits::kMaxTrackObjects> tracks;
453 for (auto i = 0u; i < ObjectManager::getMaxObjects(ObjectType::vehicle); ++i)
454 {
455 const auto* vehObj = ObjectManager::get<VehicleObject>(i);
456 if (vehObj == nullptr)
457 {
458 continue;
459 }
460
461 if (company->isVehicleIndexUnlocked(i) && vehObj->mode == TransportMode::rail)
462 {
463 tracks.insert(vehObj->trackType);
464 }
465 }
466
467 std::copy_if(std::begin(tracks), std::end(tracks), std::back_inserter(result), [](uint8_t trackIdx) {
468 const auto* trackObj = ObjectManager::get<TrackObject>(trackIdx);
469 return trackObj->hasFlags(TrackObjectFlags::isRoad);
470 });

Callers 6

chooseBasicRoadObjectFunction · 0.85
roadMenuMouseDownFunction · 0.85
assignRouteColoursFunction · 0.85
sub_4A18D4Function · 0.85

Calls 6

getMaxObjectsFunction · 0.85
beginFunction · 0.85
endFunction · 0.85
getFunction · 0.70
hasFlagsMethod · 0.45

Tested by

no test coverage detected