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

Method updateLastJourneyAverageSpeed

src/OpenLoco/src/Vehicles/VehicleHead.cpp:2710–2783  ·  view source on GitHub ↗

0x004BACAF

Source from the content-addressed store, hash-verified

2708
2709 // 0x004BACAF
2710 void VehicleHead::updateLastJourneyAverageSpeed()
2711 {
2712 if (!hasBreakdownFlags(BreakdownFlags::journeyStarted))
2713 {
2714 return;
2715 }
2716 Vehicle train(*this);
2717
2718 breakdownFlags &= ~BreakdownFlags::journeyStarted;
2719 const auto distanceTravelled = Math::Vector::distance2D(journeyStartPos, Pos2(train.veh2->position));
2720
2721 const auto timeInTicks = ScenarioManager::getScenarioTicks() - journeyStartTicks;
2722
2723 auto modeModifier = [](TransportMode m) {
2724 switch (m)
2725 {
2726 default:
2727 case TransportMode::rail:
2728 case TransportMode::road:
2729 return 21;
2730 case TransportMode::air:
2731 return 36;
2732 case TransportMode::water:
2733 return 31;
2734 }
2735 }(mode);
2736
2737 auto adjustedDistance = distanceTravelled * static_cast<int64_t>(modeModifier);
2738 auto adjustedTime = timeInTicks;
2739 // TODO: In the future (when we can diverge) we can just do a 64bit divide instead of
2740 // slowly bringing down the divisor and dividend by 2 until 32bit
2741 while (adjustedDistance > std::numeric_limits<uint32_t>::max())
2742 {
2743 adjustedDistance >>= 1;
2744 adjustedTime >>= 1;
2745 }
2746 if (adjustedTime == 0)
2747 {
2748 return;
2749 }
2750 const auto averageSpeed = std::min(train.veh2->maxSpeed, Speed16(adjustedDistance / adjustedTime));
2751 lastAverageSpeed = averageSpeed;
2752
2753 Ui::WindowManager::invalidate(Ui::WindowType::vehicle, enumValue(head));
2754
2755 const auto recordType = [](TransportMode m) {
2756 switch (m)
2757 {
2758 default:
2759 case TransportMode::rail:
2760 case TransportMode::road:
2761 return 0;
2762 case TransportMode::air:
2763 return 1;
2764 case TransportMode::water:
2765 return 2;
2766 }
2767 }(mode);

Callers

nothing calls this directly

Calls 8

distance2DFunction · 0.85
getScenarioTicksFunction · 0.85
enumValueFunction · 0.85
getCurrentDayFunction · 0.85
setRecordsFunction · 0.85
postFunction · 0.85
companyEmotionEventFunction · 0.85
invalidateFunction · 0.50

Tested by

no test coverage detected