war3parser 0.3.0

A extractor and parser for Warcraft 3 map files
Documentation
use binary_reader::BinaryReader;

use crate::parser::binary_reader::{AutoReadable, BinaryReadable};
use crate::parser::error::ParserError;

#[cfg_attr(
    feature = "wasm",
    derive(tsify_next::Tsify),
    tsify(into_wasm_abi, from_wasm_abi)
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug)]
pub struct Player {
    pub id: i32,
    pub player_type: i32,
    pub race: i32,
    pub is_fixed_start_position: i32,
    pub name: String,
    pub start_location: [f32; 2],
    pub ally_low_priorities: u32,
    pub ally_high_priorities: u32,
    pub known1: Option<[u8; 8]>,
}

impl BinaryReadable for Player {
    fn load(stream: &mut BinaryReader, version: u32) -> Result<Self, ParserError> {
        Ok(Self {
            id: AutoReadable::read(stream)?,
            player_type: AutoReadable::read(stream)?,
            race: AutoReadable::read(stream)?,
            is_fixed_start_position: AutoReadable::read(stream)?,
            name: AutoReadable::read(stream)?,
            start_location: AutoReadable::read(stream)?,
            ally_low_priorities: AutoReadable::read(stream)?,
            ally_high_priorities: AutoReadable::read(stream)?,
            known1: if version > 30 {
                Some(AutoReadable::read(stream)?)
            } else {
                None
            },
        })
    }

    fn size(&self, version: u32) -> usize {
        let mut size = 32 + self.name.len() + 1;
        if version > 30 {
            size += 8;
        }
        size
    }
}