}
fn log_did_to_piece<L: Lens + ?Sized>(
- _occults: &GameOccults,
- gpl: &mut GPlayerState, lens: &L,
+ occults: &GameOccults,
+ gpl: &mut GPlayerState, _lens: &L,
piece: PieceId, pc: &PieceState, p: &dyn Piece,
did: &str,
) -> Vec<LogEntry> {
+ let pri = piece_pri(occults, gpl, piece, pc);
vec![ LogEntry { html: Html(format!(
"{} {} {}",
&htmlescape::encode_minimal(&gpl.nick),
did,
- p.describe_pri(&lens.log_pri(piece, pc)).0
+ p.describe_pri(&pri).0
))}]
}
let ipieces = &g.ipieces;
let iplayers = &g.iplayers;
let _ = iplayers.byid(player)?;
- let _ = gs.players.byid(player)?;
+ let gpl = gs.players.byid(player)?;
let lens = TransparentLens { };
- let piece = lens.decode_visible_pieceid(form.piece, player);
+ let piece = vpiece_decode(gs, gpl, form.piece).ok_or(OE::PieceGone)?;
use ApiPieceOpError::*;
match (||{
#[throws(ApiPieceOpError)]
fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
- let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a;
+ let ApiPieceOpArgs { gs,player,piece,p, .. } = a;
let pc = gs.pieces.byid_mut(piece)?;
let players = &mut gs.players;
let was = pc.held;
let was = was.map(|was| htmlescape::encode_minimal(&was.nick));
let gpl = players.byid_mut(player)?;
- let pcs = p.describe_pri(&lens.log_pri(piece, pc)).0;
+ let pri = piece_pri(&gs.occults, gpl, piece, pc);
+ let pcs = p.describe_pri(&pri).0;
pc.held = Some(player);
pieces.sort_by_key(|(_,pr)| &pr.zlevel);
for (gpid, pr) in pieces {
- let pri = PieceRenderInstructions {
- id: make_pieceid_visible(gpid),
- angle: make_angle_visible(pr.angle),
- face: pr.face,
- };
+ let pri = piece_pri(&ig.gs.occults, gpl, gpid, pr);
let p = if let Some(p) = ig.ipieces.get(gpid) { p }
else { continue /* was deleted */ };
let defs = p.make_defs(&pri)?;
// ========== ad-hoc and temporary ==========
-pub fn make_pieceid_visible(p: PieceId) -> VisiblePieceId {
- // todo-lens need to do censorship mapping here
- let kd: slotmap::KeyData = p.data();
- VisiblePieceId(kd)
-}
-
pub fn make_angle_visible(angle: PieceAngle) -> VisiblePieceAngle {
// todo-lens need to do censorship mapping here
VisiblePieceAngle(angle)
// can be abolished.
pub trait Lens : Debug {
- fn new_hidden_todo(&self, why: &'static str);
- /// Will be replaced by some call to an Occlusion
- fn new_hidden_pri(&self, id: VisiblePieceId,
- angle: VisiblePieceAngle, face: FaceId)
- -> PieceRenderInstructions;
-
- fn pieceid2visible(&self, piece: PieceId) -> VisiblePieceId;
- fn log_pri(&self, piece: PieceId, pc: &PieceState)
- -> PieceRenderInstructions;
- fn svg_pri(&self, piece: PieceId, pc: &PieceState, player: PlayerId)
- -> PieceRenderInstructions;
- fn massage_prep_piecestate(&self, ns : &mut PreparedPieceState);
- fn decode_visible_pieceid(&self, vpiece: VisiblePieceId, player: PlayerId)
- -> PieceId;
}
#[derive(Debug)]
pub struct TransparentLens {
}
impl Lens for TransparentLens {
- fn new_hidden_todo(&self, _why: &'static str) { }
- fn new_hidden_pri(&self, id: VisiblePieceId,
- angle: VisiblePieceAngle, face: FaceId)
- -> PieceRenderInstructions {
- PieceRenderInstructions { id, angle, face }
- }
-
- fn pieceid2visible(&self, piece: PieceId) -> VisiblePieceId {
- let kd : slotmap::KeyData = piece.data();
- VisiblePieceId(kd)
- }
- fn log_pri(&self, piece: PieceId, pc: &PieceState)
- -> PieceRenderInstructions {
- let id = self.pieceid2visible(piece);
- let angle = make_angle_visible(pc.angle);
- PieceRenderInstructions { id, angle, face: pc.face }
- }
- fn svg_pri(&self, piece: PieceId, pc: &PieceState, _player: PlayerId)
- -> PieceRenderInstructions {
- self.log_pri(piece, pc)
- }
- fn decode_visible_pieceid(&self, vpiece: VisiblePieceId, _player: PlayerId)
- -> PieceId {
- let kd : slotmap::KeyData = vpiece.into();
- PieceId::from(kd)
- }
- fn massage_prep_piecestate(&self, _ns : &mut PreparedPieceState) { }
}
p: &Box<dyn Piece>,
op: PieceUpdateOp<(),()>,
pri: &PieceRenderInstructions,
- lens: &dyn Lens) -> PreparedPieceUpdate
+ _lens: &dyn Lens) -> PreparedPieceUpdate
{
max_z.update_max(&pc.zlevel.z);
let op = op.try_map(
|()|{
let mut ns = pc.prep_piecestate(p.as_ref(), pri)?;
- lens.massage_prep_piecestate(&mut ns);
+ massage_prep_piecestate(pri, &mut ns);
<Result<_,InternalError>>::Ok(ns)
},
|()|{
gen_update(pc, gen, &self.by_client);
}
let mut out: SecondarySlotMap<PlayerId, PreparedPieceUpdate> = default();
- for player in gs.players.keys() {
+ for (player, gpl) in &mut gs.players {
let ops = match ops {
PUO::Simple(update) => update,
PUO::PerPlayer(ref ops) => match ops.get(player) {
};
let op = match (&mut pc, p) {
(Some(pc), Some(p)) => {
- let pri = lens.svg_pri(piece,pc,Default::default());
+ let pri = piece_pri(&gs.occults, gpl, piece, *pc);
Self::piece_update_player(
&mut gs.max_z, pc, p, ops, &pri, lens
)?
}
_ => PreparedPieceUpdate {
- piece: lens.pieceid2visible(piece),
+ // The piece is deleted, so we can't leak anything.
+ piece: gpl.idmap.fwd_or_insert(piece),
op: PieceUpdateOp::Delete(),
}
};