chiark / gitweb /
hidden: Make it possible to completely hide a piece, properly
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 28 Feb 2021 16:03:00 +0000 (16:03 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 28 Feb 2021 16:03:00 +0000 (16:03 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/api.rs
src/updates.rs

index ba278a6a9c4d1671db5346c37eb2d8d0b5d327c7..3ef13834499e8609b6e4ce339bd8162a67c0d67e 100644 (file)
@@ -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![])
           },
 
index 46441b8d4feb49e903769b0b88a79f0207be6c41..f3ef36d6450e2d46f1d34a3a727c41ee673b56bc 100644 (file)
@@ -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<LogEntry>, Option<Html>) {
   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<LogEntry> {
-  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 ----------