From: Ian Jackson Date: Thu, 25 Mar 2021 18:21:15 +0000 (+0000) Subject: piece aliases: Pass about everywhere, esp. to PieceSpec methods X-Git-Tag: otter-0.5.0~407 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=0eef5d099c5df3f4f581d02169bdd886d08636b8;p=otter.git piece aliases: Pass about everywhere, esp. to PieceSpec methods Signed-off-by: Ian Jackson --- diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index a41d1eed..0c46a1cd 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -635,7 +635,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( let gref = ig_g.gref.clone(); let ig = &mut **ig_g; let gs = &mut ig.gs; - let implicit: u32 = info.count() + let implicit: u32 = info.count(&ig.pcaliases) .try_into().map_err( |_| SpE::InternalError(format!("implicit item count out of range")) )?; @@ -678,7 +678,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( moveable: default(), }; let PieceSpecLoaded { p, occultable } = - info.load(piece_i as usize, &mut gpc, &gref)?; + info.load(piece_i as usize, &mut gpc, &ig.pcaliases, &gref)?; if p.nfaces() <= face.into() { throw!(SpecError::FaceNotFound); } diff --git a/src/bin/otterlib.rs b/src/bin/otterlib.rs index 5617bc70..340739cb 100644 --- a/src/bin/otterlib.rs +++ b/src/bin/otterlib.rs @@ -77,6 +77,7 @@ fn preview(items: Vec) { } const SEVERAL: usize = 3; + let pcaliases = default(); impl Prep { fn want_several(&self) -> bool { @@ -91,7 +92,8 @@ fn preview(items: Vec) { let mut pieces: Vec = items.into_iter().map(|it| { let spec = ItemSpec { lib: it.0, item: it.1.itemname }; (||{ - let (p, _occultable) = spec.clone().find_load().context("load")?; + let (p, _occultable) = spec.clone().find_load(&pcaliases) + .context("load")?; // todo show occulted version too let mut uos = vec![]; p.add_ui_operations(&mut uos, &GameState::dummy(), &GPiece::dummy()) diff --git a/src/clock.rs b/src/clock.rs index 0d7fedf4..070889df 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -403,7 +403,8 @@ fn unprepared_update(piece: PieceId) -> UnpreparedUpdates { #[typetag::serde(name="ChessClock")] impl PieceSpec for Spec { #[throws(SpecError)] - fn load(&self, _: usize, gpc: &mut GPiece, _ir: &InstanceRef) + fn load(&self, _: usize, gpc: &mut GPiece, + _pcaliases: &PieceAliases, _ir: &InstanceRef) -> PieceSpecLoaded { if self.time <= 0 { throw!(SpecError::NegativeTimeout) } diff --git a/src/deck.rs b/src/deck.rs index 6a708e10..f9eb1606 100644 --- a/src/deck.rs +++ b/src/deck.rs @@ -37,7 +37,8 @@ impl OutlineTrait for Deck { #[typetag::serde(name="PickupDeck")] impl PieceSpec for piece_specs::Deck { #[throws(SpecError)] - fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef) + fn load(&self, _: usize, _: &mut GPiece, + _pcaliases: &PieceAliases, _ir: &InstanceRef) -> PieceSpecLoaded { let common = SimpleCommon { itemname: None, diff --git a/src/gamestate.rs b/src/gamestate.rs index 7183c398..8952ee2d 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -201,10 +201,12 @@ pub type PieceSpecLoadedOccultable = #[typetag::serde(tag="type")] pub trait PieceSpec: Debug + Sync + Send + 'static { - fn count(&self) -> usize { 1 } - fn load(&self, i: usize, gpc: &mut GPiece, ir: &InstanceRef) + fn count(&self, _pcaliases: &PieceAliases) -> usize { 1 } + fn load(&self, i: usize, gpc: &mut GPiece, + pcaliases: &PieceAliases, ir: &InstanceRef) -> Result; - fn load_occult(&self) -> Result, SpecError> { + fn load_occult(&self, _pcaliases: &PieceAliases) + -> Result, SpecError> { throw!(SpE::ComplexPieceWhereSimpleRequired) } } diff --git a/src/hand.rs b/src/hand.rs index a49ebeee..27b3825e 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -50,7 +50,8 @@ impl OutlineTrait for Hand { #[typetag::serde] impl PieceSpec for piece_specs::Hand { #[throws(SpecError)] - fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef) + fn load(&self, _: usize, _: &mut GPiece, + _pcaliases: &PieceAliases, _ir: &InstanceRef) -> PieceSpecLoaded { let common = SimpleCommon { itemname: None, diff --git a/src/pieces.rs b/src/pieces.rs index f8f2a65c..9befa20e 100644 --- a/src/pieces.rs +++ b/src/pieces.rs @@ -294,7 +294,8 @@ impl SimplePieceSpec for piece_specs::Disc { #[typetag::serde] impl PieceSpec for piece_specs::Disc { #[throws(SpecError)] - fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef) + fn load(&self, _: usize, _: &mut GPiece, + _pcaliases: &PieceAliases, _ir: &InstanceRef) -> PieceSpecLoaded { SimplePieceSpec::load(self)? } @@ -332,7 +333,8 @@ impl SimplePieceSpec for piece_specs::Rect { #[typetag::serde] impl PieceSpec for piece_specs::Rect { #[throws(SpecError)] - fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef) + fn load(&self, _: usize, _: &mut GPiece, + _pcaliases: &PieceAliases, _ir: &InstanceRef) -> PieceSpecLoaded { SimplePieceSpec::load(self)? } diff --git a/src/shapelib.rs b/src/shapelib.rs index e2b4bb35..4a6eafc9 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -339,11 +339,11 @@ impl From for PieceSpecLoaded { impl ItemSpec { #[throws(SpecError)] - pub fn find_load(&self) -> ItemSpecLoaded { + pub fn find_load(&self, pcaliases: &PieceAliases) -> ItemSpecLoaded { let lib = libs_lookup(&self.lib)?; let idata = lib.items.get(&self.item) .ok_or(SpE::LibraryItemNotFound(self.item.clone()))?; - lib.load1(idata, &self.item)? + lib.load1(idata, &self.item, pcaliases)? } } @@ -366,7 +366,8 @@ impl Contents { } #[throws(SpecError)] - fn load1(&self, idata: &ItemData, name: &str) -> ItemSpecLoaded { + fn load1(&self, idata: &ItemData, name: &str, pcaliases: &PieceAliases) + -> ItemSpecLoaded { let svg_data = self.load_svg(name, name)?; idata.group.d.outline.check(&idata.group) @@ -389,7 +390,7 @@ impl Contents { face.xform.scale[0] *= -1.; faces.push(face); } else if let Some(back_spec) = &idata.group.d.back { - let p = back_spec.load_occult()?; + let p = back_spec.load_occult(pcaliases)?; let p = p.into(); back = Some(p); } @@ -441,7 +442,7 @@ impl Contents { let mut out = vec![]; for (k,v) in &self.items { if !pat.matches(&k) { continue } - let (loaded, _) = match self.load1(v, &k) { + let (loaded, _) = match self.load1(v, &k, &default()) { Err(SpecError::LibraryItemNotFound(_)) => continue, e@ Err(_) => e?, Ok(r) => r, @@ -461,22 +462,25 @@ impl Contents { #[typetag::serde(name="Lib")] impl PieceSpec for ItemSpec { #[throws(SpecError)] - fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef) + fn load(&self, _: usize, _: &mut GPiece, + pcaliases: &PieceAliases, _ir: &InstanceRef) -> PieceSpecLoaded { - self.find_load()?.into() + self.find_load(pcaliases)?.into() } #[throws(SpecError)] - fn load_occult(&self) -> Box { - self.find_load()?.0 as Box + fn load_occult(&self, pcaliases: &PieceAliases) + -> Box { + self.find_load(pcaliases)?.0 as Box } } #[typetag::serde(name="LibList")] impl PieceSpec for MultiSpec { - fn count(&self) -> usize { self.items.len() } + fn count(&self, _pcaliases: &PieceAliases) -> usize { self.items.len() } #[throws(SpecError)] - fn load(&self, i: usize, _: &mut GPiece, _ir: &InstanceRef) + fn load(&self, i: usize, _: &mut GPiece, + pcaliases: &PieceAliases, _ir: &InstanceRef) -> PieceSpecLoaded { let item = self.items.get(i).ok_or_else( @@ -484,7 +488,7 @@ impl PieceSpec for MultiSpec { )?; let item = format!("{}{}{}", &self.prefix, item, &self.suffix); let lib = self.lib.clone(); - ItemSpec { lib, item }.find_load()?.into() + ItemSpec { lib, item }.find_load(pcaliases)?.into() } }