mindustry logic execution, map- and schematic- parsing and rendering
bendn 2 months ago
parent f6d26b4 · commit 3452b9d
-rw-r--r--mindus/src/block/logic.rs4
-rw-r--r--mindus/src/block/mod.rs10
-rw-r--r--mindus/src/block/payload.rs4
-rw-r--r--mindus/src/block/power.rs2
-rw-r--r--mindus/src/data/schematic.rs11
-rw-r--r--mindus/src/exe/draw.rs2
-rw-r--r--mindus/src/utils/array.rs2
7 files changed, 24 insertions, 11 deletions
diff --git a/mindus/src/block/logic.rs b/mindus/src/block/logic.rs
index 126dfcd..67d5bb4 100644
--- a/mindus/src/block/logic.rs
+++ b/mindus/src/block/logic.rs
@@ -469,7 +469,7 @@ impl ProcessorSerializeError {
}
}
-#[derive(Clone, Debug, Eq, PartialEq, Default)]
+#[derive(Clone, Debug, Eq, PartialEq, Default, Hash)]
pub struct ProcessorLink {
name: String,
x: i16,
@@ -502,7 +502,7 @@ impl ProcessorLink {
}
}
-#[derive(Clone, Debug, Eq, PartialEq, Default)]
+#[derive(Clone, Debug, Eq, PartialEq, Default, Hash)]
pub struct ProcessorState {
code: String,
links: Vec<ProcessorLink>,
diff --git a/mindus/src/block/mod.rs b/mindus/src/block/mod.rs
index f06caa9..18cdc00 100644
--- a/mindus/src/block/mod.rs
+++ b/mindus/src/block/mod.rs
@@ -130,7 +130,7 @@ pub trait Cast {
macro_rules! stater {
($($k: ident($v: ty),)+) => {
- #[derive(Debug, Clone)]
+ #[derive(Debug, Clone, Hash)]
pub enum State {
$($k($v),)+
}
@@ -312,6 +312,12 @@ pub struct Block {
logic: BlockLogicEnum,
}
+impl core::hash::Hash for Block {
+ fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+ self.name.hash(state);
+ }
+}
+
impl PartialEq for Block {
fn eq(&self, rhs: &Block) -> bool {
self.name == rhs.name
@@ -430,7 +436,7 @@ impl fmt::Debug for Block {
}
}
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
/// the possible rotation states of a object
#[repr(u8)]
pub enum Rotation {
diff --git a/mindus/src/block/payload.rs b/mindus/src/block/payload.rs
index f68f8af..80a8a6f 100644
--- a/mindus/src/block/payload.rs
+++ b/mindus/src/block/payload.rs
@@ -5,9 +5,9 @@ use crate::block::content::Type as BlockEnum;
use crate::block::simple::*;
use crate::block::{self, *};
use crate::content;
+use crate::data::ReadError;
use crate::data::dynamic::DynType;
use crate::data::entity_mapping;
-use crate::data::ReadError;
use crate::unit;
make_simple!(SimplePayloadBlock, |_, n, _, _, r: Rotation, scl| {
@@ -70,7 +70,7 @@ make_simple!(
read_payload_router
);
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
/// payload item cfg
pub enum Payload {
Empty,
diff --git a/mindus/src/block/power.rs b/mindus/src/block/power.rs
index d891a8f..3fde947 100644
--- a/mindus/src/block/power.rs
+++ b/mindus/src/block/power.rs
@@ -115,7 +115,7 @@ impl ConnectorDeserializeError {
}
}
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub struct Rgba(u8, u8, u8, u8);
impl From<u32> for Rgba {
diff --git a/mindus/src/data/schematic.rs b/mindus/src/data/schematic.rs
index aded36b..55baf3f 100644
--- a/mindus/src/data/schematic.rs
+++ b/mindus/src/data/schematic.rs
@@ -12,8 +12,8 @@ use crate::data::dynamic::{self, DynData};
use crate::data::renderer::*;
use crate::data::{self, DataRead, DataWrite, GridPos, Serializable};
use crate::item::storage::ItemStorage;
-use crate::utils::array::Array2D;
use crate::utils::Cow;
+use crate::utils::array::Array2D;
/// biggest schematic
pub const MAX_DIMENSION: usize = 1024;
@@ -21,7 +21,7 @@ pub const MAX_DIMENSION: usize = 1024;
pub const MAX_BLOCKS: u32 = 1024 * 1024;
/// a placement in a schematic
-#[derive(Clone)]
+#[derive(Clone, Hash)]
pub struct Placement {
pub block: &'static Block,
pub rot: Rotation,
@@ -118,6 +118,13 @@ pub struct Schematic {
/// schems can have holes, so [Option] is used.
pub blocks: Array2D<Option<Placement>>,
}
+impl core::hash::Hash for Schematic {
+ fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+ self.width.hash(state);
+ self.height.hash(state);
+ self.blocks.hash(state);
+ }
+}
impl PartialEq for Schematic {
fn eq(&self, rhs: &Schematic) -> bool {
diff --git a/mindus/src/exe/draw.rs b/mindus/src/exe/draw.rs
index 08f84c7..6bf8895 100644
--- a/mindus/src/exe/draw.rs
+++ b/mindus/src/exe/draw.rs
@@ -22,7 +22,7 @@ pub fn main(args: Args) {
}
} {
Ok(s) => {
- println!("{curr} {}", s.tags.get("name").unwrap());
+ println!("{curr} {}, {:?}", s.tags.get("name").unwrap(), &s.tags);
let i = mindus::Renderable::render(&s);
if let Ok(v) = std::env::var("SAVE")
&& v == "1"
diff --git a/mindus/src/utils/array.rs b/mindus/src/utils/array.rs
index 6685baa..8398b8a 100644
--- a/mindus/src/utils/array.rs
+++ b/mindus/src/utils/array.rs
@@ -2,7 +2,7 @@ use std::{
fmt::{Debug, Write},
ops::Deref,
};
-#[derive(Clone, PartialEq, Eq)]
+#[derive(Clone, PartialEq, Eq, Hash)]
pub struct Array2D<T: Clone> {
width: usize,
height: usize,