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()
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) }
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()
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()
}
("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![])
},
// ---------- helpful utilities ----------
+#[throws(OE)]
pub fn log_did_to_piece_whoby(
occults: &GameOccults,
player: PlayerId,
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,
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 ----------