#[derive(Debug,Serialize,Deserialize)]
pub struct GPiece { // usual variable: gpc
pub pos: Pos,
+ #[serde(default, skip_serializing_if="is_default")]
pub face: FaceId,
+ #[serde(default, skip_serializing_if="is_default")]
pub held: Option<PlayerId>,
pub zlevel: ZLevel,
+ #[serde(default, skip_serializing_if="is_default")]
pub pinned: bool,
pub occult: PieceOccult,
pub angle: PieceAngle,
pub lastclient: ClientId,
#[serde(default)] pub last_released: ClientId,
pub gen_before_lastclient: Generation,
+ #[serde(default, skip_serializing_if="Option::is_none")]
pub xdata: PieceXDataState,
pub moveable: PieceMoveable,
#[serde(default)] pub rotateable: bool,
///
/// These remain constant after the piece has been loaded,
/// so they are mostly "can/do we do this thing".
-#[derive(Debug,Clone,Default,Serialize,Deserialize)]
+#[derive(Debug,Clone,ConstDefault,Default,Serialize,Deserialize)]
pub struct PieceSpecialProperties {
+ #[serde(default, skip_serializing_if="Option::is_none")]
pub rendering: Option<SpecialClientRendering>,
+
+ #[serde(default, skip_serializing_if="is_default")]
pub multigrab: bool,
}
use std::convert::TryFrom;
use std::time::Duration;
+use const_default::ConstDefault;
use enum_map::Enum;
use fehler::{throw,throws};
use index_vec::{define_index_type, IndexVec};
pub type RawFaceId = u8;
define_index_type! {
- #[derive(Default)]
+ #[derive(Default,ConstDefault)]
pub struct FaceId = RawFaceId;
IMPL_RAW_CONVERSIONS = true;
}