#[throws(InternalError)]
fn recalculate_occultation_general<
+ R,
+ V: FnOnce(Vec<LogEntry>) -> R,
L: FnOnce(&Html, Html, Html, Option<&Html>) -> Vec<LogEntry>,
+ F: FnOnce(PieceUpdateOps_PerPlayer, Vec<LogEntry>) -> R,
>(
gs: &mut GameState,
who_by: Html,
ipieces: &PiecesLoaded,
piece: PieceId,
- vanilla: PUFOS,
+ log_visible: Vec<LogEntry>,
+ ret_vanilla: V,
log_callback: L,
+ ret_callback: F,
)
- -> PieceUpdate
+ -> R
{
// fallible part
let (puos, log, occids): (_, _, OldNew<Option<OccId>>) = {
].into();
let occids = occulteds.map(|h| h.as_ref().map(|occ| occ.occid));
- if occids.old() == occids.new() { return vanilla.into(); }
+ if occids.old() == occids.new() { return ret_vanilla(log_visible); }
/*
#[throws(IE)]
let log = match most_obscure {
OccK::Visible => {
- vanilla.2
+ log_visible
}
OccK::Scrambled | OccK::Displaced{..} => {
let face = ipc.nfaces() - 1;
gs.pieces.byid_mut(piece).unwrap().occult.passive = *occids.new();
})(); // <- no ?, infallible commitment
- PieceUpdate {
- wrc: WRC::Unpredictable,
- ops: PieceUpdateOps::PerPlayer(puos),
- log,
- }
+ ret_callback(puos, log)
}
#[throws(InternalError)]
who_by: Html,
ipieces: &PiecesLoaded,
piece: PieceId,
- vanilla: PUFOS,
+ (vanilla_wrc, vanilla_op, vanilla_log): PUFOS,
)
-> PieceUpdate
{
who_by,
ipieces,
piece,
- vanilla,
+ vanilla_log,
+ |log| (vanilla_wrc, vanilla_op, log).into(),
|who_by, old, new, show| vec![ LogEntry { html: Html(format!(
"{} moved {} from {} to {}",
&who_by.0,
if let Some(show) = show { &show.0 } else { "something" },
&old.0, &new.0,
- ))}]
+ ))}],
+ |puos, log| PieceUpdate {
+ wrc: WRC::Unpredictable,
+ ops: PieceUpdateOps::PerPlayer(puos),
+ log
+ }
)?
}
#[derive(Debug)]
pub enum PieceUpdateOps {
Simple(PieceUpdateOp<(),()>),
- PerPlayer(SecondarySlotMap<PlayerId, PieceUpdateOp<(),()>>),
+ PerPlayer(PieceUpdateOps_PerPlayer),
}
+#[allow(non_camel_case_types)]
+pub type PieceUpdateOps_PerPlayer =
+ SecondarySlotMap<PlayerId, PieceUpdateOp<(),()>>;
+
impl From<PieceUpdateOp<(),()>> for PieceUpdateOps {
fn from(op: PieceUpdateOp<(),()>) -> Self { PUOs::Simple(op) }
}