mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/units.rs')
| -rw-r--r-- | src/block/units.rs | 170 |
1 files changed, 161 insertions, 9 deletions
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)] |