chiark / gitweb /
wip gamestate before trying to think about what js needs
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 17 May 2020 13:27:23 +0000 (14:27 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 17 May 2020 13:27:23 +0000 (14:27 +0100)
src/gamestate.rs

index c0bea89257bf284940ae8f29ab31b326b11d801b..994f25dedfe506828883d257ad2ac193d1eaed8d 100644 (file)
@@ -1,5 +1,7 @@
 
 pub trait Piece {
+  type Msg : Serialize;
+  fn msg(&self) -> Msg;
 }
 
 #[derive(Debug)]
@@ -10,14 +12,16 @@ pub struct PieceRecord {
   held : Option<PlayerRef>,
 }
 
+const RECENT_BUFFER : usize = 10;
+
 #[derive(Debug)]
 pub struct GameState {
   gen : Counter,
   data : GameStateData,
-  clients,
+  recent : VecDeque<MsgUpdate>,
+  notify : Condvar,
 }
 
-
 #[derive(Debug)]
 pub struct GameStateData {
   pub pieces : Vec<PieceRecord>,
@@ -32,35 +36,53 @@ impl Deref for GameState {
 impl GameState {
   fn as_ref(&self) -> (&usize, &GameStateData) { (&self.gen, &self.data) }
   fn gen(&self) -> usize { self.gen }
-}
-
 
+  fn<F> update(&mut self, f : F)
+  where F : FnOnce(&mut GameStateData) -> MsgUpdate {
+    let msg = f(&mut self.data),
+    if let MsgNoUpdate = msg { return }
+    self.gen += 1,
+    if self.recent.len() >= RECENT_BUFFER { self.pop_front() }
+    self.recent.push_back(msg);
+    self.notify.notify_all();
+  }
+}
 
 #[derive(Serialize)]
 enum MsgUpdate {
-  InsertPiece(usize, MsgPiece),
-  DeletePiece(usize),
-  UpdatePiece(usize, MsgPiece),
+  MsgNoUpdate,
+  MsgPieceInsert(usize, MsgPiece),
+  MsgPieceDelete(usize),
+  MsgPieceUpdate(usize, MsgPiece),
 }
 
-struct DataGuard<'gs> {
-  gs : &'gs mut GameState,
-  msg : MsgUpdate,
-}
-impl<'gs> Deref for DataGuard<'gs> {
-  type Output = GameState;
-  fn deref(&self) -> GameState<'gs> { self.gs }
-}
-impl<'gs> DerefMut for DataGuard<'gs> {
-  fn deref_mut(&mut self) -> GameState<'gs> { self.gs }
+struct MsgPiece {
+  
 }
 
-impl GameState {
-  fn update(&mut self, msg : MsgUpdate) -> DataGuard<'_> {
-    DataGuard { gs : self, msg }
+impl PieceRecord {
+  fn msg(&self) -> MsgPiece {
+    
   }
 }
 
-impl Drop for DataGuard {
-  
+impl GameState {
+  fn piece_insert(&mut self, i : usize, p : PieceRecord) {
+    self.update(|d| {
+      d.pieces.insert(i, p);
+      MsgPieceInsert(i, p.msg())
+    );
+  }
+  fn piece_delete(&mut self, i : usize) {
+    self.update(|d| {
+      d.pieces.remove(i, p);
+      MsgPieceDelete(i)
+    }
+  }
+  fn piece_update(&mut self, i : usize, p : PieceRecord) {
+    self.update(|d| {
+      d.pieces[i] = p,
+      MsgPieceUpdate(i, p.msg()),
+    }
+  }
 }