1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
use byteorder::{BigEndian, ReadBytesExt}; use crate::resources::Resource; pub(crate) fn palettes(data: &[u8], resources: Vec<Resource>) -> Vec<Palette> { let mut palettes = vec!(); for resource in resources { let mut references = vec!(); let num_children = (&data[resource.data_offset as usize..]).read_i32::<BigEndian>().unwrap(); for i in 0..num_children as usize { let data = &data[resource.data_offset as usize + 4 + PALETTE_REF_SIZE * i..]; let material_offset = (&data[0x00..]).read_i32::<BigEndian>().unwrap(); let reference_offset = (&data[0x04..]).read_i32::<BigEndian>().unwrap(); references.push(PaletteRef { material_offset, reference_offset }); } let name = resource.string; palettes.push(Palette { name, references }); } palettes } #[derive(Debug)] pub struct Palette { pub name: String, pub references: Vec<PaletteRef>, } const PALETTE_REF_SIZE: usize = 0x8; #[derive(Debug)] pub struct PaletteRef { pub material_offset: i32, pub reference_offset: i32, }