From: Ian Jackson Date: Sun, 31 May 2020 22:10:06 +0000 (+0100) Subject: found X-Git-Tag: otter-0.2.0~1607 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e440fcb7156f1a3699de5ab8e85447a864da261a;p=otter.git found --- diff --git a/src/gamestate.rs b/src/gamestate.rs index 761e14fd..20fdd4e6 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -5,55 +5,54 @@ pub trait Piece { #[derive(Debug)] pub struct PieceRecord { pos : Pos, - p : Box, + p : Rc, held : Option, } #[derive(Debug)] pub struct GameState { - pub pieces : Vec, - pub players : Vec, + pub pieces : Vec>, + pub players : Vec>, } -type MsgPiece = SvgData; - pub struct GameRef (InstanceGuard); impl Deref for GameRef { type Output = GamState; fn deref(&self) -> &GameState { self.0.read() } } - -#[derive(Serialize)] -enum MsgUpdate { - MsgNoUpdate, - MsgPieceInsert(usize, MsgPiece), - MsgPieceDelete(usize), - MsgPieceUpdate(usize, MsgPiece), +enum GameUpdate { + NoUpdate, + PieceInsert(usize, PieceRecord), + PieceDelete(usize, PieceRecord), + PieceUpdate(usize, PieceRecord, PieceRecord), } +struct LogMessage (HtmlString); + impl PieceRecord { fn msg(&self) -> MsgPiece { self.p.svg(self) } } impl GameRef { - fn piece_insert(&mut self, i : usize, p : PieceRecord) { - self.0.update(|d| { - d.pieces.insert(i, p); - MsgPieceInsert(i, p.msg()) + fn piece_insert(&mut self, i : usize, + p : Rc, msg : LogMessage) { + self.0.action(|g| { + g.pieces.insert(i, p); + (msg, MsgPieceInsert(i, p)) ); - } - fn piece_delete(&mut self, i : usize) { - self.0.update(|d| { - d.pieces.remove(i, p); - MsgPieceDelete(i) + fn piece_delete(&mut self, i : usize, msg : LogMessage) { + self.0.action(|g| { + let old = g.pieces.remove(i, p); + (msg, MsgPieceDelete(i, old)) } } fn piece_update(&mut self, i : usize, p : PieceRecord) { - self.0.update(|d| { - d.pieces[i] = p, - MsgPieceUpdate(i, p.msg()), + self.0.action(|g| { + let new = p.clone(); + let old = replace(g.pieces[i], p); + (msg, MsgPieceUpdate(i, old, new)) } } } diff --git a/src/instance.rs b/src/instance.rs index 720cb1ce..0118dfcb 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -11,7 +11,18 @@ pub struct Instance { struct Game { gen : Counter, gs : GameState, - recent : VecDeque, + log : VecDeque, +} + +struct LogEntry { + game : Vec, + msgs : Vec, +} + +impl From<(LogMessage, GameUpdate)> for LogEntry { + fn from((msg, gu) : (LogMessage, GameUpdate)) -> LogEntry { + LogEntry { game : vec![lm], msgs: vec![msg] } + } } impl Instance { @@ -44,13 +55,15 @@ impl InstanceGuard { fn read(&self) -> &GameState { &self.g.deref().gs } fn iname(&self) -> &str { self.iname } - fn update(&mut self, f : F) - where F : FnOnce(&mut GameState) -> MsgUpdate { + fn action(&mut self, f : F) + where F : FnOnce(&mut GameState) -> L + L : Into + { let msg = f(&mut self.gs.g), if let MsgNoUpdate = msg { return } self.gs.gen += 1, if self.gw.recent.len() >= RECENT_BUFFER { self.pop_front() } - self.g.recent.push_back(msg); + self.g.evenglog.push_back(msg); self.g_notify.notify_all(); } }