mindustry logic execution, map- and schematic- parsing and rendering
properly draw unit constructors
55 files changed, 164 insertions, 12 deletions
@@ -1,6 +1,6 @@ [package] name = "mindus" -version = "1.3.1" +version = "1.3.2" edition = "2021" description = "A library for working with mindustry data formats (eg schematics) (fork of plandustry)" authors = [ diff --git a/assets/blocks/payload/factory-top-5.png b/assets/blocks/payload/factory-top-5.png Binary files differdeleted file mode 100644 index d6e51b4..0000000 --- a/assets/blocks/payload/factory-top-5.png +++ /dev/null diff --git a/assets/blocks/units/additive-reconstructor-top.png b/assets/blocks/units/additive-reconstructor-top.png Binary files differindex 72f787f..235e672 100644 --- a/assets/blocks/units/additive-reconstructor-top.png +++ b/assets/blocks/units/additive-reconstructor-top.png diff --git a/assets/blocks/units/additive-reconstructor.png b/assets/blocks/units/additive-reconstructor.png Binary files differindex c40e27c..fbc893b 100644 --- a/assets/blocks/units/additive-reconstructor.png +++ b/assets/blocks/units/additive-reconstructor.png diff --git a/assets/blocks/units/air-factory.png b/assets/blocks/units/air-factory.png Binary files differindex a6267de..0644c21 100644 --- a/assets/blocks/units/air-factory.png +++ b/assets/blocks/units/air-factory.png diff --git a/assets/blocks/units/basic-assembler-module-side.png b/assets/blocks/units/basic-assembler-module-side.png Binary files differnew file mode 100644 index 0000000..a621bee --- /dev/null +++ b/assets/blocks/units/basic-assembler-module-side.png diff --git a/assets/blocks/units/basic-assembler-module-side1.png b/assets/blocks/units/basic-assembler-module-side1.png Binary files differdeleted file mode 100644 index 6972683..0000000 --- a/assets/blocks/units/basic-assembler-module-side1.png +++ /dev/null diff --git a/assets/blocks/units/basic-assembler-module-side2.png b/assets/blocks/units/basic-assembler-module-side2.png Binary files differdeleted file mode 100644 index 1684852..0000000 --- a/assets/blocks/units/basic-assembler-module-side2.png +++ /dev/null diff --git a/assets/blocks/units/basic-assembler-module-top.png b/assets/blocks/units/basic-assembler-module-top.png Binary files differdeleted file mode 100644 index c8335d4..0000000 --- a/assets/blocks/units/basic-assembler-module-top.png +++ /dev/null diff --git a/assets/blocks/units/basic-assembler-module.png b/assets/blocks/units/basic-assembler-module.png Binary files differindex 925ae31..328c982 100644 --- a/assets/blocks/units/basic-assembler-module.png +++ b/assets/blocks/units/basic-assembler-module.png diff --git a/assets/blocks/units/exponential-reconstructor-top.png b/assets/blocks/units/exponential-reconstructor-top.png Binary files differindex 4323e74..fb14b35 100644 --- a/assets/blocks/units/exponential-reconstructor-top.png +++ b/assets/blocks/units/exponential-reconstructor-top.png diff --git a/assets/blocks/units/exponential-reconstructor.png b/assets/blocks/units/exponential-reconstructor.png Binary files differindex 9d39a51..d448f39 100644 --- a/assets/blocks/units/exponential-reconstructor.png +++ b/assets/blocks/units/exponential-reconstructor.png diff --git a/assets/blocks/units/ground-factory.png b/assets/blocks/units/ground-factory.png Binary files differindex 7a1106c..4897ec4 100644 --- a/assets/blocks/units/ground-factory.png +++ b/assets/blocks/units/ground-factory.png diff --git a/assets/blocks/units/mech-assembler-side.png b/assets/blocks/units/mech-assembler-side.png Binary files differnew file mode 100644 index 0000000..128573a --- /dev/null +++ b/assets/blocks/units/mech-assembler-side.png diff --git a/assets/blocks/units/mech-assembler-side1.png b/assets/blocks/units/mech-assembler-side1.png Binary files differdeleted file mode 100644 index a65aedb..0000000 --- a/assets/blocks/units/mech-assembler-side1.png +++ /dev/null diff --git a/assets/blocks/units/mech-assembler-side2.png b/assets/blocks/units/mech-assembler-side2.png Binary files differdeleted file mode 100644 index baec10a..0000000 --- a/assets/blocks/units/mech-assembler-side2.png +++ /dev/null diff --git a/assets/blocks/units/mech-assembler-top.png b/assets/blocks/units/mech-assembler-top.png Binary files differindex 6e5e2b7..eaeb699 100644 --- a/assets/blocks/units/mech-assembler-top.png +++ b/assets/blocks/units/mech-assembler-top.png diff --git a/assets/blocks/units/mech-assembler.png b/assets/blocks/units/mech-assembler.png Binary files differindex 04b7308..d49f5a2 100644 --- a/assets/blocks/units/mech-assembler.png +++ b/assets/blocks/units/mech-assembler.png diff --git a/assets/blocks/units/mech-fabricator-top.png b/assets/blocks/units/mech-fabricator-top.png Binary files differindex 57ebfc2..d4e4d62 100644 --- a/assets/blocks/units/mech-fabricator-top.png +++ b/assets/blocks/units/mech-fabricator-top.png diff --git a/assets/blocks/units/mech-fabricator.png b/assets/blocks/units/mech-fabricator.png Binary files differindex d816c06..2556a96 100644 --- a/assets/blocks/units/mech-fabricator.png +++ b/assets/blocks/units/mech-fabricator.png diff --git a/assets/blocks/units/mech-refabricator-top.png b/assets/blocks/units/mech-refabricator-top.png Binary files differindex e78d8c2..48446c0 100644 --- a/assets/blocks/units/mech-refabricator-top.png +++ b/assets/blocks/units/mech-refabricator-top.png diff --git a/assets/blocks/units/mech-refabricator.png b/assets/blocks/units/mech-refabricator.png Binary files differindex 7ab0cc5..5d89f8f 100644 --- a/assets/blocks/units/mech-refabricator.png +++ b/assets/blocks/units/mech-refabricator.png diff --git a/assets/blocks/units/multiplicative-reconstructor-top.png b/assets/blocks/units/multiplicative-reconstructor-top.png Binary files differindex 4403825..e319530 100644 --- a/assets/blocks/units/multiplicative-reconstructor-top.png +++ b/assets/blocks/units/multiplicative-reconstructor-top.png diff --git a/assets/blocks/units/multiplicative-reconstructor.png b/assets/blocks/units/multiplicative-reconstructor.png Binary files differindex 6dcf71c..5ea5f9f 100644 --- a/assets/blocks/units/multiplicative-reconstructor.png +++ b/assets/blocks/units/multiplicative-reconstructor.png diff --git a/assets/blocks/units/naval-factory.png b/assets/blocks/units/naval-factory.png Binary files differindex 052f729..f022ba2 100644 --- a/assets/blocks/units/naval-factory.png +++ b/assets/blocks/units/naval-factory.png diff --git a/assets/blocks/units/prime-refabricator-top.png b/assets/blocks/units/prime-refabricator-top.png Binary files differindex 1bd25e6..675639a 100644 --- a/assets/blocks/units/prime-refabricator-top.png +++ b/assets/blocks/units/prime-refabricator-top.png diff --git a/assets/blocks/units/prime-refabricator.png b/assets/blocks/units/prime-refabricator.png Binary files differindex 05491bd..d48e63c 100644 --- a/assets/blocks/units/prime-refabricator.png +++ b/assets/blocks/units/prime-refabricator.png diff --git a/assets/blocks/units/repair-point-base.png b/assets/blocks/units/repair-point-base.png Binary files differindex 5cc56cb..d68eb37 100644 --- a/assets/blocks/units/repair-point-base.png +++ b/assets/blocks/units/repair-point-base.png diff --git a/assets/blocks/units/repair-point.png b/assets/blocks/units/repair-point.png Binary files differindex f3c0a07..9bad782 100644 --- a/assets/blocks/units/repair-point.png +++ b/assets/blocks/units/repair-point.png diff --git a/assets/blocks/units/repair-turret.png b/assets/blocks/units/repair-turret.png Binary files differindex f62c761..f20f3d7 100644 --- a/assets/blocks/units/repair-turret.png +++ b/assets/blocks/units/repair-turret.png diff --git a/assets/blocks/units/ship-assembler-side.png b/assets/blocks/units/ship-assembler-side.png Binary files differnew file mode 100644 index 0000000..f865e4d --- /dev/null +++ b/assets/blocks/units/ship-assembler-side.png diff --git a/assets/blocks/units/ship-assembler-side1.png b/assets/blocks/units/ship-assembler-side1.png Binary files differdeleted file mode 100644 index 619461a..0000000 --- a/assets/blocks/units/ship-assembler-side1.png +++ /dev/null diff --git a/assets/blocks/units/ship-assembler-side2.png b/assets/blocks/units/ship-assembler-side2.png Binary files differdeleted file mode 100644 index 3a743e8..0000000 --- a/assets/blocks/units/ship-assembler-side2.png +++ /dev/null diff --git a/assets/blocks/units/ship-assembler-top.png b/assets/blocks/units/ship-assembler-top.png Binary files differindex e38503a..c055289 100644 --- a/assets/blocks/units/ship-assembler-top.png +++ b/assets/blocks/units/ship-assembler-top.png diff --git a/assets/blocks/units/ship-assembler.png b/assets/blocks/units/ship-assembler.png Binary files differindex a1fff21..1617c27 100644 --- a/assets/blocks/units/ship-assembler.png +++ b/assets/blocks/units/ship-assembler.png diff --git a/assets/blocks/units/ship-fabricator-top.png b/assets/blocks/units/ship-fabricator-top.png Binary files differindex 7c4de4e..b120238 100644 --- a/assets/blocks/units/ship-fabricator-top.png +++ b/assets/blocks/units/ship-fabricator-top.png diff --git a/assets/blocks/units/ship-fabricator.png b/assets/blocks/units/ship-fabricator.png Binary files differindex 67b5a12..3f02145 100644 --- a/assets/blocks/units/ship-fabricator.png +++ b/assets/blocks/units/ship-fabricator.png diff --git a/assets/blocks/units/ship-refabricator-top.png b/assets/blocks/units/ship-refabricator-top.png Binary files differindex d003e35..aa8cc85 100644 --- a/assets/blocks/units/ship-refabricator-top.png +++ b/assets/blocks/units/ship-refabricator-top.png diff --git a/assets/blocks/units/ship-refabricator.png b/assets/blocks/units/ship-refabricator.png Binary files differindex b8c6ff6..1c921a4 100644 --- a/assets/blocks/units/ship-refabricator.png +++ b/assets/blocks/units/ship-refabricator.png diff --git a/assets/blocks/units/tank-assembler-side.png b/assets/blocks/units/tank-assembler-side.png Binary files differnew file mode 100644 index 0000000..ee7fee9 --- /dev/null +++ b/assets/blocks/units/tank-assembler-side.png diff --git a/assets/blocks/units/tank-assembler-side1.png b/assets/blocks/units/tank-assembler-side1.png Binary files differdeleted file mode 100644 index 7c6725f..0000000 --- a/assets/blocks/units/tank-assembler-side1.png +++ /dev/null diff --git a/assets/blocks/units/tank-assembler-side2.png b/assets/blocks/units/tank-assembler-side2.png Binary files differdeleted file mode 100644 index b5689c0..0000000 --- a/assets/blocks/units/tank-assembler-side2.png +++ /dev/null diff --git a/assets/blocks/units/tank-assembler-top.png b/assets/blocks/units/tank-assembler-top.png Binary files differindex 2c8060b..1478f2c 100644 --- a/assets/blocks/units/tank-assembler-top.png +++ b/assets/blocks/units/tank-assembler-top.png diff --git a/assets/blocks/units/tank-assembler.png b/assets/blocks/units/tank-assembler.png Binary files differindex 3e379f0..74e2017 100644 --- a/assets/blocks/units/tank-assembler.png +++ b/assets/blocks/units/tank-assembler.png diff --git a/assets/blocks/units/tank-fabricator-top.png b/assets/blocks/units/tank-fabricator-top.png Binary files differindex 09cf0a6..18ef34f 100644 --- a/assets/blocks/units/tank-fabricator-top.png +++ b/assets/blocks/units/tank-fabricator-top.png diff --git a/assets/blocks/units/tank-fabricator.png b/assets/blocks/units/tank-fabricator.png Binary files differindex e18aff4..91eec5d 100644 --- a/assets/blocks/units/tank-fabricator.png +++ b/assets/blocks/units/tank-fabricator.png diff --git a/assets/blocks/units/tank-refabricator-top.png b/assets/blocks/units/tank-refabricator-top.png Binary files differindex 458d929..f57933e 100644 --- a/assets/blocks/units/tank-refabricator-top.png +++ b/assets/blocks/units/tank-refabricator-top.png diff --git a/assets/blocks/units/tank-refabricator.png b/assets/blocks/units/tank-refabricator.png Binary files differindex 93b606a..3d73664 100644 --- a/assets/blocks/units/tank-refabricator.png +++ b/assets/blocks/units/tank-refabricator.png diff --git a/assets/blocks/units/tetrative-reconstructor-top.png b/assets/blocks/units/tetrative-reconstructor-top.png Binary files differindex fa72177..9db3308 100644 --- a/assets/blocks/units/tetrative-reconstructor-top.png +++ b/assets/blocks/units/tetrative-reconstructor-top.png diff --git a/assets/blocks/units/tetrative-reconstructor.png b/assets/blocks/units/tetrative-reconstructor.png Binary files differindex 67f7ed8..391f483 100644 --- a/assets/blocks/units/tetrative-reconstructor.png +++ b/assets/blocks/units/tetrative-reconstructor.png diff --git a/assets/blocks/units/unit-cargo-loader.png b/assets/blocks/units/unit-cargo-loader.png Binary files differindex cd658f8..6b8de38 100644 --- a/assets/blocks/units/unit-cargo-loader.png +++ b/assets/blocks/units/unit-cargo-loader.png diff --git a/assets/blocks/units/unit-repair-tower-glow.png b/assets/blocks/units/unit-repair-tower-glow.png Binary files differdeleted file mode 100644 index 3234f4a..0000000 --- a/assets/blocks/units/unit-repair-tower-glow.png +++ /dev/null diff --git a/assets/blocks/units/unit-repair-tower.png b/assets/blocks/units/unit-repair-tower.png Binary files differindex 805e1ef..59530d8 100644 --- a/assets/blocks/units/unit-repair-tower.png +++ b/assets/blocks/units/unit-repair-tower.png diff --git a/src/block/units.rs b/src/block/units.rs index a9d15a4..2dcfc94 100644 --- a/src/block/units.rs +++ b/src/block/units.rs @@ -6,7 +6,114 @@ use crate::block::*; use crate::data::dynamic::DynType; use crate::unit; -make_simple!(ConstructorBlock); +// fn is_pay(b: &str) -> bool { +// matches!( +// b, +// "ground-factory" +// | "air-factory" +// | "naval-factory" +// | "additive-reconstructor" +// | "multiplicative-reconstructor" +// | "exponential-reconstructor" +// | "tank-fabricator" +// | "ship-fabricator" +// | "mech-fabricator" +// | "tank-refabricator" +// | "ship-refabricator" +// | "payload-conveyor" +// | "payload-router" +// | "reinforced-payload-conveyor" +// | "reinforced-payload-router" +// | "payload-mass-driver" +// | "large-payload-mass-driver" +// | "constructor" +// | "large-constructor" +// | "payload-source" +// ) +// } + +make_simple!( + ConstructorBlock, + |me: &Self, _, name, _, context: Option<&RenderingContext>| { + let ctx = context.unwrap(); + let mut base = load("units", name).unwrap().to_owned(); + let times = ctx.rotation.rotated(false).count(); + { + let out = load( + "payload", + &match name { + "additive-reconstructor" + | "multiplicative-reconstructor" + | "exponential-reconstructor" + | "tetrative-reconstructor" => format!("factory-out-{}", me.size), + _ => format!("factory-out-{}-dark", me.size), + }, + ) + .unwrap(); + if times != 0 { + let mut out = out.clone(); + out.rotate(times); + base.overlay(&out, 0, 0); + } else { + base.overlay(&out, 0, 0); + } + } + { + let input = load( + "payload", + &match name { + "additive-reconstructor" + | "multiplicative-reconstructor" + | "exponential-reconstructor" + | "tetrative-reconstructor" => format!("factory-in-{}", me.size), + _ => format!("factory-in-{}-dark", me.size), + }, + ) + .unwrap(); + if times != 0 { + let mut input = input.clone(); + input.rotate(times); + base.overlay(&input, 0, 0); + } else { + base.overlay(&input, 0, 0); + } + } + // TODO: the context cross is too small + // for i in 0..4u8 { + // if let Some((b, rot)) = dbg!(ctx.cross[i as usize]) { + // if rot.mirrored(true, true) != ctx.rotation && match rot { + // Rotation::Up => i == 3, + // Rotation::Right => i == 4, + // Rotation::Down => i == 0, + // Rotation::Left => i == 2, + // } && is_pay(b.name()) + // { + // let r = unsafe { std::mem::transmute::<u8, Rotation>(i) } + // .mirrored(true, true) + // .rotated(false); + // let mut input = input.clone(); + // input.rotate(r.count()); + // base.overlay(&input, 0, 0); + // } + // } + // } + { + base.overlay(&load("units", &format!("{name}-top")).unwrap(), 0, 0); + } + if matches!(name, "mech-assembler" | "tank-assembler" | "ship-assembler") { + let side = load("units", &format!("{name}-side")).unwrap(); + if times != 0 { + let mut side = side.clone(); + side.rotate(times); + base.overlay(&side, 0, 0); + } else { + base.overlay(&side, 0, 0); + } + } + Some(ImageHolder::from(base)) + }, + true +); make_simple!(UnitBlock); const GROUND_UNITS: &[unit::Type] = &[unit::Type::Dagger, unit::Type::Crawler, unit::Type::Nova]; @@ -25,9 +132,9 @@ make_register! { cost!(Lead: 4000, Thorium: 1000, Silicon: 3000, Plastanium: 600, PhaseFabric: 600, SurgeAlloy: 800)); "repair-point" => UnitBlock::new(1, true, cost!(Copper: 30, Lead: 30, Silicon: 20)); "repair-turret" => UnitBlock::new(2, true, cost!(Thorium: 80, Silicon: 90, Plastanium: 60)); - "tank-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 200, Beryllium: 150)); - "ship-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 250, Beryllium: 200)); - "mech-fabricator" => ConstructorBlock::new(3, true, cost!(Silicon: 200, Graphite: 300, Tungsten: 60)); + "tank-fabricator" => AssemblerBlock::new(3, true, cost!(Silicon: 200, Beryllium: 150), &[unit::Type::Stell]); + "ship-fabricator" => AssemblerBlock::new(3, true, cost!(Silicon: 250, Beryllium: 200), &[unit::Type::Elude]); + "mech-fabricator" => AssemblerBlock::new(3, true, cost!(Silicon: 200, Graphite: 300, Tungsten: 60), &[unit::Type::Merui]); "tank-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 200, Tungsten: 80, Silicon: 100)); "mech-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 250, Tungsten: 120, Silicon: 150)); "ship-refabricator" => ConstructorBlock::new(3, true, cost!(Beryllium: 200, Tungsten: 100, Silicon: 150, Oxide: 40)); @@ -35,7 +142,7 @@ make_register! { "tank-assembler" => ConstructorBlock::new(5, true, cost!(Thorium: 500, Oxide: 150, Carbide: 80, Silicon: 500)); "ship-assembler" => ConstructorBlock::new(5, true, cost!(Carbide: 100, Oxide: 200, Tungsten: 500, Silicon: 800, Thorium: 400)); "mech-assembler" => ConstructorBlock::new(5, true, cost!(Carbide: 200, Thorium: 600, Oxide: 200, Tungsten: 500, Silicon: 900)); // smh collaris - "basic-assembler-module" => ConstructorBlock::new(5, true, cost!(Carbide: 300, Thorium: 500, Oxide: 200, PhaseFabric: 400)); // the dummy block + "basic-assembler-module" => UnitBlock::new(5, true, cost!(Carbide: 300, Thorium: 500, Oxide: 200, PhaseFabric: 400)); // the dummy block "unit-repair-tower" => UnitBlock::new(2, true, cost!(Graphite: 90, Silicon: 90, Tungsten: 80)); } @@ -105,10 +212,6 @@ impl BlockLogic for AssemblerBlock { Box::new(Self::create_state(*state)) } - fn mirror_state(&self, _: &mut State, _: bool, _: bool) {} - - fn rotate_state(&self, _: &mut State, _: bool) {} - fn serialize_state(&self, state: &State) -> Result<DynData, SerializeError> { if let Some(state) = Self::get_state(state) { for (i, curr) in self.valid.iter().enumerate() { @@ -123,6 +226,55 @@ impl BlockLogic for AssemblerBlock { Ok(DynData::Int(-1)) } } + + fn draw( + &self, + _: &str, + name: &str, + _: Option<&State>, + context: Option<&RenderingContext>, + ) -> Option<ImageHolder> { + let ctx = context.unwrap(); + let mut base = load("units", name).unwrap().to_owned(); + let out = load( + "payload", + match name { + "ground-factory" | "air-factory" | "naval-factory" => "factory-out-3", + _ => "factory-out-3-dark", + }, + ) + .unwrap(); + let times = ctx.rotation.rotated(false).count(); + if times != 0 { + let mut out = out.clone(); + out.rotate(times); + base.overlay(&out, 0, 0); + } else { + base.overlay(&out, 0, 0); + } + base.overlay( + &load( + match name { + "ground-factory" | "air-factory" | "naval-factory" => "payload", + _ => "units", + }, + &match name { + "ground-factory" | "air-factory" | "naval-factory" => { + format!("factory-top-{}", self.size) + } + _ => format!("{name}-top"), + }, + ) + .unwrap(), + 0, + 0, + ); + Some(ImageHolder::from(base)) + } + + fn want_context(&self) -> bool { + true + } } #[derive(Clone, Copy, Debug, Eq, PartialEq, Error)] diff --git a/src/data/renderer.rs b/src/data/renderer.rs index 5290584..58aba9b 100644 --- a/src/data/renderer.rs +++ b/src/data/renderer.rs @@ -92,12 +92,12 @@ impl From<RgbaImage> for ImageHolder { static CACHE: OnceLock<Cache> = OnceLock::new(); pub(crate) fn load(category: &str, name: &str) -> Option<Ref<'static, PathBuf, RgbaImage>> { - let key = Path::new("blocks").join(category).join(name); - let mut p = key.clone(); + let key = Path::new(category).join(name); use dashmap::mapref::entry::Entry::*; Some(match cache().entry(key) { Occupied(v) => v.into_ref().downgrade(), Vacant(entry) => { + let mut p = Path::new("blocks").join(category).join(name); p.set_extension("png"); let Some(i) = load_raw(p) else { return None; |