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,
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)?;
desc: Html,
uos: &'r [UoDescription],
moveable: PieceMoveable,
+ rotateable: bool,
occregion: Option<JsonString<&'r Region>>,
pub bbox: &'r Rect,
}
desc,
bbox: &bbox,
moveable: gpc.moveable(),
+ rotateable: gpc.rotateable(),
uos: &pri.ui_operations(&ig.gs, gpc, ipc)?,
occregion,
};
PosOffTable,
PieceGone,
Occultation,
+ PieceUnrotateable,
OrganisedPlacementOverfull,
}
display_as_debug!{PieceOpError}
pub gen_before_lastclient: Generation,
pub xdata: PieceXDataState,
pub moveable: PieceMoveable,
+ #[serde(default)] pub rotateable: bool,
}
pub type PieceXDataState = Option<Box<dyn PieceXData>>;
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);
gen_before_lastclient: gen_dummy,
xdata: None,
moveable: default(),
+ rotateable: true,
}
}
}
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),
pub angle: CompassAngle,
pub pinned: bool,
pub moveable: PieceMoveable,
+ pub rotateable: bool,
pub uos: Vec<UoDescription>,
pub occregion: Option<JsonString<Region>>,
pub bbox: Rect,
angle: CompassAngle,
pinned: boolean,
moveable: PieceMoveable,
+ rotateable: boolean,
uos : UoDescription[],
uelem : SVGGraphicsElement,
delem : SVGGraphicsElement,
};
};
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',
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);
angle: number,
uos: UoDescription[],
moveable: PieceMoveable,
+ rotateable: boolean,
occregion: string | null,
bbox: Rect,
}
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);