From: Ian Jackson Date: Fri, 2 Oct 2020 23:12:01 +0000 (+0100) Subject: wresting works X-Git-Tag: otter-0.2.0~797 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=337a4c41724e9584729b574ea66cd7d36e033e24;p=otter.git wresting works Signed-off-by: Ian Jackson --- diff --git a/src/api.rs b/src/api.rs index 34829bc8..a4c313e7 100644 --- a/src/api.rs +++ b/src/api.rs @@ -192,6 +192,45 @@ impl ApiPieceOp for ApiPieceGrab { } } +#[derive(Debug,Serialize,Deserialize)] +struct ApiPieceWrest { +} +#[post("/_/api/wrest", format="json", data="
")] +#[throws(OE)] +fn api_wrest(form : Json>) + -> 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, ]) } diff --git a/templates/script.ts b/templates/script.ts index a64081df..f8fa74f7 100644 --- a/templates/script.ts +++ b/templates/script.ts @@ -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;