use crate::vpx::biff;
use serde::{Deserialize, Serialize};
pub trait WriteSharedAttributes {
fn write_shared_attributes(&self, writer: &mut biff::BiffWriter);
fn read_shared_attribute(&mut self, tag_str: &str, reader: &mut biff::BiffReader) -> bool;
}
pub trait HasSharedAttributes {
fn name(&self) -> &str;
fn is_locked(&self) -> bool;
fn editor_layer(&self) -> Option<u32>;
fn editor_layer_name(&self) -> Option<&str>;
fn editor_layer_visibility(&self) -> Option<bool>;
fn part_group_name(&self) -> Option<&str>;
fn set_is_locked(&mut self, locked: bool);
fn set_editor_layer(&mut self, layer: Option<u32>);
fn set_editor_layer_name(&mut self, name: Option<String>);
fn set_editor_layer_visibility(&mut self, visibility: Option<bool>);
fn set_part_group_name(&mut self, name: Option<String>);
}
#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize)]
pub struct TimerData {
#[serde(rename = "is_timer_enabled")]
pub is_enabled: bool,
#[serde(rename = "timer_interval")]
pub interval: i32,
}
#[cfg(test)]
impl fake::Dummy<fake::Faker> for TimerData {
fn dummy_with_rng<R: rand::RngExt + ?Sized>(_: &fake::Faker, rng: &mut R) -> Self {
Self {
is_enabled: rng.random(),
interval: rng.random(),
}
}
}
impl TimerData {
pub fn biff_read_tag(&mut self, tag: &str, reader: &mut biff::BiffReader) -> bool {
match tag {
"TMON" => {
self.is_enabled = reader.get_bool();
true
}
"TMIN" => {
self.interval = reader.get_i32();
true
}
_ => false,
}
}
pub fn biff_write(&self, writer: &mut biff::BiffWriter) {
self.biff_write_tmon(writer);
self.biff_write_tmin(writer);
}
pub fn biff_write_tmon(&self, writer: &mut biff::BiffWriter) {
writer.write_tagged_bool("TMON", self.is_enabled);
}
pub fn biff_write_tmin(&self, writer: &mut biff::BiffWriter) {
writer.write_tagged_i32("TMIN", self.interval);
}
}
impl<T> WriteSharedAttributes for T
where
T: HasSharedAttributes,
{
fn write_shared_attributes(&self, writer: &mut biff::BiffWriter) {
writer.write_tagged_bool("LOCK", self.is_locked());
if let Some(layer) = self.editor_layer() {
writer.write_tagged_u32("LAYR", layer);
}
if let Some(name) = self.editor_layer_name() {
writer.write_tagged_string("LANR", name);
}
if let Some(group_name) = self.part_group_name() {
writer.write_tagged_string("GRUP", group_name);
}
if let Some(visibility) = self.editor_layer_visibility() {
writer.write_tagged_bool("LVIS", visibility);
}
}
fn read_shared_attribute(&mut self, tag: &str, reader: &mut biff::BiffReader) -> bool {
match tag {
"LOCK" => {
self.set_is_locked(reader.get_bool());
true
}
"LAYR" => {
self.set_editor_layer(Some(reader.get_u32()));
true
}
"LANR" => {
self.set_editor_layer_name(Some(reader.get_string()));
true
}
"LVIS" => {
self.set_editor_layer_visibility(Some(reader.get_bool()));
true
}
"GRUP" => {
self.set_part_group_name(Some(reader.get_string()));
true
}
_ => false,
}
}
}
#[macro_export]
macro_rules! impl_shared_attributes {
($ty:ty) => {
impl $crate::vpx::gameitem::select::HasSharedAttributes for $ty {
fn name(&self) -> &str {
&self.name
}
fn is_locked(&self) -> bool {
self.is_locked
}
fn editor_layer(&self) -> Option<u32> {
self.editor_layer
}
fn editor_layer_name(&self) -> Option<&str> {
self.editor_layer_name.as_deref()
}
fn editor_layer_visibility(&self) -> Option<bool> {
self.editor_layer_visibility
}
fn part_group_name(&self) -> Option<&str> {
self.part_group_name.as_deref()
}
fn set_is_locked(&mut self, locked: bool) {
self.is_locked = locked;
}
fn set_editor_layer(&mut self, layer: Option<u32>) {
self.editor_layer = layer;
}
fn set_editor_layer_name(&mut self, name: Option<String>) {
self.editor_layer_name = name;
}
fn set_editor_layer_visibility(&mut self, visibility: Option<bool>) {
self.editor_layer_visibility = visibility;
}
fn set_part_group_name(&mut self, name: Option<String>) {
self.part_group_name = name;
}
}
};
}