libgm 0.5.1

A tool for modding, unpacking and decompiling GameMaker games
Documentation
use macros::num_enum;

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

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NineSlice {
    pub left: i32,
    pub top: i32,
    pub right: i32,
    pub bottom: i32,
    pub enabled: bool,
    pub tile_modes: [TileMode; 5],
}

impl GMElement for NineSlice {
    fn deserialize(reader: &mut DataReader) -> Result<Self> {
        let left = reader.read_i32()?;
        let top = reader.read_i32()?;
        let right = reader.read_i32()?;
        let bottom = reader.read_i32()?;
        let enabled = reader.read_bool32()?;

        let mut tile_modes: [TileMode; 5] = [TileMode::Stretch; 5]; // Ignore default value
        for tile_mode in &mut tile_modes {
            *tile_mode = num_enum_from(reader.read_i32()?)?;
        }

        Ok(Self {
            left,
            top,
            right,
            bottom,
            enabled,
            tile_modes,
        })
    }

    fn serialize(&self, builder: &mut DataBuilder) -> Result<()> {
        builder.write_i32(self.left);
        builder.write_i32(self.top);
        builder.write_i32(self.right);
        builder.write_i32(self.bottom);
        builder.write_bool32(self.enabled);
        for tile_mode in &self.tile_modes {
            builder.write_i32((*tile_mode).into());
        }
        Ok(())
    }
}

#[num_enum(i32)]
pub enum TileMode {
    Stretch = 0,
    Repeat = 1,
    Mirror = 2,
    BlankRepeat = 3,
    Hide = 4,
}