chiark / gitweb /
deck: Refactor, ready for counting instead
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 24 Mar 2021 17:37:55 +0000 (17:37 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 24 Mar 2021 17:37:55 +0000 (17:37 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/deck.rs

index 78343876c588438721a79dc65b3056f9b85ae3db..6733373c4437041f954eac29b9da9072a735c252 100644 (file)
@@ -63,7 +63,7 @@ impl PieceSpec for piece_specs::Deck {
 
 impl Deck {
   fn state(&self, gpc: &GPiece, _goccults: &GameOccults) -> State {
-    if gpc.occult.is_active() { Disabled } else { Disabled }
+    if gpc.occult.is_active() { Enabled } else { Disabled }
   }
 
   fn current_face(&self, gpc: &GPiece) -> FaceId {
@@ -136,46 +136,52 @@ impl PieceTrait for Deck {
     let nick = Html(htmlescape::encode_minimal(&gpl.nick));
 
     dbgc!("ui op k entry", &opname);
+    
+    let old_state = self.state(gpc, &goccults);
+  
+    let (new_state, did) = match opname {
+      "activate" =>   (Enabled,  format!("enabled {}",  CORE_DESC)),
+      "deactivate" => (Disabled, format!("disabled {}", CORE_DESC)),
+      _ => throw!(OE::BadOperation),
+    };
+  
+    let new_view = match new_state {
+      Disabled => None,
+      Enabled  => Some(OccKG::Scrambled),
+    };
+    let region_views = new_view.map(|new_view| {
+      let region = self.shape.outline.region(gpc.pos)?;
+      let views = UniformOccultationView(new_view).views()?;
+      Ok::<_,IE>((region, views))
+    })
+      .transpose()
+      .map_err(|ie| ApiPieceOpError::ReportViaResponse(ie.into()))?;
 
-    let (xupdates, did) =
-      match (opname, self.state(gpc, &goccults))
-    {
-      ("activate", Disabled) => {
-        dbgc!("claiming");
-        let (region, views) = (||{
-          let region = self.shape.outline.region(gpc.pos)?;
-          let views = UniformOccultationView(OccKG::Scrambled).views()?;
-          Ok::<_,IE>((region, views))
-        })().map_err(|ie| ApiPieceOpError::ReportViaResponse(ie.into()))?;
-        
-        // actually do things:
-        dbgc!("creating occ");
-        let xupdates =
-          create_occultation(&mut gen.unique_gen(), &mut gs.max_z,
-                             gplayers, gpieces, goccults, ipieces, ioccults,
-                             to_permute,
-                             region, piece, views)?;
-
-        dbgc!("creating occ done", &xupdates);
-        (xupdates, format!("enabled {}", CORE_DESC))
-      }
-      ("deactivate", Enabled) => {
-        let xupdates =
-          remove_occultation(&mut gen.unique_gen(),
-                             gplayers, gpieces, goccults, ipieces, ioccults,
-                             to_permute, piece)
-          .map_err(|ie| ApiPieceOpError::ReportViaResponse(ie.into()))?;
-
-        (xupdates, format!("disabled {}", CORE_DESC))
-      }
-      ("claim", Enabled) |
-      ("deactivate", Disabled) => {
+    let mut xupdates = vec![];
+
+    if new_state == old_state {
         throw!(OE::PieceHeld);
-      }
-      _ => {
-        throw!(OE::BadOperation);
-      }
-    };
+    }      
+
+    if old_state != Disabled {
+      xupdates.extend(
+        remove_occultation(&mut gen.unique_gen(),
+                           gplayers, gpieces, goccults, ipieces, ioccults,
+                           to_permute, piece)
+          .map_err(|ie| ApiPieceOpError::ReportViaResponse(ie.into()))?
+      );
+    }
+
+    if let Some((region, views)) = region_views {
+      dbgc!("creating occ");
+      xupdates.extend(
+        create_occultation(&mut gen.unique_gen(), &mut gs.max_z,
+                           gplayers, gpieces, goccults, ipieces, ioccults,
+                           to_permute,
+                           region, piece, views)?
+      );
+      dbgc!("creating occ done", &xupdates);
+    }
 
     let log = vec![ LogEntry { html: Html(format!("{} {}", nick.0, did)) }];