refactor(vm): rework object freazing
- let vm carry object dtabase - seperate frozen object info and templates
This commit is contained in:
@@ -49,7 +49,7 @@ pub fn generate(
|
||||
eprintln!("generating enums...");
|
||||
}
|
||||
|
||||
let enums_files = enums::generate_enums(&pedia, &enums, workspace)?;
|
||||
let enums_files = enums::generate(&pedia, &enums, workspace)?;
|
||||
eprintln!("Formatting generated files...");
|
||||
for file in &enums_files {
|
||||
prepend_generated_comment_and_format(file)?;
|
||||
|
||||
@@ -15,13 +15,12 @@ use crate::{
|
||||
};
|
||||
|
||||
use stationeers_data::{
|
||||
enums::MemoryAccess,
|
||||
templates::{
|
||||
ConnectionInfo, ConsumerInfo, DeviceInfo, Instruction, InternalAtmoInfo,
|
||||
ConnectionInfo, ConsumerInfo, DeviceInfo, FabricatorInfo, Instruction, InternalAtmoInfo,
|
||||
ItemCircuitHolderTemplate, ItemConsumerTemplate, ItemInfo, ItemLogicMemoryTemplate,
|
||||
ItemLogicTemplate, ItemSlotsTemplate, ItemSuitCircuitHolderTemplate, ItemSuitLogicTemplate,
|
||||
ItemSuitTemplate, ItemTemplate, LogicInfo, MemoryInfo, ObjectTemplate, PrefabInfo,
|
||||
SlotInfo, StructureCircuitHolderTemplate, StructureInfo,
|
||||
ItemSuitTemplate, ItemTemplate, LogicInfo, MemoryInfo, ObjectTemplate, PrefabInfo, Recipe,
|
||||
RecipeGasMix, RecipeRange, SlotInfo, StructureCircuitHolderTemplate, StructureInfo,
|
||||
StructureLogicDeviceConsumerMemoryTemplate, StructureLogicDeviceConsumerTemplate,
|
||||
StructureLogicDeviceMemoryTemplate, StructureLogicDeviceTemplate, StructureLogicTemplate,
|
||||
StructureSlotsTemplate, StructureTemplate, SuitInfo, ThermalInfo,
|
||||
@@ -203,8 +202,7 @@ pub fn generate_database(
|
||||
//
|
||||
// https://regex101.com/r/V2tXIa/1
|
||||
//
|
||||
let null_matcher = regex::Regex::new(r#"(?:(?:,\n)\s*"\w+":\snull)+(,?)"#)
|
||||
.unwrap();
|
||||
let null_matcher = regex::Regex::new(r#"(?:(?:,\n)\s*"\w+":\snull)+(,?)"#).unwrap();
|
||||
let json = null_matcher.replace_all(&json, "$1");
|
||||
write!(&mut database_file, "{json}")?;
|
||||
database_file.flush()?;
|
||||
@@ -733,6 +731,7 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
|
||||
slots: slot_inserts_to_info(slot_inserts),
|
||||
device: device.into(),
|
||||
consumer_info: consumer.into(),
|
||||
fabricator_info: device.fabricator.as_ref().map(Into::into),
|
||||
},
|
||||
));
|
||||
// println!("Structure")
|
||||
@@ -805,6 +804,7 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
|
||||
slots: slot_inserts_to_info(slot_inserts),
|
||||
device: device.into(),
|
||||
consumer_info: consumer.into(),
|
||||
fabricator_info: device.fabricator.as_ref().map(Into::into),
|
||||
memory: memory.into(),
|
||||
},
|
||||
));
|
||||
@@ -1052,3 +1052,88 @@ impl From<&stationpedia::ResourceConsumer> for ConsumerInfo {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&stationpedia::Fabricator> for FabricatorInfo {
|
||||
fn from(value: &stationpedia::Fabricator) -> Self {
|
||||
FabricatorInfo {
|
||||
tier: value
|
||||
.tier_name
|
||||
.parse()
|
||||
.unwrap_or_else(|_| panic!("Unknown MachineTier {}", value.tier_name)),
|
||||
recipes: value
|
||||
.recipes
|
||||
.iter()
|
||||
.map(|(key, val)| (key.clone(), val.into()))
|
||||
.collect(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&stationpedia::Recipe> for Recipe {
|
||||
fn from(value: &stationpedia::Recipe) -> Self {
|
||||
Recipe {
|
||||
tier: value
|
||||
.tier_name
|
||||
.parse()
|
||||
.unwrap_or_else(|_| panic!("Unknown MachineTier {}", value.tier_name)),
|
||||
time: value.time,
|
||||
energy: value.energy,
|
||||
temperature: (&value.temperature).into(),
|
||||
pressure: (&value.pressure).into(),
|
||||
required_mix: (&value.required_mix).into(),
|
||||
count_types: value.count_types,
|
||||
reagents: value
|
||||
.reagents
|
||||
.iter()
|
||||
.filter_map(|(key, val)| {
|
||||
if *val == 0.0 {
|
||||
None
|
||||
} else {
|
||||
Some((key.clone(), *val))
|
||||
}
|
||||
})
|
||||
.collect(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&stationpedia::RecipeTemperature> for RecipeRange {
|
||||
fn from(value: &stationpedia::RecipeTemperature) -> Self {
|
||||
RecipeRange {
|
||||
start: value.start,
|
||||
stop: value.stop,
|
||||
is_valid: value.is_valid,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&stationpedia::RecipePressure> for RecipeRange {
|
||||
fn from(value: &stationpedia::RecipePressure) -> Self {
|
||||
RecipeRange {
|
||||
start: value.start,
|
||||
stop: value.stop,
|
||||
is_valid: value.is_valid,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&stationpedia::RecipeGasMix> for RecipeGasMix {
|
||||
fn from(value: &stationpedia::RecipeGasMix) -> Self {
|
||||
RecipeGasMix {
|
||||
rule: value.rule,
|
||||
is_any: value.is_any,
|
||||
is_any_to_remove: value.is_any_to_remove,
|
||||
reagents: value
|
||||
.reagents
|
||||
.iter()
|
||||
.filter_map(|(key, val)| {
|
||||
if *val == 0.0 {
|
||||
None
|
||||
} else {
|
||||
Some((key.clone(), *val))
|
||||
}
|
||||
})
|
||||
.collect(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ use std::{
|
||||
use proc_macro2::{Ident, Span, TokenStream};
|
||||
use quote::quote;
|
||||
|
||||
pub fn generate_enums(
|
||||
pub fn generate(
|
||||
stationpedia: &crate::stationpedia::Stationpedia,
|
||||
enums: &crate::enums::Enums,
|
||||
workspace: &std::path::Path,
|
||||
@@ -28,14 +28,14 @@ pub fn generate_enums(
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let mut writer =
|
||||
std::io::BufWriter::new(std::fs::File::create(enums_path.join("script_enums.rs"))?);
|
||||
std::io::BufWriter::new(std::fs::File::create(enums_path.join("script.rs"))?);
|
||||
write_repr_enum_use_header(&mut writer)?;
|
||||
for enm in enums.script_enums.values() {
|
||||
write_enum_listing(&mut writer, enm)?;
|
||||
}
|
||||
|
||||
let mut writer =
|
||||
std::io::BufWriter::new(std::fs::File::create(enums_path.join("basic_enums.rs"))?);
|
||||
std::io::BufWriter::new(std::fs::File::create(enums_path.join("basic.rs"))?);
|
||||
write_repr_enum_use_header(&mut writer)?;
|
||||
let script_enums_in_basic = enums
|
||||
.script_enums
|
||||
@@ -75,8 +75,8 @@ pub fn generate_enums(
|
||||
write_repr_enum(&mut writer, "StationpediaPrefab", &prefabs, true)?;
|
||||
|
||||
Ok(vec![
|
||||
enums_path.join("script_enums.rs"),
|
||||
enums_path.join("basic_enums.rs"),
|
||||
enums_path.join("script.rs"),
|
||||
enums_path.join("basic.rs"),
|
||||
enums_path.join("prefabs.rs"),
|
||||
])
|
||||
}
|
||||
@@ -116,7 +116,7 @@ fn write_enum_aggragate_mod<T: std::io::Write>(
|
||||
};
|
||||
let display_pat = format!("{name}{display_sep}{{}}");
|
||||
let name: TokenStream = if name == "_unnamed" {
|
||||
"".to_string()
|
||||
String::new()
|
||||
} else {
|
||||
name.clone()
|
||||
}
|
||||
@@ -236,7 +236,7 @@ pub fn write_enum_listing<T: std::io::Write>(
|
||||
let variant = ReprEnumVariant {
|
||||
value: var.value as u8,
|
||||
deprecated: var.deprecated,
|
||||
props: vec![("docs".to_owned(), var.description.to_owned())],
|
||||
props: vec![("docs".to_owned(), var.description.clone())],
|
||||
};
|
||||
(n.clone(), variant)
|
||||
})
|
||||
@@ -255,7 +255,7 @@ pub fn write_enum_listing<T: std::io::Write>(
|
||||
let variant = ReprEnumVariant {
|
||||
value: var.value as u16,
|
||||
deprecated: var.deprecated,
|
||||
props: vec![("docs".to_owned(), var.description.to_owned())],
|
||||
props: vec![("docs".to_owned(), var.description.clone())],
|
||||
};
|
||||
(n.clone(), variant)
|
||||
})
|
||||
@@ -269,7 +269,7 @@ pub fn write_enum_listing<T: std::io::Write>(
|
||||
let variant = ReprEnumVariant {
|
||||
value: var.value as u32,
|
||||
deprecated: var.deprecated,
|
||||
props: vec![("docs".to_owned(), var.description.to_owned())],
|
||||
props: vec![("docs".to_owned(), var.description.clone())],
|
||||
};
|
||||
(n.clone(), variant)
|
||||
})
|
||||
@@ -283,7 +283,7 @@ pub fn write_enum_listing<T: std::io::Write>(
|
||||
let variant = ReprEnumVariant {
|
||||
value: var.value as i32,
|
||||
deprecated: var.deprecated,
|
||||
props: vec![("docs".to_owned(), var.description.to_owned())],
|
||||
props: vec![("docs".to_owned(), var.description.clone())],
|
||||
};
|
||||
(n.clone(), variant)
|
||||
})
|
||||
@@ -297,7 +297,7 @@ pub fn write_enum_listing<T: std::io::Write>(
|
||||
let variant = ReprEnumVariant {
|
||||
value: var.value as i32,
|
||||
deprecated: var.deprecated,
|
||||
props: vec![("docs".to_owned(), var.description.to_owned())],
|
||||
props: vec![("docs".to_owned(), var.description.clone())],
|
||||
};
|
||||
(n.clone(), variant)
|
||||
})
|
||||
@@ -344,7 +344,7 @@ fn write_repr_basic_use_header<T: std::io::Write>(
|
||||
write!(
|
||||
writer,
|
||||
"{}",
|
||||
quote! {use super::script_enums::{ #(#enums),*};},
|
||||
quote! {use super::script::{ #(#enums),*};},
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use serde_with::{serde_as, DisplayFromStr};
|
||||
use stationeers_data::enums::MachineTier;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
@@ -132,15 +133,6 @@ pub struct BuildState {
|
||||
pub machine_tier: Option<MachineTier>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)]
|
||||
pub enum MachineTier {
|
||||
Undefined,
|
||||
TierOne,
|
||||
TierTwo,
|
||||
TierThree,
|
||||
Max,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)]
|
||||
pub struct Tool {
|
||||
#[serde(rename = "IsTool", default)]
|
||||
@@ -354,7 +346,7 @@ pub struct Device {
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Fabricator {
|
||||
#[serde(rename = "Tier")]
|
||||
tier: u32,
|
||||
pub tier: u32,
|
||||
#[serde(rename = "TierName")]
|
||||
pub tier_name: String,
|
||||
#[serde(rename = "Recipes", default)]
|
||||
|
||||
Reference in New Issue
Block a user