mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-06 16:18:35 +01:00
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:
@@ -109,6 +109,24 @@ TEST_CASE("handover: the light selector moves to the position giving the head li
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("handover: the light selector stays within its table") {
|
||||||
|
auto cab{cab_vehicle()};
|
||||||
|
|
||||||
|
SUBCASE("selector bigger than the table, as a vehicle definition can declare") {
|
||||||
|
// only the positions the table holds are looked at, the rest can't match
|
||||||
|
for (auto &table : cab->Lights) {
|
||||||
|
std::fill(std::begin(table) + cab->LightsPosNo, std::end(table), 0);
|
||||||
|
}
|
||||||
|
cab->LightsPosNo = 100;
|
||||||
|
CHECK(handover::light_selector_position(cab.mover(), end::front, pc1, allheadlights) == 2);
|
||||||
|
CHECK(handover::light_selector_position(cab.mover(), end::front, light::headlight_left, allheadlights) == 1);
|
||||||
|
}
|
||||||
|
SUBCASE("table other than the front or rear one: the selector stays") {
|
||||||
|
CHECK(handover::light_selector_position(cab.mover(), -1, pc1, allheadlights) == 1);
|
||||||
|
CHECK(handover::light_selector_position(cab.mover(), 2, pc1, allheadlights) == 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("handover: the light selector already matching the lights stays") {
|
TEST_CASE("handover: the light selector already matching the lights stays") {
|
||||||
auto cab{cab_vehicle()};
|
auto cab{cab_vehicle()};
|
||||||
cab->LightsPos = 2; // Pc1
|
cab->LightsPos = 2; // Pc1
|
||||||
|
|||||||
@@ -5564,8 +5564,10 @@ void TController::TakeControl( bool const Aidriver, bool const Forcevehiclecheck
|
|||||||
pVehicle->Controller = AIdriver;
|
pVehicle->Controller = AIdriver;
|
||||||
// the AI doesn't operate the headlight dimmer, drop the state left by the human driver
|
// the AI doesn't operate the headlight dimmer, drop the state left by the human driver
|
||||||
// so the lights set by the AI aren't hidden (dimmer in off position) or dimmed
|
// so the lights set by the AI aren't hidden (dimmer in off position) or dimmed
|
||||||
pVehicle->HeadlightsAoff = pVehicle->HeadlightsBoff = false;
|
pVehicle->HeadlightsAoff = false;
|
||||||
pVehicle->DimHeadlights = pVehicle->HighBeamLights = false;
|
pVehicle->HeadlightsBoff = false;
|
||||||
|
pVehicle->DimHeadlights = false;
|
||||||
|
pVehicle->HighBeamLights = false;
|
||||||
control_lights(); // reinicjalizacja swiatel
|
control_lights(); // reinicjalizacja swiatel
|
||||||
mvOccupied->CabActivisation(true);
|
mvOccupied->CabActivisation(true);
|
||||||
iDirection = 0; // kierunek jazdy trzeba dopiero zgadnąć
|
iDirection = 0; // kierunek jazdy trzeba dopiero zgadnąć
|
||||||
|
|||||||
@@ -30,14 +30,17 @@ void release_ai_controls(TMoverParameters &Occupied, TMoverParameters &Controlli
|
|||||||
}
|
}
|
||||||
|
|
||||||
int light_selector_position(TMoverParameters const &Occupied, int const Lightstable, int const Headlights, int const Inventory) {
|
int light_selector_position(TMoverParameters const &Occupied, int const Lightstable, int const Headlights, int const Inventory) {
|
||||||
if (Occupied.LightsPosNo <= 0) {
|
// 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;
|
return Occupied.LightsPos;
|
||||||
}
|
}
|
||||||
auto const lightsmatch{[&](int const Position) { return (Occupied.Lights[Lightstable][Position - 1] & Inventory) == Headlights; }};
|
auto const &lights{Occupied.Lights[Lightstable]};
|
||||||
if (Occupied.LightsPos >= 1 && Occupied.LightsPos <= Occupied.LightsPosNo && lightsmatch(Occupied.LightsPos)) {
|
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;
|
return Occupied.LightsPos;
|
||||||
}
|
}
|
||||||
for (auto position = 1; position <= Occupied.LightsPosNo; ++position) {
|
for (auto position = 1; position <= positioncount; ++position) {
|
||||||
if (lightsmatch(position)) {
|
if (lightsmatch(position)) {
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
@@ -49,7 +52,7 @@ int dimmer_position(TMoverParameters const &Occupied, bool const Headlightson) {
|
|||||||
auto const &positions{Occupied.dimPositions};
|
auto const &positions{Occupied.dimPositions};
|
||||||
auto const current{Occupied.modernDimmerPosition};
|
auto const current{Occupied.modernDimmerPosition};
|
||||||
auto const count{static_cast<int>(positions.size())};
|
auto const count{static_cast<int>(positions.size())};
|
||||||
auto const isoff{[&](int const Position) { return Position < 0 || Position >= count || positions[Position].isOff; }};
|
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)) {
|
if (false == Occupied.enableModernDimmer || false == Headlightson || false == isoff(current)) {
|
||||||
return current;
|
return current;
|
||||||
|
|||||||
Reference in New Issue
Block a user