use crate::imports::*;
+type WRC = WhatResponseToClientOp;
+
#[derive(Debug,Serialize,Deserialize)]
struct ApiPiece<O : ApiPieceOp> {
ctoken : RawToken,
if pc.held != None && pc.held != Some(player) {
throw!(OnlineError::PieceHeld)
};
- let (update, logents) = form.op.op(gs,player,piece,p.as_ref(),&lens)?;
- Ok::<_,ApiPieceOpError>((update, logents))
+ let (wrc, update, logents) = form.op.op(gs,player,piece,p.as_ref(),&lens)?;
+ Ok::<_,ApiPieceOpError>((wrc, update, logents))
})() {
Err(ReportViaUpdate(poe)) => {
PrepareUpdatesBuffer::piece_report_error(
warn!("api_piece_op ERROR {:?}: {:?}", &form, &err);
Err(err)?;
},
- Ok((update, logents)) => {
+ Ok((wrc, update, logents)) => {
let mut buf = PrepareUpdatesBuffer::new(g,
- Some((WhatResponseToClientOp::Predictable, client, form.cseq)),
+ Some((wrc, client, form.cseq)),
Some(1 + logents.len()));
buf.piece_update(piece, update, &lens);
impl ApiPieceOp for ApiPieceGrab {
#[throws(ApiPieceOpError)]
fn op(&self, gs: &mut GameState, player: PlayerId, piece: PieceId,
- p: &dyn Piece, lens: &dyn Lens)
- -> (PieceUpdateOp<()>, Vec<LogEntry>) {
+ p: &dyn Piece, lens: &dyn Lens) -> PieceUpdateFromOp {
let pl = gs.players.byid(player)?;
let pc = gs.pieces.byid_mut(piece)?;
p.describe_pri(&lens.log_pri(piece, pc)).0)),
};
- (update, vec![logent])
+ (WhatResponseToClientOp::Predictable,
+ update, vec![logent])
}
}
impl ApiPieceOp for ApiPieceUngrab {
#[throws(ApiPieceOpError)]
fn op(&self, gs: &mut GameState, player: PlayerId, piece: PieceId,
- p: &dyn Piece, lens: &dyn Lens)
- -> (PieceUpdateOp<()>, Vec<LogEntry>) {
+ p: &dyn Piece, lens: &dyn Lens) -> PieceUpdateFromOp {
let pl = gs.players.byid(player).unwrap();
let pc = gs.pieces.byid_mut(piece).unwrap();
p.describe_pri(&lens.log_pri(piece, pc)).0)),
};
- (update, vec![logent])
+ (WhatResponseToClientOp::Predictable,
+ update, vec![logent])
}
}
impl ApiPieceOp for ApiPieceRaise {
#[throws(ApiPieceOpError)]
fn op(&self, gs: &mut GameState, _: PlayerId, piece: PieceId,
- _p: &dyn Piece, _: &dyn Lens)
- -> (PieceUpdateOp<()>, Vec<LogEntry>) {
+ _p: &dyn Piece, _: &dyn Lens) -> PieceUpdateFromOp {
let pc = gs.pieces.byid_mut(piece).unwrap();
pc.zlevel = ZLevel { z : self.z, zg : gs.gen };
let update = PieceUpdateOp::SetZLevel(pc.zlevel);
- (update, vec![])
+ (WhatResponseToClientOp::Predictable,
+ update, vec![])
}
}
impl ApiPieceOp for ApiPieceMove {
#[throws(ApiPieceOpError)]
fn op(&self, gs: &mut GameState, _: PlayerId, piece: PieceId,
- _p: &dyn Piece, _lens: &dyn Lens)
- -> (PieceUpdateOp<()>, Vec<LogEntry>) {
+ _p: &dyn Piece, _lens: &dyn Lens) -> PieceUpdateFromOp {
let pc = gs.pieces.byid_mut(piece).unwrap();
let (pos, clamped) = self.0.clamped(gs.table_size);
let logents = vec![];
));
}
let update = PieceUpdateOp::Move(self.0);
- (update, logents)
+ (WhatResponseToClientOp::Predictable,
+ update, logents)
}
}
const DEFKEY_FLIP : UoKey = 'f';
#[derive(Debug,Serialize,Deserialize)]
-struct ApiPieceUo (UoKey);
+struct ApiPieceUo { opname: String, wrc: WhatResponseToClientOp }
#[post("/_/api/k", format="json", data="<form>")]
#[throws(OE)]
fn api_uo(form : Json<ApiPiece<ApiPieceUo>>) -> impl response::Responder<'static> {
impl ApiPieceOp for ApiPieceUo {
#[throws(ApiPieceOpError)]
fn op(&self, gs: &mut GameState, player: PlayerId, piece: PieceId,
- p: &dyn Piece, lens: &dyn Lens)
- -> (PieceUpdateOp<()>, Vec<LogEntry>) {
- let def_key = self.0;
-
+ p: &dyn Piece, lens: &dyn Lens) -> PieceUpdateFromOp {
'_normal_global_ops__not_loop: loop {
let pc = gs.pieces.byid_mut(piece)?;
let pl = gs.players.byid(player)?;
- let _: Impossible = match def_key {
+ let _: Impossible = match (self.opname.as_str(), self.wrc) {
- DEFKEY_FLIP => {
+ ("flip", wrc@ WRC::UpdateSvg) => {
let nfaces = p.nfaces();
pc.face = (RawFaceId::from(pc.face) % nfaces).into();
- return (PieceUpdateOp::Modify(()),
- vec![ LogEntry { html: Html(format!(
- "{} flipped {}",
- &htmlescape::encode_minimal(&pl.nick),
- p.describe_pri(&lens.log_pri(piece, pc)).0
- )) }])
+ return (
+ wrc,
+ PieceUpdateOp::Modify(()),
+ vec![ LogEntry { html: Html(format!(
+ "{} flipped {}",
+ &htmlescape::encode_minimal(&pl.nick),
+ p.describe_pri(&lens.log_pri(piece, pc)).0
+ )) }])
},
_ => break,
}
'_abnormal_global_ops__notloop: loop {
- let _: Impossible = match def_key {
+ let _: Impossible = match self {
_ => break,
};
}
- p.ui_operation(gs, player, piece, def_key, lens)?
+ p.ui_operation(gs, player, piece, &self.opname, self.wrc, lens)?
}
}