From e9fbaba1d64e518b310fb521242bde2eabefa617 Mon Sep 17 00:00:00 2001 From: chexit Date: Tue, 3 Nov 2026 00:15:45 +0300 Subject: [PATCH] Preserve pending delivery and command completion behavior Co-authored-by: Codex --- airdef-mod/src/commands.rs | 2 +- airdef-mod/src/sim/logistics.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/airdef-mod/src/commands.rs b/airdef-mod/src/commands.rs index 05eaa81..1ed50f9 100644 --- a/airdef-mod/src/commands.rs +++ b/airdef-mod/src/commands.rs @@ -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"] { 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("replay ", &[]), ["export", "film", "full", "map", "reel", "stop"]); assert_eq!(complete("replay film ", &[]), ["all", "best"]); diff --git a/airdef-mod/src/sim/logistics.rs b/airdef-mod/src/sim/logistics.rs index d82614c..b02fbd7 100644 --- a/airdef-mod/src/sim/logistics.rs +++ b/airdef-mod/src/sim/logistics.rs @@ -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 { return Err("Нужен исправный развёрнутый С-400 с загруженной RM48U".into()); } - if s.ground_request { 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) .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); 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(|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; @@ -177,7 +177,7 @@ impl Sim { self.sams[j].air_48n6_stock = n; 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); self.sams[j].ground_stock += take; self.sams[t].ground_stock -= take; @@ -206,7 +206,7 @@ impl Sim { } else { self.sams[t].job = None; } } let taken: Vec = 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))) } 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)))