From: Ian Jackson Date: Wed, 24 Mar 2021 11:45:44 +0000 (+0000) Subject: hidden placement: Refactor to make a place to put things X-Git-Tag: otter-0.5.0~476 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=10b47e8aca505331e1e4907fa88282921fe065f4;p=otter.git hidden placement: Refactor to make a place to put things Signed-off-by: Ian Jackson --- diff --git a/src/hand.rs b/src/hand.rs index f04c7c24..dd3b8a73 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -207,10 +207,11 @@ impl PieceTrait for Hand { let (region, views) = (||{ dbgc!("claiming region"); let region = self.shape.outline.region(gpc.pos)?; + let displace = OccDisplacement::Rect { area: region }; let views = OwnerOccultationView { owner: player, owner_view: OccK::Visible, - defview: OccK::Displaced((region, gpc.zlevel.z.clone())), + defview: OccK::Displaced((displace, gpc.zlevel.z.clone())), }.views()?; dbgc!("claiming got region", ®ion, &views); Ok::<_,IE>((region, views)) diff --git a/src/hidden.rs b/src/hidden.rs index 64af9af0..855a0db1 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -68,7 +68,15 @@ pub enum OccultationKindGeneral { Displaced(D), Invisible, } -pub type OccultationKind = OccultationKindGeneral<(Area, ZCoord)>; +pub type OccultationKind = OccultationKindGeneral<(OccDisplacement,ZCoord)>; + +#[derive(Clone,Debug,Serialize,Deserialize)] +#[derive(Eq,PartialEq,Hash)] +pub enum OccDisplacement { + Rect { + area: Area, + }, +} impl PieceOccult { pub fn is_active(&self) -> bool { self.active.is_some() } @@ -199,11 +207,10 @@ pub fn piece_pri( if let Some(zg) = occultation.notch_zg(notch); then { occultation.views.get_kind(player) - .map_displaced(|(area, z)| { - let x: Coord = (notch.index() % 3).try_into().unwrap(); // xxx - let pos = (area.0[0] + PosC([x*4, 0])).unwrap(); // xxx - let pos = (pos + PosC([5,5])).unwrap(); // xxx - let z = z.plus_offset(notch.into()) + .map_displaced(|(displace, z)| { + let notch: NotchNumber = notch.into(); + let pos = displace.place(notch); + let z = z.plus_offset(notch) .unwrap_or_else(|e| { // eek! error!("z coordinate overflow ({:?}), bodging! {:?} {:?}", e, piece, &z); @@ -231,6 +238,20 @@ pub fn piece_pri( Some(PieceRenderInstructions { vpid, occulted }) } +impl OccDisplacement { + fn place(&self, notch: NotchNumber) -> Pos { + use OccDisplacement as OD; + match self { + OD::Rect{area} => { + let x: Coord = (notch % 3).try_into().unwrap(); // xxx + let pos = (area.0[0] + PosC([x*4, 0])).unwrap(); // xxx + let pos = (pos + PosC([5,5])).unwrap(); // xxx + pos + }, + } + } +} + impl ShowUnocculted { /// override pub const fn new_visible() -> ShowUnocculted {