diff --git a/crates/save/src/lib.rs b/crates/save/src/lib.rs index 0b5b19e..e95230c 100644 --- a/crates/save/src/lib.rs +++ b/crates/save/src/lib.rs @@ -54,7 +54,7 @@ pub struct Savefile { #[br(count = 8)] _unknown0: Vec, - pub robe: u32, + robe: u32, pub symbol: u32, @@ -164,12 +164,33 @@ impl Savefile { } } + pub fn set_robe_color(&mut self, color: RobeColor) { + self.robe = match (self.robe_color(), color) { + (RobeColor::Red, RobeColor::White) => self.robe + 4, + (RobeColor::White, RobeColor::Red) => self.robe - 4, + _ => return, + } + } + pub fn robe_tier(&self) -> u32 { match self.robe_color() { RobeColor::Red => self.robe + 1, RobeColor::White => self.robe - 2, } } + + pub fn set_robe_tier(&mut self, tier: u32) { + if tier < 1 || tier > 4 { + return; + } + + self.robe = match self.robe_color() { + RobeColor::Red => tier - 1, + // There can't be a tier 1 white robe, setting it to the lowers possible tier + RobeColor::White if tier == 1 => 4, + RobeColor::White => tier + 2, + } + } } #[binrw::parser(reader, endian)] diff --git a/crates/save/src/test.rs b/crates/save/src/test.rs index f0a066e..6b19d45 100644 --- a/crates/save/src/test.rs +++ b/crates/save/src/test.rs @@ -149,6 +149,58 @@ fn murals() { } +#[test] +fn change_robe_color() { + let mut savefile = savefile(); + + // lowest tier + savefile.robe = 0; + + savefile.set_robe_color(RobeColor::White); + assert_eq!(savefile.robe_color(), RobeColor::White); + + savefile.set_robe_color(RobeColor::Red); + assert_eq!(savefile.robe_color(), RobeColor::Red); + + // highest tier + savefile.robe = 3; + + savefile.set_robe_color(RobeColor::White); + assert_eq!(savefile.robe_color(), RobeColor::White); + + savefile.set_robe_color(RobeColor::Red); + assert_eq!(savefile.robe_color(), RobeColor::Red); +} + + +#[test] +fn change_robe_tier() { + let mut savefile = savefile(); + + savefile.set_robe_tier(1); + assert_eq!(savefile.robe_tier(), 1); + assert_eq!(savefile.robe_color(), RobeColor::Red); + + savefile.set_robe_tier(4); + assert_eq!(savefile.robe_tier(), 4); + assert_eq!(savefile.robe_color(), RobeColor::Red); + + savefile.set_robe_color(RobeColor::White); + + savefile.set_robe_tier(2); + assert_eq!(savefile.robe_tier(), 2); + assert_eq!(savefile.robe_color(), RobeColor::White); + + savefile.set_robe_tier(1); + assert_eq!(savefile.robe_tier(), 2); + assert_eq!(savefile.robe_color(), RobeColor::White); + + savefile.set_robe_tier(4); + assert_eq!(savefile.robe_tier(), 4); + assert_eq!(savefile.robe_color(), RobeColor::White); +} + + fn savefile() -> Savefile { const TEST_FILE: &[u8] = include_bytes!("../test.bin"); let mut savefile = Cursor::new(TEST_FILE);