mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/data/map.rs')
-rw-r--r--src/data/map.rs103
1 files changed, 46 insertions, 57 deletions
diff --git a/src/data/map.rs b/src/data/map.rs
index 2545a65..aceddbc 100644
--- a/src/data/map.rs
+++ b/src/data/map.rs
@@ -71,7 +71,6 @@
//! - entity read
use std::collections::HashMap;
use std::ops::{Index, IndexMut};
-use std::sync::RwLock;
use thiserror::Error;
use crate::block::content::Type as BlockEnum;
@@ -97,6 +96,15 @@ pub struct Tile<'l> {
build: Option<Build<'l>>,
}
+macro_rules! lo {
+ ($v:expr => [$(|)? $($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
+ match $v {
+ $(BlockEnum::[<$k:camel>] => load!($k, $scale),)+
+ n => unreachable!("{n:?}"),
+ }
+ } };
+}
+
pub type EntityMapping = HashMap<u8, Box<dyn Content>>;
impl<'l> Tile<'l> {
#[must_use]
@@ -138,22 +146,8 @@ impl<'l> Tile<'l> {
1
}
- /// Draw the floor of this tile
- ///
- /// # Safety
- ///
- /// UB if called before [`warmup`](crate::warmup)
- pub unsafe fn floor_image(&self, s: Scale) -> ImageHolder {
- macro_rules! lo {
- ($v:expr => [$(|)? $($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
- match $v {
- $(BlockEnum::[<$k:camel>] => load!($k, $scale),)+
- n => unreachable!("{n:?}"),
- } }
- }
- }
- let floor = || {
- lo!(self.floor => [
+ pub(crate) unsafe fn floor(&self, s: Scale) -> ImageHolder {
+ lo!(self.floor => [
| "darksand"
| "sand-floor"
| "dacite"
@@ -162,62 +156,57 @@ impl<'l> Tile<'l> {
| "basalt"
| "moss"
| "mud"
- | "magmarock"
| "grass"
- | "ice-snow"
- | "hotrock"
- | "char"
- | "snow"
- | "salt"
+ | "ice-snow" | "snow" | "salt" | "ice"
+ | "hotrock" | "char" | "magmarock"
| "shale"
| "metal-floor" | "metal-floor-2" | "metal-floor-3" | "metal-floor-4" | "metal-floor-5" | "metal-floor-damaged"
| "dark-panel-1" | "dark-panel-2" | "dark-panel-3" | "dark-panel-4" | "dark-panel-5" | "dark-panel-6"
- | "darksand-tainted-water"
- | "darksand-water"
- | "deep-tainted-water"
- | "molten-slag"
- | "deep-water"
- | "sand-water"
- | "shallow-water"
+ | "darksand-tainted-water" | "darksand-water" | "deep-tainted-water" | "deep-water" | "sand-water" | "shallow-water" | "tainted-water"
+ | "tar" | "pooled-cryofluid" | "molten-slag"
| "space"
| "stone"
| "bluemat"
| "ferric-craters"
| "beryllic-stone"
- | "rhyolite-crater"
+ | "rhyolite" | "rough-rhyolite" | "rhyolite-crater" | "rhyolite-vent"
| "core-zone"
| "crater-stone"
- | "crystal-floor"
- | "dense-red-stone"
| "redmat"
| "red-ice"
| "spore-moss"
- | "arkyic-vent" | "red-stone-vent" | "rhyolite-vent" | "carbon-vent" | "crystalline-vent" | "yellow-stone-vent"
| "regolith"
- | "rhyolite"
- | "tainted-water"
- | "tar"
- | "empty"
- ], s)
- };
- if self.ore != BlockEnum::Air {
- type Floor = BlockEnum;
- type Ore = BlockEnum;
- // todo Rgb
- static ORE_LAYS: RwLock<HashMap<(Floor, Ore), &'static RgbaImage, ahash::RandomState>> =
- RwLock::new(HashMap::with_hasher(ahash::RandomState::with_seeds(
- 401, 41209, 83123, 2110,
- )));
- if let Some(v) = ORE_LAYS.read().unwrap().get(&(self.floor, self.ore)) {
- return ImageHolder::from(*v);
- }
- return ImageHolder::from(*ORE_LAYS.write().unwrap().entry((self.floor, self.ore)).or_insert_with(|| {
- let mut base = floor();
- base.overlay(lo!(self.ore => ["ore-copper" | "ore-beryllium" | "ore-lead" | "ore-scrap" | "ore-coal" | "ore-thorium" | "ore-titanium" | "ore-tungsten" | "pebbles" | "tendrils"], s).borrow());
- Box::leak(Box::new(base))
- }));
+ | "ferric-stone"
+ | "arkyic-stone" | "arkyic-vent"
+ | "yellow-stone" | "yellow-stone-plates" | "yellow-stone-vent"
+ | "red-stone" | "red-stone-vent" | "dense-red-stone"
+ | "carbon-stone" | "carbon-vent"
+ | "crystal-floor" | "crystalline-stone" | "crystalline-vent"
+ | "empty"], s)
+ }
+
+ #[must_use]
+ pub(crate) unsafe fn ore(&self, s: Scale) -> ImageHolder {
+ lo!(self.ore => ["ore-copper" | "ore-beryllium" | "ore-lead" | "ore-scrap" | "ore-coal" | "ore-thorium" | "ore-titanium" | "ore-tungsten" | "pebbles" | "tendrils" | "ore-wall-tungsten" | "ore-wall-beryllium" | "ore-wall-thorium" | "spawn" | "ore-crystal-thorium"], s)
+ }
+
+ #[must_use]
+ pub fn has_ore(&self) -> bool {
+ self.ore != BlockEnum::Air
+ }
+
+ /// Draw the floor of this tile
+ ///
+ /// # Safety
+ ///
+ /// UB if called before [`warmup`](crate::warmup)
+ #[must_use]
+ pub unsafe fn floor_image(&self, s: Scale) -> ImageHolder {
+ let mut floor = self.floor(s);
+ if self.has_ore() {
+ floor.overlay(&self.ore(s));
}
- floor()
+ floor
}
/// Draw this tiles build.