mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/payload.rs')
-rw-r--r--src/block/payload.rs163
1 files changed, 123 insertions, 40 deletions
diff --git a/src/block/payload.rs b/src/block/payload.rs
index 416adaf..4a842b7 100644
--- a/src/block/payload.rs
+++ b/src/block/payload.rs
@@ -13,11 +13,17 @@ use crate::unit;
use super::BlockRegistry;
make_simple!(SimplePayloadBlock);
+make_simple!(
+ PayloadConveyor,
+ |_, _, _, _, _, _| None,
+ read_payload_conveyor
+);
+// make_simple!(PayloadRouter, |_, _, _, _, _, _| None, read_payload_router);
make_register! {
- "payload-conveyor" => SimplePayloadBlock::new(3, false, cost!(Copper: 10, Graphite: 10));
+ "payload-conveyor" => PayloadConveyor::new(3, false, cost!(Copper: 10, Graphite: 10));
"payload-router" => PayloadBlock::new(3, false, cost!(Copper: 10, Graphite: 15));
- "reinforced-payload-conveyor" => SimplePayloadBlock::new(3, false, cost!(Tungsten: 10));
+ "reinforced-payload-conveyor" => PayloadConveyor::new(3, false, cost!(Tungsten: 10));
"reinforced-payload-router" => SimplePayloadBlock::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);
@@ -33,12 +39,14 @@ make_register! {
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+/// payload item cfg
pub enum Payload {
Empty,
Block(block::content::Type),
Unit(unit::Type),
}
+/// a payload related block with [item cfg](Payload)
pub struct PayloadBlock {
size: u8,
symmetric: bool,
@@ -103,49 +111,124 @@ impl BlockLogic for PayloadBlock {
Payload::Unit(unit) => Ok(DynData::Content(content::Type::Unit, (*unit).into())),
}
}
+}
+
+/// format:
+/// - call [`read_payload_conveyor`]
+/// - t: [`u8`]
+/// - sort: [`u16`]
+/// - recdir: [`u8`]
+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)?;
+ buff.skip(4)
+}
+
+/// format:
+/// - [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)
+}
+
+/// format:
+/// - vector: ([`f32`], [`f32`])
+/// - rotation: [`f32`]
+/// - 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)
+}
- /// format:
- /// - exists: `bool`
- /// - if !exists: ok
- /// - type: `u8`
- /// - if type == 1 (payload block):
- /// - block: `u16`
- /// - version: `u8`
- /// - [`crate::block::Block::read`] (recursion :ferrisHmm:),
- /// - if type == 2 (paylood unit):
- /// - id: `u8`
- /// - unit read???????? TODO
- fn read(
- &self,
- _: &str,
- _: &str,
- reg: &BlockRegistry,
- entity_mapping: &crate::data::map::EntityMapping,
- buff: &mut crate::data::DataRead,
- ) -> Result<(), crate::data::ReadError> {
- if !buff.read_bool()? {
- return Ok(());
+/// format:
+/// - exists: [`bool`]
+/// - if !exists: ok
+/// - type: [`u8`]
+/// - if type == `1` (payload block):
+/// - block: [`u16`]
+/// - version: [`u8`]
+/// - [`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> {
+ if !buff.read_bool()? {
+ return Ok(());
+ }
+ let t = buff.read_u8()?;
+ const BLOCK: u8 = 1;
+ const UNIT: u8 = 0;
+ match t {
+ BLOCK => {
+ 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)?;
}
- let t = buff.read_u8()?;
- const BLOCK: u8 = 1;
- const UNIT: u8 = 0;
- match t {
- BLOCK => {
- let b = buff.read_u16()?;
- let b = BlockEnum::try_from(b).unwrap_or(BlockEnum::Router);
- let b = reg.get(b.get_name()).unwrap();
- b.read(buff, reg, entity_mapping)?;
- }
- UNIT => {
- let u = buff.read_u8()?;
- let Some(_u) = entity_mapping.get(&u) else {
+ UNIT => {
+ let u = buff.read_u8()?;
+ let Some(_u) = entity_mapping.get(&u) else {
return Err(ReadError::Expected("map entry"));
};
- // unit::Type::try_from(u).unwrap_or(unit::Type::Alpha).read(todo!());
- }
- _ => return Err(ReadError::Expected("0 | 1")),
+ // unit::Type::try_from(u).unwrap_or(unit::Type::Alpha).read(todo!());
}
- Ok(())
+ _ => return Err(ReadError::Expected("0 | 1")),
+ }
+ Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+ use std::collections::HashMap;
+
+ use crate::registry::Registry;
+
+ use super::*;
+ #[test]
+ fn payload_conv() {
+ 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),
+ &reg,
+ &HashMap::default(),
+ &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),
+ &reg,
+ &HashMap::default(),
+ &mut r,
+ )
+ .unwrap();
+ assert!(r.read_bool().is_err());
}
}