chiark / gitweb /
Do not tolerate ui operations for occulted pieces
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Mar 2021 16:31:40 +0000 (16:31 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Mar 2021 16:31:40 +0000 (16:31 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/api.rs
src/gamestate.rs
src/hand.rs

index 37d9196ce45f7f2286f515dc5d8e3524a740f66d..03acd0d9cfad89d12b566b6753302525dc21f22b 100644 (file)
@@ -469,6 +469,19 @@ api_route!{
     fn op_complex(&self, mut a: ApiPieceOpArgs) -> UpdateFromOpComplex {
       let ApiPieceOpArgs { ioccults,player,piece,ipc, .. } = a;
       let gs = &mut a.gs;
+      let pri = piece_pri(ioccults, &gs.occults,
+                          player, gs.players.byid_mut(player)?,
+                          piece, gs.pieces.byid(piece)?,
+                          ipc)
+        .ok_or(OE::PieceGone)?;
+      let y = {
+        use PriOcculted::*;
+        match pri.occulted {
+          Visible(y) => y,
+          Occulted | Displaced(..) => throw!(OE::BadOperation),
+        }
+      };
+
       '_normal_global_ops__not_loop: loop {
         let gpc = gs.pieces.byid_mut(piece)?;
         let gpl = gs.players.byid_mut(player)?;
@@ -499,7 +512,7 @@ api_route!{
         };
       }
 
-      ipc.p.ui_operation(a, &self.opname, self.wrc)?
+      ipc.p.ui_operation(a, &self.opname, self.wrc, y)?
     }
   }
 }
index 853d753225433a68f0994cbc1ea013156940a3e2..3f94693b90da26a8c47c1e5b6ec3f02436b4e105 100644 (file)
@@ -137,7 +137,8 @@ pub trait PieceTrait: OutlineTrait + Send + Debug + 'static {
                        _gpc: &GPiece, _y: ShowUnocculted) { }
 
   fn ui_operation(&self, _a: ApiPieceOpArgs<'_>,
-                  _opname: &str, _wrc: WhatResponseToClientOp)
+                  _opname: &str, _wrc: WhatResponseToClientOp,
+                  _y: ShowUnocculted)
                   -> Result<UpdateFromOpComplex, ApiPieceOpError> {
     throw!(OE::BadOperation)
   }
index 5a51e7c7385f9585a0ff304b3c9e022856e14dde..2b61db415e6fab98220f542528a17cd9bf4cb700 100644 (file)
@@ -139,7 +139,8 @@ impl PieceTrait for Hand {
 
   #[throws(ApiPieceOpError)]
   fn ui_operation(&self, a: ApiPieceOpArgs<'_>,
-                  opname: &str, wrc: WhatResponseToClientOp)
+                  opname: &str, wrc: WhatResponseToClientOp,
+                  _: ShowUnocculted)
                   -> UpdateFromOpComplex {
     let ApiPieceOpArgs { gs,player,piece,ipieces,to_permute,.. } = a;
     let gen = &mut gs.gen;