Implements the requirements rename in the codebase. The salvageable object dropped by destroyed ships and defence stations is now the "debris" entity; the scrap resource it yields (cargo, delivery, smelting, threat, scrap_drop_formula, scrap_per_threat) is unchanged. Entity renames: ScrapDataComponent->DebrisComponent, ScrapSystem->DebrisSystem, ScrapInfo->DebrisInfo, ScrapSelectionChangedEvent->DebrisSelectionChangedEvent (member scrap->debris), spawnScrap->spawnDebris, getScraps->getDebrisSystem, getAllScrapInfo->getAllDebrisInfo, scrapAtWorldPos/scrapInBox->debris*, SalvageScrapBehavior::scrapTarget->debrisTarget, PendingCollection::scrap->debris, ScrapTest.cpp->DebrisTest.cpp. Config key scrap_despawn_seconds-> debris_despawn_seconds (WorldConfig.scrapDespawnSeconds->debrisDespawnSeconds). The salvage/deliver behavior classes keep their names (they act on the scrap resource). Also implements the new REQ-UI-DEBRIS-PANEL behavior in SelectedBuildingPanel: a single selected piece of debris shows a "Debris" heading plus a "Scrap" stat row; a multi/mixed field selection appends "Debris x N" and "Scrap x N" lines. Updates the four renamed REQ-ID references in comments/docs, plus architecture.md and derived.md. All 449 test cases pass; app, tests, and balancing targets build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
56 lines
1.8 KiB
C++
56 lines
1.8 KiB
C++
#include "SalvageScrapEvaluator.h"
|
|
|
|
#include <optional>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include <QVector2D>
|
|
|
|
#include "BehaviorScores.h"
|
|
#include "BehaviorTargeting.h"
|
|
#include "EntityAdmin.h"
|
|
#include "PositionComponent.h"
|
|
#include "SalvageScrapBehavior.h"
|
|
#include "DebrisSystem.h"
|
|
#include "SensorRangeComponent.h"
|
|
#include "tracing.h"
|
|
|
|
void SalvageScrapEvaluator::evaluate(EntityAdmin& admin, const DebrisSystem& debris)
|
|
{
|
|
TRACE();
|
|
const std::unordered_map<entt::entity, CargoState> cargoByShip = buildCargoByShip(admin);
|
|
const std::vector<DebrisInfo> allDebris = debris.getAllDebrisInfo();
|
|
|
|
admin.forEach<SalvageScrapBehavior, PositionComponent, SensorRangeComponent>(
|
|
[&](entt::entity e, SalvageScrapBehavior& salvage, const PositionComponent& pos,
|
|
const SensorRangeComponent& sensor)
|
|
{
|
|
const std::unordered_map<entt::entity, CargoState>::const_iterator it =
|
|
cargoByShip.find(e);
|
|
const bool cargoFull = (it != cargoByShip.end()) && isCargoFull(it->second);
|
|
|
|
if (cargoFull)
|
|
{
|
|
salvage.debrisTarget = std::nullopt;
|
|
salvage.score = BehaviorScores::kInactive;
|
|
return;
|
|
}
|
|
|
|
// Find nearest debris within sensor range.
|
|
float bestDist = sensor.value_tiles;
|
|
std::optional<QVector2D> bestPos;
|
|
for (const DebrisInfo& si : allDebris)
|
|
{
|
|
const float dist = (si.position - pos.value).length();
|
|
if (dist < bestDist)
|
|
{
|
|
bestDist = dist;
|
|
bestPos = si.position;
|
|
}
|
|
}
|
|
|
|
salvage.debrisTarget = bestPos;
|
|
salvage.score = bestPos ? BehaviorScores::kSalvage : BehaviorScores::kInactive;
|
|
});
|
|
}
|