mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/payload.rs')
| -rw-r--r-- | src/block/payload.rs | 103 |
1 files changed, 40 insertions, 63 deletions
diff --git a/src/block/payload.rs b/src/block/payload.rs index 6a8ef11..fef2246 100644 --- a/src/block/payload.rs +++ b/src/block/payload.rs @@ -7,6 +7,7 @@ use crate::block::simple::*; use crate::block::{self, *}; use crate::content::{self, Content}; use crate::data::dynamic::DynType; +use crate::data::entity_mapping; use crate::data::ReadError; use crate::unit; @@ -56,13 +57,24 @@ make_simple!( }, read_payload_conveyor ); -// make_simple!(PayloadRouter => read_payload_router); + +make_simple!( + PayloadRouter, + |_, n, _, _, r: Rotation, s| { + let mut base = load!(from n which is ["payload-router" | "reinforced-payload-router"], s); + unsafe { + base.rotate(r.rotated(false).count()); + base.overlay(& load!(concat "over" => n which is ["payload-router" | "reinforced-payload-router"], s)); + } + base + } // read_payload_router +); make_register! { "payload-conveyor" => PayloadConveyor::new(3, false, cost!(Copper: 10, Graphite: 10)); - "payload-router" => PayloadBlock::new(3, false, cost!(Copper: 10, Graphite: 15)); + "payload-router" => PayloadRouter::new(3, false, cost!(Copper: 10, Graphite: 15)); "reinforced-payload-conveyor" => PayloadConveyor::new(3, false, cost!(Tungsten: 10)); - "reinforced-payload-router" => PayloadBlock::new(3, false, cost!(Tungsten: 15)); + "reinforced-payload-router" => PayloadRouter::new(3, false, cost!(Tungsten: 15)); "payload-mass-driver" -> BridgeBlock::new(3, true, cost!(Tungsten: 120, Silicon: 120, Graphite: 50), 700, false); "large-payload-mass-driver" -> BridgeBlock::new(5, true, cost!(Thorium: 200, Tungsten: 200, Silicon: 200, Graphite: 100, Oxide: 30), 1100, false); "small-deconstructor" => SimplePayloadBlock::new(3, true, cost!(Beryllium: 100, Silicon: 100, Oxide: 40, Graphite: 80)); @@ -116,31 +128,19 @@ impl BlockLogic for PayloadBlock { r: Rotation, s: Scale, ) -> ImageHolder<4> { - match name { - "payload-router" | "reinforced-payload-router" => { - let mut base = - load!(from name which is ["payload-router" | "reinforced-payload-router"], s); - unsafe { - base.rotate(r.rotated(false).count()); - base.overlay(& load!(concat "over" => name which is ["payload-router" | "reinforced-payload-router"], s)); - } - base - } - _ => { - let mut base = load!(from name which is ["constructor" | "large-constructor" | "payload-source"], s); - let mut out = load!(s -> match name { - "constructor" => "factory-out-3", - "large-constructor" => "factory-out-5-dark", - _ => "factory-out-5", - }); - unsafe { - out.rotate(r.rotated(false).count()); - base.overlay(&out); - base.overlay(&load!(concat "top" => name which is ["constructor" | "large-constructor" | "payload-source"], s)) - }; - base - } - } + let mut base = + load!(from name which is ["constructor" | "large-constructor" | "payload-source"], s); + let mut out = load!(s -> match name { + "constructor" => "factory-out-3", + "large-constructor" => "factory-out-5-dark", + _ => "factory-out-5", + }); + unsafe { + out.rotate(r.rotated(false).count()); + base.overlay(&out); + base.overlay(&load!(concat "top" => name which is ["constructor" | "large-constructor" | "payload-source"], s)) + }; + base } fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> { @@ -185,25 +185,23 @@ impl BlockLogic for PayloadBlock { fn read_payload_router( b: &mut Build, reg: &BlockRegistry, - entity_mapping: &EntityMapping, buff: &mut DataRead, ) -> Result<(), DataReadError> { - read_payload_conveyor(b, reg, entity_mapping, buff)?; + read_payload_conveyor(b, reg, buff)?; buff.skip(4) } /// format: -/// - [skip(4)](`DataRead::skip`) +/// - [`skip(4)`](`DataRead::skip`) /// - rot: [`f32`] /// - become [`read_payload`] fn read_payload_conveyor( _: &mut Build, reg: &BlockRegistry, - entity_mapping: &EntityMapping, buff: &mut DataRead, ) -> Result<(), DataReadError> { buff.skip(8)?; - read_payload(reg, entity_mapping, buff) + read_payload(reg, buff) } /// format: @@ -220,11 +218,10 @@ pub(crate) fn read_payload_seq(buff: &mut DataRead) -> Result<(), DataReadError> /// - become [`read_payload`] pub(crate) fn read_payload_block( reg: &BlockRegistry, - entity_mapping: &EntityMapping, buff: &mut DataRead, ) -> Result<(), DataReadError> { buff.skip(12)?; - read_payload(reg, entity_mapping, buff) + read_payload(reg, buff) } /// format: @@ -237,12 +234,8 @@ pub(crate) fn read_payload_block( /// - [`BlockLogic::read`] (recursion :ferrisHmm:), /// - if type == 2 (paylood unit): /// - id: [`u8`] -/// - unit read???????? TODO -fn read_payload( - reg: &BlockRegistry, - entity_mapping: &crate::data::map::EntityMapping, - buff: &mut DataRead, -) -> Result<(), DataReadError> { +/// - call [`UnitClass::read`](crate::data::entity_mapping::UnitClass::read) +fn read_payload(reg: &BlockRegistry, buff: &mut DataRead) -> Result<(), DataReadError> { if !buff.read_bool()? { return Ok(()); } @@ -254,16 +247,14 @@ fn read_payload( let b = buff.read_u16()?; let b = BlockEnum::try_from(b).unwrap_or(BlockEnum::Router); let block = reg.get(b.get_name()).unwrap(); - block - .logic - .read(&mut Build::new(block), reg, entity_mapping, buff)?; + block.logic.read(&mut Build::new(block), reg, buff)?; } UNIT => { - let u = buff.read_u8()?; - let Some(_u) = entity_mapping.get(&u) else { + let u = buff.read_u8()? as usize; + let Some(&Some(u)) = entity_mapping::ID.get(u) else { return Err(ReadError::Expected("map entry")); }; - // unit::Type::try_from(u).unwrap_or(unit::Type::Alpha).read(todo!()); + let _ = u.read(buff)?; } _ => return Err(ReadError::Expected("0 | 1")), } @@ -272,8 +263,6 @@ fn read_payload( #[cfg(test)] mod tests { - use std::collections::HashMap; - use crate::registry::Registry; use super::*; @@ -282,24 +271,12 @@ mod tests { let mut reg = Registry::default(); register(&mut reg); let mut r = DataRead::new(&[0, 0, 0, 0, 0, 0, 0, 0, 0]); - read_payload_conveyor( - &mut Build::new(&PAYLOAD_CONVEYOR), - ®, - &HashMap::default(), - &mut r, - ) - .unwrap(); + read_payload_conveyor(&mut Build::new(&PAYLOAD_CONVEYOR), ®, &mut r).unwrap(); assert!(r.read_bool().is_err()); let mut r = DataRead::new(&[ 65, 198, 232, 0, 67, 51, 255, 249, 1, 1, 0, 157, 0, 67, 197, 128, 0, 128, 1, 3, ]); - read_payload_conveyor( - &mut Build::new(&PAYLOAD_CONVEYOR), - ®, - &HashMap::default(), - &mut r, - ) - .unwrap(); + read_payload_conveyor(&mut Build::new(&PAYLOAD_CONVEYOR), ®, &mut r).unwrap(); assert!(r.read_bool().is_err()); } } |