depend on factory data instead of BuildingSystem in the AI path

This commit is contained in:
2026-08-05 06:44:49 +02:00
parent 46932e4abf
commit 0408336cf9
17 changed files with 238 additions and 126 deletions

View File

@@ -1,4 +1,5 @@
#include "AiSystem.h"
#include "FactoryQueries.h"
#include <limits>
@@ -42,7 +43,7 @@ AiSystem::AiSystem(const GameConfig& config)
{
}
void AiSystem::tick(EntityAdmin& admin, const BuildingSystem& buildings,
void AiSystem::tick(EntityAdmin& admin, const FactoryState& state,
const DebrisSystem& debris)
{
TRACE();
@@ -55,7 +56,7 @@ void AiSystem::tick(EntityAdmin& admin, const BuildingSystem& buildings,
m_attackEvaluator.evaluate(admin);
m_repairEvaluator.evaluate(admin);
m_salvageScrapEvaluator.evaluate(admin, debris);
m_deliverScrapEvaluator.evaluate(admin, buildings);
m_deliverScrapEvaluator.evaluate(admin, state);
// Phase 2: pick the highest-scoring behavior per ship.
selectWinningBehaviors(admin);
@@ -68,7 +69,7 @@ void AiSystem::tick(EntityAdmin& admin, const BuildingSystem& buildings,
m_attackExecutor.execute(admin);
m_repairExecutor.execute(admin);
m_salvageScrapExecutor.execute(admin);
m_deliverScrapExecutor.execute(admin, buildings);
m_deliverScrapExecutor.execute(admin, state);
}
void AiSystem::selectWinningBehaviors(EntityAdmin& admin)

View File

@@ -1,5 +1,7 @@
#pragma once
#include "FactoryQueries.h"
#include "AdvanceEvaluator.h"
#include "AdvanceExecutor.h"
#include "AttackEvaluator.h"
@@ -17,7 +19,6 @@
#include "StandbyEvaluator.h"
#include "StandbyExecutor.h"
class BuildingSystem;
class EntityAdmin;
class DebrisSystem;
struct GameConfig;
@@ -34,7 +35,7 @@ class AiSystem
public:
explicit AiSystem(const GameConfig& config);
void tick(EntityAdmin& admin, const BuildingSystem& buildings, const DebrisSystem& debris);
void tick(EntityAdmin& admin, const FactoryState& state, const DebrisSystem& debris);
private:
void selectWinningBehaviors(EntityAdmin& admin);

View File

@@ -1,4 +1,5 @@
#include "SalvagerSystem.h"
#include "FactoryQueries.h"
#include <vector>
@@ -23,7 +24,7 @@ SalvagerSystem::SalvagerSystem(EntityAdmin& admin)
{
}
void SalvagerSystem::tick(Tick currentTick, DebrisSystem& debris, BuildingSystem& buildings,
void SalvagerSystem::tick(Tick currentTick, DebrisSystem& debris, FactoryState& state,
std::vector<BeamFiredEvent>& outBeamFiredEvents)
{
TRACE();
@@ -89,7 +90,7 @@ void SalvagerSystem::tick(Tick currentTick, DebrisSystem& debris, BuildingSystem
[&](entt::entity ship, const DeliverScrapBehavior& deliver, const PositionComponent& pos)
{
if (!deliver.deliveryBay.has_value()) { return; }
const Building* bay = buildings.findBuilding(*deliver.deliveryBay);
const Building* bay = findBuilding(state, *deliver.deliveryBay);
if (!bay) { return; }
const QVector2D bayCenter(bay->anchor.x() + bay->footprint.width() / 2.0f,
@@ -100,7 +101,7 @@ void SalvagerSystem::tick(Tick currentTick, DebrisSystem& debris, BuildingSystem
if (!m_admin.hasAll<CargoComponent>(ship)) { return; }
CargoComponent& cargo = m_admin.get<CargoComponent>(ship);
if (cargo.current <= 0) { return; }
if (buildings.deliverScrapToSalvageBay(*deliver.deliveryBay))
if (deliverScrapToSalvageBay(state, *deliver.deliveryBay))
{
--cargo.current;
}

View File

@@ -1,5 +1,7 @@
#pragma once
#include "FactoryQueries.h"
#include <vector>
#include "BeamFiredEvent.h"
@@ -7,7 +9,6 @@
#include "entt/entity/entity.hpp"
class BuildingSystem;
class EntityAdmin;
class DebrisSystem;
@@ -21,7 +22,7 @@ class SalvagerSystem
public:
explicit SalvagerSystem(EntityAdmin& admin);
void tick(Tick currentTick, DebrisSystem& debris, BuildingSystem& buildings,
void tick(Tick currentTick, DebrisSystem& debris, FactoryState& state,
std::vector<BeamFiredEvent>& outBeamFiredEvents);
private:

View File

@@ -1,4 +1,5 @@
#include "DeliverScrapEvaluator.h"
#include "FactoryQueries.h"
#include <unordered_map>
@@ -12,7 +13,7 @@
#include "PositionComponent.h"
#include "tracing.h"
void DeliverScrapEvaluator::evaluate(EntityAdmin& admin, const BuildingSystem& buildings)
void DeliverScrapEvaluator::evaluate(EntityAdmin& admin, const FactoryState& state)
{
TRACE();
const std::unordered_map<entt::entity, CargoState> cargoByShip = buildCargoByShip(admin);
@@ -34,7 +35,7 @@ void DeliverScrapEvaluator::evaluate(EntityAdmin& admin, const BuildingSystem& b
if (!deliver.deliveryBay.has_value())
{
const Building* bay =
buildings.findNearestBuilding(pos.value, BuildingType::SalvageBay);
findNearestBuilding(state, pos.value, BuildingType::SalvageBay);
if (bay) { deliver.deliveryBay = bay->id; }
}

View File

@@ -1,12 +1,13 @@
#pragma once
#include "FactoryQueries.h"
class EntityAdmin;
class BuildingSystem;
// Scores high only when the ship's cargo is full, and assigns the nearest
// SalvageBay as the delivery destination.
class DeliverScrapEvaluator
{
public:
void evaluate(EntityAdmin& admin, const BuildingSystem& buildings);
void evaluate(EntityAdmin& admin, const FactoryState& state);
};

View File

@@ -1,4 +1,5 @@
#include "DeliverScrapExecutor.h"
#include "FactoryQueries.h"
#include <QVector2D>
@@ -12,7 +13,7 @@
#include "SelectedBehaviorComponent.h"
#include "tracing.h"
void DeliverScrapExecutor::execute(EntityAdmin& admin, const BuildingSystem& buildings)
void DeliverScrapExecutor::execute(EntityAdmin& admin, const FactoryState& state)
{
TRACE();
admin.forEach<DeliverScrapBehavior, SelectedBehaviorComponent, PositionComponent,
@@ -26,7 +27,7 @@ void DeliverScrapExecutor::execute(EntityAdmin& admin, const BuildingSystem& bui
QVector2D dest = pos.value;
if (deliver.deliveryBay.has_value())
{
const Building* bay = buildings.findBuilding(*deliver.deliveryBay);
const Building* bay = findBuilding(state, *deliver.deliveryBay);
if (bay)
{
dest = QVector2D(bay->anchor.x() + bay->footprint.width() / 2.0f,

View File

@@ -1,12 +1,13 @@
#pragma once
#include "FactoryQueries.h"
class EntityAdmin;
class BuildingSystem;
// Moves a ship toward its delivery bay when DeliverScrap is the winning
// behavior. Never decrements cargo — SalvagerSystem performs the delivery.
class DeliverScrapExecutor
{
public:
void execute(EntityAdmin& admin, const BuildingSystem& buildings);
void execute(EntityAdmin& admin, const FactoryState& state);
};