mindustry logic execution, map- and schematic- parsing and rendering
-rw-r--r--Cargo.toml2
-rw-r--r--assets/units/aegires.pngbin0 -> 7637 bytes
-rw-r--r--assets/units/alpha.pngbin0 -> 890 bytes
-rw-r--r--assets/units/anthicus-missile.pngbin0 -> 575 bytes
-rw-r--r--assets/units/anthicus.pngbin0 -> 2700 bytes
-rw-r--r--assets/units/antumbra.pngbin0 -> 7956 bytes
-rw-r--r--assets/units/arkyid.pngbin0 -> 4028 bytes
-rw-r--r--assets/units/assembly-drone.pngbin0 -> 972 bytes
-rw-r--r--assets/units/atrax.pngbin0 -> 1593 bytes
-rw-r--r--assets/units/avert.pngbin0 -> 2080 bytes
-rw-r--r--assets/units/beta.pngbin0 -> 1173 bytes
-rw-r--r--assets/units/bryde.pngbin0 -> 3457 bytes
-rw-r--r--assets/units/cleroi.pngbin0 -> 1970 bytes
-rw-r--r--assets/units/collaris.pngbin0 -> 6204 bytes
-rw-r--r--assets/units/conquer.pngbin0 -> 8403 bytes
-rw-r--r--assets/units/corvus.pngbin0 -> 4024 bytes
-rw-r--r--assets/units/crawler.pngbin0 -> 549 bytes
-rw-r--r--assets/units/cyerce.pngbin0 -> 4018 bytes
-rw-r--r--assets/units/dagger.pngbin0 -> 781 bytes
-rw-r--r--assets/units/disrupt-missile.pngbin0 -> 841 bytes
-rw-r--r--assets/units/disrupt.pngbin0 -> 7070 bytes
-rw-r--r--assets/units/eclipse.pngbin0 -> 12373 bytes
-rw-r--r--assets/units/elude.pngbin0 -> 1197 bytes
-rw-r--r--assets/units/emanate.pngbin0 -> 1761 bytes
-rw-r--r--assets/units/evoke.pngbin0 -> 1109 bytes
-rw-r--r--assets/units/flare.pngbin0 -> 802 bytes
-rw-r--r--assets/units/fortress.pngbin0 -> 1640 bytes
-rw-r--r--assets/units/gamma.pngbin0 -> 1375 bytes
-rw-r--r--assets/units/horizon.pngbin0 -> 1282 bytes
-rw-r--r--assets/units/incite.pngbin0 -> 1466 bytes
-rw-r--r--assets/units/latum.pngbin0 -> 7320 bytes
-rw-r--r--assets/units/locus.pngbin0 -> 2347 bytes
-rw-r--r--assets/units/mace.pngbin0 -> 1148 bytes
-rw-r--r--assets/units/manifold.pngbin0 -> 1483 bytes
-rw-r--r--assets/units/mega.pngbin0 -> 2145 bytes
-rw-r--r--assets/units/merui.pngbin0 -> 1028 bytes
-rw-r--r--assets/units/minke.pngbin0 -> 2169 bytes
-rw-r--r--assets/units/mono.pngbin0 -> 783 bytes
-rw-r--r--assets/units/navanax.pngbin0 -> 13444 bytes
-rw-r--r--assets/units/nova.pngbin0 -> 1034 bytes
-rw-r--r--assets/units/obviate.pngbin0 -> 3010 bytes
-rw-r--r--assets/units/oct.pngbin0 -> 11034 bytes
-rw-r--r--assets/units/omura.pngbin0 -> 10498 bytes
-rw-r--r--assets/units/oxynoe.pngbin0 -> 2369 bytes
-rw-r--r--assets/units/poly.pngbin0 -> 1232 bytes
-rw-r--r--assets/units/precept.pngbin0 -> 4039 bytes
-rw-r--r--assets/units/pulsar.pngbin0 -> 1517 bytes
-rw-r--r--assets/units/quad.pngbin0 -> 5661 bytes
-rw-r--r--assets/units/quasar.pngbin0 -> 1982 bytes
-rw-r--r--assets/units/quell-missile.pngbin0 -> 723 bytes
-rw-r--r--assets/units/quell.pngbin0 -> 4089 bytes
-rw-r--r--assets/units/reign.pngbin0 -> 4992 bytes
-rw-r--r--assets/units/renale.pngbin0 -> 993 bytes
-rw-r--r--assets/units/retusa.pngbin0 -> 1511 bytes
-rw-r--r--assets/units/risso.pngbin0 -> 1602 bytes
-rw-r--r--assets/units/scathe-missile.pngbin0 -> 1186 bytes
-rw-r--r--assets/units/scepter.pngbin0 -> 4260 bytes
-rw-r--r--assets/units/sei.pngbin0 -> 6569 bytes
-rw-r--r--assets/units/spiroct.pngbin0 -> 2256 bytes
-rw-r--r--assets/units/stell.pngbin0 -> 1516 bytes
-rw-r--r--assets/units/tecta.pngbin0 -> 4429 bytes
-rw-r--r--assets/units/toxopid.pngbin0 -> 5437 bytes
-rw-r--r--assets/units/vanquish.pngbin0 -> 4998 bytes
-rw-r--r--assets/units/vela.pngbin0 -> 3390 bytes
-rw-r--r--assets/units/zenith.pngbin0 -> 3066 bytes
-rw-r--r--build.rs4
-rw-r--r--src/data/map.rs21
-rw-r--r--src/data/mod.rs13
-rw-r--r--src/data/renderer.rs14
-rw-r--r--src/unit/mod.rs165
70 files changed, 131 insertions, 88 deletions
diff --git a/Cargo.toml b/Cargo.toml
index c381255..0084712 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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
new file mode 100644
index 0000000..e89c0f9
--- /dev/null
+++ b/assets/units/aegires.png
Binary files differ
diff --git a/assets/units/alpha.png b/assets/units/alpha.png
new file mode 100644
index 0000000..af3f4d0
--- /dev/null
+++ b/assets/units/alpha.png
Binary files differ
diff --git a/assets/units/anthicus-missile.png b/assets/units/anthicus-missile.png
new file mode 100644
index 0000000..406dc4b
--- /dev/null
+++ b/assets/units/anthicus-missile.png
Binary files differ
diff --git a/assets/units/anthicus.png b/assets/units/anthicus.png
new file mode 100644
index 0000000..96e6674
--- /dev/null
+++ b/assets/units/anthicus.png
Binary files differ
diff --git a/assets/units/antumbra.png b/assets/units/antumbra.png
new file mode 100644
index 0000000..8369d3a
--- /dev/null
+++ b/assets/units/antumbra.png
Binary files differ
diff --git a/assets/units/arkyid.png b/assets/units/arkyid.png
new file mode 100644
index 0000000..39ec11e
--- /dev/null
+++ b/assets/units/arkyid.png
Binary files differ
diff --git a/assets/units/assembly-drone.png b/assets/units/assembly-drone.png
new file mode 100644
index 0000000..bb9104b
--- /dev/null
+++ b/assets/units/assembly-drone.png
Binary files differ
diff --git a/assets/units/atrax.png b/assets/units/atrax.png
new file mode 100644
index 0000000..5de4da8
--- /dev/null
+++ b/assets/units/atrax.png
Binary files differ
diff --git a/assets/units/avert.png b/assets/units/avert.png
new file mode 100644
index 0000000..21f093c
--- /dev/null
+++ b/assets/units/avert.png
Binary files differ
diff --git a/assets/units/beta.png b/assets/units/beta.png
new file mode 100644
index 0000000..4739bb8
--- /dev/null
+++ b/assets/units/beta.png
Binary files differ
diff --git a/assets/units/bryde.png b/assets/units/bryde.png
new file mode 100644
index 0000000..2b95dc1
--- /dev/null
+++ b/assets/units/bryde.png
Binary files differ
diff --git a/assets/units/cleroi.png b/assets/units/cleroi.png
new file mode 100644
index 0000000..3bb2c2c
--- /dev/null
+++ b/assets/units/cleroi.png
Binary files differ
diff --git a/assets/units/collaris.png b/assets/units/collaris.png
new file mode 100644
index 0000000..5858a88
--- /dev/null
+++ b/assets/units/collaris.png
Binary files differ
diff --git a/assets/units/conquer.png b/assets/units/conquer.png
new file mode 100644
index 0000000..d3af969
--- /dev/null
+++ b/assets/units/conquer.png
Binary files differ
diff --git a/assets/units/corvus.png b/assets/units/corvus.png
new file mode 100644
index 0000000..da8a8b2
--- /dev/null
+++ b/assets/units/corvus.png
Binary files differ
diff --git a/assets/units/crawler.png b/assets/units/crawler.png
new file mode 100644
index 0000000..df0b6b0
--- /dev/null
+++ b/assets/units/crawler.png
Binary files differ
diff --git a/assets/units/cyerce.png b/assets/units/cyerce.png
new file mode 100644
index 0000000..903fbe3
--- /dev/null
+++ b/assets/units/cyerce.png
Binary files differ
diff --git a/assets/units/dagger.png b/assets/units/dagger.png
new file mode 100644
index 0000000..609f158
--- /dev/null
+++ b/assets/units/dagger.png
Binary files differ
diff --git a/assets/units/disrupt-missile.png b/assets/units/disrupt-missile.png
new file mode 100644
index 0000000..55d2e03
--- /dev/null
+++ b/assets/units/disrupt-missile.png
Binary files differ
diff --git a/assets/units/disrupt.png b/assets/units/disrupt.png
new file mode 100644
index 0000000..8092db7
--- /dev/null
+++ b/assets/units/disrupt.png
Binary files differ
diff --git a/assets/units/eclipse.png b/assets/units/eclipse.png
new file mode 100644
index 0000000..ca644ca
--- /dev/null
+++ b/assets/units/eclipse.png
Binary files differ
diff --git a/assets/units/elude.png b/assets/units/elude.png
new file mode 100644
index 0000000..09e0de0
--- /dev/null
+++ b/assets/units/elude.png
Binary files differ
diff --git a/assets/units/emanate.png b/assets/units/emanate.png
new file mode 100644
index 0000000..87e5dd8
--- /dev/null
+++ b/assets/units/emanate.png
Binary files differ
diff --git a/assets/units/evoke.png b/assets/units/evoke.png
new file mode 100644
index 0000000..07a807e
--- /dev/null
+++ b/assets/units/evoke.png
Binary files differ
diff --git a/assets/units/flare.png b/assets/units/flare.png
new file mode 100644
index 0000000..6000f66
--- /dev/null
+++ b/assets/units/flare.png
Binary files differ
diff --git a/assets/units/fortress.png b/assets/units/fortress.png
new file mode 100644
index 0000000..bbdf6e1
--- /dev/null
+++ b/assets/units/fortress.png
Binary files differ
diff --git a/assets/units/gamma.png b/assets/units/gamma.png
new file mode 100644
index 0000000..bcb08df
--- /dev/null
+++ b/assets/units/gamma.png
Binary files differ
diff --git a/assets/units/horizon.png b/assets/units/horizon.png
new file mode 100644
index 0000000..11d2739
--- /dev/null
+++ b/assets/units/horizon.png
Binary files differ
diff --git a/assets/units/incite.png b/assets/units/incite.png
new file mode 100644
index 0000000..f659ffb
--- /dev/null
+++ b/assets/units/incite.png
Binary files differ
diff --git a/assets/units/latum.png b/assets/units/latum.png
new file mode 100644
index 0000000..ecba602
--- /dev/null
+++ b/assets/units/latum.png
Binary files differ
diff --git a/assets/units/locus.png b/assets/units/locus.png
new file mode 100644
index 0000000..d409235
--- /dev/null
+++ b/assets/units/locus.png
Binary files differ
diff --git a/assets/units/mace.png b/assets/units/mace.png
new file mode 100644
index 0000000..0b4a6a2
--- /dev/null
+++ b/assets/units/mace.png
Binary files differ
diff --git a/assets/units/manifold.png b/assets/units/manifold.png
new file mode 100644
index 0000000..d42d391
--- /dev/null
+++ b/assets/units/manifold.png
Binary files differ
diff --git a/assets/units/mega.png b/assets/units/mega.png
new file mode 100644
index 0000000..7f58fab
--- /dev/null
+++ b/assets/units/mega.png
Binary files differ
diff --git a/assets/units/merui.png b/assets/units/merui.png
new file mode 100644
index 0000000..a28422c
--- /dev/null
+++ b/assets/units/merui.png
Binary files differ
diff --git a/assets/units/minke.png b/assets/units/minke.png
new file mode 100644
index 0000000..0cc85e7
--- /dev/null
+++ b/assets/units/minke.png
Binary files differ
diff --git a/assets/units/mono.png b/assets/units/mono.png
new file mode 100644
index 0000000..533a3ed
--- /dev/null
+++ b/assets/units/mono.png
Binary files differ
diff --git a/assets/units/navanax.png b/assets/units/navanax.png
new file mode 100644
index 0000000..94b193c
--- /dev/null
+++ b/assets/units/navanax.png
Binary files differ
diff --git a/assets/units/nova.png b/assets/units/nova.png
new file mode 100644
index 0000000..7ab100d
--- /dev/null
+++ b/assets/units/nova.png
Binary files differ
diff --git a/assets/units/obviate.png b/assets/units/obviate.png
new file mode 100644
index 0000000..a836265
--- /dev/null
+++ b/assets/units/obviate.png
Binary files differ
diff --git a/assets/units/oct.png b/assets/units/oct.png
new file mode 100644
index 0000000..7df38a7
--- /dev/null
+++ b/assets/units/oct.png
Binary files differ
diff --git a/assets/units/omura.png b/assets/units/omura.png
new file mode 100644
index 0000000..580bb5f
--- /dev/null
+++ b/assets/units/omura.png
Binary files differ
diff --git a/assets/units/oxynoe.png b/assets/units/oxynoe.png
new file mode 100644
index 0000000..87fc11a
--- /dev/null
+++ b/assets/units/oxynoe.png
Binary files differ
diff --git a/assets/units/poly.png b/assets/units/poly.png
new file mode 100644
index 0000000..e792d5e
--- /dev/null
+++ b/assets/units/poly.png
Binary files differ
diff --git a/assets/units/precept.png b/assets/units/precept.png
new file mode 100644
index 0000000..32fe877
--- /dev/null
+++ b/assets/units/precept.png
Binary files differ
diff --git a/assets/units/pulsar.png b/assets/units/pulsar.png
new file mode 100644
index 0000000..152c365
--- /dev/null
+++ b/assets/units/pulsar.png
Binary files differ
diff --git a/assets/units/quad.png b/assets/units/quad.png
new file mode 100644
index 0000000..09986db
--- /dev/null
+++ b/assets/units/quad.png
Binary files differ
diff --git a/assets/units/quasar.png b/assets/units/quasar.png
new file mode 100644
index 0000000..cc9ac31
--- /dev/null
+++ b/assets/units/quasar.png
Binary files differ
diff --git a/assets/units/quell-missile.png b/assets/units/quell-missile.png
new file mode 100644
index 0000000..dd05d06
--- /dev/null
+++ b/assets/units/quell-missile.png
Binary files differ
diff --git a/assets/units/quell.png b/assets/units/quell.png
new file mode 100644
index 0000000..f724c4e
--- /dev/null
+++ b/assets/units/quell.png
Binary files differ
diff --git a/assets/units/reign.png b/assets/units/reign.png
new file mode 100644
index 0000000..55701e6
--- /dev/null
+++ b/assets/units/reign.png
Binary files differ
diff --git a/assets/units/renale.png b/assets/units/renale.png
new file mode 100644
index 0000000..d4283d4
--- /dev/null
+++ b/assets/units/renale.png
Binary files differ
diff --git a/assets/units/retusa.png b/assets/units/retusa.png
new file mode 100644
index 0000000..1115725
--- /dev/null
+++ b/assets/units/retusa.png
Binary files differ
diff --git a/assets/units/risso.png b/assets/units/risso.png
new file mode 100644
index 0000000..97d9d2f
--- /dev/null
+++ b/assets/units/risso.png
Binary files differ
diff --git a/assets/units/scathe-missile.png b/assets/units/scathe-missile.png
new file mode 100644
index 0000000..fd9ce44
--- /dev/null
+++ b/assets/units/scathe-missile.png
Binary files differ
diff --git a/assets/units/scepter.png b/assets/units/scepter.png
new file mode 100644
index 0000000..61b87a6
--- /dev/null
+++ b/assets/units/scepter.png
Binary files differ
diff --git a/assets/units/sei.png b/assets/units/sei.png
new file mode 100644
index 0000000..076c659
--- /dev/null
+++ b/assets/units/sei.png
Binary files differ
diff --git a/assets/units/spiroct.png b/assets/units/spiroct.png
new file mode 100644
index 0000000..2670acc
--- /dev/null
+++ b/assets/units/spiroct.png
Binary files differ
diff --git a/assets/units/stell.png b/assets/units/stell.png
new file mode 100644
index 0000000..0d06858
--- /dev/null
+++ b/assets/units/stell.png
Binary files differ
diff --git a/assets/units/tecta.png b/assets/units/tecta.png
new file mode 100644
index 0000000..66f473c
--- /dev/null
+++ b/assets/units/tecta.png
Binary files differ
diff --git a/assets/units/toxopid.png b/assets/units/toxopid.png
new file mode 100644
index 0000000..34e5301
--- /dev/null
+++ b/assets/units/toxopid.png
Binary files differ
diff --git a/assets/units/vanquish.png b/assets/units/vanquish.png
new file mode 100644
index 0000000..31e07d6
--- /dev/null
+++ b/assets/units/vanquish.png
Binary files differ
diff --git a/assets/units/vela.png b/assets/units/vela.png
new file mode 100644
index 0000000..a76ec93
--- /dev/null
+++ b/assets/units/vela.png
Binary files differ
diff --git a/assets/units/zenith.png b/assets/units/zenith.png
new file mode 100644
index 0000000..a015009
--- /dev/null
+++ b/assets/units/zenith.png
Binary files differ
diff --git a/build.rs b/build.rs
index f725eba..c3afb72 100644
--- a/build.rs
+++ b/build.rs
@@ -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)
+ }
+}