mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/fluid.rs')
| -rw-r--r-- | src/block/fluid.rs | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/src/block/fluid.rs b/src/block/fluid.rs index 6174eee..a9f1349 100644 --- a/src/block/fluid.rs +++ b/src/block/fluid.rs @@ -3,47 +3,49 @@ use std::error::Error; use std::fmt; use crate::block::{BlockLogic, DataConvertError, DeserializeError, make_register, SerializeError}; -use crate::block::simple::{SimpleBlock, state_impl}; +use crate::block::simple::{BuildCost, cost, SimpleBlock, state_impl}; use crate::block::transport::BridgeBlock; use crate::content; use crate::data::GridPos; use crate::data::dynamic::{DynData, DynType}; use crate::fluid; +use crate::item::storage::Storage; make_register! ( - MECHANICAL_PUMP: "mechanical-pump" => SimpleBlock::new(1, true); - ROTARY_PUMP: "rotary-pump" => SimpleBlock::new(2, true); - IMPULSE_PUMP: "impulse-pump" => SimpleBlock::new(3, true); - CONDUIT: "conduit" => SimpleBlock::new(1, false); - PULSE_CONDUIT: "pulse-conduit" => SimpleBlock::new(1, false); - PLATED_CONDUIT: "plated-conduit" => SimpleBlock::new(1, false); - LIQUID_ROUTER: "liquid-router" => SimpleBlock::new(1, true); - LIQUID_CONTAINER: "liquid-container" => SimpleBlock::new(2, true); - LIQUID_TANK: "liquid-tank" => SimpleBlock::new(3, true); - LIQUID_JUNCTION: "liquid-junction" => SimpleBlock::new(1, true); - BRIDGE_CONDUIT: "bridge-conduit" => BridgeBlock::new(1, true, 4, true); - PHASE_CONDUIT: "phase-conduit" => BridgeBlock::new(1, true, 12, true); + MECHANICAL_PUMP: "mechanical-pump" => SimpleBlock::new(1, true, cost!(Copper: 15, Metaglass: 10)); + ROTARY_PUMP: "rotary-pump" => SimpleBlock::new(2, true, cost!(Copper: 70, Metaglass: 50, Titanium: 35, Silicon: 20)); + IMPULSE_PUMP: "impulse-pump" => SimpleBlock::new(3, true, cost!(Copper: 80, Metaglass: 90, Titanium: 40, Thorium: 35, Silicon: 30)); + CONDUIT: "conduit" => SimpleBlock::new(1, false, cost!(Metaglass: 1)); + PULSE_CONDUIT: "pulse-conduit" => SimpleBlock::new(1, false, cost!(Metaglass: 1, Titanium: 2)); + PLATED_CONDUIT: "plated-conduit" => SimpleBlock::new(1, false, cost!(Metaglass: 1, Thorium: 2, Plastanium: 1)); + LIQUID_ROUTER: "liquid-router" => SimpleBlock::new(1, true, cost!(Metaglass: 2, Graphite: 4)); + LIQUID_CONTAINER: "liquid-container" => SimpleBlock::new(2, true, cost!(Metaglass: 15, Titanium: 10)); + LIQUID_TANK: "liquid-tank" => SimpleBlock::new(3, true, cost!(Metaglass: 40, Titanium: 30)); + LIQUID_JUNCTION: "liquid-junction" => SimpleBlock::new(1, true, cost!(Metaglass: 8, Graphite: 4)); + BRIDGE_CONDUIT: "bridge-conduit" => BridgeBlock::new(1, true, cost!(Metaglass: 8, Graphite: 4), 4, true); + PHASE_CONDUIT: "phase-conduit" => BridgeBlock::new(1, true, cost!(Metaglass: 20, Titanium: 10, Silicon: 7, PhaseFabric: 5), 12, true); // sandbox only - LIQUID_SOURCE: "liquid-source" => FluidBlock::new(1, true); - LIQUID_VOID: "liquid-void" => SimpleBlock::new(1, true); + LIQUID_SOURCE: "liquid-source" => FluidBlock::new(1, true, &[]); + LIQUID_VOID: "liquid-void" => SimpleBlock::new(1, true, &[]); ); pub struct FluidBlock { size: u8, symmetric: bool, + build_cost: BuildCost, } impl FluidBlock { - pub const fn new(size: u8, symmetric: bool) -> Self + pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost) -> Self { if size == 0 { panic!("invalid size"); } - Self{size, symmetric} + Self{size, symmetric, build_cost} } state_impl!(pub Option<fluid::Type>); @@ -61,6 +63,20 @@ impl BlockLogic for FluidBlock 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, config: i32, _: GridPos) -> Result<DynData, DataConvertError> { if config < 0 || config > u16::MAX as i32 |