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

Function getSignalState

src/OpenLoco/src/Vehicles/Routing.cpp:243–307  ·  view source on GitHub ↗

0x0048963F but only when flags are 0xXXXX_XXXA

Source from the content-addressed store, hash-verified

241
242 // 0x0048963F but only when flags are 0xXXXX_XXXA
243 SignalStateFlags getSignalState(const World::Pos3& loc, const TrackAndDirection::_TrackAndDirection trackAndDirection, const uint8_t trackType, uint32_t flags)
244 {
245 auto trackStart = loc;
246 if (trackAndDirection.isReversed())
247 {
248 auto& trackSize = World::TrackData::getUnkTrack(trackAndDirection._data);
249 trackStart += trackSize.pos;
250 if (trackSize.rotationEnd < 12)
251 {
252 trackStart -= World::Pos3{ World::kRotationOffset[trackSize.rotationEnd], 0 };
253 }
254 flags ^= (1ULL << 31);
255 }
256
257 auto& trackPieces = World::TrackData::getTrackPiece(trackAndDirection.id());
258 auto& trackPiece = trackPieces[0];
259
260 auto signalLoc = trackStart + World::Pos3{ Math::Vector::rotate(World::Pos2{ trackPiece.x, trackPiece.y }, trackAndDirection.cardinalDirection()), 0 };
261 signalLoc.z += trackPiece.z;
262 auto res = findSignalOnTrack(signalLoc, trackAndDirection, trackType, trackPiece.index);
263
264 if (!res)
265 {
266 return SignalStateFlags::none;
267 }
268
269 auto* elSignal = res->first;
270
271 // edx
272 auto& signalSide = (flags & (1ULL << 31)) ? elSignal->getRight() : elSignal->getLeft();
273 auto ret = SignalStateFlags::none;
274 if (signalSide.isOccupied())
275 {
276 ret |= SignalStateFlags::occupied;
277 }
278 if (!signalSide.hasSignal())
279 {
280 ret |= SignalStateFlags::blockedNoRoute;
281 }
282 if (flags & (1ULL << 31))
283 {
284 if (!elSignal->getLeft().hasSignal() || elSignal->isLeftGhost())
285 {
286 ret |= SignalStateFlags::occupiedOneWay;
287 }
288
289 if (elSignal->isRightGhost() && elSignal->getLeft().hasSignal())
290 {
291 ret |= SignalStateFlags::blockedNoRoute;
292 }
293 }
294 else
295 {
296 if (!elSignal->getRight().hasSignal() || elSignal->isRightGhost())
297 {
298 ret |= SignalStateFlags::occupiedOneWay;
299 }
300

Callers 6

sub_4ACEF1Function · 0.85
sub_4A2D4CFunction · 0.85
sub_4A2AA1Function · 0.85

Calls 10

getTrackPieceFunction · 0.85
findSignalOnTrackFunction · 0.85
isOccupiedMethod · 0.80
isLeftGhostMethod · 0.80
isRightGhostMethod · 0.80
rotateFunction · 0.50
isReversedMethod · 0.45
idMethod · 0.45
cardinalDirectionMethod · 0.45
hasSignalMethod · 0.45

Tested by

no test coverage detected