From: Ian Jackson Date: Sun, 28 Feb 2021 16:03:00 +0000 (+0000) Subject: hidden: Make it possible to completely hide a piece, properly X-Git-Tag: otter-0.4.0~274 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=fd7e0edd24c2f4b6f5d97d16b7ccb575dbc6d968;p=otter.git hidden: Make it possible to completely hide a piece, properly Signed-off-by: Ian Jackson --- diff --git a/daemon/api.rs b/daemon/api.rs index ba278a6a..3ef13834 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -231,14 +231,15 @@ api_route!{ let gpl = gs.players.byid_mut(player)?; let pc = gs.pieces.byid_mut(piece)?; + let logents = log_did_to_piece( + &gs.occults, player, gpl, piece, pc, p, + "grasped" + )?; + if pc.held.is_some() { throw!(OnlineError::PieceHeld) } pc.held = Some(player); let update = PieceUpdateOp::ModifyQuiet(()); - let logents = log_did_to_piece( - &gs.occults, player, gpl, piece, pc, p, - "grasped" - ); (WhatResponseToClientOp::Predictable, update, logents).into() @@ -303,7 +304,7 @@ api_route!{ let (logents, who_by) = log_did_to_piece_whoby( &gs.occults, player, gpl, piece, pc, p, "released" - ); + )?; let who_by = who_by.ok_or(OE::PieceGone)?; if pc.held != Some(player) { throw!(OnlineError::PieceHeld) } @@ -396,11 +397,11 @@ api_route!{ let ApiPieceOpArgs { gs,player,piece,p, .. } = a; let pc = gs.pieces.byid_mut(piece).unwrap(); let gpl = gs.players.byid_mut(player).unwrap(); - pc.angle = PieceAngle::Compass(self.0); let logents = log_did_to_piece( &gs.occults, player, gpl, piece, pc, p, "rotated" - ); + )?; + pc.angle = PieceAngle::Compass(self.0); let update = PieceUpdateOp::Modify(()); (WhatResponseToClientOp::Predictable, update, logents).into() @@ -417,12 +418,12 @@ api_route!{ let ApiPieceOpArgs { gs,player,piece,p, .. } = a; let pc = gs.pieces.byid_mut(piece).unwrap(); let gpl = gs.players.byid_mut(player).unwrap(); - pc.pinned = self.0; - let update = PieceUpdateOp::Modify(()); let logents = log_did_to_piece( &gs.occults, player, gpl, piece, pc, p, if pc.pinned { "pinned" } else { "unpinned" }, - ); + )?; + pc.pinned = self.0; + let update = PieceUpdateOp::Modify(()); (WhatResponseToClientOp::Predictable, update, logents).into() } @@ -450,14 +451,15 @@ api_route!{ ("flip", wrc@ WRC::UpdateSvg) => { let nfaces = p.nfaces(); + let logents = log_did_to_piece( + &gs.occults, player, gpl, piece, pc, p, + "flipped" + )?; pc.face = ((RawFaceId::from(pc.face) + 1) % nfaces).into(); return (( wrc, PieceUpdateOp::Modify(()), - log_did_to_piece( - &gs.occults, player, gpl, piece, pc, p, - "flipped" - ), + logents, ).into(), vec![]) }, diff --git a/src/updates.rs b/src/updates.rs index 46441b8d..f3ef36d6 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -199,6 +199,7 @@ struct FormattedLogEntry<'u> { // ---------- helpful utilities ---------- +#[throws(OE)] pub fn log_did_to_piece_whoby( occults: &GameOccults, player: PlayerId, @@ -207,19 +208,19 @@ pub fn log_did_to_piece_whoby( did: &str, ) -> (Vec, Option) { let who_by = Html(htmlescape::encode_minimal(&gpl.nick)); - if let Some(pri) = piece_pri(occults, player, gpl, piece, pc) { - let log = vec![ LogEntry { html: Html(format!( - "{} {} {}", - &who_by.0, - did, - pri.describe(pc, &p).0, - ))}]; - (log, Some(who_by)) - } else { - (vec![], None) - } + let pri = piece_pri(occults, player, gpl, piece, pc) + .ok_or(OE::PieceGone)?; + + let log = vec![ LogEntry { html: Html(format!( + "{} {} {}", + &who_by.0, + did, + pri.describe(pc, &p).0, + ))}]; + (log, Some(who_by)) } +#[throws(OE)] pub fn log_did_to_piece( occults: &GameOccults, player: PlayerId, @@ -227,7 +228,7 @@ pub fn log_did_to_piece( piece: PieceId, pc: &GPiece, p: &dyn PieceTrait, did: &str, ) -> Vec { - log_did_to_piece_whoby(occults,player,gpl,piece,pc,p,did).0 + log_did_to_piece_whoby(occults,player,gpl,piece,pc,p,did)?.0 } // ---------- prepared updates, queued in memory ----------