use getset::*;
use serde_derive::{Serialize, Deserialize};
use crate::error::{Result, RLibError};
use crate::binary::{ReadBytes, WriteBytes};
use crate::files::{DecodeableExtraData, Decodeable, EncodeableExtraData, Encodeable};
use crate::utils::check_size_mismatch;
pub const EXTENSION: &str = ".bin";
mod versions;
#[cfg(test)] mod portrait_settings_test;
#[derive(PartialEq, Clone, Debug, Default, Getters, MutGetters, Setters, Serialize, Deserialize)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub struct PortraitSettings {
version: u32,
entries: Vec<Entry>,
}
#[derive(PartialEq, Clone, Debug, Default, Getters, MutGetters, Setters, Serialize, Deserialize)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub struct Entry {
id: String,
camera_settings_head: CameraSetting,
camera_settings_body: Option<CameraSetting>,
variants: Vec<Variant>
}
#[derive(PartialEq, Clone, Debug, Default, Getters, MutGetters, Setters, Serialize, Deserialize)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub struct CameraSetting {
z: f32,
y: f32,
yaw: f32,
pitch: f32,
distance: f32,
theta: f32,
phi: f32,
fov: f32,
skeleton_node: String,
}
#[derive(PartialEq, Eq, Clone, Debug, Getters, MutGetters, Setters, Serialize, Deserialize)]
#[getset(get = "pub", get_mut = "pub", set = "pub")]
pub struct Variant {
filename: String,
file_diffuse: String,
file_mask_1: String,
file_mask_2: String,
file_mask_3: String,
season: String,
level: i32,
age: i32,
politician: bool,
faction_leader: bool,
}
impl Decodeable for PortraitSettings {
fn decode<R: ReadBytes>(data: &mut R, _extra_data: &Option<DecodeableExtraData>) -> Result<Self> {
let version = data.read_u32()?;
let mut settings = Self::default();
settings.version = version;
match version {
1 => settings.read_v1(data)?,
4 => settings.read_v4(data)?,
_ => Err(RLibError::DecodingPortraitSettingUnsupportedVersion(version as usize))?,
}
check_size_mismatch(data.stream_position()? as usize, data.len()? as usize)?;
Ok(settings)
}
}
impl Encodeable for PortraitSettings {
fn encode<W: WriteBytes>(&mut self, buffer: &mut W, _extra_data: &Option<EncodeableExtraData>) -> Result<()> {
buffer.write_u32(self.version)?;
match self.version {
1 => self.write_v1(buffer)?,
4 => self.write_v4(buffer)?,
_ => unimplemented!()
}
Ok(())
}
}
impl PortraitSettings {
pub fn from_json(data: &str) -> Result<Self> {
serde_json::from_str(data).map_err(From::from)
}
pub fn to_json(&self) -> Result<String> {
serde_json::to_string_pretty(&self).map_err(From::from)
}
}
impl Default for Variant {
fn default() -> Self {
Self {
filename: Default::default(),
file_diffuse: Default::default(),
file_mask_1: Default::default(),
file_mask_2: Default::default(),
file_mask_3: Default::default(),
season: "none".to_owned(),
level: Default::default(),
age: Default::default(),
politician: Default::default(),
faction_leader: Default::default(),
}
}
}