chiark / gitweb /
wresting works
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 2 Oct 2020 23:12:01 +0000 (00:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 2 Oct 2020 23:12:01 +0000 (00:12 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/api.rs
templates/script.ts

index 34829bc88fbcb0f995333ec1cbc5291e453ced10..a4c313e7786ac9e3c1fabb20a08b2138ecdd61a5 100644 (file)
@@ -192,6 +192,45 @@ impl ApiPieceOp for ApiPieceGrab {
   }
 }
 
+#[derive(Debug,Serialize,Deserialize)]
+struct ApiPieceWrest {
+}
+#[post("/_/api/wrest", format="json", data="<form>")]
+#[throws(OE)]
+fn api_wrest(form : Json<ApiPiece<ApiPieceWrest>>)
+            -> impl response::Responder<'static> {
+  api_piece_op(form)
+}
+impl ApiPieceOp for ApiPieceWrest {
+  #[throws(OnlineError)]
+  fn check_held(&self, _pc: &PieceState, _player: PlayerId) { }
+
+  #[throws(ApiPieceOpError)]
+  fn op(&self, gs: &mut GameState, player: PlayerId, piece: PieceId,
+        p: &dyn Piece, lens: &dyn Lens) -> PieceUpdateFromOp {
+    let pl = gs.players.byid(player)?;
+    let pc = gs.pieces.byid_mut(piece)?;
+    let pcs = p.describe_pri(&lens.log_pri(piece, pc)).0;
+
+    let was = pc.held;
+    pc.held = Some(player);
+    let was = was.and_then(|p| gs.players.get(p));    
+
+    let update = PieceUpdateOp::Modify(());
+
+    let pls = &htmlescape::encode_minimal(&pl.nick);
+
+    let logent = LogEntry { html : Html(match was {
+        Some(was) => format!("{} wrested {} from {}", pls, pcs,
+                             &htmlescape::encode_minimal(&was.nick)),
+        None => format!("{} wrested {}", pls, pcs),
+    })};
+
+    (WhatResponseToClientOp::Predictable,
+     update, vec![logent])
+  }
+}
+
 #[derive(Debug,Serialize,Deserialize)]
 struct ApiPieceUngrab {
 }
@@ -325,6 +364,7 @@ pub fn mount(rocket_instance: Rocket) -> Rocket {
     api_ungrab,
     api_raise,
     api_move,
+    api_wrest,
     api_uo,
   ])
 }
index a64081df16d84d143adf94d8a44e2d1478ea5e00..f8fa74f7f45fee490d2d09545fc7a5322d9d7dad 100644 (file)
@@ -375,7 +375,16 @@ function drag_mousedown(e : MouseEvent, shifted: boolean) {
   let held = p.held;
 
   drag_pieces = [];
-  if (held == null) {
+  if (held == us) {
+    dragging = DRAGGING.MAYBE_UNGRAB;
+    drag_add_piece(piece,p); // contrive to have this one first
+    for (let tpiece of Object.keys(pieces)) {
+      if (tpiece == piece) continue;
+      let tp = pieces[tpiece]!;
+      if (tp.held != us) continue;
+      drag_add_piece(tpiece,tp);
+    }
+  } else if (held == null || wresting) {
     if (!shifted) {
       for (let tpiece of Object.keys(pieces)) {
        let tp = pieces[tpiece]!;
@@ -388,16 +397,7 @@ function drag_mousedown(e : MouseEvent, shifted: boolean) {
     dragging = DRAGGING.MAYBE_GRAB;
     drag_add_piece(piece,p);
     set_grab(piece,p, us);
-    api_piece(api, 'grab', piece,p, { });
-  } else if (held == us) {
-    dragging = DRAGGING.MAYBE_UNGRAB;
-    drag_add_piece(piece,p); // contrive to have this one first
-    for (let tpiece of Object.keys(pieces)) {
-      if (tpiece == piece) continue;
-      let tp = pieces[tpiece]!;
-      if (tp.held != us) continue;
-      drag_add_piece(tpiece,tp);
-    }
+    api_piece(api, wresting ? 'wrest' : 'grab', piece,p, { });
   } else {
     add_log_message('That piece is held by another player.');
     return;