chiark / gitweb /
wip lens move etc.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 Jul 2020 17:58:40 +0000 (18:58 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 Jul 2020 17:58:40 +0000 (18:58 +0100)
src/bin/server.rs
templates/script.js

index 8b4bddd8b5cf1c3ca8b6ea0d93399dcdc84aefa0..837b84c6f18a9ec3a2ae3c92f7c56a0b62ba5d46 100644 (file)
@@ -124,7 +124,7 @@ struct ApiPiece<O : ApiPieceOp> {
 trait ApiPieceOp : Debug {
   #[throws(GameError)]
   fn op(&self, gs: &mut GameState, player: PlayerId, piece: PieceId,
-        lens: &dyn Lens)
+        lens: &dyn Lens /* used for LogEntry and PieceId but not Pos */)
         -> (PieceUpdateOp<()>, Vec<LogEntry>);
 }
 
@@ -133,6 +133,7 @@ trait Lens {
              -> PieceRenderInstructions;
   fn svg_pri(&self, piece: PieceId, pc: &PieceRecord, player: PlayerId)
              -> PieceRenderInstructions;
+  fn massage_prep_piecestate(&self, ns : &mut PreparedPieceState);
   fn decode_visible_pieceid(&self, vpiece: VisiblePieceId, player: PlayerId)
                             -> PieceId;
 }
@@ -153,6 +154,7 @@ impl Lens for TransparentLens {
     let kd : slotmap::KeyData = vpiece.into();
     PieceId::from(kd)
   }
+  fn massage_prep_piecestate(&self, _ns : &mut PreparedPieceState) { }
 }
 
 #[throws(OE)]
@@ -201,7 +203,9 @@ fn api_piece_op<O: ApiPieceOp>(form : Json<ApiPiece<O>>)
       let pri_for_all = lens.svg_pri(piece,pc,Default::default());
 
       let update = update.map_new_state(|_|{
-        pc.prep_piecestate(&pri_for_all)
+        let mut ns = pc.prep_piecestate(&pri_for_all);
+        lens.massage_prep_piecestate(&mut ns);
+        ns
       });
 
       let mut us = Vec::with_capacity(1 + logents.len());
@@ -299,16 +303,23 @@ impl ApiPieceOp for ApiPieceUngrab {
 }
 
 #[derive(Debug,Serialize,Deserialize)]
-struct ApiMove {
-  t : String,
-  p : VisiblePieceId,
-  l : Pos,
-}
+struct ApiPieceMove (Pos);
 #[post("/_/api/m", format="json", data="<form>")]
 #[throws(OE)]
-fn api_move(form : Json<ApiMove>) -> impl response::Responder<'static> {
-  eprintln!("API {:?}", &form);
-  ""
+fn api_move(form : Json<ApiPiece<ApiPieceMove>>) -> impl response::Responder<'static> {
+  api_piece_op(form)
+}
+impl ApiPieceOp for ApiPieceMove {
+  #[throws(GameError)]
+  fn op(&self, gs: &mut GameState, _: PlayerId, piece: PieceId,
+        _lens: &dyn Lens)
+        -> (PieceUpdateOp<()>, Vec<LogEntry>) {
+    let pc = gs.pieces.byid_mut(piece).unwrap();
+
+    pc.pos = self.0;
+    let update = PieceUpdateOp::Move(self.0);
+    (update, vec![])
+  }
 }
 
 #[get("/_/updates/<ctoken>/<gen>")]
index 1b1ab39ac73074a0fab8bf5d9e7427a02ca6cfdd..9f88872718eba88b4c2c3d6d57d78d9ddbbbca5e 100644 (file)
@@ -96,10 +96,10 @@ function api_posted() {
   api_check();
 }
 
-function api_piece(meth, piece, pelem, op) {
+function api_piece(f, meth, piece, pelem, op) {
   cseq += 1;
   pelem.dataset.cseq = cseq;
-  api(meth, {
+  f(meth, {
     ctoken : ctoken,
     piece : piece,
     gen : gen,
@@ -138,7 +138,7 @@ function drag_mousedown(e) {
   } else {
     dragging = DRAGGING.MAYBE_GRAB;
     pelem = set_grab(drag_uelem, piece, us);
-    api_piece('grab', piece, pelem, { });
+    api_piece(api, 'grab', piece, pelem, { });
   }
 
   window.addEventListener('mousemove', drag_mousemove, true);
@@ -186,7 +186,7 @@ function drag_mousemove(e) {
     drag_uelem.setAttributeNS(null, "x", x);
     drag_uelem.setAttributeNS(null, "y", y);
     //console.log(drag_uelem);
-    api_delay('m',{
+    api_piece(api_delay ('m',{
       t : token,
       p : drag_uelem.dataset.piece,
       l : [x, y],
@@ -202,7 +202,7 @@ function drag_mouseup(e) {
       dragging == (DRAGGING.MAYBE_GRAB | DRAGGING.YES)) {
     piece = drag_uelem.dataset.piece;
     var pelem = set_ungrab(drag_uelem, piece);
-    api_piece('ungrab', drag_uelem.dataset.piece, pelem, { });
+    api_piece(f, 'ungrab', drag_uelem.dataset.piece, pelem, { });
   }
   drag_cancel(e);
 }