From cfbe8fa7e801f5f67415af2f03eb2c0eaa2ae8cb Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 26 Sep 2020 20:18:37 +0100 Subject: [PATCH] new itemname regime itemnames are now global in scope, and there is no separate "category" Signed-off-by: Ian Jackson --- library/wikimedia.toml | 5 +---- src/cmdlistener.rs | 6 ++++-- src/commands.rs | 1 + src/gamestate.rs | 2 ++ src/pieces.rs | 16 ++++++++++++---- src/shapelib.rs | 6 +++++- src/spec.rs | 2 ++ 7 files changed, 27 insertions(+), 11 deletions(-) diff --git a/library/wikimedia.toml b/library/wikimedia.toml index 23e61e24..a646de19 100644 --- a/library/wikimedia.toml +++ b/library/wikimedia.toml @@ -19,7 +19,6 @@ outline = "Circle" scale = 0.20 size = [45] centre = [22.5, 22.5] -category = "chess" item_prefix = "chess-" stem_prefix = "Chess_" files = """ @@ -101,8 +100,6 @@ outline = "Square" size = [448,326] centre = [224, 163] scale = 0.025 -category = "management/library-load-marker" -# xxx this is clumsy, we want to use [[files]] files = """ -library-load-marker Box_with_polygons a library load area marker +mgmt-library-load-marker Box_with_polygons a library load area marker """ diff --git a/src/cmdlistener.rs b/src/cmdlistener.rs index 7f298399..5ec81846 100644 --- a/src/cmdlistener.rs +++ b/src/cmdlistener.rs @@ -163,8 +163,10 @@ fn execute_game_insn(cs: &CommandStream, Insn::ListPieces => readonly(ig, { let pieces = ig.gs.pieces.iter().map(|(piece,p)|{ let &PieceState { pos, face, .. } = p; - let desc_html = ig.pieces.get(piece)?.describe_html(None); - Some(MgmtGamePieceInfo { piece, pos, face, desc_html }) + let pinfo = ig.pieces.get(piece)?; + let desc_html = pinfo.describe_html(None); + let itemname = pinfo.itemname().to_string(); + Some(MgmtGamePieceInfo { piece, pos, face, desc_html, itemname }) }).flatten().collect(); Resp::Pieces(pieces) }), diff --git a/src/commands.rs b/src/commands.rs index b1408356..aa0d932f 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -62,6 +62,7 @@ pub struct MgmtGameResponseGameInfo { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct MgmtGamePieceInfo { pub piece: PieceId, + pub itemname: String, pub pos: Pos, pub face: FaceId, pub desc_html: Html, diff --git a/src/gamestate.rs b/src/gamestate.rs index 0d231c54..9cabc5aa 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -103,6 +103,8 @@ pub trait Piece : Outline + Send + Debug { -> ExecuteGameChangeUpdates { ExecuteGameChangeUpdates{ pcs: vec![], log: vec![], raw: None } } + + fn itemname(&self) -> &str; } #[derive(Debug,Copy,Clone)] diff --git a/src/pieces.rs b/src/pieces.rs index 36d9ab9c..f313cbee 100644 --- a/src/pieces.rs +++ b/src/pieces.rs @@ -16,6 +16,7 @@ struct SimpleShape { scaled_path : Html, approx_dia : Coord, colours : ColourMap, + itemname: String, } pub const SELECT_SCALE : f64 = 1.1; @@ -134,11 +135,14 @@ impl Piece for SimpleShape { self.colours.get(face).ok_or(SpecError::FaceNotFound)?; face } + + fn itemname(&self) -> &str { &self.itemname } } impl SimpleShape { fn new_from_path(desc: Html, path: Html, approx_dia: Coord, - faces: &IndexVec) + faces: &IndexVec, + itemname: String) -> Result,SpecError> { let scaled_path = svg_rescale_path(&path, SELECT_SCALE)?; let colours = faces @@ -146,7 +150,7 @@ impl SimpleShape { .map(|s| s.try_into()) .collect::>()?; Ok(Box::new(SimpleShape { - scaled_path, desc, approx_dia, path, colours, + scaled_path, desc, approx_dia, path, colours, itemname })) } } @@ -156,8 +160,10 @@ impl PieceSpec for piece_specs::Disc { #[throws(SpecError)] fn load(&self) -> Box { let path = svg_circle_path(self.diam as f64)?; + let itemname = self.itemname.clone() + .unwrap_or_else(||"simple-disc".to_string()); SimpleShape::new_from_path(Html::lit("circle"), path, self.diam, - &self.faces)? + &self.faces, itemname)? } } @@ -172,7 +178,9 @@ impl PieceSpec for piece_specs::Square { }; let path = Html(format!("M {} {} h {} v {} h {} z", -(x as f64)*0.5, -(y as f64)*0.5, x, y, -x)); + let itemname = self.itemname.clone() + .unwrap_or_else(||"simple-square".to_string()); SimpleShape::new_from_path(Html::lit("square"), path, (x+y+1)/2, - &self.faces)? + &self.faces, itemname)? } } diff --git a/src/shapelib.rs b/src/shapelib.rs index 53c324e1..50d339dc 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -132,6 +132,7 @@ struct ItemFace { #[derive(Debug,Serialize,Deserialize)] struct Item { + itemname: String, faces: IndexVec, desc_hidden: DescId, descs: IndexVec, @@ -171,6 +172,8 @@ impl Piece for Item { None => self.desc_hidden, }].clone() } + + fn itemname(&self) -> &str { &self.itemname } } impl ItemSpec { @@ -204,7 +207,8 @@ impl ItemSpec { let scale = idata.group.d.scale; let face = ItemFace { svg: Html(svg_data), desc, centre, scale }; let faces = index_vec![ face ]; - let it = Item { faces, descs, outline, desc_hidden }; + let it = Item { faces, descs, outline, desc_hidden, + itemname: self.item.clone() }; Ok(Box::new(it)) } } diff --git a/src/spec.rs b/src/spec.rs index b0a033e7..6e217ff9 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -91,12 +91,14 @@ pub mod piece_specs { #[derive(Debug,Serialize,Deserialize)] pub struct Disc { + pub itemname: Option, pub diam : Coord, pub faces : IndexVec, } #[derive(Debug,Serialize,Deserialize)] pub struct Square { + pub itemname: Option, pub size : Vec, pub faces : IndexVec, } -- 2.30.2