mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/distribution.rs')
| -rw-r--r-- | src/block/distribution.rs | 70 |
1 files changed, 54 insertions, 16 deletions
diff --git a/src/block/distribution.rs b/src/block/distribution.rs index c68a851..69db26b 100644 --- a/src/block/distribution.rs +++ b/src/block/distribution.rs @@ -2,23 +2,39 @@ use std::error::Error; use std::fmt; -use image::RgbaImage; - -use crate::block::make_register; -use crate::block::simple::{cost, make_simple, state_impl}; +use crate::block::simple::*; +use crate::block::*; use crate::content; use crate::data::dynamic::DynType; -use crate::data::renderer::load; +use crate::data::renderer::{load, ImageHolder}; use crate::item; +use crate::utils::ImageUtils; make_simple!(ConveyorBlock); +make_simple!( + JunctionBlock, + |_, _, _, _| None, + |_, _, _, _, _, buff: &mut crate::data::DataRead| { + // format: + // - iterate 4 + // - u8 + // - iterate u8 + // - i64 + for _ in 0..4 { + let _ = buff.read_u8()?; + let n = buff.read_u8()? as usize; + buff.skip(n * 8)?; + } + Ok(()) + } +); make_register! { "conveyor" => ConveyorBlock::new(1, false, cost!(Copper: 1)); "titanium-conveyor" => ConveyorBlock::new(1, false, cost!(Copper: 1, Lead: 1, Titanium: 1)); "plastanium-conveyor" => ConveyorBlock::new(1, false, cost!(Graphite: 1, Silicon: 1, Plastanium: 1)); "armored-conveyor" => ConveyorBlock::new(1, false, cost!(Metaglass: 1, Thorium: 1, Plastanium: 1)); - "junction" => ConveyorBlock::new(1, true, cost!(Copper: 2)); + "junction" => JunctionBlock::new(1, true, cost!(Copper: 2)); "bridge-conveyor" => BridgeBlock::new(1, false, cost!(Copper: 6, Lead: 6), 4, true); "phase-conveyor" => BridgeBlock::new(1, false, cost!(Lead: 10, Graphite: 10, Silicon: 7, PhaseFabric: 5), 12, true); "sorter" => ItemBlock::new(1, true, cost!(Copper: 2, Lead: 2)); @@ -106,28 +122,27 @@ impl BlockLogic for ItemBlock { } } - fn draw(&self, category: &str, name: &str, state: Option<&State>) -> Option<RgbaImage> { + fn draw(&self, category: &str, name: &str, state: Option<&State>) -> Option<ImageHolder> { if !matches!( name, "unloader" | "item-source" | "sorter" | "inverted-sorter" ) { return None; } - let mut p = load(category, name).unwrap(); + let mut p = load(category, name).unwrap().clone(); if let Some(state) = state { if let Some(s) = Self::get_state(state) { - let mut top = load(category, "center").unwrap(); - crate::utils::image::tint(&mut top, s.color()); - image::imageops::overlay(&mut p, &top, 0, 0); - return Some(p); + let mut top = load(category, "center").unwrap().clone(); + p.overlay(top.tint(s.color()), 0, 0); + return Some(ImageHolder::from(p)); } } if name == "unloader" { - return Some(p); + return Some(ImageHolder::from(p)); } - let mut null = load("distribution", "cross-full").unwrap(); - image::imageops::overlay(&mut null, &p, 0, 0); - Some(null) + let mut null = load("distribution", "cross-full").unwrap().clone(); + null.overlay(&p, 0, 0); + Some(ImageHolder::from(null)) } } @@ -294,6 +309,29 @@ impl BlockLogic for BridgeBlock { Some((dx, dy)) => Ok(DynData::Point2(*dx, *dy)), } } + + /// format: + /// - out: `i32` + /// - warmup: `f32` + /// - iterate `links<u8>` + /// - in+: `i32` + /// - moved: `bool` + fn read( + &self, + _: &str, + _: &str, + _: &super::BlockRegistry, + _: &crate::data::map::EntityMapping, + buff: &mut crate::data::DataRead, + ) -> Result<(), crate::data::ReadError> { + buff.read_i32()?; + buff.read_f32()?; + for _ in 0..buff.read_u8()? { + buff.read_i32()?; + } + buff.read_bool()?; + Ok(()) + } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] |