inside-baseball 0.1.0

Modding tools for Backyard Baseball 2001
Documentation
use crate::script::ins::Variable;

pub fn read_u8(code: &mut &[u8]) -> Option<u8> {
    Some(read_bytes(code, 1)?[0])
}

pub fn read_i16(code: &mut &[u8]) -> Option<i16> {
    let bytes = read_bytes(code, 2)?;
    Some(i16::from_le_bytes(bytes.try_into().unwrap()))
}

pub fn read_u16(code: &mut &[u8]) -> Option<u16> {
    let bytes = read_bytes(code, 2)?;
    Some(u16::from_le_bytes(bytes.try_into().unwrap()))
}

pub fn read_i32(code: &mut &[u8]) -> Option<i32> {
    let bytes = read_bytes(code, 4)?;
    Some(i32::from_le_bytes(bytes.try_into().unwrap()))
}

pub fn read_var(code: &mut &[u8]) -> Option<Variable> {
    Some(Variable(read_u16(code)?))
}

fn read_bytes<'a>(code: &mut &'a [u8], len: usize) -> Option<&'a [u8]> {
    if code.len() < len {
        return None;
    }
    let result = &code[..len];
    *code = &code[len..];
    Some(result)
}

pub fn read_string<'a>(code: &mut &'a [u8]) -> Option<&'a [u8]> {
    let len = code.iter().position(|&b| b == b'\0')?;
    let result = &code[..len];
    *code = &code[len + 1..];
    Some(result)
}