use std::{env::args, fs::File, io::BufReader}; use unity_tools::{serialized_file::SerializedFile, unityfs::UnityFS}; fn main() -> anyhow::Result<()> { env_logger::init_from_env("LOG"); let file = BufReader::new(File::open(args().nth(1).unwrap())?); let fs = UnityFS::open(file)?; let node = fs.find_main_file().unwrap().to_owned(); let mut cab = fs.read(&node)?; let file = SerializedFile::read(&mut cab, node.name)?; let shared_assets = if let Some(n) = file.find_fs_shared_assets(&fs) { Some(SerializedFile::read(fs.read(&n)?, n.name)?) } else { None }; for ob in file.objects { // eprintln!("{:#?}", ob); let typetree = if ob.type_id < 0 { unimplemented!() } else { // file.types // .iter() // .find(|t| t.class_id == ob.type_id) // .expect("unknown type") &file.types[ob.type_id as usize] }; // fn print_types(tt: &TypeTreeNode) { // println!("{}", tt.type_string); // for c in &tt.children { // print_types(&c); // } // } // fn print_crit_types(tt: &TypeTreeNode) { // let mut crit = tt.byte_size == -1 || tt.children.is_empty(); // for c in &tt.children { // print_crit_types(&c); // crit &= c.byte_size != -1 // } // if crit { // println!("{}", tt.type_string); // } // } if let Some(tree) = &typetree.type_tree { println!("{}", tree.type_string); // print_crit_types(tree); // print_types(tree); } // eprintln!("{typetree:#?}"); // let value = read_value(typetree.type_tree.as_ref().unwrap(), e, &mut cab)?; // if let Value::Object { class, .. } = &value { // println!("{class}") // } // debug!( // "{}", // serde_json::to_string_pretty(&value.to_json()).unwrap() // ) } eprintln!("{:#?}", file.ecx); if let Some(shared_assets) = shared_assets { eprintln!("{:#?}", shared_assets); for ob in shared_assets.objects { let typetree = if ob.type_id < 0 { unimplemented!() } else { &file.types[ob.type_id as usize] }; if let Some(tree) = &typetree.type_tree { println!("{}", tree.type_string); } } } Ok(()) }