refactor(vm): rework object freazing

- let vm carry object dtabase
 - seperate frozen object info and templates
This commit is contained in:
Rachel Powers
2024-05-23 23:04:42 -07:00
parent d79726a794
commit 24778b21b7
25 changed files with 18268 additions and 1262 deletions

View File

@@ -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)?;

View 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(),
}
}
}

View File

@@ -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(())
}

View File

@@ -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)]