mindustry logic execution, map- and schematic- parsing and rendering
-rw-r--r--mindus/Cargo.toml1
-rw-r--r--mindus/assets/blocks/distribution/bridge-conveyor-arrow.pngbin128 -> 139 bytes
-rw-r--r--mindus/assets/blocks/distribution/bridge-conveyor-bridge.pngbin116 -> 102 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.pngbin104 -> 105 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.pngbin109 -> 89 bytes
-rw-r--r--mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.pngbin129 -> 103 bytes
-rw-r--r--mindus/assets/blocks/distribution/phase-conveyor-arrow.pngbin121 -> 135 bytes
-rw-r--r--mindus/assets/blocks/distribution/phase-conveyor-bridge.pngbin114 -> 94 bytes
-rw-r--r--mindus/assets/blocks/liquid/bridge-conduit-arrow.pngbin128 -> 142 bytes
-rw-r--r--mindus/assets/blocks/liquid/bridge-conduit-bridge.pngbin116 -> 102 bytes
-rw-r--r--mindus/assets/blocks/liquid/phase-conduit-arrow.pngbin128 -> 146 bytes
-rw-r--r--mindus/assets/blocks/liquid/phase-conduit-bridge.pngbin117 -> 94 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.pngbin104 -> 105 bytes
-rw-r--r--mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.pngbin136 -> 103 bytes
-rw-r--r--mindus/assets/blocks/logic/tiled-display/tile-logic-display-14.pngbin110 -> 107 bytes
-rw-r--r--mindus/build.rs24
-rw-r--r--mindus/src/data/renderer.rs121
-rw-r--r--mindus/src/utils/image/holder.rs13
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
index b8b62bc..de8a053 100644
--- a/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png
+++ b/mindus/assets/blocks/distribution/bridge-conveyor-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png b/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png
index 947e48d..465ded4 100644
--- a/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png
+++ b/mindus/assets/blocks/distribution/bridge-conveyor-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png
index 5ade24b..78bb451 100644
--- a/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png
+++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge-bottom.png
index 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
Binary files differ
diff --git a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png
index 4211864..62b944a 100644
--- a/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png
+++ b/mindus/assets/blocks/distribution/ducts/duct-bridge-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/phase-conveyor-arrow.png b/mindus/assets/blocks/distribution/phase-conveyor-arrow.png
index 7b8d69c..9ae80d9 100644
--- a/mindus/assets/blocks/distribution/phase-conveyor-arrow.png
+++ b/mindus/assets/blocks/distribution/phase-conveyor-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/distribution/phase-conveyor-bridge.png b/mindus/assets/blocks/distribution/phase-conveyor-bridge.png
index fc1f5b7..e30c898 100644
--- a/mindus/assets/blocks/distribution/phase-conveyor-bridge.png
+++ b/mindus/assets/blocks/distribution/phase-conveyor-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/bridge-conduit-arrow.png b/mindus/assets/blocks/liquid/bridge-conduit-arrow.png
index b8b62bc..d2542f3 100644
--- a/mindus/assets/blocks/liquid/bridge-conduit-arrow.png
+++ b/mindus/assets/blocks/liquid/bridge-conduit-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/bridge-conduit-bridge.png b/mindus/assets/blocks/liquid/bridge-conduit-bridge.png
index 5f23ff3..0eb0968 100644
--- a/mindus/assets/blocks/liquid/bridge-conduit-bridge.png
+++ b/mindus/assets/blocks/liquid/bridge-conduit-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/phase-conduit-arrow.png b/mindus/assets/blocks/liquid/phase-conduit-arrow.png
index 62bcb0c..ff8b8da 100644
--- a/mindus/assets/blocks/liquid/phase-conduit-arrow.png
+++ b/mindus/assets/blocks/liquid/phase-conduit-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/phase-conduit-bridge.png b/mindus/assets/blocks/liquid/phase-conduit-bridge.png
index fcdef72..5cf08c0 100644
--- a/mindus/assets/blocks/liquid/phase-conduit-bridge.png
+++ b/mindus/assets/blocks/liquid/phase-conduit-bridge.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png
index e785b30..d7c908d 100644
--- a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-arrow.png
Binary files differ
diff --git a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png
index 12c5bde..c4d4321 100644
--- a/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png
+++ b/mindus/assets/blocks/liquid/reinforced-bridge-conduit-bridge.png
Binary files differ
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
index 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
Binary files differ
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> {