}
}
+/*
+#[derive(Debug,Serialize,Deserialize)]
+struct ApiPieceRotate (bool);
+#[post("/_/api/r", format="json", data="<form>")]
+#[throws(OE)]
+fn api_rotate(form : Json<ApiPiece<ApiPieceRotate>>) -> impl response::Responder<'static> {
+ api_piece_op(form)
+}
+impl ApiPieceOp for ApiPieceRotate {
+ #[throws(ApiPieceOpError)]
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ let ApiPieceOpArgs { gs,piece, .. } = a;
+ let pc = gs.pieces.byid_mut(piece).unwrap();
+ let (pos, clamped) = self.0.clamped(gs.table_size);
+ let logents = vec![];
+ pc.pos = pos;
+ if clamped {
+ throw!(ApiPieceOpError::PartiallyProcessed(
+ PieceOpError::PosOffTable,
+ logents,
+ ));
+ }
+ let update = PieceUpdateOp::Move(self.0);
+ (WhatResponseToClientOp::Predictable,
+ update, logents)
+ }
+}*/
+
#[derive(Debug,Serialize,Deserialize)]
struct ApiPiecePin (bool);
#[post("/_/api/pin", format="json", data="<form>")]
struct SessionPieceContext {
id: VisiblePieceId,
pos: Pos,
- transform: VisibleAngleTransform,
info: String, // SessionPieceLoadJson as JSON
}
z: ZCoord,
zg: Generation,
pinned: bool,
+ angle: VisiblePieceAngle,
uos: &'r [UoDescription],
}
for (gpid, pr) in pieces {
let pri = PieceRenderInstructions {
- id : make_pieceid_visible(gpid),
- face : pr.face,
+ id: make_pieceid_visible(gpid),
+ angle: make_angle_visible(pr.angle),
+ face: pr.face,
};
let p = if let Some(p) = ig.ipieces.get(gpid) { p }
else { continue /* was deleted */ };
let defs = p.make_defs(&pri)?;
alldefs.push((pri.id, defs));
- let transform = make_angle_visible(pr.angle, pr.pos);
let for_info = SessionPieceLoadJson {
- held : &pr.held,
- z : pr.zlevel.z.clone(),
- zg : pr.zlevel.zg,
- pinned : pr.pinned,
- uos : &p.ui_operations()?,
+ held: &pr.held,
+ z: pr.zlevel.z.clone(),
+ zg: pr.zlevel.zg,
+ pinned: pr.pinned,
+ angle: pri.angle,
+ uos: &p.ui_operations()?,
};
let for_piece = SessionPieceContext {
- transform,
id: pri.id,
pos: pr.pos,
info: serde_json::to_string(&for_info)
visible_slotmap_key!{ VisiblePieceId('.') }
+#[derive(Clone,Copy,Debug)]
+#[derive(Serialize,Deserialize)]
+#[serde(transparent)]
+pub struct VisiblePieceAngle(PieceAngle);
+
#[derive(Clone,Debug)]
#[derive(Serialize,Deserialize)]
#[serde(transparent)]
fn itemname(&self) -> &str;
}
-#[derive(Debug,Copy,Clone)]
+#[derive(Debug,Clone)]
pub struct PieceRenderInstructions {
pub id: VisiblePieceId,
+ pub angle: VisiblePieceAngle,
pub face: FaceId,
}
}
}
+impl VisiblePieceAngle {
+ pub fn to_transform(self) -> VisibleAngleTransform {
+ match self.0 {
+ PieceAngle::Compass(angle) => VisibleAngleTransform(
+ zcoord::misc::raw_angle_transform(
+ angle.into()
+ )
+ ),
+ }
+ }
+}
+
// ---------- game state - rendering etc. ----------
impl PieceState {
Some(n) => n,
None => -1,
};
+ let transform = pri.angle.to_transform();
write!(&mut defs.0,
- r##"<g id="piece{}" data-dragraise="{}">"##,
- pri.id, dragraise)?;
+ r##"<g id="piece{}" transform="{}" data-dragraise="{}">"##,
+ pri.id, &transform.0, dragraise)?;
self.svg_piece(&mut defs, &pri)?;
write!(&mut defs.0, r##"</g>"##)?;
write!(&mut defs.0,
VisiblePieceId(kd)
}
-pub fn make_angle_visible(angle: PieceAngle, pos: Pos)
- -> VisibleAngleTransform {
+pub fn make_angle_visible(angle: PieceAngle) -> VisiblePieceAngle {
// todo-lens need to do censorship mapping here
- VisibleAngleTransform(angle.to_transform(pos))
+ VisiblePieceAngle(angle)
}
fn log_pri(&self, piece: PieceId, pc: &PieceState)
-> PieceRenderInstructions {
let id = self.pieceid2visible(piece);
- PieceRenderInstructions { id, face : pc.face }
+ let angle = make_angle_visible(pc.angle);
+ PieceRenderInstructions { id, angle, face: pc.face }
}
fn svg_pri(&self, piece: PieceId, pc: &PieceState, _player: PlayerId)
-> PieceRenderInstructions {
}
}
- impl PieceAngle {
- pub fn to_transform(self, pos: Pos) -> String {
- match self {
- PieceAngle::Compass(CompassAngle(angle)) => {
- if angle == 0 { default() }
- else { format!("rotate({}, {}, {})",
- -45 * (angle as i16),
- pos.0[0], pos.0[1]) }
- }
- }
- }
- }
-
impl<P: Eq + Hash> Default for Acl<P> {
fn default() -> Self { Acl { ents: default() } }
}
{%- for piece in uses %}
<use id="use{{ piece.id }}" href="#piece{{ piece.id }}"
x="{{ piece.pos[0] }}" y="{{ piece.pos[1] }}"
- transform="{{ piece.transform }}"
data-piece="{{ piece.id }}" data-info="{{ piece.info | escape }}" />
{%- endfor %}
<g id="defs_marker"></g>
else { (this, false) }
}
}
+
+pub fn raw_angle_transform(compass: u8) -> String {
+ assert!(compass < 8);
+ if compass == 0 { Default::default() }
+ else { format!("rotate({})", -45 * (compass as i16)) }
+}