chiark / gitweb /
wip load
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 19 Jul 2020 11:59:53 +0000 (12:59 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 19 Jul 2020 11:59:53 +0000 (12:59 +0100)
src/gamestate.rs
src/global.rs

index 9aad9064acf4beedb555a19d4856b298213f5470..795f072e9fbf43a98947dfebe5a421de53a44932 100644 (file)
@@ -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;
 
index 22988a392530a8f66f355243848bdd7fe6cb936e..e8429323c8dc5c09c577556a17e33722474aed74 100644 (file)
@@ -212,13 +212,43 @@ impl InstanceGuard<'_> {
   fn load_something<T:DeserializeOwned>(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<Mutex<Instance>> {
-    let gs = Self::savefile(&instance_name,"g-");
-    
-  }*/
+    let gs : GameState = Self::load_something(&instance_name, "g-")?;
+    let mut al : InstanceSaveAccesses<String>
+                       = 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 ----------