#include "SalvageScrapEvaluator.h" #include #include #include #include #include "BehaviorScores.h" #include "BehaviorTargeting.h" #include "EntityAdmin.h" #include "PositionComponent.h" #include "SalvageScrapBehavior.h" #include "ScrapSystem.h" #include "SensorRangeComponent.h" #include "tracing.h" void SalvageScrapEvaluator::evaluate(EntityAdmin& admin, const ScrapSystem& scraps) { TRACE(); const std::unordered_map cargoByShip = buildCargoByShip(admin); const std::vector allScrap = scraps.allScrapInfo(); admin.forEach( [&](entt::entity e, SalvageScrapBehavior& salvage, const PositionComponent& pos, const SensorRangeComponent& sensor) { const std::unordered_map::const_iterator it = cargoByShip.find(e); const bool cargoFull = (it != cargoByShip.end()) && isCargoFull(it->second); if (cargoFull) { salvage.scrapTarget = std::nullopt; salvage.score = BehaviorScores::kInactive; return; } // Find nearest scrap within sensor range. float bestDist = sensor.value_tiles; std::optional bestPos; for (const ScrapInfo& si : allScrap) { const float dist = (si.position - pos.value).length(); if (dist < bestDist) { bestDist = dist; bestPos = si.position; } } salvage.scrapTarget = bestPos; salvage.score = bestPos ? BehaviorScores::kSalvage : BehaviorScores::kInactive; }); }