rpfm_lib/files/bmd/civilian_shelter_list/
mod.rs1use serde_derive::{Serialize, Deserialize};
12
13use crate::binary::{ReadBytes, WriteBytes};
14use crate::error::{Result, RLibError};
15use crate::files::{Decodeable, EncodeableExtraData, Encodeable};
16
17use super::*;
18
19const SHELTER_VERSION: u16 = 1;
21
22#[derive(Default, PartialEq, Clone, Debug, Getters, MutGetters, Setters, Serialize, Deserialize)]
28#[getset(get = "pub", get_mut = "pub", set = "pub")]
29pub struct CivilianShelterList {
30 civilian_shelter_list: Vec<CivilianShelter>,
31}
32
33#[derive(Default, PartialEq, Clone, Debug, Getters, MutGetters, Setters, Serialize, Deserialize)]
35#[getset(get = "pub", get_mut = "pub", set = "pub")]
36pub struct CivilianShelter {
37
38 area: Rectangle,
40
41 capacity: u32,
43}
44
45impl Decodeable for CivilianShelterList {
50
51 fn decode<R: ReadBytes>(data: &mut R, extra_data: &Option<DecodeableExtraData>) -> Result<Self> {
52 let mut decoded = Self::default();
53
54 for _ in 0..data.read_u32()? {
55 let version = data.read_u16()?;
56 if version != SHELTER_VERSION {
57 return Err(RLibError::DecodingFastBinUnsupportedVersion(String::from("CivilianShelter"), version));
58 }
59
60 decoded.civilian_shelter_list.push(CivilianShelter {
61 area: Rectangle::decode(data, extra_data)?,
62 capacity: data.read_u32()?,
63 });
64 }
65
66 Ok(decoded)
67 }
68}
69
70impl Encodeable for CivilianShelterList {
71
72 fn encode<W: WriteBytes>(&mut self, buffer: &mut W, extra_data: &Option<EncodeableExtraData>) -> Result<()> {
73 buffer.write_u32(self.civilian_shelter_list.len() as u32)?;
74
75 for shelter in &mut self.civilian_shelter_list {
76 buffer.write_u16(SHELTER_VERSION)?;
77 shelter.area.encode(buffer, extra_data)?;
78 buffer.write_u32(shelter.capacity)?;
79 }
80
81 Ok(())
82 }
83}