chiark / gitweb /
Provide for occultation_notify_hook
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 24 Mar 2021 20:29:51 +0000 (20:29 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 24 Mar 2021 20:30:16 +0000 (20:30 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/gamestate.rs
src/hidden.rs

index 73ffb5b38baf3a9b038d9df367a34c7857c9082a..7b086ba9417b97aeaeae86b1b45d56ec35c6550c 100644 (file)
@@ -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]
index e328970682246aa5f836e618d5ef067ad1ba909e..7e4bab720660b2c92d7868024d897c83add3347a 100644 (file)
@@ -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)
     }
   }
 }