chiark / gitweb /
occult ilks: Save and restore
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 11 Mar 2021 10:29:06 +0000 (10:29 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 11 Mar 2021 10:29:06 +0000 (10:29 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/global.rs
src/occultilks.rs

index 46fe7ff63c5ed973c7c49bb27affd7e45e25e951..764f72a2400684c926d1128e1658cb944eda1de8 100644 (file)
@@ -46,6 +46,7 @@ pub struct Instance {
   pub name: Arc<InstanceName>,
   pub gs: GameState,
   pub ipieces: IPieces,
+  pub ioccults: OccultIlks,
   pub clients: DenseSlotMap<ClientId, Client>,
   pub iplayers: SecondarySlotMap<PlayerId, PlayerRecord>,
   pub tokens_players: TokenRegistry<PlayerId>,
@@ -214,8 +215,9 @@ pub struct InstanceContainer {
 }
 
 #[derive(Debug,Default,Serialize,Deserialize)]
-struct InstanceSaveAccesses<RawTokenStr, PiecesLoadedRef> {
+struct InstanceSaveAccesses<RawTokenStr, PiecesLoadedRef, OccultIlksRef> {
   ipieces: PiecesLoadedRef,
+  #[serde(default)] ioccults: OccultIlksRef,
   tokens_players: Vec<(RawTokenStr, PlayerId)>,
   aplayers: SecondarySlotMap<PlayerId, IPlayer>,
   acl: Acl<TablePermission>,
@@ -297,6 +299,7 @@ impl Instance {
       name: name.clone(),
       gs, acl,
       ipieces: IPieces(default()),
+      ioccults: default(),
       clients: default(),
       iplayers: default(),
       tokens_players: default(),
@@ -969,6 +972,7 @@ impl InstanceGuard<'_> {
   fn save_access_now(&mut self) {
     self.save_something("a-", |s, w| {
       let ipieces = &s.c.g.ipieces;
+      let ioccults = &s.c.g.ioccults;
       let tokens_players: Vec<(&str, PlayerId)> = {
         let global_players = GLOBAL.players.read().unwrap();
         s.c.g.tokens_players.tr
@@ -986,7 +990,7 @@ impl InstanceGuard<'_> {
       let acl = s.c.g.acl.clone().into();
       let links = s.c.g.links.clone();
       let isa = InstanceSaveAccesses {
-        ipieces, tokens_players, aplayers, acl, links,
+        ipieces, ioccults, tokens_players, aplayers, acl, links,
       };
       rmp_serde::encode::write_named(w, &isa)
     })?;
@@ -1009,8 +1013,8 @@ impl InstanceGuard<'_> {
   fn load_game(accounts: &AccountsGuard,
                games: &mut GamesGuard,
                name: InstanceName) -> Option<InstanceRef> {
-    let InstanceSaveAccesses::<String,ActualIPieces>
-    { tokens_players, mut ipieces, mut aplayers, acl, links }
+    let InstanceSaveAccesses::<String,ActualIPieces,OccultIlks>
+    { tokens_players, mut ipieces, ioccults, mut aplayers, acl, links }
     = match Self::load_something(&name, "a-") {
       Ok(data) => data,
       Err(e) => if (||{
@@ -1074,6 +1078,7 @@ impl InstanceGuard<'_> {
       gs, iplayers, links,
       acl: acl.into(),
       ipieces: IPieces(ipieces),
+      ioccults,
       name: name.clone(),
       clients: default(),
       tokens_clients: default(),
index aedacb72a33a05aca96672fd78bd39fd51581cb2..44a108eb2916a6163d38b87c4c64b5558120fb74 100644 (file)
@@ -22,7 +22,7 @@ type K = OccultIlkName;
 type V = Box<dyn OccultedPieceTrait>;
 type Refcount = u32;
 
-#[derive(Debug,Serialize,Deserialize)]
+#[derive(Debug,Serialize,Deserialize,Default)]
 pub struct OccultIlks {
   lookup: HashMap<K, Id>,
   table: DenseSlotMap<Id, Data>,