1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#[cfg_attr(test, mockall_double::double)]
use crate::factorio::rcon::FactorioRcon;
use crate::factorio::world::FactorioWorld;
use crate::graph::task_graph::TaskGraph;
use crate::types::{EntityName, PlayerChangedMainInventoryEvent};
use parking_lot::RwLock;
use petgraph::Direction;
use std::collections::BTreeMap;
use std::sync::Arc;
pub struct Planner {
#[allow(dead_code)]
pub rcon: Option<Arc<FactorioRcon>>,
pub real_world: Arc<FactorioWorld>,
pub plan_world: Arc<FactorioWorld>,
pub graph: Arc<RwLock<TaskGraph>>,
}
impl Planner {
pub fn new(world: Arc<FactorioWorld>, rcon: Option<Arc<FactorioRcon>>) -> Planner {
let plan_world = (*world).clone();
Planner {
graph: Arc::new(RwLock::new(TaskGraph::new())),
rcon,
real_world: world,
plan_world: Arc::new(plan_world),
}
}
pub fn reset(&mut self) {
let plan_world = (*self.real_world).clone();
self.plan_world = Arc::new(plan_world);
self.graph = Arc::new(RwLock::new(TaskGraph::new()));
}
pub fn update_plan_world(&mut self) {
self.plan_world = Arc::new((*self.real_world).clone());
}
pub fn world(&self) -> Arc<FactorioWorld> {
self.plan_world.clone()
}
pub fn graph(&self) -> TaskGraph {
self.graph.read().clone()
}
pub fn initiate_missing_players_with_default_inventory(&mut self, bot_count: u8) -> Vec<u8> {
let mut player_ids: Vec<u8> = vec![];
for player_id in 1u8..=bot_count {
player_ids.push(player_id);
if self.real_world.players.get(&player_id).is_none() {
let mut main_inventory: BTreeMap<String, u32> = BTreeMap::new();
main_inventory.insert(EntityName::Wood.to_string(), 1);
main_inventory.insert(EntityName::StoneFurnace.to_string(), 1);
main_inventory.insert(EntityName::BurnerMiningDrill.to_string(), 1);
self.real_world
.player_changed_main_inventory(PlayerChangedMainInventoryEvent {
player_id,
main_inventory: main_inventory.clone(),
})
.expect("failed to set player inventory");
}
}
player_ids
}
}
pub fn execute_plan(
_world: Arc<FactorioWorld>,
_rcon: Arc<FactorioRcon>,
plan: TaskGraph,
) {
let root = plan.node_indices().next().unwrap();
let pointer = root;
let _tick = 0;
loop {
let outgoing = plan.edges_directed(pointer, Direction::Outgoing);
for _edge in outgoing {
}
}
}