use std::collections::BTreeMap; use crate::enums::{ basic::{Class, GasType, SortingClass}, script::{LogicSlotType, LogicType}, ConnectionRole, ConnectionType, MachineTier, MemoryAccess, Species, }; use serde_with::{serde_as, DisplayFromStr}; use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "tsify")] use tsify::Tsify; #[cfg(feature = "tsify")] use wasm_bindgen::prelude::*; #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] #[serde(tag = "templateType")] pub enum ObjectTemplate { Structure(StructureTemplate), StructureSlots(StructureSlotsTemplate), StructureLogic(StructureLogicTemplate), StructureLogicDevice(StructureLogicDeviceTemplate), StructureLogicDeviceConsumer(StructureLogicDeviceConsumerTemplate), StructureLogicDeviceMemory(StructureLogicDeviceMemoryTemplate), StructureLogicDeviceConsumerMemory(StructureLogicDeviceConsumerMemoryTemplate), StructureCircuitHolder(StructureCircuitHolderTemplate), Item(ItemTemplate), ItemSlots(ItemSlotsTemplate), ItemConsumer(ItemConsumerTemplate), ItemLogic(ItemLogicTemplate), ItemLogicMemory(ItemLogicMemoryTemplate), ItemCircuitHolder(ItemCircuitHolderTemplate), ItemSuit(ItemSuitTemplate), ItemSuitLogic(ItemSuitLogicTemplate), ItemSuitCircuitHolder(ItemSuitCircuitHolderTemplate), Human(HumanTemplate), } #[allow(dead_code)] impl ObjectTemplate { #[allow(clippy::must_use_candidate)] pub fn prefab(&self) -> &PrefabInfo { #[allow(clippy::enum_glob_use)] use ObjectTemplate::*; match self { Structure(s) => &s.prefab, StructureSlots(s) => &s.prefab, StructureLogic(s) => &s.prefab, StructureLogicDevice(s) => &s.prefab, StructureLogicDeviceConsumer(s) => &s.prefab, StructureLogicDeviceMemory(s) => &s.prefab, StructureLogicDeviceConsumerMemory(s) => &s.prefab, StructureCircuitHolder(s) => &s.prefab, Item(i) => &i.prefab, ItemSlots(i) => &i.prefab, ItemConsumer(i) => &i.prefab, ItemLogic(i) => &i.prefab, ItemLogicMemory(i) => &i.prefab, ItemCircuitHolder(i) => &i.prefab, ItemSuit(i) => &i.prefab, ItemSuitLogic(i) => &i.prefab, ItemSuitCircuitHolder(i) => &i.prefab, Human(h) => &h.prefab, } } } impl From for ObjectTemplate { fn from(value: StructureTemplate) -> Self { Self::Structure(value) } } impl From for ObjectTemplate { fn from(value: StructureSlotsTemplate) -> Self { Self::StructureSlots(value) } } impl From for ObjectTemplate { fn from(value: StructureLogicTemplate) -> Self { Self::StructureLogic(value) } } impl From for ObjectTemplate { fn from(value: StructureLogicDeviceTemplate) -> Self { Self::StructureLogicDevice(value) } } impl From for ObjectTemplate { fn from(value: StructureLogicDeviceConsumerTemplate) -> Self { Self::StructureLogicDeviceConsumer(value) } } impl From for ObjectTemplate { fn from(value: StructureLogicDeviceMemoryTemplate) -> Self { Self::StructureLogicDeviceMemory(value) } } impl From for ObjectTemplate { fn from(value: StructureLogicDeviceConsumerMemoryTemplate) -> Self { Self::StructureLogicDeviceConsumerMemory(value) } } impl From for ObjectTemplate { fn from(value: ItemTemplate) -> Self { Self::Item(value) } } impl From for ObjectTemplate { fn from(value: ItemSlotsTemplate) -> Self { Self::ItemSlots(value) } } impl From for ObjectTemplate { fn from(value: ItemConsumerTemplate) -> Self { Self::ItemConsumer(value) } } impl From for ObjectTemplate { fn from(value: ItemLogicTemplate) -> Self { Self::ItemLogic(value) } } impl From for ObjectTemplate { fn from(value: ItemLogicMemoryTemplate) -> Self { Self::ItemLogicMemory(value) } } impl From for ObjectTemplate { fn from(value: ItemSuitCircuitHolderTemplate) -> Self { Self::ItemSuitCircuitHolder(value) } } impl From for ObjectTemplate { fn from(value: ItemSuitTemplate) -> Self { Self::ItemSuit(value) } } impl From for ObjectTemplate { fn from(value: ItemSuitLogicTemplate) -> Self { Self::ItemSuitLogic(value) } } impl From for ObjectTemplate { fn from(value: ItemCircuitHolderTemplate) -> Self { Self::ItemCircuitHolder(value) } } impl From for ObjectTemplate { fn from(value: StructureCircuitHolderTemplate) -> Self { Self::StructureCircuitHolder(value) } } impl From for ObjectTemplate { fn from(value: HumanTemplate) -> Self { Self::Human(value) } } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct HumanTemplate { pub prefab: PrefabInfo, pub species: Species, pub slots: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct PrefabInfo { pub prefab_name: String, pub prefab_hash: i32, pub desc: String, pub name: String, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct SlotInfo { pub name: String, pub typ: Class, } #[serde_as] #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct LogicInfo { #[serde_as( as = "BTreeMap")] pub logic_slot_types: BTreeMap>, pub logic_types: BTreeMap, #[serde_as( as = "Option>")] pub modes: Option>, pub transmission_receiver: bool, pub wireless_logic: bool, pub circuit_holder: bool, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemInfo { pub consumable: bool, pub filter_type: Option, pub ingredient: bool, pub max_quantity: u32, pub reagents: Option>, pub slot_class: Class, pub sorting_class: SortingClass, } #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ConnectionInfo { pub typ: ConnectionType, pub role: ConnectionRole, } #[allow(clippy::struct_excessive_bools)] #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct DeviceInfo { pub connection_list: Vec, pub device_pins_length: Option, pub has_activate_state: bool, pub has_atmosphere: bool, pub has_color_state: bool, pub has_lock_state: bool, pub has_mode_state: bool, pub has_on_off_state: bool, pub has_open_state: bool, pub has_reagents: bool, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ConsumerInfo { pub consumed_resources: Vec, pub processed_reagents: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct RecipeRange { pub start: f64, pub stop: f64, pub is_valid: bool, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct RecipeGasMix { pub rule: i64, pub is_any: bool, pub is_any_to_remove: bool, pub reagents: BTreeMap, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct Recipe { pub tier: MachineTier, pub time: f64, pub energy: f64, pub temperature: RecipeRange, pub pressure: RecipeRange, pub required_mix: RecipeGasMix, pub count_types: i64, pub reagents: BTreeMap, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct FabricatorInfo { pub tier: MachineTier, pub recipes: BTreeMap, } #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureInfo { pub small_grid: bool, } #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub enum InstructionPartType { Bool8, Byte8, Int32, UInt32, Short16, UShort16, Unused(u32), Unknown(String), } #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct InstructionPart { pub range: (u32, u32), pub name: String, pub typ: InstructionPartType, } #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct Instruction { pub description: String, pub description_stripped: String, pub typ: String, pub value: i64, pub valid: (u32, Option), pub parts: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct MemoryInfo { pub instructions: Option>, pub memory_access: MemoryAccess, pub memory_size: u32, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ThermalInfo { pub convection_factor: f32, pub radiation_factor: f32, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct InternalAtmoInfo { pub volume: f32, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct SuitInfo { pub hygiene_reduction_multiplier: f32, pub waste_max_pressure: f32, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureSlotsTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub slots: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureLogicTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureLogicDeviceTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub device: DeviceInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureLogicDeviceConsumerTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub device: DeviceInfo, pub consumer_info: ConsumerInfo, pub fabricator_info: Option, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureLogicDeviceMemoryTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub device: DeviceInfo, pub memory: MemoryInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureCircuitHolderTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub device: DeviceInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct StructureLogicDeviceConsumerMemoryTemplate { pub prefab: PrefabInfo, pub structure: StructureInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub device: DeviceInfo, pub consumer_info: ConsumerInfo, pub fabricator_info: Option, pub memory: MemoryInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemSlotsTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub slots: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemConsumerTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub slots: Vec, pub consumer_info: ConsumerInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemLogicTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemLogicMemoryTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub memory: MemoryInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemCircuitHolderTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemSuitTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub slots: Vec, pub suit_info: SuitInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemSuitLogicTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub suit_info: SuitInfo, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[cfg_attr(feature = "tsify", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] pub struct ItemSuitCircuitHolderTemplate { pub prefab: PrefabInfo, pub item: ItemInfo, pub thermal_info: Option, pub internal_atmo_info: Option, pub logic: LogicInfo, pub slots: Vec, pub suit_info: SuitInfo, pub memory: MemoryInfo, }