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

Function getAvailableCompatibleSignals

src/OpenLoco/src/Objects/ObjectUtils.cpp:354–410  ·  view source on GitHub ↗

0x00488B4D

Source from the content-addressed store, hash-verified

352
353 // 0x00488B4D
354 sfl::static_vector<uint8_t, Limits::kMaxTrainSignalObjects> getAvailableCompatibleSignals(uint8_t trackType)
355 {
356 sfl::static_vector<uint8_t, Limits::kMaxTrainSignalObjects> signalList;
357 auto currentYear = getCurrentYear();
358 auto trackObj = ObjectManager::get<TrackObject>(trackType);
359 auto signals = trackObj->signals;
360 while (signals > 0)
361 {
362 const auto signalId = Numerics::bitScanForward(signals);
363 if (signalId == -1)
364 {
365 break;
366 }
367 signals &= ~(1 << signalId);
368 auto signalObj = ObjectManager::get<TrainSignalObject>(signalId);
369
370 if (currentYear > signalObj->obsoleteYear)
371 {
372 continue;
373 }
374 if (currentYear < signalObj->designedYear)
375 {
376 continue;
377 }
378 signalList.push_back(signalId);
379 }
380
381 for (uint8_t i = 0; i < ObjectManager::getMaxObjects(ObjectType::trackSignal); i++)
382 {
383 auto signalObj = ObjectManager::get<TrainSignalObject>(i);
384 if (signalObj == nullptr)
385 {
386 continue;
387 }
388 for (auto modCount = 0; modCount < signalObj->numCompatible; modCount++)
389 {
390 if (trackType != ObjectManager::get<TrainSignalObject>(i)->mods[modCount])
391 {
392 continue;
393 }
394 if (currentYear < signalObj->designedYear)
395 {
396 continue;
397 }
398 if (currentYear > signalObj->obsoleteYear)
399 {
400 continue;
401 }
402 if (std::ranges::find(signalList, i) == signalList.end())
403 {
404 signalList.push_back(i);
405 }
406 }
407 }
408 std::ranges::sort(signalList);
409 return signalList;
410 }
411}

Callers 3

openAtTrackFunction · 0.85

Calls 6

getCurrentYearFunction · 0.85
bitScanForwardFunction · 0.85
getMaxObjectsFunction · 0.85
findFunction · 0.85
push_backMethod · 0.80
endMethod · 0.45

Tested by

no test coverage detected