Skip to content

Commit

Permalink
add army race enum
Browse files Browse the repository at this point in the history
  • Loading branch information
mgi388 committed Jul 2, 2024
1 parent 9f11071 commit be09655
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 3 deletions.
7 changes: 6 additions & 1 deletion src/army/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ pub enum DecodeError {
IoError(IoError),
InvalidFormat(u32),
InvalidString,
InvalidArmyRace(u8),
InvalidRegimentAlignment(u8),
InvalidRegimentClass(u8),
}
Expand All @@ -30,6 +31,7 @@ impl fmt::Display for DecodeError {
DecodeError::IoError(e) => write!(f, "IO error: {}", e),
DecodeError::InvalidFormat(format) => write!(f, "invalid format: {}", format),
DecodeError::InvalidString => write!(f, "invalid string"),
DecodeError::InvalidArmyRace(v) => write!(f, "invalid army race: {}", v),
DecodeError::InvalidRegimentAlignment(v) => {
write!(f, "invalid regiment alignment: {}", v)
}
Expand Down Expand Up @@ -88,10 +90,13 @@ impl<R: Read + Seek> Decoder<R> {

let header = self.read_header(start_pos)?;

let race = ArmyRace::try_from(header.race)
.map_err(|_| DecodeError::InvalidArmyRace(header.race))?;

let regiments = self.read_regiments(&header)?;

Ok(Army {
race: header.race,
race,
unknown1: header.unknown1.to_vec(),
unknown2: header.unknown2.to_vec(),
regiments,
Expand Down
4 changes: 3 additions & 1 deletion src/army/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,14 @@ impl<W: Write> Encoder<W> {
fn write_header(&mut self, army: &Army) -> Result<(), EncodeError> {
// TODO: Ignoring save file header.

let race: u8 = army.race.into();

self.writer.write_all(&FORMAT.to_le_bytes())?;
self.writer
.write_all(&(army.regiments.len() as u32).to_le_bytes())?;
self.writer
.write_all(&(REGIMENT_BLOCK_SIZE as u32).to_le_bytes())?;
self.writer.write_all(&[army.race])?;
self.writer.write_all(&[race])?;
self.writer.write_all(&army.unknown1)?;
self.writer.write_all(&army.unknown2)?;
self.write_string(&army.small_banner_path)?;
Expand Down
14 changes: 13 additions & 1 deletion src/army/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub use encoder::{EncodeError, Encoder};

#[derive(Debug, Clone, Serialize)]
pub struct Army {
pub race: u8,
pub race: ArmyRace,
unknown1: Vec<u8>,
unknown2: Vec<u8>,
pub regiments: Vec<Regiment>,
Expand All @@ -32,6 +32,17 @@ pub struct Army {
unknown3: Vec<u8>,
}

#[repr(u8)]
#[derive(Debug, Clone, Copy, IntoPrimitive, PartialEq, Serialize, TryFromPrimitive)]
pub enum ArmyRace {
Empire = 0,
EmpireMultiplayer = 1,
Greenskin = 2,
GreenskinMultiplayer = 3,
Undead = 4,
UndeadMultiplayer = 5,
}

#[derive(Debug, Clone, Serialize)]
pub struct Regiment {
pub status: [u8; 2],
Expand Down Expand Up @@ -309,6 +320,7 @@ mod tests {
let file = File::open(d).unwrap();
let a = Decoder::new(file).decode().unwrap();

assert_eq!(a.race, ArmyRace::Empire);
assert_eq!(a.small_banner_path, "[BOOKS]\\hshield.spr");
assert_eq!(a.small_banner_disabled_path, "[BOOKS]\\hgban.spr");
assert_eq!(a.large_banner_path, "[BOOKS]\\hlban.spr");
Expand Down

0 comments on commit be09655

Please sign in to comment.