mindustry logic execution, map- and schematic- parsing and rendering
remove many unused sprites and fix some sprites being incorrectly unused
bendn 2023-08-10
parent 5fead62 · commit 764d636
-rw-r--r--assets/blocks/distribution/ducts/arrow-glow.pngbin2058 -> 0 bytes
-rw-r--r--assets/blocks/distribution/stack-conveyors/surge-conveyor-glow.pngbin2058 -> 0 bytes
-rw-r--r--assets/blocks/environment/cliff.pngbin213 -> 0 bytes
-rw-r--r--assets/blocks/environment/edge-stencil.pngbin1847 -> 0 bytes
-rw-r--r--assets/blocks/environment/edge.pngbin437 -> 0 bytes
-rw-r--r--assets/blocks/environment/env-error.pngbin169 -> 0 bytes
-rw-r--r--assets/blocks/liquid/fluid.pngbin71 -> 0 bytes
-rw-r--r--assets/blocks/power/steam-generator-turbine.pngbin133 -> 0 bytes
-rw-r--r--assets/blocks/turrets/bases/reinforced-block-2.pngbin472 -> 0 bytes
-rw-r--r--assets/error.pngbin215 -> 0 bytes
-rw-r--r--build.rs28
-rw-r--r--src/block/content.rs3
-rw-r--r--src/block/distribution.rs2
-rw-r--r--src/block/liquid.rs2
-rw-r--r--src/block/production.rs45
-rw-r--r--src/block/units.rs91
-rw-r--r--src/data/autotile.rs10
17 files changed, 118 insertions, 63 deletions
diff --git a/assets/blocks/distribution/ducts/arrow-glow.png b/assets/blocks/distribution/ducts/arrow-glow.png
deleted file mode 100644
index 469de30..0000000
--- a/assets/blocks/distribution/ducts/arrow-glow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/distribution/stack-conveyors/surge-conveyor-glow.png b/assets/blocks/distribution/stack-conveyors/surge-conveyor-glow.png
deleted file mode 100644
index 469de30..0000000
--- a/assets/blocks/distribution/stack-conveyors/surge-conveyor-glow.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/cliff.png b/assets/blocks/environment/cliff.png
deleted file mode 100644
index e2756c7..0000000
--- a/assets/blocks/environment/cliff.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/edge-stencil.png b/assets/blocks/environment/edge-stencil.png
deleted file mode 100644
index 302e9ab..0000000
--- a/assets/blocks/environment/edge-stencil.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/edge.png b/assets/blocks/environment/edge.png
deleted file mode 100644
index bd38d6c..0000000
--- a/assets/blocks/environment/edge.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/environment/env-error.png b/assets/blocks/environment/env-error.png
deleted file mode 100644
index fbd397f..0000000
--- a/assets/blocks/environment/env-error.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/liquid/fluid.png b/assets/blocks/liquid/fluid.png
deleted file mode 100644
index 0d9e7e3..0000000
--- a/assets/blocks/liquid/fluid.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/power/steam-generator-turbine.png b/assets/blocks/power/steam-generator-turbine.png
deleted file mode 100644
index d72808b..0000000
--- a/assets/blocks/power/steam-generator-turbine.png
+++ /dev/null
Binary files differ
diff --git a/assets/blocks/turrets/bases/reinforced-block-2.png b/assets/blocks/turrets/bases/reinforced-block-2.png
deleted file mode 100644
index 29f837f..0000000
--- a/assets/blocks/turrets/bases/reinforced-block-2.png
+++ /dev/null
Binary files differ
diff --git a/assets/error.png b/assets/error.png
deleted file mode 100644
index 005c405..0000000
--- a/assets/error.png
+++ /dev/null
Binary files differ
diff --git a/build.rs b/build.rs
index b9904fa..8663e85 100644
--- a/build.rs
+++ b/build.rs
@@ -35,7 +35,7 @@ fn main() {
// let mut half = File::create(o.join("half.rs")).unwrap();
let mut quar = File::create(o.join("quar.rs")).unwrap();
let mut eigh = File::create(o.join("eigh.rs")).unwrap();
- let mut n = 5usize;
+ let mut n = 23usize;
wr!(full => "pub mod full {{");
wr!(full => "pub static EMPTY: LazyLock<RgbaImage> = LazyLock::new(|| RgbaImage::new(32, 32));");
@@ -50,14 +50,11 @@ fn main() {
file.write_all(b"macro_rules!img{($v:expr)=>{{static TMP:LazyLock<RgbaImage>=LazyLock::new(||$v);&TMP}};}\n").unwrap();
wr!(file => "use image::RgbaImage;");
wr!(file => "use crate::utils::Lock as LazyLock;");
+ wr!(file => "pub static CLIFF: &LazyLock<RgbaImage> = &EMPTY;");
+ for i in 1..=16 {
+ wr!(file => "pub static BUILD{}: &LazyLock<RgbaImage> = &EMPTY;", i);
+ }
}
- for i in 1..=16 {
- n += 1;
- wr!(full => "pub static BUILD{}: &LazyLock<RgbaImage> = &EMPTY;", i);
- wr!(quar => "pub static BUILD{}: &LazyLock<RgbaImage> = &EMPTY;", i);
- wr!(eigh => "pub static BUILD{}: &LazyLock<RgbaImage> = &EMPTY;", i);
- }
-
let mut warmup = File::create(o.join("warmup.rs")).unwrap();
wr!(warmup => "/// # Safety\n///\n/// this function must only be called once.");
wr!(warmup => "pub unsafe fn warmup() {{");
@@ -66,12 +63,17 @@ fn main() {
let path = e.path();
if path.is_file() && let Some(e) = path.extension() && e == "png" {
let p = DynamicImage::from_decoder(PngDecoder::new(BufReader::new(File::open(path).unwrap())).unwrap()).unwrap().into_rgba8();
- let f = path.to_str().unwrap();
- if f.contains("-bottom.png") || f.contains("-liquid.png") || f.contains("-team") {
+ if path.file_name().unwrap().to_str().unwrap().contains("-liquid.png") {
+ continue
+ }
+ let f = path.file_name().unwrap().to_str().unwrap();
+ if f.contains("bottom") || f.contains("-team") || f.contains("-end") || f.contains("stack") {
continue;
}
- let path = path.with_extension("");
- let path = kebab2bigsnek(path.file_name().unwrap().to_str().unwrap());
+ let path = kebab2bigsnek(path.with_extension("").file_name().unwrap().to_str().unwrap());
+ if matches!(path.as_str(), "CLIFF_CRUSHER_ROTATOR" | "NEOPLASIA_REACTOR_CENTER" | "FLUX_REACTOR_MID" | "EDGE" | "PHASE_CONVEYOR_BRIDGE" | "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" | "PLATED_CONDUIT_CAP") {
+ continue
+ }
macro_rules! writ {
($ext:ident / $scale:literal) => {
let mut buf = File::create(o.join(n.to_string() + "-" + stringify!($ext))).unwrap();
@@ -100,7 +102,7 @@ fn main() {
let y = new.height();
buf.write_all(&new.into_raw()).unwrap();
wr!($ext =>
- r#"pub static {path}: &LazyLock<RgbaImage> = img!(unsafe {{ RgbaImage::from_vec({x}, {y}, include_bytes!(concat!(env!("OUT_DIR"), "/{n}-{}")).to_vec()).unwrap_unchecked() }});"#,
+ r#"pub(crate) static {path}: &LazyLock<RgbaImage> = img!(unsafe {{ RgbaImage::from_vec({x}, {y}, include_bytes!(concat!(env!("OUT_DIR"), "/{n}-{}")).to_vec()).unwrap_unchecked() }});"#,
stringify!($ext)
);
};
diff --git a/src/block/content.rs b/src/block/content.rs
index 2275f6d..d07eb05 100644
--- a/src/block/content.rs
+++ b/src/block/content.rs
@@ -1,5 +1,5 @@
//! everything
-use crate::content::{content_enum};
+use crate::content::content_enum;
content_enum! {
pub enum Type / Block for u16 | TryFromU16Error
@@ -418,4 +418,3 @@ content_enum! {
"world-message",
}
}
-
diff --git a/src/block/distribution.rs b/src/block/distribution.rs
index 46e0f2c..933636b 100644
--- a/src/block/distribution.rs
+++ b/src/block/distribution.rs
@@ -251,7 +251,7 @@ impl BlockLogic for ItemBlock {
let mut top = load!("duct-unloader-top", s);
top.rotate(rot.rotated(false).count());
p.overlay(&top);
- let mut arrow = load!("top", s);
+ let mut arrow = load!("duct-unloader-arrow", s);
arrow.rotate(rot.rotated(false).count());
p.overlay(&arrow);
p
diff --git a/src/block/liquid.rs b/src/block/liquid.rs
index 4816e5a..7164885 100644
--- a/src/block/liquid.rs
+++ b/src/block/liquid.rs
@@ -18,7 +18,7 @@ make_simple!(
let (index, rot, flip) = mask2rotations(mask, rot);
// TODO caps. stopped trying bcz too complex
- rotations2tile((index, rot, flip), "conduit", s)
+ rotations2tile((index, rot, flip), name, s)
},
true
);
diff --git a/src/block/production.rs b/src/block/production.rs
index 17e758b..5f2b122 100644
--- a/src/block/production.rs
+++ b/src/block/production.rs
@@ -24,7 +24,7 @@ make_register! {
"coal-centrifuge" -> ProductionBlock::new(2, true, cost!(Lead: 30, Graphite: 40, Titanium: 20));
"incinerator" -> BasicBlock::new(1, true, cost!(Lead: 15, Graphite: 5));
"silicon-arc-furnace" -> ProductionBlock::new(3, true, cost!(Beryllium: 70, Graphite: 80));
- "electrolyzer" -> ProductionBlock::new(3, true, cost!(Silicon: 50, Graphite: 40, Beryllium: 130, Tungsten: 80));
+ "electrolyzer" => ProductionBlock::new(3, true, cost!(Silicon: 50, Graphite: 40, Beryllium: 130, Tungsten: 80));
"atmospheric-concentrator" -> ProductionBlock::new(3, true, cost!(Oxide: 60, Beryllium: 180, Silicon: 150));
"oxidation-chamber" => HeatCrafter::new(3, true, cost!(Tungsten: 120, Graphite: 80, Silicon: 100, Beryllium: 120));
"electric-heater" => HeatCrafter::new(2, false, cost!(Tungsten: 30, Oxide: 30));
@@ -47,7 +47,27 @@ make_register! {
make_simple!(SeparatorBlock => |_, _, _, buff: &mut DataRead| buff.skip(12));
make_simple!(
- ProductionBlock =>
+ ProductionBlock,
+ |_, _, _, _, r: Rotation, s| {
+ // electrolyzer exclusive
+ // ozone <- e(^) -> hydrogen
+ let mut base = load!("electrolyzer", s);
+ base.overlay(
+ load!(s -> match r {
+ Rotation::Up | Rotation::Left => "electrolyzer-hydrogen-output1"
+ Rotation::Down | Rotation::Right => "electrolyzer-hydrogen-output2"
+ })
+ .rotate(r.count()),
+ );
+ base.overlay(
+ load!(s -> match r {
+ Rotation::Down | Rotation::Right => "electrolyzer-ozone-output1"
+ Rotation::Up | Rotation::Left => "electrolyzer-ozone-output2"
+ })
+ .rotate(r.mirrored(true, true).count()),
+ );
+ base
+ },
|b: &mut Build<'_>, _, _, buff: &mut DataRead| {
// format:
// - progress: `f32`
@@ -55,7 +75,6 @@ make_simple!(
// (cultivator)
// `f32`
buff.skip(8 + if b.name() == "cultivator" { 4 } else { 0 })
-
}
);
@@ -68,9 +87,8 @@ make_simple!(
let mut base = load!(from n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater"], s);
base.overlay(
match r {
- Rotation::Up | Rotation::Right =>
- load!(concat top1 => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater"], s),
- _ => load!(concat top2 => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater"], s)
+ Rotation::Up | Rotation::Right => load!(concat top1 => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater"], s),
+ Rotation::Down | Rotation::Left => load!(concat top2 => n which is ["phase-heater" | "electric-heater" | "oxidation-chamber" | "slag-heater"], s)
}
.rotate(r.rotated(false).count()),
);
@@ -90,9 +108,16 @@ make_simple!(
);
make_simple!(HeatConduit, |_, n, _, _, r: Rotation, s| {
let mut base = load!(from n which is ["heat-router" | "heat-redirector"], s);
- base.overlay(match r {
- Rotation::Up | Rotation::Right => load!(concat top1 => n which is ["heat-router" | "heat-redirector"], s),
- _ => load!(concat top2 => n which is ["heat-router" | "heat-redirector"], s),
- }.rotate(r.rotated(false).count()));
+ base.overlay(
+ match r {
+ Rotation::Up | Rotation::Right => {
+ load!(concat top1 => n which is ["heat-router" | "heat-redirector"], s)
+ }
+ Rotation::Down | Rotation::Left => {
+ load!(concat top2 => n which is ["heat-router" | "heat-redirector"], s)
+ }
+ }
+ .rotate(r.rotated(false).count()),
+ );
base
});
diff --git a/src/block/units.rs b/src/block/units.rs
index c3def54..9a893d8 100644
--- a/src/block/units.rs
+++ b/src/block/units.rs
@@ -5,8 +5,7 @@ use super::payload::{read_payload_block, read_payload_seq};
use crate::block::simple::*;
use crate::block::*;
use crate::data::command::UnitCommand;
-use crate::data::dynamic::{DynType, DynSerializer};
-use crate::data::Serializer;
+use crate::data::dynamic::DynType;
use crate::unit;
// fn is_pay(b: &str) -> bool {
@@ -35,19 +34,23 @@ use crate::unit;
// )
// }
-make_simple!(AssemblerBlock, |_, name, _, _, rot: Rotation, s| {
- let mut base =
- load!(from name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s);
- base.overlay(
+make_simple!(
+ AssemblerBlock,
+ |_, name, _, _, rot: Rotation, s| {
+ let mut base =
+ load!(from name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s);
+ base.overlay(
match rot {
Rotation::Up | Rotation::Right => load!(concat side1 => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s),
Rotation::Down | Rotation::Left => load!(concat side2 => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s)
}
.rotate(rot.rotated(false).count()),
);
- base.overlay(load!(concat top => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s).borrow());
- base
-}, |_, reg, map, buff| read_assembler(reg, map, buff));
+ base.overlay(load!(concat top => name which is ["tank-assembler" | "ship-assembler" | "mech-assembler"], s).borrow());
+ base
+ },
+ |_, reg, map, buff| read_assembler(reg, map, buff)
+);
/// format:
/// - call [`read_payload_block`]
@@ -56,7 +59,11 @@ make_simple!(AssemblerBlock, |_, name, _, _, rot: Rotation, s| {
/// - read: [`i32`]
/// - call [`read_payload_seq`]
/// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
-fn read_assembler(reg: &BlockRegistry, map: &EntityMapping, buff: &mut DataRead) -> Result<(), DataReadError> {
+fn read_assembler(
+ reg: &BlockRegistry,
+ map: &EntityMapping,
+ buff: &mut DataRead,
+) -> Result<(), DataReadError> {
read_payload_block(reg, map, buff)?;
buff.skip(4)?;
let n = buff.read_u8()? as usize;
@@ -65,24 +72,37 @@ fn read_assembler(reg: &BlockRegistry, map: &EntityMapping, buff: &mut DataRead)
buff.skip(8)
}
-make_simple!(AssemblerModule, |_, _, _, _, rot: Rotation, scl| {
- let mut base = load!("basic-assembler-module", scl);
- base.overlay(
- load!(scl -> match rot {
- Rotation::Up | Rotation::Right => "basic-assembler-module-side1",
- _ => "basic-assembler-module-side2",
- })
- .rotate(rot.rotated(false).count()),
- );
- base
-}, |_, reg, map, buff| read_payload_block(reg, map, buff));
+make_simple!(
+ AssemblerModule,
+ |_, _, _, _, rot: Rotation, scl| {
+ let mut base = load!("basic-assembler-module", scl);
+ base.overlay(
+ load!(scl -> match rot {
+ Rotation::Up | Rotation::Right => "basic-assembler-module-side1",
+ _ => "basic-assembler-module-side2",
+ })
+ .rotate(rot.rotated(false).count()),
+ );
+ base
+ },
+ |_, reg, map, buff| read_payload_block(reg, map, buff)
+);
make_simple!(
- RepairTurret => |scl| {
- let mut bot = load!("block-2", scl);
- let top = load!("repair-turret", scl);
- bot.overlay(&top);
- bot
+ RepairTurret,
+ |_, n, _, _, _, scl| {
+ match n {
+ "repair-turret" => {
+ let mut bot = load!("block-2", scl);
+ bot.overlay(&load!("repair-turret", scl));
+ bot
+ }
+ _ => {
+ let mut bot = load!("repair-point-base", scl);
+ bot.overlay(&load!("repair-point", scl));
+ bot
+ }
+ }
},
|_, _, _, buff: &mut DataRead| {
buff.skip(4) // rotation: [`f32`]
@@ -151,7 +171,10 @@ impl BlockLogic for ConstructorBlock {
match data {
DynData::Empty => Ok(Some(Self::create_state(None))),
DynData::UnitCommand(u) => Ok(Some(Self::create_state(Some(u)))),
- _ => Err(DeserializeError::InvalidType { have: data.get_type(), expect: DynType::UnitCommand })
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::UnitCommand,
+ }),
}
}
@@ -224,11 +247,17 @@ impl BlockLogic for ConstructorBlock {
/// - progress: [`f32`]
/// - point: ([`f32`], [`f32`]) (maybe [`NaN`](f32::NAN))
/// - command: [`DynData::UnitCommand`]
- fn read(&self,b: &mut Build,reg: &BlockRegistry,map: &EntityMapping,buff: &mut DataRead,) -> Result<(),DataReadError> {
- read_payload_block(reg,map, buff)?;
+ fn read(
+ &self,
+ _: &mut Build,
+ reg: &BlockRegistry,
+ map: &EntityMapping,
+ buff: &mut DataRead,
+ ) -> Result<(), DataReadError> {
+ read_payload_block(reg, map, buff)?;
buff.skip(12)?;
- // TODO handlerr
- b.state = self.deserialize_state(DynSerializer.deserialize(buff).unwrap()).unwrap();
+ // TODO uncomment when read_payload_block impl finished
+ // b.state = self.deserialize_state(DynSerializer.deserialize(buff).unwrap()).unwrap();
Ok(())
}
}
diff --git a/src/data/autotile.rs b/src/data/autotile.rs
index 76aed59..c7af8e1 100644
--- a/src/data/autotile.rs
+++ b/src/data/autotile.rs
@@ -226,19 +226,19 @@ pub fn flrot(flip: u8, rot: u8, with: &mut ImageHolder) {
pub fn rotations2tile((index, rot, flip): (u8, u8, u8), name: &str, scale: Scale) -> ImageHolder {
let mut p = match index {
0 => {
- load!(concat 0 => name which is ["armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
+ load!(concat 0 => name which is ["reinforced-conduit" | "armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
}
1 => {
- load!(concat 1 => name which is ["armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
+ load!(concat 1 => name which is ["reinforced-conduit" | "armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
}
2 => {
- load!(concat 2 => name which is ["armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
+ load!(concat 2 => name which is ["reinforced-conduit" | "armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
}
3 => {
- load!(concat 3 => name which is ["armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
+ load!(concat 3 => name which is ["reinforced-conduit" | "armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
}
_ => {
- load!(concat 4 => name which is ["armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
+ load!(concat 4 => name which is ["reinforced-conduit" | "armored-duct" | "pulse-conduit" | "plated-conduit" | "conduit" | "conveyor" | "titanium-conveyor" | "armored-conveyor" | "duct"], scale)
}
};
flrot(flip, rot, p.borrow_mut());