mindustry logic execution, map- and schematic- parsing and rendering
draw units
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | assets/units/aegires.png | bin | 0 -> 7637 bytes | |||
| -rw-r--r-- | assets/units/alpha.png | bin | 0 -> 890 bytes | |||
| -rw-r--r-- | assets/units/anthicus-missile.png | bin | 0 -> 575 bytes | |||
| -rw-r--r-- | assets/units/anthicus.png | bin | 0 -> 2700 bytes | |||
| -rw-r--r-- | assets/units/antumbra.png | bin | 0 -> 7956 bytes | |||
| -rw-r--r-- | assets/units/arkyid.png | bin | 0 -> 4028 bytes | |||
| -rw-r--r-- | assets/units/assembly-drone.png | bin | 0 -> 972 bytes | |||
| -rw-r--r-- | assets/units/atrax.png | bin | 0 -> 1593 bytes | |||
| -rw-r--r-- | assets/units/avert.png | bin | 0 -> 2080 bytes | |||
| -rw-r--r-- | assets/units/beta.png | bin | 0 -> 1173 bytes | |||
| -rw-r--r-- | assets/units/bryde.png | bin | 0 -> 3457 bytes | |||
| -rw-r--r-- | assets/units/cleroi.png | bin | 0 -> 1970 bytes | |||
| -rw-r--r-- | assets/units/collaris.png | bin | 0 -> 6204 bytes | |||
| -rw-r--r-- | assets/units/conquer.png | bin | 0 -> 8403 bytes | |||
| -rw-r--r-- | assets/units/corvus.png | bin | 0 -> 4024 bytes | |||
| -rw-r--r-- | assets/units/crawler.png | bin | 0 -> 549 bytes | |||
| -rw-r--r-- | assets/units/cyerce.png | bin | 0 -> 4018 bytes | |||
| -rw-r--r-- | assets/units/dagger.png | bin | 0 -> 781 bytes | |||
| -rw-r--r-- | assets/units/disrupt-missile.png | bin | 0 -> 841 bytes | |||
| -rw-r--r-- | assets/units/disrupt.png | bin | 0 -> 7070 bytes | |||
| -rw-r--r-- | assets/units/eclipse.png | bin | 0 -> 12373 bytes | |||
| -rw-r--r-- | assets/units/elude.png | bin | 0 -> 1197 bytes | |||
| -rw-r--r-- | assets/units/emanate.png | bin | 0 -> 1761 bytes | |||
| -rw-r--r-- | assets/units/evoke.png | bin | 0 -> 1109 bytes | |||
| -rw-r--r-- | assets/units/flare.png | bin | 0 -> 802 bytes | |||
| -rw-r--r-- | assets/units/fortress.png | bin | 0 -> 1640 bytes | |||
| -rw-r--r-- | assets/units/gamma.png | bin | 0 -> 1375 bytes | |||
| -rw-r--r-- | assets/units/horizon.png | bin | 0 -> 1282 bytes | |||
| -rw-r--r-- | assets/units/incite.png | bin | 0 -> 1466 bytes | |||
| -rw-r--r-- | assets/units/latum.png | bin | 0 -> 7320 bytes | |||
| -rw-r--r-- | assets/units/locus.png | bin | 0 -> 2347 bytes | |||
| -rw-r--r-- | assets/units/mace.png | bin | 0 -> 1148 bytes | |||
| -rw-r--r-- | assets/units/manifold.png | bin | 0 -> 1483 bytes | |||
| -rw-r--r-- | assets/units/mega.png | bin | 0 -> 2145 bytes | |||
| -rw-r--r-- | assets/units/merui.png | bin | 0 -> 1028 bytes | |||
| -rw-r--r-- | assets/units/minke.png | bin | 0 -> 2169 bytes | |||
| -rw-r--r-- | assets/units/mono.png | bin | 0 -> 783 bytes | |||
| -rw-r--r-- | assets/units/navanax.png | bin | 0 -> 13444 bytes | |||
| -rw-r--r-- | assets/units/nova.png | bin | 0 -> 1034 bytes | |||
| -rw-r--r-- | assets/units/obviate.png | bin | 0 -> 3010 bytes | |||
| -rw-r--r-- | assets/units/oct.png | bin | 0 -> 11034 bytes | |||
| -rw-r--r-- | assets/units/omura.png | bin | 0 -> 10498 bytes | |||
| -rw-r--r-- | assets/units/oxynoe.png | bin | 0 -> 2369 bytes | |||
| -rw-r--r-- | assets/units/poly.png | bin | 0 -> 1232 bytes | |||
| -rw-r--r-- | assets/units/precept.png | bin | 0 -> 4039 bytes | |||
| -rw-r--r-- | assets/units/pulsar.png | bin | 0 -> 1517 bytes | |||
| -rw-r--r-- | assets/units/quad.png | bin | 0 -> 5661 bytes | |||
| -rw-r--r-- | assets/units/quasar.png | bin | 0 -> 1982 bytes | |||
| -rw-r--r-- | assets/units/quell-missile.png | bin | 0 -> 723 bytes | |||
| -rw-r--r-- | assets/units/quell.png | bin | 0 -> 4089 bytes | |||
| -rw-r--r-- | assets/units/reign.png | bin | 0 -> 4992 bytes | |||
| -rw-r--r-- | assets/units/renale.png | bin | 0 -> 993 bytes | |||
| -rw-r--r-- | assets/units/retusa.png | bin | 0 -> 1511 bytes | |||
| -rw-r--r-- | assets/units/risso.png | bin | 0 -> 1602 bytes | |||
| -rw-r--r-- | assets/units/scathe-missile.png | bin | 0 -> 1186 bytes | |||
| -rw-r--r-- | assets/units/scepter.png | bin | 0 -> 4260 bytes | |||
| -rw-r--r-- | assets/units/sei.png | bin | 0 -> 6569 bytes | |||
| -rw-r--r-- | assets/units/spiroct.png | bin | 0 -> 2256 bytes | |||
| -rw-r--r-- | assets/units/stell.png | bin | 0 -> 1516 bytes | |||
| -rw-r--r-- | assets/units/tecta.png | bin | 0 -> 4429 bytes | |||
| -rw-r--r-- | assets/units/toxopid.png | bin | 0 -> 5437 bytes | |||
| -rw-r--r-- | assets/units/vanquish.png | bin | 0 -> 4998 bytes | |||
| -rw-r--r-- | assets/units/vela.png | bin | 0 -> 3390 bytes | |||
| -rw-r--r-- | assets/units/zenith.png | bin | 0 -> 3066 bytes | |||
| -rw-r--r-- | build.rs | 4 | ||||
| -rw-r--r-- | src/data/map.rs | 21 | ||||
| -rw-r--r-- | src/data/mod.rs | 13 | ||||
| -rw-r--r-- | src/data/renderer.rs | 14 | ||||
| -rw-r--r-- | src/unit/mod.rs | 165 |
70 files changed, 131 insertions, 88 deletions
@@ -1,6 +1,6 @@ [package] name = "mindus" -version = "4.0.13" +version = "4.0.14" edition = "2021" description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)" authors = [ diff --git a/assets/units/aegires.png b/assets/units/aegires.png Binary files differnew file mode 100644 index 0000000..e89c0f9 --- /dev/null +++ b/assets/units/aegires.png diff --git a/assets/units/alpha.png b/assets/units/alpha.png Binary files differnew file mode 100644 index 0000000..af3f4d0 --- /dev/null +++ b/assets/units/alpha.png diff --git a/assets/units/anthicus-missile.png b/assets/units/anthicus-missile.png Binary files differnew file mode 100644 index 0000000..406dc4b --- /dev/null +++ b/assets/units/anthicus-missile.png diff --git a/assets/units/anthicus.png b/assets/units/anthicus.png Binary files differnew file mode 100644 index 0000000..96e6674 --- /dev/null +++ b/assets/units/anthicus.png diff --git a/assets/units/antumbra.png b/assets/units/antumbra.png Binary files differnew file mode 100644 index 0000000..8369d3a --- /dev/null +++ b/assets/units/antumbra.png diff --git a/assets/units/arkyid.png b/assets/units/arkyid.png Binary files differnew file mode 100644 index 0000000..39ec11e --- /dev/null +++ b/assets/units/arkyid.png diff --git a/assets/units/assembly-drone.png b/assets/units/assembly-drone.png Binary files differnew file mode 100644 index 0000000..bb9104b --- /dev/null +++ b/assets/units/assembly-drone.png diff --git a/assets/units/atrax.png b/assets/units/atrax.png Binary files differnew file mode 100644 index 0000000..5de4da8 --- /dev/null +++ b/assets/units/atrax.png diff --git a/assets/units/avert.png b/assets/units/avert.png Binary files differnew file mode 100644 index 0000000..21f093c --- /dev/null +++ b/assets/units/avert.png diff --git a/assets/units/beta.png b/assets/units/beta.png Binary files differnew file mode 100644 index 0000000..4739bb8 --- /dev/null +++ b/assets/units/beta.png diff --git a/assets/units/bryde.png b/assets/units/bryde.png Binary files differnew file mode 100644 index 0000000..2b95dc1 --- /dev/null +++ b/assets/units/bryde.png diff --git a/assets/units/cleroi.png b/assets/units/cleroi.png Binary files differnew file mode 100644 index 0000000..3bb2c2c --- /dev/null +++ b/assets/units/cleroi.png diff --git a/assets/units/collaris.png b/assets/units/collaris.png Binary files differnew file mode 100644 index 0000000..5858a88 --- /dev/null +++ b/assets/units/collaris.png diff --git a/assets/units/conquer.png b/assets/units/conquer.png Binary files differnew file mode 100644 index 0000000..d3af969 --- /dev/null +++ b/assets/units/conquer.png diff --git a/assets/units/corvus.png b/assets/units/corvus.png Binary files differnew file mode 100644 index 0000000..da8a8b2 --- /dev/null +++ b/assets/units/corvus.png diff --git a/assets/units/crawler.png b/assets/units/crawler.png Binary files differnew file mode 100644 index 0000000..df0b6b0 --- /dev/null +++ b/assets/units/crawler.png diff --git a/assets/units/cyerce.png b/assets/units/cyerce.png Binary files differnew file mode 100644 index 0000000..903fbe3 --- /dev/null +++ b/assets/units/cyerce.png diff --git a/assets/units/dagger.png b/assets/units/dagger.png Binary files differnew file mode 100644 index 0000000..609f158 --- /dev/null +++ b/assets/units/dagger.png diff --git a/assets/units/disrupt-missile.png b/assets/units/disrupt-missile.png Binary files differnew file mode 100644 index 0000000..55d2e03 --- /dev/null +++ b/assets/units/disrupt-missile.png diff --git a/assets/units/disrupt.png b/assets/units/disrupt.png Binary files differnew file mode 100644 index 0000000..8092db7 --- /dev/null +++ b/assets/units/disrupt.png diff --git a/assets/units/eclipse.png b/assets/units/eclipse.png Binary files differnew file mode 100644 index 0000000..ca644ca --- /dev/null +++ b/assets/units/eclipse.png diff --git a/assets/units/elude.png b/assets/units/elude.png Binary files differnew file mode 100644 index 0000000..09e0de0 --- /dev/null +++ b/assets/units/elude.png diff --git a/assets/units/emanate.png b/assets/units/emanate.png Binary files differnew file mode 100644 index 0000000..87e5dd8 --- /dev/null +++ b/assets/units/emanate.png diff --git a/assets/units/evoke.png b/assets/units/evoke.png Binary files differnew file mode 100644 index 0000000..07a807e --- /dev/null +++ b/assets/units/evoke.png diff --git a/assets/units/flare.png b/assets/units/flare.png Binary files differnew file mode 100644 index 0000000..6000f66 --- /dev/null +++ b/assets/units/flare.png diff --git a/assets/units/fortress.png b/assets/units/fortress.png Binary files differnew file mode 100644 index 0000000..bbdf6e1 --- /dev/null +++ b/assets/units/fortress.png diff --git a/assets/units/gamma.png b/assets/units/gamma.png Binary files differnew file mode 100644 index 0000000..bcb08df --- /dev/null +++ b/assets/units/gamma.png diff --git a/assets/units/horizon.png b/assets/units/horizon.png Binary files differnew file mode 100644 index 0000000..11d2739 --- /dev/null +++ b/assets/units/horizon.png diff --git a/assets/units/incite.png b/assets/units/incite.png Binary files differnew file mode 100644 index 0000000..f659ffb --- /dev/null +++ b/assets/units/incite.png diff --git a/assets/units/latum.png b/assets/units/latum.png Binary files differnew file mode 100644 index 0000000..ecba602 --- /dev/null +++ b/assets/units/latum.png diff --git a/assets/units/locus.png b/assets/units/locus.png Binary files differnew file mode 100644 index 0000000..d409235 --- /dev/null +++ b/assets/units/locus.png diff --git a/assets/units/mace.png b/assets/units/mace.png Binary files differnew file mode 100644 index 0000000..0b4a6a2 --- /dev/null +++ b/assets/units/mace.png diff --git a/assets/units/manifold.png b/assets/units/manifold.png Binary files differnew file mode 100644 index 0000000..d42d391 --- /dev/null +++ b/assets/units/manifold.png diff --git a/assets/units/mega.png b/assets/units/mega.png Binary files differnew file mode 100644 index 0000000..7f58fab --- /dev/null +++ b/assets/units/mega.png diff --git a/assets/units/merui.png b/assets/units/merui.png Binary files differnew file mode 100644 index 0000000..a28422c --- /dev/null +++ b/assets/units/merui.png diff --git a/assets/units/minke.png b/assets/units/minke.png Binary files differnew file mode 100644 index 0000000..0cc85e7 --- /dev/null +++ b/assets/units/minke.png diff --git a/assets/units/mono.png b/assets/units/mono.png Binary files differnew file mode 100644 index 0000000..533a3ed --- /dev/null +++ b/assets/units/mono.png diff --git a/assets/units/navanax.png b/assets/units/navanax.png Binary files differnew file mode 100644 index 0000000..94b193c --- /dev/null +++ b/assets/units/navanax.png diff --git a/assets/units/nova.png b/assets/units/nova.png Binary files differnew file mode 100644 index 0000000..7ab100d --- /dev/null +++ b/assets/units/nova.png diff --git a/assets/units/obviate.png b/assets/units/obviate.png Binary files differnew file mode 100644 index 0000000..a836265 --- /dev/null +++ b/assets/units/obviate.png diff --git a/assets/units/oct.png b/assets/units/oct.png Binary files differnew file mode 100644 index 0000000..7df38a7 --- /dev/null +++ b/assets/units/oct.png diff --git a/assets/units/omura.png b/assets/units/omura.png Binary files differnew file mode 100644 index 0000000..580bb5f --- /dev/null +++ b/assets/units/omura.png diff --git a/assets/units/oxynoe.png b/assets/units/oxynoe.png Binary files differnew file mode 100644 index 0000000..87fc11a --- /dev/null +++ b/assets/units/oxynoe.png diff --git a/assets/units/poly.png b/assets/units/poly.png Binary files differnew file mode 100644 index 0000000..e792d5e --- /dev/null +++ b/assets/units/poly.png diff --git a/assets/units/precept.png b/assets/units/precept.png Binary files differnew file mode 100644 index 0000000..32fe877 --- /dev/null +++ b/assets/units/precept.png diff --git a/assets/units/pulsar.png b/assets/units/pulsar.png Binary files differnew file mode 100644 index 0000000..152c365 --- /dev/null +++ b/assets/units/pulsar.png diff --git a/assets/units/quad.png b/assets/units/quad.png Binary files differnew file mode 100644 index 0000000..09986db --- /dev/null +++ b/assets/units/quad.png diff --git a/assets/units/quasar.png b/assets/units/quasar.png Binary files differnew file mode 100644 index 0000000..cc9ac31 --- /dev/null +++ b/assets/units/quasar.png diff --git a/assets/units/quell-missile.png b/assets/units/quell-missile.png Binary files differnew file mode 100644 index 0000000..dd05d06 --- /dev/null +++ b/assets/units/quell-missile.png diff --git a/assets/units/quell.png b/assets/units/quell.png Binary files differnew file mode 100644 index 0000000..f724c4e --- /dev/null +++ b/assets/units/quell.png diff --git a/assets/units/reign.png b/assets/units/reign.png Binary files differnew file mode 100644 index 0000000..55701e6 --- /dev/null +++ b/assets/units/reign.png diff --git a/assets/units/renale.png b/assets/units/renale.png Binary files differnew file mode 100644 index 0000000..d4283d4 --- /dev/null +++ b/assets/units/renale.png diff --git a/assets/units/retusa.png b/assets/units/retusa.png Binary files differnew file mode 100644 index 0000000..1115725 --- /dev/null +++ b/assets/units/retusa.png diff --git a/assets/units/risso.png b/assets/units/risso.png Binary files differnew file mode 100644 index 0000000..97d9d2f --- /dev/null +++ b/assets/units/risso.png diff --git a/assets/units/scathe-missile.png b/assets/units/scathe-missile.png Binary files differnew file mode 100644 index 0000000..fd9ce44 --- /dev/null +++ b/assets/units/scathe-missile.png diff --git a/assets/units/scepter.png b/assets/units/scepter.png Binary files differnew file mode 100644 index 0000000..61b87a6 --- /dev/null +++ b/assets/units/scepter.png diff --git a/assets/units/sei.png b/assets/units/sei.png Binary files differnew file mode 100644 index 0000000..076c659 --- /dev/null +++ b/assets/units/sei.png diff --git a/assets/units/spiroct.png b/assets/units/spiroct.png Binary files differnew file mode 100644 index 0000000..2670acc --- /dev/null +++ b/assets/units/spiroct.png diff --git a/assets/units/stell.png b/assets/units/stell.png Binary files differnew file mode 100644 index 0000000..0d06858 --- /dev/null +++ b/assets/units/stell.png diff --git a/assets/units/tecta.png b/assets/units/tecta.png Binary files differnew file mode 100644 index 0000000..66f473c --- /dev/null +++ b/assets/units/tecta.png diff --git a/assets/units/toxopid.png b/assets/units/toxopid.png Binary files differnew file mode 100644 index 0000000..34e5301 --- /dev/null +++ b/assets/units/toxopid.png diff --git a/assets/units/vanquish.png b/assets/units/vanquish.png Binary files differnew file mode 100644 index 0000000..31e07d6 --- /dev/null +++ b/assets/units/vanquish.png diff --git a/assets/units/vela.png b/assets/units/vela.png Binary files differnew file mode 100644 index 0000000..a76ec93 --- /dev/null +++ b/assets/units/vela.png diff --git a/assets/units/zenith.png b/assets/units/zenith.png Binary files differnew file mode 100644 index 0000000..a015009 --- /dev/null +++ b/assets/units/zenith.png @@ -69,15 +69,17 @@ fn main() { continue; } let rgb = path.components().any(|c| c.as_os_str() == "floors"); + let env = path.components().any(|c| c.as_os_str() == "environment"); let path = kebab2bigsnek(path.with_extension("").file_name().unwrap().to_str().unwrap()); if matches!(path.as_str(), "CLIFF_CRUSHER_ROTATOR" | "NEOPLASIA_REACTOR_CENTER" | "FLUX_REACTOR_MID" | "EDGE" | "PHASE_CONVEYOR_BRIDGE" | "BRIDGE_ARROW" | "DUCT_BRIDGE_BRIDGE" | "DUCT_BRIDGE_ARROW" | "LAUNCHPOD" | "BRIDGE_CONVEYOR_BRIDGE" | "BRIDGE_CONVEYOR_ARROW" | "PHASE_CONVEYOR_ARROW" | "REINFORCED_BRIDGE_CONDUIT_ARROW" | "REINFORCED_BRIDGE_CONDUIT_BRIDGE" | "PHASE_CONDUIT_BRIDGE" | "BRIDGE_CONDUIT_ARROW" | "PHASE_CONDUIT_ARROW" | "BRIDGE_CONDUIT_BRIDGE" | "PLATED_CONDUIT_CAP") { continue } + println!("do {path}"); macro_rules! writ { ($ext:ident / $scale:literal) => { let mut buf = File::create(o.join(n.to_string() + "-" + stringify!($ext))).unwrap(); // boulders - let (mx, my) = if p.width() + p.height() == 48+48 { + let (mx, my) = if env && p.width() + p.height() == 48+48 { (32, 32) // vents (dont match VENT_CONDENSER, do match (RHYOLITE_VENT) } else if path.contains("_VENT") 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) diff --git a/src/data/mod.rs b/src/data/mod.rs index 0cd1d66..d399c18 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -126,14 +126,11 @@ impl<'d> DataRead<'d> { Ok(len) } - pub fn read_chunk<E>( + pub fn read_chunk<E: Error + From<ReadError>, T>( &mut self, big: bool, - f: impl FnOnce(&mut DataRead) -> Result<(), E>, - ) -> Result<(), E> - where - E: Error + From<ReadError>, - { + f: impl FnOnce(&mut DataRead) -> Result<T, E>, + ) -> Result<T, E> { let len = if big { self.read_u32()? as usize } else { @@ -154,10 +151,10 @@ impl<'d> DataRead<'d> { }; Err(e) } - Ok(_) => { + Ok(v) => { debug_assert!(len >= read, "overread; supposed to read {len}; read {read}"); debug_assert!((len - read) == 0, "supposed to read {len}; read {read}"); - Ok(()) + Ok(v) } } } diff --git a/src/data/renderer.rs b/src/data/renderer.rs index eff39ed..62c5fcd 100644 --- a/src/data/renderer.rs +++ b/src/data/renderer.rs @@ -232,6 +232,20 @@ impl Renderable for Map<'_> { } } } + for entity in &self.entities { + // bounds checks + let (x, y) = ( + entity.state.position.0 as u32, + self.height as u32 - entity.state.position.1 as u32 - 1, + ); + if x < 10 || x as usize > self.width - 10 || y < 10 || y as usize > self.height - 10 { + continue; + } + unsafe { + top.as_mut() + .overlay_at(&entity.draw(scale).borrow(), scale * x, scale * y) + }; + } unsafe { floor.as_mut().overlay(&top.as_ref()) }; floor } diff --git a/src/unit/mod.rs b/src/unit/mod.rs index af32c5c..78b70ec 100644 --- a/src/unit/mod.rs +++ b/src/unit/mod.rs @@ -10,76 +10,93 @@ use crate::data::{DataRead, ReadError}; use crate::item::Type as Item; use crate::modifier::Type as Status; use crate::team::Team; +use crate::utils::ImageHolder; use crate::Serializable; -content_enum! { - pub enum Type / Unit for u16 | TryFromU16Error { - "dagger", - "mace", - "fortress", - "scepter", - "reign", - "nova", - "pulsar", - "quasar", - "vela", - "corvus", - "crawler", - "atrax", - "spiroct", - "arkyid", - "toxopid", - "flare", - "horizon", - "zenith", - "antumbra", - "eclipse", - "mono", - "poly", - "mega", - "quad", - "oct", - "risso", - "minke", - "bryde", - "sei", - "omura", - "retusa", - "oxynoe", - "cyerce", - "aegires", - "navanax", - "alpha", - "beta", - "gamma", - "stell", - "locus", - "precept", - "vanquish", - "conquer", - "merui", - "cleroi", - "anthicus", - "anthicus-missile", - "tecta", - "collaris", - "elude", - "avert", - "obviate", - "quell", - "quell-missile", - "disrupt", - "disrupt-missile", - "renale", - "latum", - "evoke", - "incite", - "emanate", - "block", - "manifold", - "assembly-drone", - "scathe-missile", - } +macro_rules! units { + ($($unit:literal,)+ $(,)?) => { paste::paste! { + content_enum! (pub enum Type / Unit for u16 | TryFromU16Error { + $($unit,)+ + }); + + impl Type { + fn draw(self, s: crate::data::renderer::Scale) -> ImageHolder<4> { + match self { + $(Type::[<$unit:camel>] => units!(@help $unit + s),)+ + } + } + } + } }; + (@help "block" + $s:expr) => { crate::data::renderer::load!("empty4", $s) }; + (@help $v:literal + $s:expr) => { crate::data::renderer::load!($v, $s) }; +} + +units! { + "dagger", + "mace", + "fortress", + "scepter", + "reign", + "nova", + "pulsar", + "quasar", + "vela", + "corvus", + "crawler", + "atrax", + "spiroct", + "arkyid", + "toxopid", + "flare", + "horizon", + "zenith", + "antumbra", + "eclipse", + "mono", + "poly", + "mega", + "quad", + "oct", + "risso", + "minke", + "bryde", + "sei", + "omura", + "retusa", + "oxynoe", + "cyerce", + "aegires", + "navanax", + "alpha", + "beta", + "gamma", + "stell", + "locus", + "precept", + "vanquish", + "conquer", + "merui", + "cleroi", + "anthicus", + "anthicus-missile", + "tecta", + "collaris", + "elude", + "avert", + "obviate", + "quell", + "quell-missile", + "disrupt", + "disrupt-missile", + "renale", + "latum", + "evoke", + "incite", + "emanate", + "block", + "manifold", + "assembly-drone", + "scathe-missile", } #[derive(Default, Debug)] @@ -257,7 +274,10 @@ impl UnitClass { let ty = Type::try_from(buff.read_u16()?).unwrap(); buff.skip(1)?; // update_building state.velocity = (buff.read_f32()?, buff.read_f32()?); - state.position = (buff.read_f32()?, buff.read_f32()?); + state.position = ( + (buff.read_f32()? / 8.0).floor(), + (buff.read_f32()? / 8.0).floor(), + ); Ok(Unit { state, ty }) } } @@ -349,3 +369,10 @@ fn read_status(buff: &mut DataRead) -> Result<[Status; 3], ReadError> { } Ok(status) } + +impl Unit { + #[inline] + pub fn draw(&self, s: crate::data::renderer::Scale) -> ImageHolder<4> { + self.ty.draw(s) + } +} |