chiark / gitweb /
ZLevel: Track max zg Generation too
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 4 Apr 2021 23:30:32 +0000 (00:30 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Apr 2021 00:40:22 +0000 (01:40 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/gamestate.rs
src/hidden.rs
src/updates.rs

index f56dbacf8baabc8fb48e078567fdb63395b36400..76baf1dc520a4949a519cb4bc5372dd64191439c 100644 (file)
@@ -165,7 +165,7 @@ fn execute(cs: &mut CommandStream, cmd: MgmtCommand) -> MgmtResponse {
         players: default(),
         log: default(),
         gen: Generation(0),
-        max_z: default(),
+        max_z: ZLevel::zero(),
         occults: default(),
       };
 
@@ -731,7 +731,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
 
       let mut updates = Vec::with_capacity(count_len);
       let mut pos = pos.unwrap_or(DEFAULT_POS_START);
-      let mut z = gs.max_z.clone_mut();
+      let mut z = gs.max_z.z.clone_mut();
       for piece_i in count {
         let ilks = &mut ig.ioccults.ilks;
         let face = face.unwrap_or_default();
@@ -757,7 +757,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
           ilks.insert(ilkname, OccultIlkData { p_occ })
         });
         gpc.pos.clamped(gs.table_size).map_err(|_| SpecError::PosOffTable)?;
-        if gpc.zlevel.z > gs.max_z { gs.max_z = gpc.zlevel.z.clone() }
+        if gpc.zlevel > gs.max_z { gs.max_z = gpc.zlevel.clone() }
         let piece = gs.pieces.as_mut(modperm).insert(gpc);
         let p = IPieceTraitObj::new(p);
         ig.ipieces.as_mut(modperm).insert(piece, IPiece { p, occilk });
index 4baf9b30e79ac74f92b40fdfd669c1ed12eee588..3f80b31e59de2d27ec3be72dd79366ef69eb17c1 100644 (file)
@@ -28,7 +28,8 @@ pub const DEFAULT_TABLE_COLOUR: &str = "green";
 
 // ---------- general data types ----------
 
-#[derive(Debug,Clone,Serialize,Deserialize,Eq,PartialEq,Ord,PartialOrd)]
+#[derive(Debug,Clone,Eq,PartialEq,Ord,PartialOrd)]
+#[derive(Serialize,Deserialize)]
 pub struct ZLevel {
   pub z: ZCoord,
   pub zg: Generation,
@@ -43,7 +44,7 @@ pub struct GameState { // usual variable: gs
   pub pieces: GPieces,
   pub gen: Generation,
   pub log: VecDeque<(Generation, Arc<CommittedLogEntry>)>,
-  pub max_z: ZCoord,
+  pub max_z: ZLevel,
   pub players: GPlayers,
   pub occults: GameOccults,
 }
@@ -445,12 +446,16 @@ impl GameState {
     pieces: default(),
     gen: Generation(0),
     log: default(),
-    max_z: default(),
+    max_z: ZLevel::zero(),
     players: default(),
     occults: default(),
   } }
 }
 
+impl ZLevel {
+  pub fn zero() -> Self { ZLevel { z: default(), zg: Generation(0) } }
+}
+
 // ---------- log expiry ==========
 
 impl GameState {
index 5cd7f4a9eca3aadd0ee3a9a73bfb41695fcb2b84..74397d3e2211e9218652315d370220fca88496ef 100644 (file)
@@ -864,7 +864,7 @@ impl OccultationViewDef for OwnerOccultationView {
 #[throws(OnlineError)]
 pub fn create_occultation(
   gen: &mut UniqueGenGen,
-  max_z: &mut ZCoord,
+  max_z: &mut ZLevel,
   gplayers: &mut GPlayers,
   gpieces: &mut GPieces,
   goccults: &mut GameOccults,
@@ -894,6 +894,7 @@ pub fn create_occultation(
     } {
       // We expect that ogpc.zlevel.z.increment() is shorter than
       // the displ_z, but in case it isn't, we must look at both.
+      let max_z = &mut max_z.z;
       (||{
         max_z.update_max(&ogpc.zlevel.z.clone_mut().increment()?);
         max_z.update_max(&displ_z.plus_offset(! 0)?);
index c8702358763d50ec8004b60d736924bf7fd6bedd..3b42fc90cbd9496c2e7937109b780b0a1dab7663 100644 (file)
@@ -652,7 +652,7 @@ impl<'r> PrepareUpdatesBuffer<'r> {
      -> SecondarySlotMap<PlayerId, U>
   where
     GUF: FnOnce(&mut GPiece, Generation, &IsResponseToClientOp),
-    WMZ: FnMut(&mut ZCoord, &GPiece),
+    WMZ: FnMut(&mut ZLevel, &GPiece),
     MUF: FnMut(&IOccults, &GameState, &GPiece, &IPiece,
                PlayerId, &Option<PieceRenderInstructions>)
                -> Result<Option<U>,IE>,
@@ -711,7 +711,7 @@ impl<'r> PrepareUpdatesBuffer<'r> {
     (
       piece,by_client, gen_update,
 
-      |max_z, gpc| max_z.update_max(&gpc.zlevel.z),
+      |max_z, gpc| max_z.update_max(&gpc.zlevel),
 
       |ioccults,gs,gpc,ipc,player,pri| {
         let ops = match ops {