mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/walls.rs')
-rw-r--r--src/block/walls.rs93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/block/walls.rs b/src/block/walls.rs
new file mode 100644
index 0000000..2cf3bbc
--- /dev/null
+++ b/src/block/walls.rs
@@ -0,0 +1,93 @@
+//! walls
+use std::any::Any;
+
+use crate::block::simple::{cost, state_impl, BuildCost, SimpleBlock};
+use crate::block::{
+ impl_block, make_register, BlockLogic, DataConvertError, DeserializeError, SerializeError,
+};
+use crate::data::dynamic::{DynData, DynType};
+use crate::data::GridPos;
+use crate::item::storage::Storage;
+
+make_register! {
+ "copper-wall" => SimpleBlock::new(1, true, cost!(Copper: 6));
+ "copper-wall-large" => SimpleBlock::new(2, true, cost!(Copper: 6 * 4));
+ "titanium-wall" => SimpleBlock::new(1, true, cost!(Titanium: 6));
+ "titanium-wall-large" => SimpleBlock::new(2, true, cost!(Titanium: 6 * 4));
+ "plastanium-wall" => SimpleBlock::new(1, true, cost!(Metaglass: 2, Plastanium: 5));
+ "plastanium-wall-large" => SimpleBlock::new(2, true, cost!(Metaglass: 2 * 4, Plastanium: 5 * 4));
+ "thorium-wall" => SimpleBlock::new(1, true, cost!(Thorium: 6));
+ "thorium-wall-large" => SimpleBlock::new(2, true, cost!(Thorium: 6 * 4));
+ "phase-wall" => SimpleBlock::new(1, true, cost!(PhaseFabric: 6));
+ "phase-wall-large" => SimpleBlock::new(2, true, cost!(PhaseFabric: 6 * 4));
+ "surge-wall" => SimpleBlock::new(1, true, cost!(SurgeAlloy: 6));
+ "surge-wall-large" => SimpleBlock::new(2, true, cost!(SurgeAlloy: 6 * 4));
+ "door" => DoorBlock::new(1, true, cost!(Titanium: 6, Silicon: 4));
+ "door-large" => DoorBlock::new(2, true, cost!(Titanium: 6 * 4, Silicon: 4 * 4));
+ "tungsten-wall" => SimpleBlock::new(1, true, cost!(Tungsten: 6));
+ "large-tungsten-wall" => SimpleBlock::new(2, true, cost!(Tungsten: 6 * 4));
+ "blast-door" => DoorBlock::new(2, true, cost!(Tungsten: 24, Silicon: 24));
+ "reinforced-surge-wall" => SimpleBlock::new(1, true, cost!(SurgeAlloy: 6, Tungsten: 2));
+ "reinforced-surge-wall-large" => SimpleBlock::new(2, true, cost!(SurgeAlloy: 6 * 4, Tungsten: 2 * 4));
+ "carbide-wall" => SimpleBlock::new(1, true, cost!(Thorium: 6, Carbide: 6));
+ "carbide-wall-large" => SimpleBlock::new(2, true, cost!(Thorium: 6 * 4, Carbide: 6 * 4));
+ "shielded-wall" => SimpleBlock::new(2, true, cost!(PhaseFabric: 20, SurgeAlloy: 12, Beryllium: 12));
+ // sandbox only
+ "scrap-wall" => SimpleBlock::new(1, true, cost!(Scrap: 6));
+ "scrap-wall-large" => SimpleBlock::new(2, true, cost!(Scrap: 24));
+ "scrap-wall-huge" => SimpleBlock::new(3, true, cost!(Scrap: 54));
+ "scrap-wall-gigantic" => SimpleBlock::new(4, true, cost!(Scrap: 96));
+ "thruster" => SimpleBlock::new(4, false, cost!(Scrap: 96));
+}
+
+pub struct DoorBlock {
+ size: u8,
+ symmetric: bool,
+ build_cost: BuildCost,
+}
+
+impl DoorBlock {
+ #[must_use]
+ pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self {
+ assert!(size != 0, "invalid size");
+ Self {
+ size,
+ symmetric,
+ build_cost,
+ }
+ }
+
+ state_impl!(pub bool);
+}
+
+impl BlockLogic for DoorBlock {
+ impl_block!();
+
+ fn data_from_i32(&self, _: i32, _: GridPos) -> Result<DynData, DataConvertError> {
+ Ok(DynData::Boolean(false))
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Result<Option<Box<dyn Any>>, DeserializeError> {
+ match data {
+ DynData::Boolean(opened) => Ok(Some(Self::create_state(opened))),
+ _ => Err(DeserializeError::InvalidType {
+ have: data.get_type(),
+ expect: DynType::Boolean,
+ }),
+ }
+ }
+
+ fn clone_state(&self, state: &dyn Any) -> Box<dyn Any> {
+ let state = Self::get_state(state);
+ Box::new(Self::create_state(*state))
+ }
+
+ fn mirror_state(&self, _: &mut dyn Any, _: bool, _: bool) {}
+
+ fn rotate_state(&self, _: &mut dyn Any, _: bool) {}
+
+ fn serialize_state(&self, state: &dyn Any) -> Result<DynData, SerializeError> {
+ let state = Self::get_state(state);
+ Ok(DynData::Boolean(*state))
+ }
+}