From: Ian Jackson Date: Sun, 4 Apr 2021 23:30:32 +0000 (+0100) Subject: ZLevel: Track max zg Generation too X-Git-Tag: otter-0.5.0~201 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=efb38693a62d64230a87de530f2fb04395523ba9;p=otter.git ZLevel: Track max zg Generation too Signed-off-by: Ian Jackson --- diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index f56dbacf..76baf1dc 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -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 }); diff --git a/src/gamestate.rs b/src/gamestate.rs index 4baf9b30..3f80b31e 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -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)>, - 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 { diff --git a/src/hidden.rs b/src/hidden.rs index 5cd7f4a9..74397d3e 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -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)?); diff --git a/src/updates.rs b/src/updates.rs index c8702358..3b42fc90 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -652,7 +652,7 @@ impl<'r> PrepareUpdatesBuffer<'r> { -> SecondarySlotMap 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) -> Result,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 {