gpc.pos.clamped(gs.table_size).map_err(|_| SpecError::PosOffTable)?;
if gpc.zlevel.z > gs.max_z { gs.max_z = gpc.zlevel.z.clone() }
let piece = gs.pieces.as_mut(modperm).insert(gpc);
+ let p = IPieceTraitObj::new(p);
ig.ipieces.as_mut(modperm).insert(piece, IPiece { p, occilk });
updates.push((piece, PieceUpdateOp::Insert(())));
pos = (pos + posd)?;
#[derive(Debug,Serialize,Deserialize)]
pub struct IPiece {
- pub p: Box<dyn PieceTrait>,
+ pub p: IPieceTraitObj,
pub occilk: Option<OccultIlkOwningId>,
}
+deref_to_field!{IPiece, IPieceTraitObj, p}
#[derive(Debug,Serialize,Deserialize)]
#[serde(transparent)]
#[derive(Copy,Clone,Debug)]
pub struct ShowUnocculted(());
+#[derive(Debug,Serialize,Deserialize)]
+#[serde(transparent)]
+pub struct IPieceTraitObj(Box<dyn PieceTrait>);
+deref_to_field!{IPieceTraitObj, Box<dyn PieceTrait>, 0} // xxx
+
#[derive(Clone,Debug,Default,Serialize,Deserialize)]
pub struct GameOccults {
occults: DenseSlotMap<OccId, Occultation>,
}
}
+impl IPieceTraitObj {
+ pub fn new(p: Box<dyn PieceTrait>) -> Self { Self(p) }
+
+ pub fn show(&self, _: ShowUnocculted) -> &Box<dyn PieceTrait> {
+ &self.0
+ }
+}
+
impl GPiece {
pub fn fully_visible_to_everyone(&self) -> Option<ShowUnocculted> {
match self.occult.passive {
let ogpc = gpieces.get(opiece).ok_or_else(bad)?;
let ounocc = ogpc.fully_visible_to_everyone()
.ok_or_else(||internal_error_bydebug(&(occulteds, &ogpc)))?;
- Ok::<_,IE>(oipc.p.describe_html(ogpc, ounocc)?)
+ Ok::<_,IE>(oipc.show(ounocc).describe_html(ogpc, ounocc)?)
};
let most_obscure = most_obscure.unwrap_or(&OccK::Visible); // no players!
pub fn describe_fallible(&self, ioccults: &IOccults,
gpc: &GPiece, ipc: &IPiece) -> Html {
match self.instead(ioccults, ipc)? {
- Left(y) => ipc.p.describe_html(gpc, y)?,
+ Left(y) => ipc.show(y).describe_html(gpc, y)?,
Right(i) => i.describe_html()?,
}
}
let instead = pri.instead(ioccults, ipc)?;
let o: &dyn OutlineTrait = match instead {
- Left(_) => Borrow::<dyn PieceTrait>::borrow(&ipc.p).dyn_upcast(),
+ Left(y) => Borrow::<dyn PieceTrait>::borrow(ipc.show(y)).dyn_upcast(),
Right(i) => i.dyn_upcast(),
};