From: Ian Jackson Date: Fri, 26 Mar 2021 18:19:01 +0000 (+0000) Subject: hidden: enforce via types that Scrambled is the only view X-Git-Tag: otter-0.5.0~396 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=12e6e3f37318a3f02cd3bc754c8e09f5bfd0f1f3;p=otter.git hidden: enforce via types that Scrambled is the only view Signed-off-by: Ian Jackson --- diff --git a/src/hand.rs b/src/hand.rs index 27b3825e..eeedbd7b 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -193,8 +193,8 @@ impl PieceTrait for Hand { let displace = OccDisplacement::Rect { rect }; let views = OwnerOccultationView { owner: player, - owner_view: OccK::Visible, - defview: OccK::Displaced((displace, gpc.zlevel.z.clone())), + owner_view: OccKA::Visible, + defview: OccKA::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 aef082e1..23372f33 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -72,6 +72,25 @@ pub enum OccultationKindGeneral { } pub type OccultationKind = OccultationKindGeneral<(OccDisplacement,ZCoord)>; +#[derive(Clone,Debug)] +#[derive(Eq,PartialEq,Hash)] +pub enum OccultationKindAlwaysOk { + Visible, + // Scrambled is only allowed as the only view; enforced by our + // OccultationViewDef trait impls + Displaced((OccDisplacement,ZCoord)), + Invisible, +} +impl From for OccultationKind { + fn from(i: OccultationKindAlwaysOk) -> OccultationKind { + match i { + OccKA::Visible => OccKG::Visible, + OccKA::Displaced(d) => OccKG::Displaced(d), + OccKA::Invisible => OccKG::Invisible, + } + } +} + #[derive(Clone,Debug,Serialize,Deserialize)] #[derive(Eq,PartialEq,Hash)] pub enum OccDisplacement { @@ -788,9 +807,9 @@ pub struct UniformOccultationView( ); #[derive(Debug,Clone)] pub struct OwnerOccultationView { - pub defview: OccultationKind, + pub defview: OccultationKindAlwaysOk, pub owner: PlayerId, - pub owner_view: OccultationKind, + pub owner_view: OccultationKindAlwaysOk, } pub trait OccultationViewDef { @@ -806,10 +825,10 @@ impl OccultationViewDef for UniformOccultationView { impl OccultationViewDef for OwnerOccultationView { #[throws(IE)] fn views(self) -> OccultationViews { OccultationViews { - defview: self.defview, + defview: self.defview.into(), views: vec![OccultView { players: vec![self.owner], - occult: self.owner_view, + occult: self.owner_view.into(), }] } } } diff --git a/src/prelude.rs b/src/prelude.rs index acaddafa..8d98bb88 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -180,6 +180,7 @@ pub type SpE = SpecError; // hidden.rs pub type OccK = OccultationKind; pub use OccultationKindGeneral as OccKG; +pub use OccultationKindAlwaysOk as OccKA; // pcrender.rs pub use PriOccultedGeneral as PriOG;