From: Ian Jackson Date: Thu, 11 Mar 2021 11:19:45 +0000 (+0000) Subject: occult ilks: find piece ilk and record it - BREAKING X-Git-Tag: otter-0.4.0~186 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=0afa3175815770c39c8952060ee92b751a823bd2;p=otter.git occult ilks: find piece ilk and record it - BREAKING This brakes savefiles because we need to put something different in IPieces. We can't sensibly mix a Box with anything else. Signed-off-by: Ian Jackson --- diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index a8f5a7e8..368d6001 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -559,7 +559,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( MGI::DeletePiece(piece) => { let (ig, modperm, _) = cs.check_acl_modify_pieces(ag, ig)?; - let IPiece { p } = ig.ipieces.as_mut(modperm) + let IPiece { p, occilk } = ig.ipieces.as_mut(modperm) .remove(piece).ok_or(ME::PieceNotFound)?; let gs = &mut ig.gs; let gpc = gs.pieces.as_mut(modperm).remove(piece); @@ -570,6 +570,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( Html::lit("") }; if let Some(gpc) = gpc { p.delete_hook(&gpc, gs); } + if let Some(occilk) = occilk { ig.ioccults.ilks.dispose(occilk); } (U{ pcs: vec![(piece, PieceUpdateOp::Delete())], log: vec![ LogEntry { html: Html(format!("A piece {} was removed from the game", @@ -608,7 +609,10 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( let mut z = gs.max_z.clone_mut(); for piece_i in count { let PieceSpecLoaded { p, occultable } = info.load(piece_i as usize)?; - let _ = occultable; // xxx + let ilks = &mut ig.ioccults.ilks; + let occilk = occultable.map(|(ilkname, p_occ)| { + ilks.insert(ilkname, OccultIlkData { p_occ }) + }); let face = face.unwrap_or_default(); if p.nfaces() <= face.into() { throw!(SpecError::FaceNotFound); @@ -628,7 +632,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( gpc.pos.clamped(gs.table_size).map_err(|_| SpecError::PosOffTable)?; if gpc.zlevel.z > gs.max_z { gs.max_z = gpc.zlevel.z.clone() } let piece = gs.pieces.as_mut(modperm).insert(gpc); - ig.ipieces.as_mut(modperm).insert(piece, IPiece { p }); + ig.ipieces.as_mut(modperm).insert(piece, IPiece { p, occilk }); updates.push((piece, PieceUpdateOp::Insert(()))); pos = (pos + posd)?; } diff --git a/src/global.rs b/src/global.rs index 2e093a59..af8aec63 100644 --- a/src/global.rs +++ b/src/global.rs @@ -70,8 +70,8 @@ pub struct IPlayer { // usual variable: ipl #[derive(Debug,Serialize,Deserialize)] pub struct IPiece { - #[serde(flatten)] pub p: Box, + pub occilk: Option, } #[derive(Debug,Serialize,Deserialize)]