libgm 0.5.0

A tool for modding, unpacking and decompiling GameMaker games
Documentation
pub mod bitmap;
pub mod shape;
pub mod subshape;

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

#[derive(Debug, Clone, PartialEq)]
pub struct Item {
    pub id: i32,
    pub item_data: ItemData,
}

impl GMElement for Item {
    fn deserialize(reader: &mut DataReader) -> Result<Self> {
        let item_type = reader.read_i32()?;
        let id = reader.read_i32()?;
        let item_data: ItemData = match item_type {
            1 => ItemData::ItemShape(shape::Data::deserialize(reader)?),
            2 => ItemData::ItemBitmap(bitmap::Data::deserialize(reader)?),
            3 => ItemData::ItemFont,
            4 => ItemData::ItemTextField,
            5 => ItemData::ItemSprite,
            _ => bail!(
                "Invalid YYSWF Item Type {0} 0x{0:08X} at position {1} while parsing Sprite YYSWF \
                 Item",
                item_type,
                reader.cur_pos,
            ),
        };
        Ok(Self { id, item_data })
    }

    fn serialize(&self, builder: &mut DataBuilder) -> Result<()> {
        builder.write_i32(match &self.item_data {
            ItemData::ItemShape(_) => 1,
            ItemData::ItemBitmap(_) => 2,
            ItemData::ItemFont => 3,
            ItemData::ItemTextField => 4,
            ItemData::ItemSprite => 5,
        });
        builder.write_i32(self.id);
        match &self.item_data {
            ItemData::ItemShape(shape_data) => shape_data.serialize(builder)?,
            ItemData::ItemBitmap(bitmap_data) => bitmap_data.serialize(builder)?,
            ItemData::ItemFont | ItemData::ItemTextField | ItemData::ItemSprite => {}
        }
        Ok(())
    }
}

#[derive(Debug, Clone, PartialEq)]
pub enum ItemData {
    ItemShape(shape::Data<subshape::Data>),
    ItemBitmap(bitmap::Data),
    ItemFont,
    ItemTextField,
    ItemSprite,
}