diff --git a/resources/tests/container_info.bin b/resources/tests/container_info.bin new file mode 100644 index 0000000..5d1d9ff Binary files /dev/null and b/resources/tests/container_info.bin differ diff --git a/resources/tests/item_info.bin b/resources/tests/item_info.bin new file mode 100644 index 0000000..905a1df Binary files /dev/null and b/resources/tests/item_info.bin differ diff --git a/resources/tests/tiny_mandragora.bin b/resources/tests/tiny_mandragora.bin new file mode 100644 index 0000000..980ff30 Binary files /dev/null and b/resources/tests/tiny_mandragora.bin differ diff --git a/src/world/ipc/container_info.rs b/src/world/ipc/container_info.rs new file mode 100644 index 0000000..c024b3a --- /dev/null +++ b/src/world/ipc/container_info.rs @@ -0,0 +1,35 @@ +use binrw::binrw; + +#[binrw] +#[brw(little)] +#[derive(Debug, Clone, Default)] +pub struct ContainerInfo { + pub sequence: u32, + pub num_items: u32, + pub container_id: u32, + pub start_or_finish: u32, +} + +#[cfg(test)] +mod tests { + use std::{fs::read, io::Cursor, path::PathBuf}; + + use binrw::BinRead; + + use super::*; + + #[test] + fn read_containerinfo() { + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("resources/tests/container_info.bin"); + + let buffer = read(d).unwrap(); + let mut buffer = Cursor::new(&buffer); + + let container_info = ContainerInfo::read_le(&mut buffer).unwrap(); + assert_eq!(container_info.sequence, 1); + assert_eq!(container_info.num_items, 0); + assert_eq!(container_info.container_id, 1); + assert_eq!(container_info.start_or_finish, 0); + } +} diff --git a/src/world/ipc/item_info.rs b/src/world/ipc/item_info.rs new file mode 100644 index 0000000..07952e7 --- /dev/null +++ b/src/world/ipc/item_info.rs @@ -0,0 +1,59 @@ +use binrw::binrw; + +#[binrw] +#[brw(little)] +#[derive(Debug, Clone, Default)] +pub struct ItemInfo { + pub sequence: u32, + pub unk1: u32, + pub container_id: u16, + pub slot: u16, + pub quantity: u32, + pub catalog_id: u32, + pub reserved_flag: u32, + pub signature_id: u64, + pub hq_flag: u8, + pub unk2: u8, + pub condition: u16, + pub spirit_bond: u16, + pub stain: u16, + pub glamour_catalog_id: u32, + pub materia: [u16; 5], + #[brw(pad_before = 6)] + pub unk3: u32, +} + +#[cfg(test)] +mod tests { + use std::{fs::read, io::Cursor, path::PathBuf}; + + use binrw::BinRead; + + use super::*; + + #[test] + fn read_iteminfo() { + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("resources/tests/item_info.bin"); + + let buffer = read(d).unwrap(); + let mut buffer = Cursor::new(&buffer); + + let item_info = ItemInfo::read_le(&mut buffer).unwrap(); + assert_eq!(item_info.sequence, 4); + assert_eq!(item_info.unk1, 0); + assert_eq!(item_info.container_id, 1000); + assert_eq!(item_info.slot, 11); + assert_eq!(item_info.quantity, 1); + assert_eq!(item_info.catalog_id, 4426); + assert_eq!(item_info.reserved_flag, 0); + assert_eq!(item_info.signature_id, 0); + assert_eq!(item_info.hq_flag, 0); + assert_eq!(item_info.unk2, 0); + assert_eq!(item_info.condition, 30000); + assert_eq!(item_info.spirit_bond, 0); + assert_eq!(item_info.stain, 0); + assert_eq!(item_info.glamour_catalog_id, 0); + assert_eq!(item_info.unk3, 0); + } +} diff --git a/src/world/ipc/mod.rs b/src/world/ipc/mod.rs index 7be01af..cadf530 100644 --- a/src/world/ipc/mod.rs +++ b/src/world/ipc/mod.rs @@ -47,6 +47,12 @@ pub use weather_change::WeatherChange; mod action_request; pub use action_request::ActionRequest; +mod container_info; +pub use container_info::ContainerInfo; + +mod item_info; +pub use item_info::ItemInfo; + use crate::common::Position; use crate::common::read_string; use crate::common::write_string;