From: Ian Jackson Date: Mon, 15 Mar 2021 16:31:40 +0000 (+0000) Subject: Do not tolerate ui operations for occulted pieces X-Git-Tag: otter-0.4.0~28 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=64ee12d82c58945a7a9468131c4b88f4f7b29f3d;p=otter.git Do not tolerate ui operations for occulted pieces Signed-off-by: Ian Jackson --- diff --git a/daemon/api.rs b/daemon/api.rs index 37d9196c..03acd0d9 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -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)? } } } diff --git a/src/gamestate.rs b/src/gamestate.rs index 853d7532..3f94693b 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -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 { throw!(OE::BadOperation) } diff --git a/src/hand.rs b/src/hand.rs index 5a51e7c7..2b61db41 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -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;