From: Ian Jackson Date: Wed, 17 Feb 2021 22:27:48 +0000 (+0000) Subject: Provide remove_occultation X-Git-Tag: otter-0.4.0~422 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=df7fea475b64769e949742590ad640c67c93d7c4;p=otter.git Provide remove_occultation Signed-off-by: Ian Jackson --- diff --git a/src/hidden.rs b/src/hidden.rs index 92e8af03..ec3a17bc 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -530,3 +530,34 @@ pub fn create_occultation( updates } + +#[throws(IE)] +pub fn remove_occultation( + gs: &mut GameState, + ipieces: &PiecesLoaded, + occid: OccId, +) -> Vec<(PieceId, PieceUpdateOps)> { + let occultation = gs.occults.occults.remove(occid).ok_or_else( + || internal_logic_error("removing nonexistent occultation"))?; + + let mut updates = vec![]; + let mut aggerr = AggregatedIE::new(); + for &ppiece in &occultation.pieces { + recalculate_occultation_ofmany(gs, ipieces, ppiece, &mut updates) + .unwrap_or_else(|e| { + aggerr.record(e); + if let Some(pgpc) = gs.pieces.get_mut(ppiece) { + pgpc.occult.passive = None; + } + }); + } + + if let Some(ogpc) = gs.pieces.get_mut(occultation.occulter) { + ogpc.occult.active = None; + } else { + aggerr.record(internal_logic_error("removing occultation of non-piece")); + } + + aggerr.ok()?; + updates +}