Add initial automatic roboport placement

This commit is contained in:
Henning Lindemann 2025-03-18 22:46:28 +01:00
parent 1680fef14d
commit caea696dd7
6 changed files with 203 additions and 1 deletions

View file

@ -0,0 +1,50 @@
use factorio_core::{misc::PositionMap, prelude::Position};
use factorio_graph::{
priority_queue::binary_heap::FastBinaryHeap, set_cover::greedy_set_cover_priority_queue,
};
use crate::abstraction::Entity;
use super::Blueprint;
impl Blueprint {
pub fn add_roboport_network(&mut self) {
let aabb = self.get_aabb().unwrap();
let universe = self.entities.len();
let map = self.placibility_map();
let mut roboports = Vec::new();
let mut sets = Vec::new();
for (x, y) in (aabb.min().x..=aabb.max().x)
.filter(move |x| x.rem_euclid(2) == 0)
.flat_map(|x| {
(aabb.min().y..=aabb.max().y)
.filter(move |y| y.rem_euclid(2) == 0)
.map(move |y| (x, y))
})
{
if map.placeable(Position::new(x, y), Position::new(8, 8)) {
let mut coverage = Vec::new();
for (i, (_, e)) in self.entities.iter().enumerate() {
if e.position.x.abs_diff(x) <= 110 && e.position.y.abs_diff(y) <= 110 {
coverage.push(i);
}
}
roboports.push(Position::new(x, y));
sets.push(coverage);
}
}
dbg!(universe, sets.len());
let res = greedy_set_cover_priority_queue::<_, FastBinaryHeap<_>>(universe, &sets);
for r in res {
self.add_entity(Entity::new_roboport(roboports[r]));
}
}
}