mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-03 17:50:21 +01:00
fix(ai): release horn when human driver takes over from AI (#210)
* fix(ai): release what the AI was holding when the player takes over * fix(ai): keep the light selector lookup within its table, Sonar findings of the handover - the light selector size comes from the vehicle definition (LightsList Size) and isn't limited, while the table holds 18 positions; a bigger selector read past the table, and so did a table index other than the front or rear one. Only the positions the table holds are looked at now, and the selector stays where it is for a bad table index (cpp:S2259), - the lambdas of the handover capture what they use explicitly (cpp:S3608), - the chained assignments resetting the headlight state on the AI taking over are split (cpp:S1121).
This commit is contained in:
76
vehicle/handover.cpp
Normal file
76
vehicle/handover.cpp
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
This Source Code Form is subject to the
|
||||
terms of the Mozilla Public License, v.
|
||||
2.0. If a copy of the MPL was not
|
||||
distributed with this file, You can
|
||||
obtain one at
|
||||
http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "vehicle/handover.h"
|
||||
|
||||
#include "McZapkie/MOVER.h"
|
||||
|
||||
namespace handover {
|
||||
|
||||
void release_ai_controls(TMoverParameters &Occupied, TMoverParameters &Controlling) {
|
||||
// the AI's hornoff action touches the horn only while the AI drives
|
||||
Occupied.WarningSignal = 0;
|
||||
// the AI drives the sandbox directly, bypassing the manual and automatic sanding states
|
||||
if (Controlling.SandDose && false == (Controlling.SandDoseManual || Controlling.SandDoseAuto)) {
|
||||
Controlling.Sandbox(false);
|
||||
}
|
||||
if (Occupied.DepartureSignal) {
|
||||
Occupied.signal_departure(false);
|
||||
}
|
||||
if (Occupied.Hamulec->Releaser()) {
|
||||
Occupied.BrakeReleaser(0);
|
||||
}
|
||||
}
|
||||
|
||||
int light_selector_position(TMoverParameters const &Occupied, int const Lightstable, int const Headlights, int const Inventory) {
|
||||
// the selector size comes from the vehicle definition, the table holds a fixed number of positions
|
||||
auto const positioncount{std::min(Occupied.LightsPosNo, static_cast<int>(std::size(Occupied.Lights[0])))};
|
||||
if (positioncount <= 0 || Lightstable < 0 || Lightstable >= static_cast<int>(std::size(Occupied.Lights))) {
|
||||
return Occupied.LightsPos;
|
||||
}
|
||||
auto const &lights{Occupied.Lights[Lightstable]};
|
||||
auto const lightsmatch{[&lights, Inventory, Headlights](int const Position) { return (lights[Position - 1] & Inventory) == Headlights; }};
|
||||
if (Occupied.LightsPos >= 1 && Occupied.LightsPos <= positioncount && lightsmatch(Occupied.LightsPos)) {
|
||||
return Occupied.LightsPos;
|
||||
}
|
||||
for (auto position = 1; position <= positioncount; ++position) {
|
||||
if (lightsmatch(position)) {
|
||||
return position;
|
||||
}
|
||||
}
|
||||
return Occupied.LightsPos;
|
||||
}
|
||||
|
||||
int dimmer_position(TMoverParameters const &Occupied, bool const Headlightson) {
|
||||
auto const &positions{Occupied.dimPositions};
|
||||
auto const current{Occupied.modernDimmerPosition};
|
||||
auto const count{static_cast<int>(positions.size())};
|
||||
auto const isoff{[&positions, count](int const Position) { return Position < 0 || Position >= count || positions[Position].isOff; }};
|
||||
|
||||
if (false == Occupied.enableModernDimmer || false == Headlightson || false == isoff(current)) {
|
||||
return current;
|
||||
}
|
||||
if (false == isoff(Occupied.modernDimmerDefaultPosition)) {
|
||||
return Occupied.modernDimmerDefaultPosition;
|
||||
}
|
||||
for (auto position = 0; position < count; ++position) {
|
||||
if (false == (positions[position].isOff || positions[position].isDimmed || positions[position].isHighBeam)) {
|
||||
return position;
|
||||
}
|
||||
}
|
||||
for (auto position = 0; position < count; ++position) {
|
||||
if (false == positions[position].isOff) {
|
||||
return position;
|
||||
}
|
||||
}
|
||||
return current;
|
||||
}
|
||||
|
||||
} // namespace handover
|
||||
Reference in New Issue
Block a user