chiark / gitweb /
game destroy compiles
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 21:20:13 +0000 (22:20 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 21:20:13 +0000 (22:20 +0100)
src/global.rs
src/updates.rs

index b02e52b676d2ad02b5204b4ceefcb07204dc5ed7..4a376ce4c123d9f2c14f50cd7e2cd2934a248ff7 100644 (file)
@@ -341,22 +341,23 @@ impl InstanceGuard<'_> {
       pieces : Default::default(),
     };
 
+    let mut updated_pieces = vec![];
+    
+    // drop order is reverse of creation order, so create undo
+    // after all the things it will reference
     let mut undo : Vec<Box<dyn FnOnce(&mut InstanceGuard)>> = vec![];
 
     // Arrange gs.pieces
-    let mut updated_pieces = vec![];
     for (piece,p) in &mut self.c.g.gs.pieces {
       if p.held == Some(oldplayer) {
         p.held = None;
         updated_pieces.push(piece);
       }
     }
-    undo.push(Box::new(|ig| for piece in updated_pieces {
+    undo.push(Box::new(|ig| for &piece in &updated_pieces {
       ig.c.g.gs.pieces[piece].held = Some(oldplayer)
     }));
 
-    // xxx send updates for pieces
-
     // Handle gs.log:
     // Installs gs as the new game state, stealing the log
     let mut swap_things = |ig: &mut InstanceGuard| {
@@ -378,6 +379,18 @@ impl InstanceGuard<'_> {
     mem::drop(undo);
 
     (||{
+      for &piece in &updated_pieces {
+        self.c.g.gs.pieces[piece].gen = self.c.g.gs.gen;
+      }
+
+      let lens = TransparentLens { };
+      let estimate = updated_pieces.len() + 1;
+      let mut buf = PrepareUpdatesBuffer::new(self, None, Some(estimate));
+      for &piece in &updated_pieces {
+        buf.piece_update(piece, PieceUpdateOp::Modify(()), &lens);
+      }
+      buf.finish();
+
       let mut clients_to_remove = HashSet::new();
       self.clients.retain(|k,v| {
         let remove = v.player == oldplayer;
index a5f4070f36124aa5de67b36cbaa6a511ecc9cce2..367a838fe5ea0b8a0cde437db15d0a4e68b28e93 100644 (file)
@@ -252,6 +252,8 @@ impl<'r> PrepareUpdatesBuffer<'r> {
       self.us.push(PreparedUpdateEntry::Log(logentry));
     }
   }
+
+  pub fn finish(self) { }
 }
 
 impl<'r> Drop for PrepareUpdatesBuffer<'r> {