MGI::AddPieces(PiecesSpec{ pos,posd,count,face,pinned,angle,info }) => {
let (ig_g, modperm, _) = cs.check_acl_modify_pieces(ag, ig)?;
- let gref = ig_g.gref.clone();
let ig = &mut **ig_g;
let gs = &mut ig.gs;
let implicit: u32 = info.count(&ig.pcaliases)?
let mut pos = pos.unwrap_or(DEFAULT_POS_START);
let mut z = gs.max_z.z.clone_mut();
for piece_i in count {
- let ilks = &mut ig.ioccults.ilks;
+ let gs = &mut ig.gs;
let face = face.unwrap_or_default();
let mut gpc = GPiece {
held: None,
rotateable: true,
};
let PieceSpecLoaded { p, loaded_via_alias, occultable } =
- info.load(piece_i as usize, &mut gpc, &ig.pcaliases, &gref)?;
+ info.load(piece_i as usize, &mut gpc, &ig, SpecDepth::zero())?;
if p.nfaces() <= face.into() {
throw!(SpecError::FaceNotFound);
}
+ let gs = &mut ig.gs;
+ let ilks = &mut ig.ioccults.ilks;
let occilk = occultable.map(|(ilkname, p_occ)| {
ilks.insert(ilkname, OccultIlkData { p_occ })
});
}
const SEVERAL: usize = 3;
- let pcaliases = default();
+ let ig_dummy = Instance::dummy();
impl Prep {
fn want_several(&self) -> bool {
let spec = ItemSpec { lib: it.0, item: it.1.itemname.into() };
let sortkey = it.1.sortkey;
(||{
- let (p, _occultable) = spec.clone().find_load(&pcaliases)
+ let (p, _occultable) = spec.clone()
+ .find_load(&ig_dummy, SpecDepth::zero())
.context("load")?;
// todo show occulted version too
let mut uos = vec![];
#[typetag::serde(name="ChessClock")]
impl PieceSpec for Spec {
#[throws(SpecError)]
- fn load(&self, _: usize, gpc: &mut GPiece,
- _pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, _: usize, gpc: &mut GPiece, _ig: &Instance, _:SpecDepth)
-> PieceSpecLoaded {
if self.time <= 0 { throw!(SpecError::NegativeTimeout) }
#[typetag::serde(name="PickupDeck")]
impl PieceSpec for piece_specs::Deck {
#[throws(SpecError)]
- fn load(&self, _: usize, gpc: &mut GPiece,
- _pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, _: usize, gpc: &mut GPiece, _ig: &Instance, _:SpecDepth)
-> PieceSpecLoaded {
let common = SimpleCommon {
itemname: None,
pub const DEFAULT_TABLE_SIZE: Pos = PosC::new( 400, 200 );
pub const DEFAULT_TABLE_COLOUR: &str = "green";
+#[derive(Copy,Clone,Debug,Eq,Ord,PartialEq,PartialOrd)]
+pub struct SpecDepth(u16);
+
// ---------- general data types ----------
#[derive(Debug,Clone,Eq,PartialEq,Ord,PartialOrd)]
pub trait PieceSpec: Debug + Sync + Send + 'static {
#[throws(SpecError)]
fn count(&self, _pcaliases: &PieceAliases) -> usize { 1 }
- fn load(&self, i: usize, gpc: &mut GPiece,
- pcaliases: &PieceAliases, ir: &InstanceRef)
+ fn load(&self, i: usize, gpc: &mut GPiece, ig: &Instance, depth: SpecDepth)
-> Result<PieceSpecLoaded, SpecError>;
- fn load_occult(&self, _pcaliases: &PieceAliases)
+ fn load_occult(&self, _ig: &Instance, _:SpecDepth)
-> Result<Box<dyn OccultedPieceTrait>, SpecError> {
throw!(SpE::ComplexPieceWhereSimpleRequired)
}
}
}
+impl SpecDepth {
+ pub fn zero() -> Self { Self(0) }
+ pub fn increment(self) -> Option<Self> {
+ const MAX: SpecDepth = SpecDepth(5);
+ if self > MAX { return None }
+ Some(Self(self.0 + 1))
+ }
+}
+
impl Timestamp {
/// Always >= previously
pub fn now() -> Timestamp {
);
html
}
+
+ pub fn dummy() -> Instance {
+ Instance {
+ name: Arc::new("server::".parse().unwrap()),
+ gs: GameState::dummy(),
+ ipieces: IPieces(default()),
+ pcaliases: default(),
+ ioccults: default(),
+ clients: default(),
+ tokens_players: default(),
+ tokens_clients: default(),
+ acl: default(),
+ links: default(),
+ bundle_list: default(),
+ asset_url_key: AssetUrlKey::Dummy,
+ iplayers: default(),
+ }
+ }
+
}
pub fn games_lock() -> RwLockWriteGuard<'static, GamesTable> {
#[typetag::serde]
impl PieceSpec for piece_specs::Hand {
#[throws(SpecError)]
- fn load(&self, _: usize, gpc: &mut GPiece,
- _pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, _: usize, gpc: &mut GPiece, _ig: &Instance, _:SpecDepth)
-> PieceSpecLoaded {
gpc.moveable = PieceMoveable::IfWresting;
gpc.rotateable = false;
#[typetag::serde]
impl PieceSpec for piece_specs::PlayerLabel {
#[throws(SpecError)]
- fn load(&self, _: usize, _: &mut GPiece,
- _pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, _: usize, _: &mut GPiece, _ig: &Instance, _:SpecDepth)
-> PieceSpecLoaded {
self.c.load(Behaviour::PlayerLabel)?
}
.ok_or(SpecError::AliasNotFound)?
)
}
+
+ #[throws(SpecError)]
+ fn new_depth(&self, depth: SpecDepth) -> SpecDepth {
+ depth.increment().ok_or_else(||{
+ SpE::AliasLoop(self.target.clone())
+ })?
+ }
}
#[typetag::serde]
self.resolve(pcaliases)?.count(&default())?
}
#[throws(SpecError)]
- fn load(&self, i: usize, gpc: &mut GPiece,
- pcaliases: &PieceAliases, ir: &InstanceRef)
+ fn load(&self, i: usize, gpc: &mut GPiece, ig: &Instance, depth: SpecDepth)
-> PieceSpecLoaded {
- let mut r = self.resolve(pcaliases)?.load(i, gpc, &default(), ir)?;
+ let mut r = self.resolve(&ig.pcaliases)?
+ .load(i, gpc, ig, self.new_depth(depth)?)?;
r.loaded_via_alias = Some(self.target.clone());
r
}
#[throws(SpecError)]
- fn load_occult(&self, pcaliases: &PieceAliases)
+ fn load_occult(&self, ig: &Instance, depth: SpecDepth)
-> Box<dyn OccultedPieceTrait> {
- self.resolve(pcaliases)?.load_occult(&default())?
+ self.resolve(&ig.pcaliases)?.load_occult(ig, self.new_depth(depth)?)?
}
}
#[typetag::serde]
impl PieceSpec for piece_specs::Disc {
#[throws(SpecError)]
- fn load(&self, _: usize, _: &mut GPiece,
- _pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, _: usize, _: &mut GPiece, _ig: &Instance, _:SpecDepth)
-> PieceSpecLoaded {
SimplePieceSpec::load(self)?
}
#[typetag::serde]
impl PieceSpec for piece_specs::Rect {
#[throws(SpecError)]
- fn load(&self, _: usize, _: &mut GPiece,
- _pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, _: usize, _: &mut GPiece, _ig: &Instance, _:SpecDepth)
-> PieceSpecLoaded {
SimplePieceSpec::load(self)?
}
impl ItemSpec {
#[throws(SpecError)]
- pub fn find_load(&self, pcaliases: &PieceAliases) -> ItemSpecLoaded {
+ pub fn find_load(&self, ig: &Instance, depth: SpecDepth) -> ItemSpecLoaded {
let lib = libs_lookup(&self.lib)?;
let (item, idata) = lib.items.get_key_value(self.item.as_str())
.ok_or(SpE::LibraryItemNotFound(self.clone()))?;
- lib.load1(idata, &self.lib, item.unnest::<str>(), pcaliases)?
+ lib.load1(idata, &self.lib, item.unnest::<str>(), ig, depth)?
}
fn from_strs<L,I>(lib: &L, item: &I) -> Self
#[throws(SpecError)]
fn load1(&self, idata: &ItemData, lib_name: &str,
name: &SvgBaseName<str>,
- pcaliases: &PieceAliases)
+ ig: &Instance, depth:SpecDepth)
-> ItemSpecLoaded {
let svg_data = self.load_svg(name, lib_name, &**name)?;
face.xform.scale[0] *= -1.;
faces.push(face);
} else if let Some(back_spec) = &idata.group.d.back {
- match back_spec.load_occult(pcaliases) {
+ match back_spec.load_occult(ig, depth) {
Err(SpecError::AliasNotFound) => { },
Err(e) => throw!(e),
Ok(p) => {
for (k,v) in &self.items {
if !pat.matches(k.as_str()) { continue }
let (loaded, _) = match
- self.load1(v, &self.libname, k.unnest(), &default())
+ self.load1(v, &self.libname, k.unnest(),
+ &Instance::dummy(), SpecDepth::zero())
{
Err(SpecError::LibraryItemNotFound(_)) => continue,
Err(SpecError::LibraryItemNotPrepared(_)) => continue,
#[typetag::serde(name="Lib")]
impl PieceSpec for ItemSpec {
#[throws(SpecError)]
- fn load(&self, _: usize, _: &mut GPiece,
- pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, _: usize, _: &mut GPiece, ig: &Instance, depth: SpecDepth)
-> PieceSpecLoaded {
- self.find_load(pcaliases)?.into()
+ self.find_load(ig,depth)?.into()
}
#[throws(SpecError)]
- fn load_occult(&self, pcaliases: &PieceAliases)
+ fn load_occult(&self, ig: &Instance, depth: SpecDepth)
-> Box<dyn OccultedPieceTrait> {
- self.find_load(pcaliases)?.0 as Box<dyn OccultedPieceTrait>
+ self.find_load(ig,depth)?.0 as Box<dyn OccultedPieceTrait>
}
}
fn count(&self, _pcaliases: &PieceAliases) -> usize { self.items.len() }
#[throws(SpecError)]
- fn load(&self, i: usize, _: &mut GPiece,
- pcaliases: &PieceAliases, _ir: &InstanceRef)
+ fn load(&self, i: usize, _: &mut GPiece, ig: &Instance, depth:SpecDepth)
-> PieceSpecLoaded
{
let item = self.items.get(i).ok_or_else(
)?;
let item = format!("{}{}{}", &self.prefix, item, &self.suffix);
let lib = self.lib.clone();
- ItemSpec { lib, item }.find_load(pcaliases)?.into()
+ ItemSpec { lib, item }.find_load(ig,depth)?.into()
}
}
ComplexPieceWhereSimpleRequired,
AliasNotFound,
AliasTargetMultiSpec,
+ AliasLoop(String),
}
display_as_debug!{SpecError}