mindustry logic execution, map- and schematic- parsing and rendering
bridges
18 files changed, 145 insertions, 14 deletions
diff --git a/mindus/Cargo.toml b/mindus/Cargo.toml index 86899f7..a3c0902 100644 --- a/mindus/Cargo.toml +++ b/mindus/Cargo.toml @@ -31,6 +31,7 @@ fimg = { version = "0.4.33", features = [ "save", ], default-features = false } atools = "0.1.6" +either = "1.15.0" [features] bin = ["fimg/save"] diff --git a/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png b/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png Binary files differindex b8b62bc..de8a053 100644 --- a/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png +++ b/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png diff --git a/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png b/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png Binary files differindex 947e48d..465ded4 100644 --- a/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png +++ b/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png Binary files differindex 5ade24b..78bb451 100644 --- a/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png +++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png Binary files differindex 695183d..15da706 100644 --- a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png +++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png Binary files differindex 4211864..62b944a 100644 --- a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png +++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png diff --git a/mindus/assets/blocks/distribution/phase-conveyor-arrow.png b/mindus/assets/blocks/distribution/phase-conveyor-arrow.png Binary files differindex 7b8d69c..9ae80d9 100644 --- a/mindus/assets/blocks/distribution/phase-conveyor-arrow.png +++ b/mindus/assets/blocks/distribution/phase-conveyor-arrow.png diff --git a/mindus/assets/blocks/distribution/phase-conveyor-bridge.png b/mindus/assets/blocks/distribution/phase-conveyor-bridge.png Binary files differindex fc1f5b7..e30c898 100644 --- a/mindus/assets/blocks/distribution/phase-conveyor-bridge.png +++ b/mindus/assets/blocks/distribution/phase-conveyor-bridge.png diff --git a/mindus/assets/blocks/liquid/bridge-conduit-arrow.png b/mindus/assets/blocks/liquid/bridge-conduit-arrow.png Binary files differindex b8b62bc..d2542f3 100644 --- a/mindus/assets/blocks/liquid/bridge-conduit-arrow.png +++ b/mindus/assets/blocks/liquid/bridge-conduit-arrow.png diff --git a/mindus/assets/blocks/liquid/bridge-conduit-bridge.png b/mindus/assets/blocks/liquid/bridge-conduit-bridge.png Binary files differindex 5f23ff3..0eb0968 100644 --- a/mindus/assets/blocks/liquid/bridge-conduit-bridge.png +++ b/mindus/assets/blocks/liquid/bridge-conduit-bridge.png diff --git a/mindus/assets/blocks/liquid/phase-conduit-arrow.png b/mindus/assets/blocks/liquid/phase-conduit-arrow.png Binary files differindex 62bcb0c..ff8b8da 100644 --- a/mindus/assets/blocks/liquid/phase-conduit-arrow.png +++ b/mindus/assets/blocks/liquid/phase-conduit-arrow.png diff --git a/mindus/assets/blocks/liquid/phase-conduit-bridge.png b/mindus/assets/blocks/liquid/phase-conduit-bridge.png Binary files differindex fcdef72..5cf08c0 100644 --- a/mindus/assets/blocks/liquid/phase-conduit-bridge.png +++ b/mindus/assets/blocks/liquid/phase-conduit-bridge.png diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png Binary files differindex e785b30..d7c908d 100644 --- a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png +++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png Binary files differindex 12c5bde..c4d4321 100644 --- a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png +++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png diff --git a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.png b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.png Binary files differindex 70d1aee..9be8d2d 100644 --- a/mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.png +++ b/mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.png diff --git a/mindus/build.rs b/mindus/build.rs index fe160cb..b2dc4a2 100644 --- a/mindus/build.rs +++ b/mindus/build.rs @@ -96,20 +96,20 @@ fn main() { | "NEOPLASIA_REACTOR_CENTER" | "FLUX_REACTOR_MID" | "EDGE" - | "PHASE_CONVEYOR_BRIDGE" + // | "PHASE_CONVEYOR_BRIDGE" | "BRIDGE_ARROW" - | "DUCT_BRIDGE_BRIDGE" - | "DUCT_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" + // | "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; diff --git a/mindus/src/data/renderer.rs b/mindus/src/data/renderer.rs index b5f3006..9927df8 100644 --- a/mindus/src/data/renderer.rs +++ b/mindus/src/data/renderer.rs @@ -1,11 +1,13 @@ //! schematic drawing -use std::ops::Coroutine; +use std::iter::successors; +use std::ops::{Coroutine, Range}; use std::pin::Pin; pub(crate) use super::autotile::*; use super::schematic::Schematic; use super::GridPos; use crate::block::content::Type; +use crate::block::{State, DUCT_BRIDGE}; use crate::color_mapping::BLOCK2COLOR; use crate::data::map::Registrar; use crate::team::Team; @@ -15,7 +17,8 @@ use crate::{ block::Rotation, data::map::{ThinBloc, ThinMapData}, }; -use fimg::{uninit, BlendingOverlay}; +use either::Either; +use fimg::{uninit, BlendingOverlay, BlendingOverlayAt}; include!(concat!(env!("OUT_DIR"), "/full.rs")); include!(concat!(env!("OUT_DIR"), "/quar.rs")); @@ -165,6 +168,120 @@ impl Renderable for Schematic { ) }; } + for (p, b) in self.block_iter() { + let Some(State::Point(mut relative)) = b.get_state() else { + continue; + }; + let directional = matches!(b.block.name(), "duct-bridge" | "reinforced-bridge-conduit"); + if directional { + let offset = match b.rot { + Rotation::Right => (1, 0), + Rotation::Down => (0, -1), + Rotation::Left => (-1, 0), + Rotation::Up => (0, 1), + }; + relative = successors(Some(offset), |&(x, y)| Some((x + offset.0, y + offset.1))) + .take(4) + .find(|x| { + self.get((p.0 as i32 + x.0) as _, (p.1 as i32 + x.1) as _) + .ok() + .flatten() + .is_some_and(|x| x.block == b.block) + }); + } + if let Some(relative) = relative + && let n @ ("bridge-conveyor" + | "bridge-conduit" + | "phase-conveyor" + | "phase-conduit" + | "duct-bridge" + | "reinforced-bridge-conduit") = b.block.name() + { + let mut bridge = load!(concat "bridge" => n which is ["bridge-conveyor" | "bridge-conduit" | "phase-conveyor" | "phase-conduit" | "duct-bridge" | "reinforced-bridge-conduit"], scale); + let arrow = load!(concat "arrow" => n which is ["bridge-conveyor"| "bridge-conduit" | "phase-conveyor" | "phase-conduit" | "duct-bridge" | "reinforced-bridge-conduit"], scale); + if relative.1 != 0 { + // continue; + bridge = bridge.swap_wh(); + } + + for index in if relative.0 > 0 { + Either::Right( + scale.px() as i32 * 2..scale.px() as i32 * relative.0 + scale.px() as i32, + ) + } else { + Either::Left( + relative.0 * scale.px() as i32 + scale.px() as i32 * 2..scale.px() as i32, + ) + } { + unsafe { + canvas.overlay_blended_at( + &bridge.borrow(), + (p.0 as i32 * scale.px() as i32 + index) as u32, + scale * (self.height as u32 - p.1 as u32 - 1 + y_fac / 2), + ) + }; + } + + for index in if relative.1 > 0 { + Either::Right( + -(scale.px() as i32) - scale.px() as i32 * (relative.1 - 1) + ..-(scale.px() as i32), + ) + } else { + Either::Left(0..(-relative.1 - 1) * scale.px() as i32) + } { + let y = + ((self.height as i32 - p.1 as i32 + 1) * scale.px() as i32 + index) as u32; + + unsafe { + canvas.overlay_blended_at( + &bridge.borrow(), + scale * (p.0 as u32 + x_fac / 2), + y, + ) + }; + } + if relative.0 != 0 { + unsafe { + canvas.overlay_blended_at( + &arrow + .rotated(if directional { + b.rot.rotated(false).count() + } else if relative.0 < 0 { + 2 + } else { + 0 + }) + .borrow(), + scale.px() as u32 + + ((scale * p.0 as u32).cast_signed() + + (scale.px() as i32 * relative.0 / 2)) + as u32, + (y_fac / 2 + scale * (self.height as u32 - p.1 as u32)) - 1, + ) + }; + } else { + unsafe { + canvas.overlay_blended_at( + &arrow + .rotated(if directional { + b.rot.rotated(false).count() + } else if relative.0 < 1 { + 3 + } else { + 1 + }) + .borrow(), + (scale * p.0 as u32) + (x_fac / 2 + scale.px() as u32) - 1, + scale.px() as u32 + + ((scale * (self.height as u32 - p.1 as u32 - 1)).cast_signed() + + (scale.px() as i32 * -relative.1 / 2)) + as u32, + ); + } + } + } + } if matches!(scale, Scale::Full) { canvas.as_mut().shadow(); diff --git a/mindus/src/utils/image/holder.rs b/mindus/src/utils/image/holder.rs index 63c8e81..6618009 100644 --- a/mindus/src/utils/image/holder.rs +++ b/mindus/src/utils/image/holder.rs @@ -16,6 +16,19 @@ impl<const CHANNELS: usize> ImageHolder<CHANNELS> { } impl<const CHANNELS: usize> ImageHolder<CHANNELS> { + pub fn swap_wh(self) -> Self { + match self { + ImageHolder::Borrow(image) => { + ImageHolder::Borrow(Image::build(image.height(), image.width()).buf(image.buffer())) + } + ImageHolder::Own(image) => ImageHolder::Own( + Image::build(image.height(), image.width()).buf(image.take_buffer()), + ), + } + } +} + +impl<const CHANNELS: usize> ImageHolder<CHANNELS> { #[must_use] #[inline] pub fn borrow(&self) -> Image<&[u8], CHANNELS> { |