From: Ian Jackson Date: Wed, 24 Mar 2021 20:29:51 +0000 (+0000) Subject: Provide for occultation_notify_hook X-Git-Tag: otter-0.5.0~440 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=24687ba77bba90b05ec866e4cc5ad251203639f4;p=otter.git Provide for occultation_notify_hook Signed-off-by: Ian Jackson --- diff --git a/src/gamestate.rs b/src/gamestate.rs index 73ffb5b3..7b086ba9 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -167,6 +167,10 @@ pub trait PieceTrait: OutlineTrait + Send + Debug + 'static { } fn itemname(&self) -> &str; + + fn occultation_notify_hook(&self, _piece: PieceId) -> UnpreparedUpdates { + None + } } #[typetag::serde] diff --git a/src/hidden.rs b/src/hidden.rs index e3289706..7e4bab72 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -725,15 +725,37 @@ mod recompute { gpieces: &mut GPieces, goccults: &mut GameOccults, ipieces: &IPieces) -> Implemented { + let mut unprepared = vec![]; + for occid in self.outdated { if let Some(occ) = goccults.occults.get_mut(occid) { vpid::permute(occid, occ, gplayers, gpieces, ipieces); + if let Some(ipc) = ipieces.get(occ.occulter) { + if let Some(uu) = { + ipc + .direct_trait_access() + .occultation_notify_hook(occ.occulter) + } { + unprepared.push(uu) + } + } } } consistency_check(gplayers, gpieces, goccults); - Implemented(None) + let unprepared = if unprepared.is_empty() { + None + } else { + Some(Box::new( + move |updates: &mut PrepareUpdatesBuffer| { + for p in unprepared.into_iter() { p(updates) } + } + ) as SomeUnpreparedUpdates + ) + }; + + Implemented(unprepared) } } }