use gc_formats::level_core::LevelCoreHeader; fn main() { let core = std::fs::read("/home/reaper/Documents/gc-extracted/level0/core_data.bin").unwrap(); let idx = std::fs::read("/home/reaper/Documents/gc-extracted/level0/core_index.bin").unwrap(); let h = LevelCoreHeader::parse(&idx).unwrap(); let sky = h.sky as usize; let end = [ h.collision as usize, h.moby_classes.offset as usize, core.len(), ] .into_iter() .filter(|&v| v > sky) .min() .unwrap_or(core.len()); let b = &core[sky..end]; let mut offs = Vec::new(); for k in 0..64 { let at = 0x20 + k * 4; if at + 4 > b.len() { break; } let v = u32::from_le_bytes(b[at..at + 4].try_into().unwrap()) as usize; if v == 0 || v >= b.len() { break; } offs.push(v); } println!( "RANGE: level0 sky, {} sub-objects from the +0x20 table", offs.len() ); for (i, &o) in offs.iter().enumerate() { let next = offs.get(i + 1).copied().unwrap_or(b.len()); println!(" sub{i}: {o}..{next} = {} bytes", next - o); let e2 = next.min(b.len()); let seg = &b[o..e2]; for r in 0..3 { let q = r * 16; if q + 16 <= seg.len() { println!( " +{q:03x}: {}", seg[q..q + 16] .iter() .map(|x| format!("{x:02x}")) .collect::>() .join(" ") ); } } } }