libgm 0.5.1

A tool for modding, unpacking and decompiling GameMaker games
Documentation
pub mod fill;
pub mod line;

use crate::prelude::*;
use crate::util::init::vec_with_capacity;
use crate::wad::deserialize::reader::DataReader;
use crate::wad::elements::GMElement;
use crate::wad::serialize::builder::DataBuilder;

#[derive(Debug, Clone, PartialEq)]
pub struct StyleGroup<T> {
    pub fill_styles: Vec<fill::Data>,
    pub line_styles: Vec<line::Data>,
    pub subshapes: Vec<T>,
}

impl<T: GMElement> GMElement for StyleGroup<T> {
    fn deserialize(reader: &mut DataReader) -> Result<Self> {
        let fill_data_count = reader.read_count("YYSWF Style Group Fill Data")?;
        let line_style_count = reader.read_count("YYSWF Style Group Line Style")?;
        let subshape_count = reader.read_count("YYSWF Style Group Subshape")?;

        let mut fill_styles: Vec<fill::Data> = vec_with_capacity(fill_data_count)?;
        for _ in 0..fill_data_count {
            fill_styles.push(fill::Data::deserialize(reader)?);
        }

        let mut line_styles: Vec<line::Data> = vec_with_capacity(line_style_count)?;
        for _ in 0..line_style_count {
            line_styles.push(line::Data::deserialize(reader)?);
        }

        let mut subshapes: Vec<T> = vec_with_capacity(subshape_count)?;
        for _ in 0..subshape_count {
            subshapes.push(T::deserialize(reader)?);
        }

        Ok(Self { fill_styles, line_styles, subshapes })
    }

    fn serialize(&self, builder: &mut DataBuilder) -> Result<()> {
        builder.write_usize(self.fill_styles.len())?;
        builder.write_usize(self.line_styles.len())?;
        builder.write_usize(self.subshapes.len())?;
        for fill_data in &self.fill_styles {
            fill_data.serialize(builder)?;
        }
        for line_data in &self.line_styles {
            line_data.serialize(builder)?;
        }
        for subshape in &self.subshapes {
            subshape.serialize(builder)?;
        }
        Ok(())
    }
}