0x0048963F but only when flags are 0xXXXX_XXXA
| 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 |
no test coverage detected