Add initial automatic roboport placement
This commit is contained in:
parent
1680fef14d
commit
caea696dd7
6 changed files with 203 additions and 1 deletions
|
|
@ -11,6 +11,7 @@ use factorio_core::{
|
|||
use std::{collections::HashMap, sync::atomic::AtomicUsize};
|
||||
|
||||
mod power_connection;
|
||||
mod roboports;
|
||||
mod visualize;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
|
|
@ -153,6 +154,7 @@ pub enum EntityType {
|
|||
Rail {
|
||||
rail_type: RailType,
|
||||
},
|
||||
Roboport,
|
||||
Unknown {
|
||||
name: String,
|
||||
size: Position,
|
||||
|
|
@ -254,6 +256,10 @@ impl Entity {
|
|||
Self::new_quarter_direction(EntityType::Rail { rail_type }, position, direction.into())
|
||||
}
|
||||
|
||||
pub fn new_roboport(position: Position) -> Self {
|
||||
Self::new(EntityType::Roboport, position, Direction::Up)
|
||||
}
|
||||
|
||||
pub fn new_unknown(
|
||||
name: impl AsRef<str>,
|
||||
position: Position,
|
||||
|
|
@ -299,6 +305,7 @@ impl Entity {
|
|||
size: _,
|
||||
} => name.clone(),
|
||||
EntityType::Rail { rail_type } => rail_type.string(),
|
||||
EntityType::Roboport => "roboport".to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -348,6 +355,7 @@ impl Entity {
|
|||
} => *size,
|
||||
EntityType::ElectricPole(electric_pole_type) => electric_pole_type.size(),
|
||||
EntityType::Rail { rail_type } => rail_type.size(),
|
||||
EntityType::Roboport => Position::new(8, 8),
|
||||
_ => Position::new(2, 2),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
50
factorio-blueprint/src/abstraction/roboports.rs
Normal file
50
factorio-blueprint/src/abstraction/roboports.rs
Normal 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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue