0x004AA24A
| 65 | |
| 66 | // 0x004AA24A |
| 67 | bool VehicleTail::update() |
| 68 | { |
| 69 | if (mode == TransportMode::air || mode == TransportMode::water) |
| 70 | { |
| 71 | return true; |
| 72 | } |
| 73 | |
| 74 | const auto _oldRoutingHandle = routingHandle; |
| 75 | const World::Pos3 _oldTilePos = World::Pos3(tileX, tileY, tileBaseZ * World::kSmallZStep); |
| 76 | |
| 77 | const auto motionResult = updateTrackMotion(getVehicleUpdateDistances().unkDistance1, false); |
| 78 | |
| 79 | if (motionResult.hasFlags(UpdateVar1136114Flags::noRouteFound)) |
| 80 | { |
| 81 | destroyTrain(); |
| 82 | return false; |
| 83 | } |
| 84 | |
| 85 | if (_oldRoutingHandle == routingHandle) |
| 86 | { |
| 87 | return true; |
| 88 | } |
| 89 | |
| 90 | const auto ref = RoutingManager::getRouting(_oldRoutingHandle); |
| 91 | TrackAndDirection trackAndDir((ref & 0x1F8) >> 3, ref & 0x7); |
| 92 | RoutingManager::freeRouting(_oldRoutingHandle); |
| 93 | |
| 94 | if (mode == TransportMode::road) |
| 95 | { |
| 96 | updateRoadTileOccupancy(_oldTilePos, trackAndDir.road, false); |
| 97 | } |
| 98 | else |
| 99 | { |
| 100 | if (ref & (1 << 15)) |
| 101 | { |
| 102 | setSignalState(_oldTilePos, trackAndDir.track, trackType, 0); |
| 103 | } |
| 104 | |
| 105 | const auto& trackSize = World::TrackData::getUnkTrack(ref & World::Track::AdditionalTaDFlags::basicTaDMask); |
| 106 | auto nextTile = _oldTilePos + trackSize.pos; |
| 107 | if (trackSize.rotationEnd < 12) |
| 108 | { |
| 109 | nextTile -= World::Pos3{ World::kRotationOffset[trackSize.rotationEnd], 0 }; |
| 110 | } |
| 111 | auto trackAndDirection2 = trackAndDir; |
| 112 | trackAndDirection2.track.setReversed(!trackAndDirection2.track.isReversed()); |
| 113 | sub_4A2AD7(nextTile, trackAndDirection2.track, owner, trackType); |
| 114 | leaveLevelCrossing(_oldTilePos, trackAndDir.track, 9); |
| 115 | } |
| 116 | return true; |
| 117 | } |
| 118 | |
| 119 | // 0x004B090F |
| 120 | void liftUpTail(VehicleTail& tail) |
nothing calls this directly
no test coverage detected