mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/defense.rs')
| -rw-r--r-- | src/block/defense.rs | 187 |
1 files changed, 88 insertions, 99 deletions
diff --git a/src/block/defense.rs b/src/block/defense.rs index 48de13c..2f7eb46 100644 --- a/src/block/defense.rs +++ b/src/block/defense.rs @@ -1,113 +1,102 @@ use std::any::Any; -use crate::block::{BlockLogic, DataConvertError, DeserializeError, make_register, SerializeError}; -use crate::block::simple::{BuildCost, cost, SimpleBlock, state_impl}; -use crate::data::GridPos; +use crate::block::simple::{cost, state_impl, BuildCost, SimpleBlock}; +use crate::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: "copper-wall" => SimpleBlock::new(1, true, cost!(Copper: 6)); - COPPER_WALL_LARGE: "copper-wall-large" => SimpleBlock::new(2, true, cost!(Copper: 24)); - TITANIUM_WALL: "titanium-wall" => SimpleBlock::new(1, true, cost!(Titanium: 6)); - TITANIUM_WALL_LARGE: "titanium-wall-large" => SimpleBlock::new(2, true, cost!(Titanium: 24)); - PLASTANIUM_WALL: "plastanium-wall" => SimpleBlock::new(1, true, cost!(Metaglass: 2, Plastanium: 5)); - PLASTANIUM_WALL_LARGE: "plastanium-wall-large" => SimpleBlock::new(2, true, cost!(Metaglass: 8, Plastanium: 20)); - THORIUM_WALL: "thorium-wall" => SimpleBlock::new(1, true, cost!(Thorium: 6)); - THORIUM_WALL_LARGE: "thorium-wall-large" => SimpleBlock::new(2, true, cost!(Thorium: 24)); - PHASE_WALL: "phase-wall" => SimpleBlock::new(1, true, cost!(PhaseFabric: 6)); - PHASE_WALL_LARGE: "phase-wall-large" => SimpleBlock::new(2, true, cost!(PhaseFabric: 24)); - SURGE_WALL: "surge-wall" => SimpleBlock::new(1, true, cost!(SurgeAlloy: 6)); - SURGE_WALL_LARGE: "surge-wall-large" => SimpleBlock::new(2, true, cost!(SurgeAlloy: 24)); - DOOR: "door" => DoorBlock::new(1, true, cost!(Titanium: 6, Silicon: 4)); - DOOR_LARGE: "door-large" => DoorBlock::new(2, true, cost!(Titanium: 24, Silicon: 16)); - // sandbox only - SCRAP_WALL: "scrap-wall" => SimpleBlock::new(1, true, cost!(Scrap: 6)); - SCRAP_WALL_LARGE: "scrap-wall-large" => SimpleBlock::new(2, true, cost!(Scrap: 24)); - SCRAP_WALL_HUGE: "scrap-wall-huge" => SimpleBlock::new(3, true, cost!(Scrap: 54)); - SCRAP_WALL_GIGANTIC: "scrap-wall-gigantic" => SimpleBlock::new(4, true, cost!(Scrap: 96)); - THRUSTER: "thruster" => SimpleBlock::new(4, false, cost!(Scrap: 96)); + "copper-wall" => SimpleBlock::new(1, true, cost!(Copper: 6)); + "copper-wall-large" => SimpleBlock::new(2, true, cost!(Copper: 24)); + "titanium-wall" => SimpleBlock::new(1, true, cost!(Titanium: 6)); + "titanium-wall-large" => SimpleBlock::new(2, true, cost!(Titanium: 24)); + "plastanium-wall" => SimpleBlock::new(1, true, cost!(Metaglass: 2, Plastanium: 5)); + "plastanium-wall-large" => SimpleBlock::new(2, true, cost!(Metaglass: 8, Plastanium: 20)); + "thorium-wall" => SimpleBlock::new(1, true, cost!(Thorium: 6)); + "thorium-wall-large" => SimpleBlock::new(2, true, cost!(Thorium: 24)); + "phase-wall" => SimpleBlock::new(1, true, cost!(PhaseFabric: 6)); + "phase-wall-large" => SimpleBlock::new(2, true, cost!(PhaseFabric: 24)); + "surge-wall" => SimpleBlock::new(1, true, cost!(SurgeAlloy: 6)); + "surge-wall-large" => SimpleBlock::new(2, true, cost!(SurgeAlloy: 24)); + "door" => DoorBlock::new(1, true, cost!(Titanium: 6, Silicon: 4)); + "door-large" => DoorBlock::new(2, true, cost!(Titanium: 24, Silicon: 16)); + // 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, +pub struct DoorBlock { + size: u8, + symmetric: bool, + build_cost: BuildCost, } -impl DoorBlock -{ - pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self - { - if size == 0 - { - panic!("invalid size"); - } - Self{size, symmetric, build_cost} - } - - state_impl!(pub bool); +impl DoorBlock { + pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self { + if size == 0 { + panic!("invalid size"); + } + Self { + size, + symmetric, + build_cost, + } + } + + state_impl!(pub bool); } -impl BlockLogic for DoorBlock -{ - fn get_size(&self) -> u8 - { - self.size - } - - fn is_symmetric(&self) -> bool - { - self.symmetric - } - - fn create_build_cost(&self) -> Option<Storage> - { - if !self.build_cost.is_empty() - { - let mut storage = Storage::new(); - for (ty, cnt) in self.build_cost - { - storage.add(*ty, *cnt, u32::MAX); - } - Some(storage) - } - else {None} - } - - 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)) - } +impl BlockLogic for DoorBlock { + fn get_size(&self) -> u8 { + self.size + } + + fn is_symmetric(&self) -> bool { + self.symmetric + } + + fn create_build_cost(&self) -> Option<Storage> { + if !self.build_cost.is_empty() { + let mut storage = Storage::new(); + for (ty, cnt) in self.build_cost { + storage.add(*ty, *cnt, u32::MAX); + } + Some(storage) + } else { + None + } + } + + 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)) + } } |