Preserve pending delivery and command completion behavior
Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
@@ -243,7 +243,7 @@ mod tests {
|
|||||||
"target", "give", "deploy", "wave", "clear", "targets", "damage", "truth", "shader", "hold", "lastchance", "roles", "doctrine", "stats", "sites", "strike", "ground-stock", "ground-load", "ground-unload", "ground-cancel"] {
|
"target", "give", "deploy", "wave", "clear", "targets", "damage", "truth", "shader", "hold", "lastchance", "roles", "doctrine", "stats", "sites", "strike", "ground-stock", "ground-load", "ground-unload", "ground-cancel"] {
|
||||||
assert!(top.contains(&w.to_string()), "{w} in {top:?}");
|
assert!(top.contains(&w.to_string()), "{w} in {top:?}");
|
||||||
}
|
}
|
||||||
assert_eq!(top.len(), 33);
|
assert_eq!(top.len(), 34);
|
||||||
assert_eq!(complete("rep", &[]), ["repair", "replay"]);
|
assert_eq!(complete("rep", &[]), ["repair", "replay"]);
|
||||||
assert_eq!(complete("replay ", &[]), ["export", "film", "full", "map", "reel", "stop"]);
|
assert_eq!(complete("replay ", &[]), ["export", "film", "full", "map", "reel", "stop"]);
|
||||||
assert_eq!(complete("replay film ", &[]), ["all", "best"]);
|
assert_eq!(complete("replay film ", &[]), ["all", "best"]);
|
||||||
|
|||||||
@@ -58,12 +58,12 @@ impl Sim {
|
|||||||
if s.kind != SamKind::S400 || !s.alive() || s.moving() || s.preparing.is_some() || s.reloading > 0 || s.part(Part::Launcher) <= 0.0 || s.ground_rounds == 0 {
|
if s.kind != SamKind::S400 || !s.alive() || s.moving() || s.preparing.is_some() || s.reloading > 0 || s.part(Part::Launcher) <= 0.0 || s.ground_rounds == 0 {
|
||||||
return Err("Нужен исправный развёрнутый С-400 с загруженной RM48U".into());
|
return Err("Нужен исправный развёрнутый С-400 с загруженной RM48U".into());
|
||||||
}
|
}
|
||||||
if s.ground_request { return Err("Сначала отмените заявку на доставку RM48U".into()); }
|
|
||||||
if s.ground_return { return Err("Заявка на вывоз RM48U уже ожидает ТЗМ".into()); }
|
if s.ground_return { return Err("Заявка на вывоз RM48U уже ожидает ТЗМ".into()); }
|
||||||
let depot = self.sams.iter().enumerate().filter(|(_, d)| d.kind == SamKind::Depot && d.alive() && d.pos.distance(s.pos) < DEPOT_REACH)
|
let depot = self.sams.iter().enumerate().filter(|(_, d)| d.kind == SamKind::Depot && d.alive() && d.pos.distance(s.pos) < DEPOT_REACH)
|
||||||
.min_by(|(_, a), (_, b)| a.pos.distance(s.pos).total_cmp(&b.pos.distance(s.pos)).then(a.id.cmp(&b.id)))
|
.min_by(|(_, a), (_, b)| a.pos.distance(s.pos).total_cmp(&b.pos.distance(s.pos)).then(a.id.cmp(&b.id)))
|
||||||
.map(|(j, _)| j);
|
.map(|(j, _)| j);
|
||||||
let Some(depot) = depot else {
|
let Some(depot) = depot else {
|
||||||
|
if s.ground_request { return Err("Сначала отмените заявку на доставку RM48U".into()); }
|
||||||
if !self.sams.iter().any(|d| d.kind == SamKind::Depot && d.alive() && d.ground_stock < STOCK_LIMIT) { return Err("Нет доступного склада для возврата RM48U".into()); }
|
if !self.sams.iter().any(|d| d.kind == SamKind::Depot && d.alive() && d.ground_stock < STOCK_LIMIT) { return Err("Нет доступного склада для возврата RM48U".into()); }
|
||||||
if !self.sams.iter().any(|t| t.kind == SamKind::Tzm && t.alive() && t.drive_speed() > 0.0 && t.ground_stock.saturating_add(t.air_48n6_stock) < TRUCK_LOAD) { return Err("Нет исправной ТЗМ со свободным местом для RM48U".into()); }
|
if !self.sams.iter().any(|t| t.kind == SamKind::Tzm && t.alive() && t.drive_speed() > 0.0 && t.ground_stock.saturating_add(t.air_48n6_stock) < TRUCK_LOAD) { return Err("Нет исправной ТЗМ со свободным местом для RM48U".into()); }
|
||||||
self.sams[i].ground_return = true;
|
self.sams[i].ground_return = true;
|
||||||
@@ -177,7 +177,7 @@ impl Sim {
|
|||||||
self.sams[j].air_48n6_stock = n;
|
self.sams[j].air_48n6_stock = n;
|
||||||
self.sams[t].air_48n6_stock = 0;
|
self.sams[t].air_48n6_stock = 0;
|
||||||
}
|
}
|
||||||
if self.sams[t].ground_stock > 0 && !self.sams.iter().any(|s| s.kind == SamKind::S400 && s.alive() && s.ground_request) && self.sams[j].ground_stock < STOCK_LIMIT {
|
if self.sams[t].ground_stock > 0 && !self.sams.iter().any(|s| s.alive() && s.ground_request) && self.sams[j].ground_stock < STOCK_LIMIT {
|
||||||
let take = self.sams[t].ground_stock.min(STOCK_LIMIT - self.sams[j].ground_stock);
|
let take = self.sams[t].ground_stock.min(STOCK_LIMIT - self.sams[j].ground_stock);
|
||||||
self.sams[j].ground_stock += take;
|
self.sams[j].ground_stock += take;
|
||||||
self.sams[t].ground_stock -= take;
|
self.sams[t].ground_stock -= take;
|
||||||
@@ -206,7 +206,7 @@ impl Sim {
|
|||||||
} else { self.sams[t].job = None; }
|
} else { self.sams[t].job = None; }
|
||||||
}
|
}
|
||||||
let taken: Vec<u32> = self.sams.iter().filter(|s| s.kind == SamKind::Tzm && s.alive() && s.id != truck_id).filter_map(|s| s.job).collect();
|
let taken: Vec<u32> = self.sams.iter().filter(|s| s.kind == SamKind::Tzm && s.alive() && s.id != truck_id).filter_map(|s| s.job).collect();
|
||||||
let next = if self.sams[t].ground_stock > 0 && self.sams.iter().any(|s| s.kind == SamKind::S400 && s.alive() && s.ground_request) {
|
let next = if self.sams[t].ground_stock > 0 && self.sams.iter().any(|s| s.alive() && s.ground_request) {
|
||||||
self.sams.iter().filter(|s| s.kind == SamKind::S400 && s.alive() && s.ground_request && !s.moving() && s.preparing.is_none() && s.reloading == 0 && s.part(Part::Launcher) > 0.0 && s.ground_rounds < s.cells() && !taken.contains(&s.id) && !self.routes.out_of_reach(truck_id, s.id, now)).min_by(|a,b| a.pos.distance(at).total_cmp(&b.pos.distance(at)))
|
self.sams.iter().filter(|s| s.kind == SamKind::S400 && s.alive() && s.ground_request && !s.moving() && s.preparing.is_none() && s.reloading == 0 && s.part(Part::Launcher) > 0.0 && s.ground_rounds < s.cells() && !taken.contains(&s.id) && !self.routes.out_of_reach(truck_id, s.id, now)).min_by(|a,b| a.pos.distance(at).total_cmp(&b.pos.distance(at)))
|
||||||
} else {
|
} else {
|
||||||
self.sams.iter().filter(|s| s.kind == SamKind::Depot && s.alive() && (self.sams[t].air_48n6_stock > 0 || (self.sams[t].ground_stock > 0 && s.ground_stock < STOCK_LIMIT) || (self.sams[t].ground_stock == 0 && s.ground_stock > 0)) && !self.routes.out_of_reach(truck_id, s.id, now)).min_by(|a,b| a.pos.distance(at).total_cmp(&b.pos.distance(at)))
|
self.sams.iter().filter(|s| s.kind == SamKind::Depot && s.alive() && (self.sams[t].air_48n6_stock > 0 || (self.sams[t].ground_stock > 0 && s.ground_stock < STOCK_LIMIT) || (self.sams[t].ground_stock == 0 && s.ground_stock > 0)) && !self.routes.out_of_reach(truck_id, s.id, now)).min_by(|a,b| a.pos.distance(at).total_cmp(&b.pos.distance(at)))
|
||||||
|
|||||||
Reference in New Issue
Block a user