From 57f4bc0688639a50da85b12e15e3ac0b1a569fea Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 17 Mar 2021 01:23:10 +0000 Subject: [PATCH] Pass &mut GPiece to PieceSpec::load() Signed-off-by: Ian Jackson --- daemon/cmdlistener.rs | 17 +++++++++-------- src/clock.rs | 2 +- src/gamestate.rs | 3 ++- src/hand.rs | 2 +- src/pieces.rs | 8 ++++++-- src/shapelib.rs | 7 +++++-- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index 67ca6fb5..5c4c4bce 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -656,16 +656,9 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( let mut pos = pos.unwrap_or(DEFAULT_POS_START); let mut z = gs.max_z.clone_mut(); for piece_i in count { - let PieceSpecLoaded { p, occultable } = info.load(piece_i as usize)?; 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); - } - let gpc = GPiece { + let mut gpc = GPiece { held: None, zlevel: ZLevel { z: z.increment()?, zg: gs.gen }, lastclient: default(), @@ -677,6 +670,14 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( pos, face, xdata: None, }; + let PieceSpecLoaded { p, occultable } = + info.load(piece_i as usize, &mut gpc)?; + if p.nfaces() <= face.into() { + throw!(SpecError::FaceNotFound); + } + let occilk = occultable.map(|(ilkname, p_occ)| { + 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() } let piece = gs.pieces.as_mut(modperm).insert(gpc); diff --git a/src/clock.rs b/src/clock.rs index 3598af0c..0a1bb707 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -20,7 +20,7 @@ struct Clock { // state #[typetag::serde] impl PieceSpec for ChessClock { #[throws(SpecError)] - fn load(&self, _: usize) -> PieceSpecLoaded { + fn load(&self, _: usize, _gpc: &mut GPiece) -> PieceSpecLoaded { let clock = Clock { }; diff --git a/src/gamestate.rs b/src/gamestate.rs index 8c8c0f25..d90c773d 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -187,7 +187,8 @@ pub struct PieceSpecLoaded { #[typetag::serde(tag="type")] pub trait PieceSpec: Debug { fn count(&self) -> usize { 1 } - fn load(&self, i: usize) -> Result; + fn load(&self, i: usize, gpc: &mut GPiece) + -> Result; } // ========== implementations ========== diff --git a/src/hand.rs b/src/hand.rs index c46f842b..484c9766 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -51,7 +51,7 @@ impl OutlineTrait for Hand { #[typetag::serde] impl PieceSpec for piece_specs::Hand { #[throws(SpecError)] - fn load(&self, _: usize) -> PieceSpecLoaded { + fn load(&self, _: usize, _: &mut GPiece) -> PieceSpecLoaded { let common = SimpleCommon { itemname: None, faces: index_vec![ColourSpec(self.colour.clone())], diff --git a/src/pieces.rs b/src/pieces.rs index e7ba1be6..038fa56f 100644 --- a/src/pieces.rs +++ b/src/pieces.rs @@ -257,7 +257,9 @@ impl SimplePieceSpec for piece_specs::Disc { #[typetag::serde] impl PieceSpec for piece_specs::Disc { #[throws(SpecError)] - fn load(&self, _: usize) -> PieceSpecLoaded { SimplePieceSpec::load(self)? } + fn load(&self, _: usize, _: &mut GPiece) -> PieceSpecLoaded { + SimplePieceSpec::load(self)? + } } impl piece_specs::Square { @@ -288,5 +290,7 @@ impl SimplePieceSpec for piece_specs::Square { #[typetag::serde] impl PieceSpec for piece_specs::Square { #[throws(SpecError)] - fn load(&self, _: usize) -> PieceSpecLoaded { SimplePieceSpec::load(self)? } + fn load(&self, _: usize, _: &mut GPiece) -> PieceSpecLoaded { + SimplePieceSpec::load(self)? + } } diff --git a/src/shapelib.rs b/src/shapelib.rs index 54632a84..c180b9b4 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -364,7 +364,8 @@ impl Contents { #[typetag::serde(name="Lib")] impl PieceSpec for ItemSpec { - fn load(&self, _: usize) -> Result { + fn load(&self, _: usize, _: &mut GPiece) + -> Result { self.load() } } @@ -372,7 +373,9 @@ impl PieceSpec for ItemSpec { #[typetag::serde(name="LibList")] impl PieceSpec for MultiSpec { fn count(&self) -> usize { self.items.len() } - fn load(&self, i: usize) -> Result { + fn load(&self, i: usize, _: &mut GPiece) + -> Result + { let item = self.items.get(i).ok_or_else( || SpE::InternalError(format!("item {:?} from {:?}", i, &self)) )?; -- 2.30.2