let mut pos = pos.unwrap_or(DEFAULT_POS_START);
let mut z = gs.max_z.clone_mut();
for piece_i in count {
- let PieceSpecLoaded { p, occultable } = info.load(piece_i as usize)?;
let ilks = &mut ig.ioccults.ilks;
- let occilk = occultable.map(|(ilkname, p_occ)| {
- ilks.insert(ilkname, OccultIlkData { p_occ })
- });
let face = face.unwrap_or_default();
- if p.nfaces() <= face.into() {
- throw!(SpecError::FaceNotFound);
- }
- let gpc = GPiece {
+ let mut gpc = GPiece {
held: None,
zlevel: ZLevel { z: z.increment()?, zg: gs.gen },
lastclient: default(),
pos, face,
xdata: None,
};
+ let PieceSpecLoaded { p, occultable } =
+ info.load(piece_i as usize, &mut gpc)?;
+ if p.nfaces() <= face.into() {
+ throw!(SpecError::FaceNotFound);
+ }
+ let occilk = occultable.map(|(ilkname, p_occ)| {
+ ilks.insert(ilkname, OccultIlkData { p_occ })
+ });
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);
#[typetag::serde]
impl PieceSpec for ChessClock {
#[throws(SpecError)]
- fn load(&self, _: usize) -> PieceSpecLoaded {
+ fn load(&self, _: usize, _gpc: &mut GPiece) -> PieceSpecLoaded {
let clock = Clock {
};
#[typetag::serde(tag="type")]
pub trait PieceSpec: Debug {
fn count(&self) -> usize { 1 }
- fn load(&self, i: usize) -> Result<PieceSpecLoaded, SpecError>;
+ fn load(&self, i: usize, gpc: &mut GPiece)
+ -> Result<PieceSpecLoaded, SpecError>;
}
// ========== implementations ==========
#[typetag::serde]
impl PieceSpec for piece_specs::Hand {
#[throws(SpecError)]
- fn load(&self, _: usize) -> PieceSpecLoaded {
+ fn load(&self, _: usize, _: &mut GPiece) -> PieceSpecLoaded {
let common = SimpleCommon {
itemname: None,
faces: index_vec![ColourSpec(self.colour.clone())],
#[typetag::serde]
impl PieceSpec for piece_specs::Disc {
#[throws(SpecError)]
- fn load(&self, _: usize) -> PieceSpecLoaded { SimplePieceSpec::load(self)? }
+ fn load(&self, _: usize, _: &mut GPiece) -> PieceSpecLoaded {
+ SimplePieceSpec::load(self)?
+ }
}
impl piece_specs::Square {
#[typetag::serde]
impl PieceSpec for piece_specs::Square {
#[throws(SpecError)]
- fn load(&self, _: usize) -> PieceSpecLoaded { SimplePieceSpec::load(self)? }
+ fn load(&self, _: usize, _: &mut GPiece) -> PieceSpecLoaded {
+ SimplePieceSpec::load(self)?
+ }
}
#[typetag::serde(name="Lib")]
impl PieceSpec for ItemSpec {
- fn load(&self, _: usize) -> Result<PieceSpecLoaded, SpecError> {
+ fn load(&self, _: usize, _: &mut GPiece)
+ -> Result<PieceSpecLoaded, SpecError> {
self.load()
}
}
#[typetag::serde(name="LibList")]
impl PieceSpec for MultiSpec {
fn count(&self) -> usize { self.items.len() }
- fn load(&self, i: usize) -> Result<PieceSpecLoaded, SpecError> {
+ fn load(&self, i: usize, _: &mut GPiece)
+ -> Result<PieceSpecLoaded, SpecError>
+ {
let item = self.items.get(i).ok_or_else(
|| SpE::InternalError(format!("item {:?} from {:?}", i, &self))
)?;