use std::{ env::args, fs::File, io::{BufReader, Seek, SeekFrom}, }; use unity_tools::{serialized_file::read_serialized_file, unityfs::UnityFS}; fn main() -> anyhow::Result<()> { env_logger::init_from_env("LOG"); let file = BufReader::new(File::open(args().nth(1).unwrap())?); let mut fs = UnityFS::open(file)?; for node in fs.nodes().to_vec() { if node.name.ends_with(".resource") || node.name.ends_with(".resS") { continue; } let mut cab = fs.read(&node)?; let file = read_serialized_file(&mut cab)?; for ob in file.objects { cab.seek(SeekFrom::Start(ob.data_offset))?; // 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.types); } Ok(()) }