pmd_wan 6.0.0

A library that can read wan file, a sprite format used in pokemon mystery dungeon games
Documentation
use std::io::{Read, Seek, SeekFrom};

use binread::{BinRead, BinReaderExt};

use crate::WanError;

#[derive(BinRead, Debug)]
#[allow(dead_code)]
struct ShirenAssemblyEntry {
    pointer_to_bytes: u32,
    bytes_amount: u16,
    unk1: u16,
}

impl ShirenAssemblyEntry {
    pub fn is_empty(&self) -> bool {
        return self.pointer_to_bytes == 0 && self.bytes_amount == 0;
    }
}

#[derive(Debug)]
pub struct ShirenFragmentBytes {
    pub bytes: Vec<u8>,
}

impl ShirenFragmentBytes {
    pub fn new<T: Read + Seek>(reader: &mut T) -> Result<Self, WanError> {
        let mut assembly_table = Vec::new();
        let mut total_size: usize = 0;
        loop {
            let assembly_entry: ShirenAssemblyEntry = reader.read_le()?;
            trace!("assembly_entry: {:?}", assembly_entry);
            if assembly_entry.is_empty() {
                break;
            } else {
                total_size += assembly_entry.bytes_amount as usize;
                assembly_table.push(assembly_entry);
            }
        }
        let mut bytes = vec![0; total_size];
        let mut position = 0;
        for entry in assembly_table.iter() {
            if entry.pointer_to_bytes != 0 {
                reader.seek(SeekFrom::Start(entry.pointer_to_bytes as u64))?;
                reader.read(&mut bytes[position..position + entry.bytes_amount as usize])?;
            }
            position += entry.bytes_amount as usize;
        }
        Ok(Self { bytes })
    }
}