chiark / gitweb /
New IPieceTraitObj: proof of concept
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 16 Mar 2021 12:41:49 +0000 (12:41 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 16 Mar 2021 12:41:49 +0000 (12:41 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/global.rs
src/hidden.rs
src/pcrender.rs

index 0c6138591838764fa2f2ac8d8cb256bd5c80422e..76b317cc9b3d612b73cf1292a812b9012aa01d8a 100644 (file)
@@ -683,6 +683,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);
+        let p = IPieceTraitObj::new(p);
         ig.ipieces.as_mut(modperm).insert(piece, IPiece { p, occilk });
         updates.push((piece, PieceUpdateOp::Insert(())));
         pos = (pos + posd)?;
index a1ec77c166266c4331f86a47c950030ccc1350ad..78408d7895defff17571a511cffa980b275c28a0 100644 (file)
@@ -70,9 +70,10 @@ pub struct IPlayer { // usual variable: ipl
 
 #[derive(Debug,Serialize,Deserialize)]
 pub struct IPiece {
-  pub p: Box<dyn PieceTrait>,
+  pub p: IPieceTraitObj,
   pub occilk: Option<OccultIlkOwningId>,
 }
+deref_to_field!{IPiece, IPieceTraitObj, p}
 
 #[derive(Debug,Serialize,Deserialize)]
 #[serde(transparent)]
index dd6bd198490dfdd32c89caf9abb935d59b7ae2fd..150810aa145c88df44156d00f7d7781801e432ee 100644 (file)
@@ -18,6 +18,11 @@ visible_slotmap_key!{ OccId(b'H') }
 #[derive(Copy,Clone,Debug)]
 pub struct ShowUnocculted(());
 
+#[derive(Debug,Serialize,Deserialize)]
+#[serde(transparent)]
+pub struct IPieceTraitObj(Box<dyn PieceTrait>);
+deref_to_field!{IPieceTraitObj, Box<dyn PieceTrait>, 0} // xxx
+
 #[derive(Clone,Debug,Default,Serialize,Deserialize)]
 pub struct GameOccults {
   occults: DenseSlotMap<OccId, Occultation>,
@@ -232,6 +237,14 @@ impl PieceRenderInstructions {
   }
 }
 
+impl IPieceTraitObj {
+  pub fn new(p: Box<dyn PieceTrait>) -> Self { Self(p) }
+
+  pub fn show(&self, _: ShowUnocculted) -> &Box<dyn PieceTrait> {
+    &self.0
+  }
+}
+
 impl GPiece {
   pub fn fully_visible_to_everyone(&self) -> Option<ShowUnocculted> {
     match self.occult.passive {
@@ -431,7 +444,7 @@ fn recalculate_occultation_general<
       let ogpc = gpieces.get(opiece).ok_or_else(bad)?;
       let ounocc = ogpc.fully_visible_to_everyone()
         .ok_or_else(||internal_error_bydebug(&(occulteds, &ogpc)))?;
-      Ok::<_,IE>(oipc.p.describe_html(ogpc, ounocc)?)
+      Ok::<_,IE>(oipc.show(ounocc).describe_html(ogpc, ounocc)?)
     };
 
     let most_obscure = most_obscure.unwrap_or(&OccK::Visible); // no players!
index 4a06ab4f81660ab4e2c616532c05969be084094e..25d30a848610a1faa1f116e8b32dc15eac1fcc11 100644 (file)
@@ -78,7 +78,7 @@ impl<P,Z> PriOccultedGeneral<P,Z> {
   pub fn describe_fallible(&self, ioccults: &IOccults,
                            gpc: &GPiece, ipc: &IPiece) -> Html {
     match self.instead(ioccults, ipc)? {
-      Left(y) => ipc.p.describe_html(gpc, y)?,
+      Left(y) => ipc.show(y).describe_html(gpc, y)?,
       Right(i) => i.describe_html()?,
     }
   }
@@ -158,7 +158,7 @@ impl PieceRenderInstructions {
     let instead = pri.instead(ioccults, ipc)?;
 
     let o: &dyn OutlineTrait = match instead {
-      Left(_) => Borrow::<dyn PieceTrait>::borrow(&ipc.p).dyn_upcast(),
+      Left(y) => Borrow::<dyn PieceTrait>::borrow(ipc.show(y)).dyn_upcast(),
       Right(i) => i.dyn_upcast(),
     };