From: Ian Jackson Date: Sun, 19 Jul 2020 11:59:53 +0000 (+0100) Subject: wip load X-Git-Tag: otter-0.2.0~1288 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=0673a00168a5327e77ddba910aabea0f9b9e9df0;p=otter.git wip load --- diff --git a/src/gamestate.rs b/src/gamestate.rs index 9aad9064..795f072e 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -76,11 +76,6 @@ pub trait Piece : Send + Debug { // #[throws] doesn't work here for some reason fn svg_piece(&self, f: &mut String, pri: &PieceRenderInstructions) -> SR; -/* - #[throws(SE)] - fn outline_path(&self, pri : &PieceRenderInstructions) -> String; -*/ - #[throws(SE)] fn surround_path(&self, pri : &PieceRenderInstructions) -> String; diff --git a/src/global.rs b/src/global.rs index 22988a39..e8429323 100644 --- a/src/global.rs +++ b/src/global.rs @@ -212,13 +212,43 @@ impl InstanceGuard<'_> { fn load_something(name: &str, prefix: &str) -> T { let inp = Self::savefile(name, prefix, ""); let mut f = BufReader::new(fs::File::open(&inp)?); + // xxx handle ENOENT specially, own OE variant rmp_serde::decode::from_read(&mut f)? } -/* + + #[throws(OE)] pub fn load(instance_name: String) -> Arc> { - let gs = Self::savefile(&instance_name,"g-"); - - }*/ + let gs : GameState = Self::load_something(&instance_name, "g-")?; + let mut al : InstanceSaveAccesses + = Self::load_something(&instance_name, "a-")?; + let mut updates : SecondarySlotMap<_,_> = Default::default(); + for player in gs.players.keys() { + updates.insert(player, Default::default()); + } + let inst = Instance { + name : instance_name, + gs, updates, + clients : Default::default(), + tokens_clients : Default::default(), + tokens_players : Default::default(), + }; + let amu = Arc::new(Mutex::new(inst)); + let mut ig = amu.lock().unwrap(); + for (token, _) in &al.tokens_players { + ig.tokens_players.tr.insert(RawToken(token.clone())); + } + let mut global = GLOBAL.players.write().unwrap(); + for (token, player) in al.tokens_players.drain(0..) { + let iad = InstanceAccessDetails { + g : amu.clone(), + ident : player, + }; + global.insert(RawToken(token), iad); + } + drop(global); + drop(ig); + amu + } } // ---------- Lookup and token API ----------