]> git.lizzy.rs Git - mt_net.git/blob - src/to_clt/map.rs
Implement NodeMeta and add Inventory stub
[mt_net.git] / src / to_clt / map.rs
1 use super::*;
2 use mt_ser::{DeserializeError, SerializeError};
3
4 #[mt_derive(to = "clt", repr = "u8", enumset)]
5 pub enum MapBlockFlag {
6     IsUnderground = 0,
7     DayNightDiff,
8     LightExpired,
9     NotGenerated,
10 }
11
12 pub const ALWAYS_LIT_FROM: u16 = 0xf000;
13
14 pub const CONTENT_UNKNOWN: u16 = 125;
15 pub const CONTENT_AIR: u16 = 126;
16 pub const CONTENT_IGNORE: u16 = 127;
17
18 #[mt_derive(to = "clt")]
19 pub struct NodeMetaField {
20     #[mt(len = "u32")]
21     value: String,
22     private: bool,
23 }
24
25 #[mt_derive(to = "clt")]
26 pub struct NodeMeta {
27     #[mt(len = "u32")]
28     fields: HashMap<String, NodeMetaField>,
29     inv: Inventory,
30 }
31
32 #[derive(Debug)]
33 pub struct NodeMetasLen;
34
35 impl MtCfg for NodeMetasLen {
36     type Len = <DefCfg as MtCfg>::Len;
37     type Inner = <DefCfg as MtCfg>::Inner;
38
39     fn write_len(len: usize, writer: &mut impl std::io::Write) -> Result<(), SerializeError> {
40         if len == 0 {
41             0u8.mt_serialize::<DefCfg>(writer)
42         } else {
43             2u8.mt_serialize::<DefCfg>(writer)?;
44             DefCfg::write_len(len, writer)
45         }
46     }
47
48     fn read_len(reader: &mut impl std::io::Read) -> Result<Self::Len, DeserializeError> {
49         match u8::mt_deserialize::<DefCfg>(reader)? {
50             0 => Ok(0),
51             2 => DefCfg::read_len(reader),
52             x => Err(DeserializeError::InvalidEnum("NodeMetasLen", Box::new(x))),
53         }
54     }
55 }
56
57 #[mt_derive(to = "clt")]
58 pub struct MapBlock {
59     pub flags: EnumSet<MapBlockFlag>,
60     pub lit_from: u16,
61     #[mt(const_before = "2u8")] // param0 size
62     #[mt(const_before = "2u8")] // param1 size + param2 size
63     #[serde(with = "serde_arrays")]
64     pub param_0: [u16; 4096],
65     #[serde(with = "serde_arrays")]
66     pub param_1: [u8; 4096],
67     #[serde(with = "serde_arrays")]
68     pub param_2: [u8; 4096],
69     #[mt(len = "NodeMetasLen")]
70     pub metas: HashMap<u16, NodeMeta>,
71 }