chiark / gitweb /
set up a gamestate
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Jun 2020 18:49:49 +0000 (19:49 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Jun 2020 18:49:49 +0000 (19:49 +0100)
junk/gamestate.rs
junk/instance.rs
src/bin/server.rs
src/gamestate.rs [new file with mode: 0644]
src/global.rs
src/imports.rs
src/lib.rs
src/pieces.rs [new file with mode: 0644]

index 90e614935eb3dd3d3cfe8dfd2c6db1f9aeeb9cc3..7c07c79e9a5f3e79a753518f28f549a8b4418922 100644 (file)
@@ -3,20 +3,11 @@ pub trait Piece {
   fn svg(&self, pr : &PiecedRecord) -> SvgData;
 }
 
-#[derive(Debug)]
-pub struct PieceRecord {
-  pos : Pos,
-  p : Rc<dyn Piece>,
-  held : Option<PlayerRef>,
-}
-
 struct PlayerRecord {
   nick : String,
 }
 
-#[derive(Debug)]
 pub struct GameState {
-  pub pieces : Vec<Rc<PieceRecord>>,
   pub players : Vec<PlayerRecord>,
 }
 
index ea2e60673dccd9f3934a8b892b2b708e0e39779c..d02f52128ac1fe3acf07f08738cc548c198b15c6 100644 (file)
@@ -11,7 +11,6 @@ pub struct Instance {
 #[derive(Debug)]
 struct Game {
   gen : Counter,
-  gs : GameState,
   log : VecDeque<LogEntry>,
 }
 
index fc543abd1e4e0c2c5b159de73dd59c50e20df66c..f0f1c2e520e2d2b79d4ec3c677b904b4dab5daf3 100644 (file)
@@ -128,7 +128,7 @@ fn resource(leaf : CheckedResourceLeaf) -> io::Result<NamedFile> {
 }  
 
 fn main() {
-  global::xxx_global_setup();
+  xxx_global_setup();
 
   let helmet = SpaceHelmet::default()
     .enable(NoSniff::Enable)
diff --git a/src/gamestate.rs b/src/gamestate.rs
new file mode 100644 (file)
index 0000000..bca051f
--- /dev/null
@@ -0,0 +1,35 @@
+
+use crate::imports::*;
+
+slotmap::new_key_type!{
+  pub struct PieceId;
+}
+
+pub trait Piece : Send + Debug {
+}
+
+#[derive(Debug)]
+pub struct PieceRecord {
+  pos : Pos,
+  p : Box<dyn Piece>,
+  face : FaceId,
+  held : Option<UserId>,
+}
+
+#[derive(Debug)]
+pub struct GameState {
+  pub pieces : DenseSlotMap<PieceId,PieceRecord>,
+}
+
+pub fn xxx_gamestate_init() -> GameState {
+  let mut pieces = DenseSlotMap::with_key();
+  for (pos, p) in xxx_make_pieces() {
+    let pr = PieceRecord {
+      pos, p,
+      face : 0.into(),
+      held : None,
+    };
+    pieces.insert(pr);
+  }
+  GameState { pieces }
+}
index 7c38be3b7d6d8963070f475a284a5770b3488f1f..f81f1b9bba88b10e90ff17ebf84530602ff90bb1 100644 (file)
@@ -26,6 +26,7 @@ pub struct User {
 pub struct Instance {
   /* game state goes here */
   pub users : DenseSlotMap<UserId,User>,
+  pub gs : GameState,
 }
 
 #[derive(Clone)]
@@ -74,6 +75,7 @@ impl<'r> FromParam<'r> for InstanceAccess<'r> {
 pub fn xxx_global_setup() {
   let i = Instance {
     users : Default::default(),
+    gs : xxx_gamestate_init(),
   };
   let i = Arc::new(Mutex::new(i));
   let mut ig = i.lock().unwrap();
index 9a1efe3e0174e4da22436597265d9a5a101552ac..478a6663618cf969974bffb652963be14738edba 100644 (file)
@@ -1,6 +1,7 @@
 
 pub use std::io;
 pub use std::io::{BufReader,Read};
+pub use std::fmt::Debug;
 pub use std::thread;
 pub use std::time::Duration;
 pub use std::sync::{Arc,Mutex,RwLock};
@@ -25,10 +26,11 @@ pub use rocket::response::NamedFile;
 pub use rocket::response;
 
 pub use slotmap::dense::{DenseSlotMap};
+pub use index_vec::{define_index_type,index_vec,IndexVec};
 
-pub use crate::global;
-pub use crate::global::{lookup_token,InstanceAccess,InstanceAccessDetails};
-pub use crate::global::{Client,ClientId};
+pub use crate::global::*;
+pub use crate::gamestate::*;
+pub use crate::pieces::*;
 
 pub type E = anyhow::Error;
 
index 743d4498d9328efcb4b112f593b4ae6f8dedae8a..62de69ea2a2713f751efe1679a27df4187c5bf1a 100644 (file)
@@ -1,3 +1,5 @@
 
 pub mod imports;
 pub mod global;
+pub mod pieces;
+pub mod gamestate;
diff --git a/src/pieces.rs b/src/pieces.rs
new file mode 100644 (file)
index 0000000..4fc36f5
--- /dev/null
@@ -0,0 +1,30 @@
+
+use crate::imports::*;
+
+define_index_type! {
+  pub struct FaceId = u8;
+}
+
+#[derive(Debug)]
+struct SimpleShape {
+  shape : String,
+  colours : IndexVec<FaceId,Colour>,
+}
+
+impl Piece for SimpleShape {
+}
+
+pub fn xxx_make_pieces() -> Vec<(Pos, Box<dyn Piece>)> {
+  vec![
+    ([ 50, 80 ],
+     Box::new(SimpleShape {
+       shape : r#"<circle cx="0" cy="0" r="10"/>"#.to_owned(),
+       colours : index_vec![ "red".to_string(), "grey".to_string() ],
+     })),
+    ([ 50, 60 ],
+     Box::new(SimpleShape {
+       shape : r#"<rect x="-10" y="-10" width="20" height="20"/>"#.to_owned(),
+       colours : index_vec![ "blue".to_string(), "grey".to_string() ],
+     })),
+  ]
+}