MGI::ListPieces => readonly(cs,ag,ig, &[TP::ViewNotSecret], |ig|{
let pieces = ig.gs.pieces.iter().filter_map(
- |(piece,p)| (|| Ok::<_,MgmtError>(if_chain!{
- let &GPiece { pos, face, .. } = p;
- if let Some(pinfo) = ig.ipieces.get(piece);
+ |(piece,gpc)| (|| Ok::<_,MgmtError>(if_chain!{
+ let &GPiece { pos, face, .. } = gpc;
+ if let Some(pto) = ig.ipieces.get(piece);
let visible = if ! piece_at_all_occluded(&ig.gs.occults, piece) {
// todo: something more sophisticated would be nice
let pri = PieceRenderInstructions::new_visible(
// visible id is internal one here
VisiblePieceId(piece.data())
);
- let bbox = pinfo.bbox_approx()?;
- let desc_html = pri.describe(p, pinfo);
+ let bbox = pto.bbox_approx()?;
+ let desc_html = pri.describe(gpc, pto);
Some(MgmtGamePieceVisibleInfo {
pos, face, desc_html, bbox
})
} else {
None
};
- let itemname = pinfo.itemname().to_string();
+ let itemname = pto.itemname().to_string();
then {
Some(MgmtGamePieceInfo {
piece, itemname,
MGI::DeletePiece(piece) => {
let (ig, modperm, _) = cs.check_acl_modify_pieces(ag, ig)?;
- let p = ig.ipieces.as_mut(modperm)
+ let pto = ig.ipieces.as_mut(modperm)
.remove(piece).ok_or(ME::PieceNotFound)?;
let gs = &mut ig.gs;
- let pc = gs.pieces.as_mut(modperm).remove(piece);
- let desc_html = if let Some(pc) = &pc {
+ let gpc = gs.pieces.as_mut(modperm).remove(piece);
+ let desc_html = if let Some(gpc) = &gpc {
let pri = PieceRenderInstructions::new_visible(default());
- pri.describe(pc, &p)
+ pri.describe(gpc, &pto)
} else {
Html::lit("<piece partially missing from game state!>")
};
- if let Some(pc) = pc { p.delete_hook(&pc, gs); }
+ if let Some(gpc) = gpc { pto.delete_hook(&gpc, gs); }
(U{ pcs: vec![(piece, PieceUpdateOp::Delete())],
log: vec![ LogEntry {
html: Html(format!("A piece {} was removed from the game",
pieces.sort_by_key(|(_,pr)| &pr.zlevel);
- for (gpid, pr) in pieces {
- let pri = piece_pri(&ig.gs.occults, player, gpl, gpid, pr);
- let p = if let Some(p) = ig.ipieces.get(gpid) { p }
+ for (piece, gpc) in pieces {
+ let pri = piece_pri(&ig.gs.occults, player, gpl, piece, gpc);
+ let pto = if let Some(pto) = ig.ipieces.get(piece) { pto }
else { continue /* was deleted */ };
- let defs = pri.make_defs(pr, p)?;
+ let defs = pri.make_defs(gpc, pto)?;
alldefs.push((pri.vpid, defs));
- let desc = pri.describe(&pr, p);
+ let desc = pri.describe(&gpc, pto);
- let vangle = pri.angle(pr).to_compass();
+ let vangle = pri.angle(gpc).to_compass();
let for_info = SessionPieceLoadJson {
- held: &pr.held,
- z: pr.zlevel.z.clone(),
- zg: pr.zlevel.zg,
- pinned: pr.pinned,
+ held: &gpc.held,
+ z: gpc.zlevel.z.clone(),
+ zg: gpc.zlevel.zg,
+ pinned: gpc.pinned,
angle: vangle,
desc,
- uos: &pri.ui_operations(pr, p.as_ref())?,
+ uos: &pri.ui_operations(gpc, pto.as_ref())?,
};
let for_piece = SessionPieceContext {
id: pri.vpid,
- pos: pr.pos,
+ pos: gpc.pos,
info: serde_json::to_string(&for_info)
.map_err(|e| InternalError::JSONEncode(e))?,
};
// ---------- game state ----------
#[derive(Debug,Serialize,Deserialize)]
-pub struct GameState {
+pub struct GameState { // usual variable: gs
pub table_colour: Colour,
pub table_size: Pos,
pub pieces: GPieces,
pub type GPlayers = DenseSlotMap<PlayerId, GPlayer>;
#[derive(Debug,Serialize,Deserialize,Clone)]
-pub struct GPlayer {
+pub struct GPlayer { // usual variable: gpl
pub nick: String,
pub layout: PresentationLayout,
pub idmap: PerPlayerIdMap,
}
#[derive(Debug,Serialize,Deserialize)]
-pub struct GPiece {
+pub struct GPiece{ // usual variable: gpc
pub pos: Pos,
pub face: FaceId,
pub held: Option<PlayerId>,
pub wrc: WhatResponseToClientOp,
}
-#[typetag::serde]
+#[typetag::serde] // usual variable: pto ("piece trait object")
pub trait PieceTrait: OutlineTrait + Send + Debug {
/// by convention, occult face is nfaces-1
// xxx this is no good, we need a central definition of the occult
}
#[derive(Debug,Clone,Serialize,Deserialize)]
-pub struct IPlayer {
+pub struct IPlayer { // usual variable: ipl
pub acctid: AccountId,
pub tokens_revealed: HashMap<TokenRevelationKey, TokenRevelationValue>,
pub tz: Timezone,