From 46cb48681797406a4dc3e3c7f10f4104bdde1540 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 16 Apr 2022 01:12:20 +0100 Subject: [PATCH] dice: Support rolling Signed-off-by: Ian Jackson --- src/dice.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/dice.rs b/src/dice.rs index d03b5ea3..4dfb0f20 100644 --- a/src/dice.rs +++ b/src/dice.rs @@ -338,6 +338,49 @@ impl PieceTrait for Die { true } + #[throws(InternalError)] + fn add_ui_operations(&self, _: ShowUnocculted, upd: &mut Vec, + _gs: &GameState, _gpc: &GPiece) { + upd.push(UoDescription { + kind: UoKind::Piece, + def_key: 'r', + opname: "roll".to_string(), + desc: Html::lit("Roll").into(), + wrc: WRC::UpdateSvg, + }); + } + + #[throws(ApiPieceOpError)] + fn ui_operation(&self, _: ShowUnocculted, args: ApiPieceOpArgs<'_>, + opname: &str, wrc: WhatResponseToClientOp) + -> UpdateFromOpComplex { + let ApiPieceOpArgs { gs,piece,player,ioccults,ipc,.. } = args; + let gpc = gs.pieces.byid_mut(piece)?; + let gpl = gs.players.byid(player)?; + let state = gpc.xdata.get_mut_exp()?; + + match (opname, wrc) { + ("roll", wrc@ WRC::UpdateSvg) => { + + let () = self.check_permit_flip_roll(state)?; + state.cooldown_expires = cooldown_start_value(self.cooldown_time)?; + gpc.face = config().game_rng.range(0 .. self.nfaces).into(); + + let logents = log_did_to_piece( + ioccults,&gs.occults,gpl,gpc,ipc, + "rolled" + )?; + (( + wrc, + PieceUpdateOp::Modify(()), + logents, + ).into(), None) + + }, + _ => throw!(Ia::BadUiOperation) + } + } + #[throws(IE)] fn svg_piece(&self, f: &mut Html, gpc: &GPiece, _: &GameState, vpid: VisiblePieceId) { -- 2.30.2