From 093abf0878158facea0f25a936f728728b645bdc Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 23 Mar 2021 23:37:25 +0000 Subject: [PATCH] hand: text seems to work in tests Signed-off-by: Ian Jackson --- specs/mao.game.toml | 4 ++++ src/hand.rs | 27 ++++++++++++++++++++------- src/spec.rs | 17 +++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/specs/mao.game.toml b/specs/mao.game.toml index 004e0a3a..d1440ddb 100644 --- a/specs/mao.game.toml +++ b/specs/mao.game.toml @@ -112,6 +112,8 @@ shape.xy = [97,25] [[pieces]] pos = [250, 65] colour = "yellow" +label.place = "TopLeft" +label.colour = "black" type = "Hand" edge = "darkgrey" @@ -172,6 +174,8 @@ shape.xy = [97,25] [[pieces]] pos = [50, 135] colour = "white" +label.place = "BottomLeft" +label.colour = "black" type = "Hand" edge = "darkgrey" diff --git a/src/hand.rs b/src/hand.rs index 71c79fda..4679ed86 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -3,6 +3,7 @@ // There is NO WARRANTY. use crate::prelude::*; +use piece_specs::{HandLabel, HandLabelPlace}; pub const UNCLAIMED_DESC: &str = "a hand repository"; @@ -16,6 +17,7 @@ struct MagicOwner { #[derive(Debug,Serialize,Deserialize)] struct Hand { shape: GenericSimpleShape<(), shapelib::Rectangle>, + label: Option, } #[derive(Debug,Clone,Default,Serialize,Deserialize)] @@ -67,6 +69,7 @@ impl PieceSpec for piece_specs::Hand { &common)?; let p = Box::new(Hand { shape, + label: self.label.clone(), }) as Box; PieceSpecLoaded { p, occultable: None } } @@ -104,20 +107,30 @@ impl PieceTrait for Hand { if_chain! { if let Some(owned) = owned; if let Some(gpl) = gs.players.get(owned.player); - if let Some(colour) = self.shape.edges.get(0); - let signum = if false { -1. } else { 1. }; + if let Some(spec) = &self.label; + let colour = { + if let Some(c) = &spec.colour { &c.0 } + else if let Some(c) = self.shape.edges.get(0) { &c.0 } + else { "black" } + }; let fontsz = 4.; let PosC([x,y]) = { - let mut pos = (self.shape.outline.xy * -0.5)?; - pos.0[1] -= 0.5 * fontsz; - pos.0[1] *= signum; - pos.0[1] += 0.5 * fontsz; + use HandLabelPlace::*; + let eff_size = (self.shape.outline.xy - PosC([2.,2.]))?; + let mut pos = (eff_size * -0.5)?; + let y = &mut pos.0[1]; + *y += 0.5 * fontsz; + match spec.place { + TopLeft => { *y *= -1. }, + BottomLeft => { }, + }; + *y += 0.5 * fontsz; pos }; then { write!(f.0, r##"{}"##, - x, y, fontsz, &colour.0, + x, y, fontsz, colour, htmlescape::encode_minimal(&gpl.nick))?; } } diff --git a/src/spec.rs b/src/spec.rs index d1589708..316d655d 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -246,6 +246,19 @@ pub mod piece_specs { pub edge: Option, pub edge_width: Option, pub shape: Outline, + pub label: Option, + } + + #[derive(Debug,Clone,Serialize,Deserialize)] + pub struct HandLabel { + #[serde(default)] pub place: HandLabelPlace, + pub colour: Option, + } + + #[derive(Debug,Copy,Clone,Serialize,Deserialize,Eq,PartialEq)] + pub enum HandLabelPlace { + BottomLeft, + TopLeft, } #[derive(Debug,Serialize,Deserialize)] @@ -424,6 +437,10 @@ pub mod implementation { } } + impl Default for piece_specs::HandLabelPlace { + fn default() -> Self { Self::BottomLeft } + } + impl Default for Acl

{ fn default() -> Self { Acl { ents: default() } } } -- 2.30.2