mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/power.rs')
| -rw-r--r-- | src/block/power.rs | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/src/block/power.rs b/src/block/power.rs index 5996d87..55a51da 100644 --- a/src/block/power.rs +++ b/src/block/power.rs @@ -3,40 +3,45 @@ 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::data::GridPos; use crate::data::dynamic::{DynData, DynType}; +use crate::item::storage::Storage; make_register! ( - POWER_NODE: "power-node" => ConnectorBlock::new(1, 10); - POWER_NODE_LARGE: "power-node-large" => ConnectorBlock::new(2, 15); - SURGE_TOWER: "surge-tower" => ConnectorBlock::new(2, 2); - DIODE: "diode" => SimpleBlock::new(1, false); - BATTERY: "battery" => SimpleBlock::new(1, true); - BATTERY_LARGE: "battery-large" => SimpleBlock::new(3, true); - COMBUSTION_GENERATOR: "combustion-generator" => SimpleBlock::new(1, true); - THERMAL_GENERATOR: "thermal-generator" => SimpleBlock::new(2, true); - STEAM_GENERATOR: "steam-generator" => SimpleBlock::new(2, true); - DIFFERENTIAL_GENERATOR: "differential-generator" => SimpleBlock::new(3, true); - RTG_GENERATOR: "rtg-generator" => SimpleBlock::new(2, true); - SOLAR_PANEL: "solar-panel" => SimpleBlock::new(1, true); - SOLAR_PANEL_LARGE: "solar-panel-large" => SimpleBlock::new(3, true); - THORIUM_REACTOR: "thorium-reactor" => SimpleBlock::new(3, true); - IMPACT_REACTOR: "impact-reactor" => SimpleBlock::new(4, true); - POWER_SOURCE: "power-source" => ConnectorBlock::new(1, 100); - POWER_VOID: "power-void" => SimpleBlock::new(1, true); + POWER_NODE: "power-node" => ConnectorBlock::new(1, true, cost!(Copper: 1, Lead: 3), 10); + POWER_NODE_LARGE: "power-node-large" => ConnectorBlock::new(2, true, cost!(Lead: 10, Titanium: 5, Silicon: 3), 15); + SURGE_TOWER: "surge-tower" => ConnectorBlock::new(2, true, cost!(Lead: 10, Titanium: 7, Silicon: 15, SurgeAlloy: 15), 2); + DIODE: "diode" => SimpleBlock::new(1, false, cost!(Metaglass: 10, Silicon: 10, Plastanium: 5)); + BATTERY: "battery" => SimpleBlock::new(1, true, cost!(Copper: 5, Lead: 20)); + BATTERY_LARGE: "battery-large" => SimpleBlock::new(3, true, cost!(Lead: 50, Titanium: 20, Silicon: 30)); + COMBUSTION_GENERATOR: "combustion-generator" => SimpleBlock::new(1, true, cost!(Copper: 25, Lead: 15)); + THERMAL_GENERATOR: "thermal-generator" => SimpleBlock::new(2, true, cost!(Copper: 40, Lead: 50, Metaglass: 40, Graphite: 35, Silicon: 35)); + STEAM_GENERATOR: "steam-generator" => SimpleBlock::new(2, true, cost!(Copper: 35, Lead: 40, Graphite: 25, Silicon: 30)); + DIFFERENTIAL_GENERATOR: "differential-generator" => SimpleBlock::new(3, true, cost!(Copper: 70, Lead: 100, Metaglass: 50, Titanium: 50, Silicon: 65)); + RTG_GENERATOR: "rtg-generator" => SimpleBlock::new(2, true, cost!(Lead: 100, Thorium: 50, Silicon: 75, Plastanium: 75, PhaseFabric: 25)); + SOLAR_PANEL: "solar-panel" => SimpleBlock::new(1, true, cost!(Lead: 10, Silicon: 15)); + SOLAR_PANEL_LARGE: "solar-panel-large" => SimpleBlock::new(3, true, cost!(Lead: 80, Silicon: 110, PhaseFabric: 15)); + THORIUM_REACTOR: "thorium-reactor" => SimpleBlock::new(3, true, cost!(Lead: 300, Metaglass: 50, Graphite: 150, Thorium: 150, Silicon: 200)); + IMPACT_REACTOR: "impact-reactor" => SimpleBlock::new(4, true, + cost!(Lead: 500, Metaglass: 250, Graphite: 400, Thorium: 100, Silicon: 300, SurgeAlloy: 250)); + // sandbox only + POWER_SOURCE: "power-source" => ConnectorBlock::new(1, true, &[], 100); + POWER_VOID: "power-void" => SimpleBlock::new(1, true, &[]); ); pub struct ConnectorBlock { size: u8, + symmetric: bool, + build_cost: BuildCost, max: u8, } impl ConnectorBlock { - pub const fn new(size: u8, max: u8) -> Self + pub const fn new(size: u8, symmetric: bool, build_cost: BuildCost, max: u8) -> Self { if size == 0 { @@ -46,7 +51,7 @@ impl ConnectorBlock { panic!("invalid maximum link count"); } - Self{size, max} + Self{size, symmetric, build_cost, max} } pub fn get_max_links(&self) -> u8 @@ -66,7 +71,21 @@ impl BlockLogic for ConnectorBlock fn is_symmetric(&self) -> bool { - true + 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> |