0x0047D959 ax : loc.x cx : loc.y dl : loc.z / 4 bp : trackAndDirection ebp : bp | (setOccupied << 31) returns dh : trackType
| 575 | // ebp : bp | (setOccupied << 31) |
| 576 | // returns dh : trackType |
| 577 | uint8_t VehicleBase::updateRoadTileOccupancy(const World::Pos3& loc, const TrackAndDirection::_RoadAndDirection rad, const bool setOccupied) |
| 578 | { |
| 579 | auto roadType = getTrackType(); |
| 580 | auto tile = World::TileManager::get(loc); |
| 581 | for (auto& el : tile) |
| 582 | { |
| 583 | auto* elRoad = el.as<World::RoadElement>(); |
| 584 | if (elRoad == nullptr) |
| 585 | { |
| 586 | continue; |
| 587 | } |
| 588 | |
| 589 | const auto heightDiff = std::abs(loc.z / 4 - elRoad->baseZ()); |
| 590 | if (heightDiff > 4) |
| 591 | { |
| 592 | continue; |
| 593 | } |
| 594 | |
| 595 | if (elRoad->rotation() != rad.cardinalDirection()) |
| 596 | { |
| 597 | continue; |
| 598 | } |
| 599 | |
| 600 | if (elRoad->roadId() != rad.id()) |
| 601 | { |
| 602 | continue; |
| 603 | } |
| 604 | |
| 605 | if (elRoad->isAiAllocated()) |
| 606 | { |
| 607 | continue; |
| 608 | } |
| 609 | |
| 610 | const auto newLaneOccupation = World::TrackData::getRoadOccupationMask(rad._data >> 2) >> 4; |
| 611 | if (setOccupied) |
| 612 | { |
| 613 | elRoad->setLaneOccupation(elRoad->laneOccupation() | newLaneOccupation); |
| 614 | } |
| 615 | else |
| 616 | { |
| 617 | elRoad->setLaneOccupation(elRoad->laneOccupation() & (~newLaneOccupation)); |
| 618 | } |
| 619 | |
| 620 | if (getTrackType() == 0xFF) |
| 621 | { |
| 622 | if (getGameState().roadObjectIdIsAnyRoadTypeCompatible & (1 << elRoad->roadObjectId())) |
| 623 | { |
| 624 | elRoad->setUnk7_40(true); |
| 625 | roadType = elRoad->roadObjectId(); |
| 626 | } |
| 627 | } |
| 628 | else |
| 629 | { |
| 630 | roadType = getTrackType(); |
| 631 | } |
| 632 | } |
| 633 | return roadType; |
| 634 | } |
no test coverage detected