From f64711e16d07b8eef3a10755b29b038199cf5e4a Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 7 Apr 2021 18:19:42 +0100 Subject: [PATCH] rotateable: wip plumbing Signed-off-by: Ian Jackson --- daemon/api.rs | 3 +++ daemon/cmdlistener.rs | 1 + daemon/session.rs | 2 ++ src/error.rs | 1 + src/gamestate.rs | 6 ++++++ src/pcrender.rs | 1 + src/updates.rs | 1 + templates/script.ts | 39 +++++++++++++++++++++++++-------------- 8 files changed, 40 insertions(+), 14 deletions(-) diff --git a/daemon/api.rs b/daemon/api.rs index afa09dde..962ca70d 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -510,6 +510,9 @@ api_route!{ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate { let ApiPieceOpArgs { gs,ioccults,player,piece,ipc, .. } = a; let gpc = gs.pieces.byid_mut(piece).unwrap(); + if ! gpc.rotateable() || gpc.occult.is_active() { + throw!(POE::PieceUnrotateable) + } let gpl = gs.players.byid_mut(player).unwrap(); let logents = log_did_to_piece( ioccults,&gs.occults,gpl,gpc,ipc, diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index eb4a25be..aaf002f0 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -762,6 +762,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( pos, face, xdata: None, moveable: default(), + rotateable: true, }; let PieceSpecLoaded { p, loaded_via_alias, occultable } = info.load(piece_i as usize, &mut gpc, &ig.pcaliases, &gref)?; diff --git a/daemon/session.rs b/daemon/session.rs index bf651ded..174e25f5 100644 --- a/daemon/session.rs +++ b/daemon/session.rs @@ -49,6 +49,7 @@ struct SessionPieceLoadJson<'r> { desc: Html, uos: &'r [UoDescription], moveable: PieceMoveable, + rotateable: bool, occregion: Option>, pub bbox: &'r Rect, } @@ -158,6 +159,7 @@ fn session_inner(form: Json, desc, bbox: &bbox, moveable: gpc.moveable(), + rotateable: gpc.rotateable(), uos: &pri.ui_operations(&ig.gs, gpc, ipc)?, occregion, }; diff --git a/src/error.rs b/src/error.rs index 504a8112..784465b8 100644 --- a/src/error.rs +++ b/src/error.rs @@ -180,6 +180,7 @@ pub enum PieceOpError { PosOffTable, PieceGone, Occultation, + PieceUnrotateable, OrganisedPlacementOverfull, } display_as_debug!{PieceOpError} diff --git a/src/gamestate.rs b/src/gamestate.rs index 544a84e7..f5aed30d 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -74,6 +74,7 @@ pub struct GPiece { // usual variable: gpc pub gen_before_lastclient: Generation, pub xdata: PieceXDataState, pub moveable: PieceMoveable, + #[serde(default)] pub rotateable: bool, } pub type PieceXDataState = Option>; @@ -368,6 +369,10 @@ impl GPiece { if self.occult.is_active() { PieceMoveable::No } else { self.moveable } } + pub fn rotateable(&self) -> bool { + if self.occult.is_active() { false } + else { self.rotateable } + } pub fn dummy() -> Self { let gen_dummy = Generation(1); @@ -384,6 +389,7 @@ impl GPiece { gen_before_lastclient: gen_dummy, xdata: None, moveable: default(), + rotateable: true, } } } diff --git a/src/pcrender.rs b/src/pcrender.rs index 5adb5961..0e74b782 100644 --- a/src/pcrender.rs +++ b/src/pcrender.rs @@ -129,6 +129,7 @@ impl PieceRenderInstructions { zg : zlevel.zg, angle : pri.angle(gpc).to_compass(), pinned : gpc.pinned, + rotateable : gpc.rotateable(), uos : pri.ui_operations(gs, gpc, ipc)?, moveable : gpc.moveable(), facehint : pri.facehint(gpc), diff --git a/src/updates.rs b/src/updates.rs index ec76b0d6..6307dc45 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -110,6 +110,7 @@ pub struct PreparedPieceState { pub angle: CompassAngle, pub pinned: bool, pub moveable: PieceMoveable, + pub rotateable: bool, pub uos: Vec, pub occregion: Option>, pub bbox: Rect, diff --git a/templates/script.ts b/templates/script.ts index 9a570484..66bcf575 100644 --- a/templates/script.ts +++ b/templates/script.ts @@ -74,6 +74,7 @@ type PieceInfo = { angle: CompassAngle, pinned: boolean, moveable: PieceMoveable, + rotateable: boolean, uos : UoDescription[], uelem : SVGGraphicsElement, delem : SVGGraphicsElement, @@ -300,20 +301,27 @@ function recompute_keybindings() { }; }; if (all_targets.length) { - add_uo(all_targets, { - def_key: 'l', - kind: 'Client', - wrc: 'Predictable', - opname: "left", - desc: "rotate left", - }); - add_uo(all_targets, { - def_key: 'r', - kind: 'Client', - wrc: 'Predictable', - opname: "right", - desc: "rotate right", - }); + let got_rotateable = false; + for (let t of all_targets) { + if (pieces[t]!.rotateable) + got_rotateable = true; + } + if (got_rotateable) { + add_uo(all_targets, { + def_key: 'l', + kind: 'Client', + wrc: 'Predictable', + opname: "left", + desc: "rotate left", + }); + add_uo(all_targets, { + def_key: 'r', + kind: 'Client', + wrc: 'Predictable', + opname: "right", + desc: "rotate right", + }); + } add_uo(all_targets, { def_key: 'b', kind: 'Client', @@ -524,6 +532,7 @@ keyops_local['right'] = function (uo: UoRecord) { rotate_targets(uo, -1); } function rotate_targets(uo: UoRecord, dangle: number): boolean { for (let piece of uo.targets!) { let p = pieces[piece]!; + if (!p.rotateable) continue; p.angle += dangle + 8; p.angle %= 8; let transform = wasm_bindgen.angle_transform(p.angle); @@ -1412,6 +1421,7 @@ type PreparedPieceState = { angle: number, uos: UoDescription[], moveable: PieceMoveable, + rotateable: boolean, occregion: string | null, bbox: Rect, } @@ -1496,6 +1506,7 @@ function piece_modify_core(piece: PieceId, p: PieceInfo, p.held_us_raising = false; p.pinned = info.pinned; p.moveable = info.moveable; + p.rotateable = info.rotateable; p.angle = info.angle; p.bbox = info.bbox; piece_set_zlevel_from(piece,p,info); -- 2.30.2