chiark / gitweb /
Pass &mut GPiece to PieceSpec::load()
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 17 Mar 2021 01:23:10 +0000 (01:23 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 19 Mar 2021 20:05:30 +0000 (20:05 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/clock.rs
src/gamestate.rs
src/hand.rs
src/pieces.rs
src/shapelib.rs

index 67ca6fb56deb220bc529044fcac8941c34ebe370..5c4c4bce094fe4b1a1f5855892ceb6489505e13a 100644 (file)
@@ -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);
index 3598af0c1a36e7ee3e380d4e978bcad07fb9103b..0a1bb70765e18d00fa16b625452f0655c18729f7 100644 (file)
@@ -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 {
 
     };
index 8c8c0f25cfd5979c2944e53e6ba7cefdcfccf214..d90c773dfdcc9e8c6aeb7414d05e7ee225718c2b 100644 (file)
@@ -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<PieceSpecLoaded, SpecError>;
+  fn load(&self, i: usize, gpc: &mut GPiece)
+          -> Result<PieceSpecLoaded, SpecError>;
 }
 
 // ========== implementations ==========
index c46f842b8476f764b82f317d5027112efe7e0c26..484c97665b416b72c7608ef8bd144b2968614545 100644 (file)
@@ -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())],
index e7ba1be6c27d9738c0d14fa86f5e9b715a0fcd6a..038fa56fc6420349e35abd0387ed04a71986bb2d 100644 (file)
@@ -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)?
+  }
 }
index 54632a84103dabe84ca869b4681cc09288661b15..c180b9b482412b0a47274f7eb3111d9485c156e0 100644 (file)
@@ -364,7 +364,8 @@ impl Contents {
 
 #[typetag::serde(name="Lib")]
 impl PieceSpec for ItemSpec {
-  fn load(&self, _: usize) -> Result<PieceSpecLoaded, SpecError> {
+  fn load(&self, _: usize, _: &mut GPiece)
+          -> Result<PieceSpecLoaded, SpecError> {
     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<PieceSpecLoaded, SpecError> {
+  fn load(&self, i: usize, _: &mut GPiece)
+          -> Result<PieceSpecLoaded, SpecError>
+  {
     let item = self.items.get(i).ok_or_else(
       || SpE::InternalError(format!("item {:?} from {:?}", i, &self))
     )?;