diff --git a/rwengine/src/ai/TrafficDirector.cpp b/rwengine/src/ai/TrafficDirector.cpp index c6f0b84c4..6322b3056 100644 --- a/rwengine/src/ai/TrafficDirector.cpp +++ b/rwengine/src/ai/TrafficDirector.cpp @@ -3,11 +3,11 @@ #include #include #include - #include #include #include #include +#include #include "ai/AIGraph.hpp" #include "ai/AIGraphNode.hpp" @@ -93,6 +93,19 @@ void TrafficDirector::setDensity(ai::NodeType type, float density) { } } +uint16_t TrafficDirector::assignDriver(const std::string &vehiclename) { + enum ped_types { COP = 1, MEDIC = 5, FIREMAN = 6 }; + if (vehiclename == "POLICAR") { + return COP; + } else if (vehiclename == "AMBULAN") { + return MEDIC; + } else if (vehiclename == "FIRETRUK") { + return FIREMAN; + } else { + return 0; + } +} + std::vector TrafficDirector::populateNearby( const ViewCamera& camera, float radius, int maxSpawn) { @@ -133,6 +146,7 @@ std::vector TrafficDirector::populateNearby( // Hardcoded cop Pedestrian std::vector peds = {1}; + uint16_t pedId; // Determine which zone the viewpoint is in auto zone = world->data->findZoneAt(camera.position); @@ -170,8 +184,7 @@ std::vector TrafficDirector::populateNearby( counter--; // Spawn a pedestrian from the available pool - const auto pedId = - peds.at(world->getRandomNumber(0u, peds.size() - 1)); + pedId = peds.at(world->getRandomNumber(0u, peds.size() - 1)); auto ped = world->createPedestrian(pedId, spawn->position); ped->applyOffset(); ped->setLifetime(GameObject::TrafficLifetime); @@ -244,9 +257,14 @@ std::vector TrafficDirector::populateNearby( vehicle->setHandbraking(false); // Spawn a pedestrian and put it into the vehicle - const auto pedId = - peds.at(world->getRandomNumber(0u, peds.size() - 1)); - CharacterObject* character = world->createPedestrian(pedId, vehicle->getPosition()); + pedId = TrafficDirector::assignDriver( + vehicle->getVehicle()->vehiclename_); + if (pedId == 0) { + // not an special car, random person in + pedId = peds.at(world->getRandomNumber(0u, peds.size() - 1)); + } + CharacterObject* character = + world->createPedestrian(pedId, vehicle->getPosition()); character->setLifetime(GameObject::TrafficLifetime); character->setCurrentVehicle(vehicle, 0); character->controller->setGoal(CharacterController::TrafficDriver); diff --git a/rwengine/src/ai/TrafficDirector.hpp b/rwengine/src/ai/TrafficDirector.hpp index 15e3161ff..83fcc340e 100644 --- a/rwengine/src/ai/TrafficDirector.hpp +++ b/rwengine/src/ai/TrafficDirector.hpp @@ -1,8 +1,10 @@ #ifndef _RWENGINE_TRAFFICDIRECTOR_HPP_ #define _RWENGINE_TRAFFICDIRECTOR_HPP_ -#include #include +#include +#include +#include class GameWorld; class GameObject; @@ -24,6 +26,11 @@ class TrafficDirector { void setDensity(NodeType type, float density); + /** + * Put the right pedestrian inside the car + */ + uint16_t assignDriver(const std::string &vehiclename); + /** * Creates new traffic at available locations. * @param camera The camera to spawn around