chiark / gitweb /
Do not leak item name etc. of occulted pieces
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Mar 2021 16:40:46 +0000 (16:40 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Mar 2021 16:40:46 +0000 (16:40 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/gamestate.rs
src/hand.rs
src/pieces.rs
src/shapelib.rs

index b03dfa657297ed4e77cf137eb35a964c4f8f3db4..9931141b1a01cb7b480d8b86f83807273021d915 100644 (file)
@@ -397,23 +397,31 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
           if let Some(ipc) = ig.ipieces.get(piece);
           let visible = if ! piece_at_all_occulted(gpc) {
             // todo: something more sophisticated would be nice
-            let pri = PieceRenderInstructions::new_visible(
-              // visible id is internal one here
-              VisiblePieceId(piece.data())
+            let (pri, unocc_ok) = (
+              PieceRenderInstructions::new_visible(
+                // visible id is internal one here
+                VisiblePieceId(piece.data())
+              ),
+              ShowUnocculted::new_visible(),
             );
             let bbox = ipc.p.bbox_approx()?;
             let desc_html = pri.describe(ioccults, gpc, ipc);
-            Some(MgmtGamePieceVisibleInfo {
+            Some((MgmtGamePieceVisibleInfo {
               pos, face, desc_html, bbox
-            })
+            }, unocc_ok))
           } else {
             None
           };
-          let itemname = ipc.p.itemname().to_string();
+          let itemname = if let Some((_,unocc_ok)) = visible {
+            ipc.p.itemname(unocc_ok).to_string()
+          } else {
+            "occulted-item".to_string()
+          };
           then {
             Some(MgmtGamePieceInfo {
-              piece, itemname,
-              visible
+              piece,
+              itemname,
+              visible: visible.map(|v| v.0)
             })
           } else {
             None
index 3f94693b90da26a8c47c1e5b6ec3f02436b4e105..ec9836f5f82eca5732f414d6430cc0cbe983662e 100644 (file)
@@ -154,7 +154,7 @@ pub trait PieceTrait: OutlineTrait + Send + Debug + 'static {
     ExecuteGameChangeUpdates{ pcs: vec![], log: vec![], raw: None }
   }
 
-  fn itemname(&self) -> &str;
+  fn itemname(&self, _y: ShowUnocculted) -> &str;
 }
 
 #[typetag::serde]
index 2b61db415e6fab98220f542528a17cd9bf4cb700..3462e598582a89e0a8efd315dc67ca7611c6b76f 100644 (file)
@@ -110,7 +110,7 @@ impl PieceTrait for Hand {
 
   delegate!{
     to self.shape {
-      fn itemname(&self) -> &str;
+      fn itemname(&self, y: ShowUnocculted) -> &str;
     }
   }
 
index 675258fa4edc2765f8ee2e5e79c8f38dff543d0f..1ef485723593aa32d97b24c78772f1b5beccc1f4 100644 (file)
@@ -144,7 +144,7 @@ impl PieceTrait for SimpleShape {
   }
   fn nfaces(&self) -> RawFaceId { self.count_faces().try_into().unwrap() }
 
-  fn itemname(&self) -> &str { self.itemname() }
+  fn itemname(&self, y: ShowUnocculted) -> &str { self.itemname(y) }
 }
 
 impl<Desc, Outl:'static> GenericSimpleShape<Desc, Outl>
@@ -154,7 +154,7 @@ impl<Desc, Outl:'static> GenericSimpleShape<Desc, Outl>
   pub fn count_faces(&self) -> usize {
     max(self.colours.len(), self.edges.len())
   }
-  pub fn itemname(&self) -> &str { &self.itemname }
+  pub fn itemname(&self, _: ShowUnocculted) -> &str { &self.itemname }
 
   #[throws(SpecError)]
   pub fn new(desc: Desc, outline: Outl,
index df1977eedb944319c8adb194c37496e8ceb75e2e..ab275b7ad10cd8bb8ef47e28e6e1cc100e88f6b1 100644 (file)
@@ -226,7 +226,7 @@ impl PieceTrait for Item {
     self.descs[ self.faces[gpc.face].desc ].clone()
   }
 
-  fn itemname(&self) -> &str { &self.itemname }
+  fn itemname(&self, _: ShowUnocculted) -> &str { &self.itemname }
 }
 
 static SHAPELIBS: RwLock<Option<Registry>> = const_rwlock(None);