throw!(SpE::WrongNumberOfFaces);
}
gpc.moveable = PieceMoveable::IfWresting;
+ gpc.rotateable = false;
let p = Box::new(Deck {
shape,
label: self.label.load()?,
}
#[throws(ApiPieceOpError)]
- fn ui_operation(&self, _: ShowUnocculted,
+ fn ui_operation(&self, vis: ShowUnocculted,
a: ApiPieceOpArgs<'_>,
opname: &str, wrc: WhatResponseToClientOp)
-> UpdateFromOpComplex {
let nick = gpl.nick.to_html();
dbgc!("ui op k entry", &opname);
-
+
+ let rot_checked = gpc.occulter_check_unrotated(vis)?;
let old_state = self.state(gpc, &goccults)?;
let (new_state, did) = match opname {
xupdates.extend(
create_occultation(&mut gen.unique_gen(), &mut gs.max_z,
gplayers, gpieces, goccults, ipieces, ioccults,
- to_recalculate,
+ to_recalculate, rot_checked,
region, piece, views)?
);
dbgc!("creating occ done", &xupdates);
PieceGone,
Occultation,
PieceUnrotateable,
+ OcculterAlreadyRotated,
OrganisedPlacementOverfull,
}
display_as_debug!{PieceOpError}
_pcaliases: &PieceAliases, _ir: &InstanceRef)
-> PieceSpecLoaded {
gpc.moveable = PieceMoveable::IfWresting;
+ gpc.rotateable = false;
self.c.load(Behaviour::Hand)?
}
}
}
#[throws(ApiPieceOpError)]
- fn ui_operation(&self, _: ShowUnocculted, mut a: ApiPieceOpArgs<'_>,
+ fn ui_operation(&self, vis: ShowUnocculted, mut a: ApiPieceOpArgs<'_>,
opname: &str, wrc: WhatResponseToClientOp)
-> UpdateFromOpComplex {
if let Some(r) = {
let goccults = &mut gs.occults;
let gpc = gpieces.byid_mut(piece)?;
+ let rot_checked = gpc.occulter_check_unrotated(vis);
let xdata = gpc.xdata.get_mut::<HandState,_>(default)?;
let old_desc = self.behaviour.describe_html_inner(Some(xdata));
let old_player = xdata.player();
let xupdates = match self.behaviour.views() {
None => default(),
Some((mk_owner, mk_defview)) => {
+ let rot_checked = rot_checked?;
let (region, views) = (||{
dbgc!("claiming region");
let rect = self.shape.outline.rect (gpc.pos)?;
create_occultation(&mut gen.unique_gen(), &mut gs.max_z,
gplayers, gpieces, goccults,
ipieces, ioccults,
- to_recalculate,
+ to_recalculate, rot_checked,
region, piece, views)?;
xupdates
}
#[derive(Copy,Clone,Debug)]
pub struct ShowUnocculted(());
+#[derive(Copy,Clone,Debug)]
+pub struct OcculterRotationChecked(());
+
#[derive(Debug,Serialize,Deserialize)]
#[serde(transparent)]
pub struct IPieceTraitObj(Box<dyn PieceTrait>);
}
}
+ pub fn occulter_check_unrotated(&self, _:ShowUnocculted)
+ -> Result<OcculterRotationChecked, PieceOpError> {
+ if self.angle.is_rotated() { Err(POE::OcculterAlreadyRotated) }
+ else { Ok(OcculterRotationChecked(())) }
+ }
+
+
pub fn fully_visible_to(&self, goccults: &GameOccults, player: PlayerId)
-> Option<ShowUnocculted>
{
ipieces: &IPieces,
ioccults: &IOccults,
to_recalculate: &mut ToRecalculate,
+ _: OcculterRotationChecked,
region: Region,
occulter: PieceId,
views: OccultationViews,