Add methods to manipulate robe tier and color

This commit is contained in:
Patrick Auernig 2023-08-07 23:52:33 +02:00
parent 23b5050811
commit b1676babe9
2 changed files with 74 additions and 1 deletions

View File

@ -54,7 +54,7 @@ pub struct Savefile {
#[br(count = 8)] #[br(count = 8)]
_unknown0: Vec<u8>, _unknown0: Vec<u8>,
pub robe: u32, robe: u32,
pub symbol: 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 { pub fn robe_tier(&self) -> u32 {
match self.robe_color() { match self.robe_color() {
RobeColor::Red => self.robe + 1, RobeColor::Red => self.robe + 1,
RobeColor::White => self.robe - 2, 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)] #[binrw::parser(reader, endian)]

View File

@ -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 { fn savefile() -> Savefile {
const TEST_FILE: &[u8] = include_bytes!("../test.bin"); const TEST_FILE: &[u8] = include_bytes!("../test.bin");
let mut savefile = Cursor::new(TEST_FILE); let mut savefile = Cursor::new(TEST_FILE);