mindustry logic execution, map- and schematic- parsing and rendering
hash
| -rw-r--r-- | mindus/src/block/logic.rs | 4 | ||||
| -rw-r--r-- | mindus/src/block/mod.rs | 10 | ||||
| -rw-r--r-- | mindus/src/block/payload.rs | 4 | ||||
| -rw-r--r-- | mindus/src/block/power.rs | 2 | ||||
| -rw-r--r-- | mindus/src/data/schematic.rs | 11 | ||||
| -rw-r--r-- | mindus/src/exe/draw.rs | 2 | ||||
| -rw-r--r-- | mindus/src/utils/array.rs | 2 |
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, |