mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/distribution.rs')
| -rw-r--r-- | src/block/distribution.rs | 175 |
1 files changed, 77 insertions, 98 deletions
diff --git a/src/block/distribution.rs b/src/block/distribution.rs index baa6ee6..06ce5b8 100644 --- a/src/block/distribution.rs +++ b/src/block/distribution.rs @@ -8,9 +8,9 @@ use crate::item; make_simple!( ConveyorBlock, - |_, _, name, _, ctx: Option<&RenderingContext>, rot: Rotation| { + |_, name, _, ctx: Option<&RenderingContext>, rot: Rotation| { let ctx = ctx.unwrap(); // we set want_context to true - Some(tile(ctx, "distribution", "conveyors", name, rot)) + tile(ctx, name, rot) }, |_, _, _, buff: &mut DataRead| { // format: @@ -31,9 +31,9 @@ make_simple!( make_simple!( DuctBlock, - |_, _, name, _, ctx: Option<&RenderingContext>, rot| { + |_, name, _, ctx: Option<&RenderingContext>, rot| { let ctx = ctx.unwrap(); - Some(tile(ctx, "distribution", "ducts", name, rot)) + tile(ctx, name, rot) }, |_, _, _, buff: &mut DataRead| { // format: @@ -43,35 +43,25 @@ make_simple!( true ); -make_simple!( - JunctionBlock, - |_, _, _, _, _, _| None, - |_, _, _, buff: &mut DataRead| { read_directional_item_buffer(buff) }, - false -); - -make_simple!(SimpleDuctBlock, |_, _, name, _, _, rot: Rotation| { - let mut base = load("distribution/ducts", "duct-base").unwrap().clone(); - let mut top = load("distribution/ducts", name).unwrap().clone(); +make_simple!(JunctionBlock => |_, _, _, buff: &mut DataRead| { read_directional_item_buffer(buff) }); +make_simple!(SimpleDuctBlock, |_, name, _, _, rot: Rotation| { + let mut base = load("duct-base"); + let mut top = load(name); top.rotate(rot.rotated(false).count()); base.overlay(&top); - Some(ImageHolder::from(base)) + base }); fn draw_stack( _: &StackConveyor, - _: &str, name: &str, _: Option<&State>, ctx: Option<&RenderingContext>, rot: Rotation, -) -> Option<ImageHolder> { +) -> ImageHolder { let ctx = ctx.unwrap(); let mask = mask(ctx, rot, name); - // clone to not hold lock - let edge = load("distribution/stack-conveyors", &format!("{name}-edge")) - .unwrap() - .clone(); + let edge = load(&format!("{name}-edge")); let edgify = |skip, to: &mut RgbaImage| { for i in 0..4 { if i == skip { @@ -82,45 +72,40 @@ fn draw_stack( to.overlay(&edge); } }; - let gimme = |n: u8| { - load("distribution/stack-conveyors", &format!("{name}-{n}")) - .unwrap() - .clone() - }; + let gimme = |n: u8| load(&format!("{name}-{n}")); let empty = ctx.cross[rot.count() as usize].map_or(true, |(v, _)| v.name != name); // mindustry says fuck this and just draws the arrow convs in schems but im better than that - Some(ImageHolder::from( - if rot.mirrored(true, true).mask() == mask && empty && name != "surge-conveyor" { - // end - let mut base = gimme(2); - edgify(rot.mirrored(true, true).rotated(false).count(), &mut base); - base - } else if mask == B0000 && empty { - // single - let mut base = gimme(0); - base.rotate(rot.rotated(false).count()); - edgify(5, &mut base); - base - } else if mask == B0000 { - // input - let mut base = gimme(1); - edgify(rot.rotated(false).count(), &mut base); - base - } else { - // directional - let mut base = gimme(0); - let going = rot.rotated(false).count(); - base.rotate(going); - for [r, i] in [[3, 0b1000], [0, 0b0100], [1, 0b0010], [2, 0b0001]] { - if (mask.into_u8() & i) == 0 && (going != r || empty) { - let mut edge = edge.clone(); - edge.rotate(r); - base.overlay(&edge); - } + + if rot.mirrored(true, true).mask() == mask && empty && name != "surge-conveyor" { + // end + let mut base = gimme(2); + edgify(rot.mirrored(true, true).rotated(false).count(), &mut base); + base + } else if mask == B0000 && empty { + // single + let mut base = gimme(0); + base.rotate(rot.rotated(false).count()); + edgify(5, &mut base); + base + } else if mask == B0000 { + // input + let mut base = gimme(1); + edgify(rot.rotated(false).count(), &mut base); + base + } else { + // directional + let mut base = gimme(0); + let going = rot.rotated(false).count(); + base.rotate(going); + for [r, i] in [[3, 0b1000], [0, 0b0100], [1, 0b0010], [2, 0b0001]] { + if (mask.into_u8() & i) == 0 && (going != r || empty) { + let mut edge = edge.clone(); + edge.rotate(r); + base.overlay(&edge); } - base - }, - )) + } + base + } } make_simple!( @@ -231,60 +216,43 @@ impl BlockLogic for ItemBlock { fn draw( &self, - _: &str, name: &str, state: Option<&State>, _: Option<&RenderingContext>, rot: Rotation, - ) -> Option<ImageHolder> { - let mut p = load( - match name { - "unloader" => "storage", - "duct-router" | "duct-unloader" => "distribution/ducts", - _ => "distribution", - }, - name, - ) - .unwrap() - .clone(); + ) -> ImageHolder { + let mut p = load(name); if let Some(state) = state { if let Some(s) = Self::get_state(state) { - let mut top = load( - match name { - "unloader" => "storage", - _ => "distribution", - }, - match name { - "unit-cargo-unload-point" => "unit-cargo-unload-point-top", - _ => "center", - }, - ) - .unwrap() - .clone(); + let mut top = load(match name { + "unit-cargo-unload-point" => "unit-cargo-unload-point-top", + "unloader" => "unloader-center", + _ => "center", + }); p.overlay(top.tint(s.color())); - return Some(ImageHolder::from(p)); + return p; } } if matches!(name, "unloader" | "unit-cargo-unload-point") { - return Some(ImageHolder::from(p)); + return p; } - if matches!(name, "duct-unloader" | "duct-router") { - let mut null = load("distribution/ducts", "top").unwrap().to_owned(); - null.rotate(rot.rotated(false).count()); - if name == "duct-unloader" { - let mut top = load("distribution/ducts", "duct-unloader-top") - .unwrap() - .to_owned(); - // this rotate call could be omitted if rotation == Right to save a clone - top.rotate(rot.rotated(false).count()); - null.overlay(&top); - } - p.overlay(&null); - Some(ImageHolder::from(p)) + if name == "duct-router" { + let mut arrow = load("top"); + arrow.rotate(rot.rotated(false).count()); + p.overlay(&arrow); + p + } else if name == "duct-unloader" { + let mut top = load("duct-unloader-top"); + top.rotate(rot.rotated(false).count()); + p.overlay(&top); + let mut arrow = load("top"); + arrow.rotate(rot.rotated(false).count()); + p.overlay(&arrow); + p } else { - let mut null = load("distribution", "cross-full").unwrap().clone(); + let mut null = load("cross-full"); null.overlay(&p); - Some(ImageHolder::from(null)) + null } } @@ -486,6 +454,17 @@ impl BlockLogic for BridgeBlock { } Ok(()) } + + + fn draw( + &self, + name: &str, + _: Option<&State>, + _: Option<&RenderingContext>, + _: Rotation, + ) -> ImageHolder { + read(name, self.size) + } } #[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)] |