chiark / gitweb /
Support stack_pos on PickupDeck
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 22 May 2022 22:43:49 +0000 (23:43 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 22 May 2022 22:43:49 +0000 (23:43 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
docs/gamespec.rst
src/deck.rs
src/spec.rs

index d1f13bdc0f11f0bb75922d0f2807d5191b9f7ea5..a47e3672b6f2a9d278b41caf9523fa1debf13b19 100644 (file)
@@ -237,6 +237,9 @@ Honours ``edges``, ``edge_width``.
 
 Honours ``label``, displaying the number of of pieces in (on) this deck.
 
+ * ``stack_pos``: When stacking neatly, stack here relative to the
+   deck centre.  [two numbers, ``[0,0]``]
+
 Example::
   
   [[pieces]]
index ab4603423d2a8dd39e8b29851256ba7507a56469..08137254503c3f59ffdcbd315ae8d04108f20cbf 100644 (file)
@@ -14,6 +14,7 @@ pub const ENABLED_DESC : HtmlLit = Html::lit("a pickup deck (enabled)");
 struct Deck {
   shape: GenericSimpleShape<(), RectOutline>,
   label: Option<PieceLabelLoaded>,
+  stack_pos: Pos,
 }
 
 #[derive(Debug,Clone,Copy,Ord,PartialOrd,Eq,PartialEq)]
@@ -60,6 +61,7 @@ impl PieceSpec for piece_specs::Deck {
     gpc.rotateable = false;
     let p = Box::new(Deck {
       shape,
+      stack_pos: PosC { coords: self.stack_pos },
       label: self.label.load()?,
     }) as Box<dyn PieceTrait>;
     SpecLoaded {
@@ -196,7 +198,11 @@ impl PieceTrait for Deck {
       Disabled => None,
       Counting => Some(OccKG::Visible),
       Enabled  => {
-        let displace = OccDisplacement::Stack { pos: gpc.pos };
+        let pos = (|| {
+          (gpc.pos + self.stack_pos).ok()?
+            .clamped(gs.table_size).ok()
+        })().ok_or_else(|| Ia::PosOffTable)?;
+        let displace = OccDisplacement::Stack { pos };
         let displace = (displace, gpc.zlevel.z.clone());
                   Some(OccKG::Displaced(displace))
       },
index 7ba438cc957ca96a323ea98bbc00fbafe2aade1d..9fea2654796e1da8c73e8185ae00e90e18b0beaf 100644 (file)
@@ -335,6 +335,7 @@ pub mod piece_specs {
     pub edge_width: Option<f64>,
     pub shape: Outline,
     pub label: Option<PieceLabel>,
+    #[serde(default)] pub stack_pos: [Coord; 2],
   }
 }