chiark / gitweb /
allow setting of the table colour
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 29 Nov 2020 21:18:37 +0000 (21:18 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 29 Nov 2020 21:18:37 +0000 (21:18 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/otter.rs
src/cmdlistener.rs
src/commands.rs
src/spec.rs
src/updates.rs

index 0448cc73cbd4301457796ef78fb65e6b263732e5..8cd15dd4f2677eac164db85b147054ceebc8ca85 100644 (file)
@@ -789,6 +789,7 @@ mod reset_game {
     let GameSpec {
       table_size,
       pieces,
+      table_colour,
     } = read_spec(&ma, &args.game_file)?;
 
     let mut insns = vec![];
@@ -816,6 +817,9 @@ mod reset_game {
     if let Some(table_size) = table_size {
       insns.push(MGI::SetTableSize(table_size));
     }
+    if let Some(table_colour) = table_colour {
+      insns.push(MGI::SetTableColour(table_colour));
+    }
 
     for pspec in pieces.into_iter() {
       insns.push(MGI::AddPieces(pspec));
index 663fdde72e74e729e417a481589a5a262d6f0828..37b62102933ea5decd57702b8a7664dd3715d88e 100644 (file)
@@ -311,6 +311,19 @@ fn execute_game_insn<'cs, 'igr, 'ig : 'igr>(
        Fine, ig)
     }
 
+    Insn::SetTableColour(colour) => {
+      let ig = cs.check_acl(ag, ig, PCH::Instance, &[TP::ChangePieces])?.0;
+      let colour : Colour = (&colour).try_into()?;
+      ig.gs.table_colour = colour.clone();
+      (U{ pcs: vec![],
+          log: vec![ LogEntry {
+            html: Html(format!("{} recoloured the tabletop to {}",
+                               &who.0, &colour.0)),
+          }],
+          raw: Some(vec![ PreparedUpdateEntry::SetTableColour(colour) ]) },
+       Fine, ig)
+    }
+
     Insn::JoinGame {
       details: MgmtPlayerDetails { nick }
     } => {
index 1e08f92201a29b2ec37236ab0a7207ec39ff49b7..2f395204ed1bb1d93e099fcbcfa3fa5137afa618 100644 (file)
@@ -71,6 +71,7 @@ pub enum MgmtGameInstruction {
   Noop,
   Info,
   SetTableSize(Pos),
+  SetTableColour(ColourSpec),
 
   ListPieces,
   AddPieces(PiecesSpec),
index 98e2a5e0efc54fa6d97f4e6acc3f1782f97a35fc..c2656a8ae32948fb59fea42ebea222b48700b725 100644 (file)
@@ -44,6 +44,7 @@ define_index_type! {
 #[derive(Serialize,Deserialize)]
 #[derive(Debug,Default)]
 #[repr(transparent)]
+#[serde(transparent)]
 pub struct ColourSpec(String);
 
 #[derive(Error,Clone,Serialize,Deserialize,Debug)]
@@ -128,6 +129,7 @@ pub struct UrlOnStdout;
 pub struct GameSpec {
   pub table_size : Option<Pos>,
   pub pieces : Vec<PiecesSpec>,
+  pub table_colour: Option<ColourSpec>,
 }
 
 #[derive(Debug,Serialize,Deserialize)]
index 5aff07f18beece904455c072cb436b688aedcb51..5a4ad4e8bf2975e8594af6643ed6d5f4728545bf 100644 (file)
@@ -47,6 +47,7 @@ pub enum PreparedUpdateEntry {
     op : PieceUpdateOp<PreparedPieceState,ZLevel>,
   },
   SetTableSize(Pos),
+  SetTableColour(Colour),
   AddPlayer { player: PlayerId, data: DataLoadPlayer },
   RemovePlayer { player: PlayerId },
   Log (Arc<CommittedLogEntry>),
@@ -111,6 +112,7 @@ enum TransmitUpdateEntry<'u> {
     ns: &'u PreparedPieceState,
   },
   SetTableSize(Pos),
+  SetTableColour(&'u Colour),
   AddPlayer { player: PlayerId, data: &'u DataLoadPlayer },
   RemovePlayer { player: PlayerId },
   #[serde(serialize_with="serialize_logentry")]
@@ -198,6 +200,9 @@ impl PreparedUpdateEntry {
       AddPlayer { player:_, data: DataLoadPlayer { dasharray } } => {
         dasharray.as_bytes().len() + 100
       },
+      SetTableColour(colour) => {
+        colour.0.as_bytes().len() + 50
+      },
       SetTableSize(_) |
       RemovePlayer { player:_ } |
       Error(_,_) => {
@@ -532,6 +537,9 @@ impl PreparedUpdate {
         &PUE::SetTableSize(size) => {
           TUE::SetTableSize(size)
         },
+        PUE::SetTableColour(colour) => {
+          TUE::SetTableColour(colour)
+        },
         &PUE::AddPlayer { player, ref data } => {
           TUE::AddPlayer { player, data }
         },