mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/data/map.rs')
| -rw-r--r-- | src/data/map.rs | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/data/map.rs b/src/data/map.rs index 283007e..31a0003 100644 --- a/src/data/map.rs +++ b/src/data/map.rs @@ -81,6 +81,7 @@ use crate::data::DataRead; use crate::fluid::Type as Fluid; use crate::item::{storage::Storage, Type as Item}; use crate::team::{self, Team}; +use crate::unit::Unit; #[cfg(doc)] use crate::{block::content, data::*, fluid, item, modifier, unit}; @@ -423,6 +424,7 @@ pub struct Map<'l> { pub width: usize, pub height: usize, pub tags: HashMap<String, String>, + pub entities: Vec<Unit>, /// row major 2d array /// ```rs /// (0, 0), (1, 0), (2, 0) @@ -488,6 +490,7 @@ impl<'l> Map<'l> { height, width, tags, + entities: vec![], } } } @@ -562,8 +565,7 @@ impl<'l> Serializable for Map<'l> { // map section let mut w = 0; let mut h = 0; - let mut m = None; - buff.read_chunk(true, |buff| { + let mut map = buff.read_chunk(true, |buff| { w = buff.read_u16()? as usize; h = buff.read_u16()? as usize; let mut map = Map::new(w, h, tags); @@ -626,10 +628,9 @@ impl<'l> Serializable for Map<'l> { } i += 1; } - m = Some(map); - Ok::<(), ReadError>(()) + Ok::<_, ReadError>(map) })?; - buff.read_chunk(true, |buff| { + map.entities = buff.read_chunk(true, |buff| { // read entity mapping (SaveVersion.java#436) for _ in 0..buff.read_u16()? { buff.skip(2)?; @@ -644,7 +645,9 @@ impl<'l> Serializable for Map<'l> { } } // read world entities (#412). eg units - for _ in 0..buff.read_u32()? { + let n = buff.read_u32()?; + let mut entities = Vec::with_capacity(n as usize); + for _ in 0..n { let len = buff.read_u16()? as usize; let id = buff.read_u8()? as usize; let Some(&Some(u)) = entity_mapping::ID.get(id) else { @@ -653,13 +656,13 @@ impl<'l> Serializable for Map<'l> { // return Ok(()); }; buff.skip(4)?; - let _ = u.read(buff)?; + entities.push(u.read(buff)?); } - Ok::<(), ReadError>(()) + Ok::<_, ReadError>(entities) })?; // skip custom chunks buff.skip_chunk()?; - Ok(m.unwrap()) + Ok(map) } /// serialize a map (todo) |