Conform to serialization used by ALttpDoorRandomizer.

This commit is contained in:
Lyle Mantooth 2022-06-04 14:37:12 -04:00
parent 975d6fd420
commit 76ff991e8f
Signed by: IslandUsurper
GPG key ID: 6DB52EAE123A5789

View file

@ -9,6 +9,7 @@ use crate::bosses::BossType;
use crate::InvalidEnumError; use crate::InvalidEnumError;
#[derive(Debug, Default, Deserialize, Serialize)] #[derive(Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct ManualBosses { pub struct ManualBosses {
pub eastern_palace: String, pub eastern_palace: String,
pub desert_palace: String, pub desert_palace: String,
@ -183,18 +184,22 @@ impl TryFrom<u8> for ShieldType {
} }
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(into = "u8", try_from = "u8")]
pub enum AbsorbableType { pub enum AbsorbableType {
Heart, Heart,
GreenRupee, GreenRupee,
BlueRupee, BlueRupee,
RedRupee, RedRupee,
#[serde(alias = "Bomb_1")]
Bomb1, Bomb1,
#[serde(alias = "Bomb_4")]
Bomb4, Bomb4,
#[serde(alias = "Bomb_8")]
Bomb8, Bomb8,
SmallMagic, SmallMagic,
FullMagic, FullMagic,
#[serde(alias = "Arrow_5")]
Arrow5, Arrow5,
#[serde(alias = "Arrow_10")]
Arrow10, Arrow10,
Fairy, Fairy,
Key, Key,
@ -316,6 +321,7 @@ impl TryFrom<u8> for HeartBeepSpeed {
} }
#[derive(Clone, Copy, Debug, Deserialize, Serialize)] #[derive(Clone, Copy, Debug, Deserialize, Serialize)]
#[serde(into = "u8", try_from = "u8")]
pub enum BeeLevel { pub enum BeeLevel {
Level1, Level1,
Level2, Level2,
@ -380,26 +386,26 @@ pub struct OptionFlags {
pub shuffle_enemy_damage_groups: bool, pub shuffle_enemy_damage_groups: bool,
pub enemy_damage_chaos_mode: bool, pub enemy_damage_chaos_mode: bool,
pub easy_mode_escape: bool, //pub easy_mode_escape: bool,
pub enemies_absorbable: bool, pub enemies_absorbable: bool,
pub absorbable_spawn_rate: u8, pub absorbable_spawn_rate: u8,
pub absorbable_types: HashMap<AbsorbableType, bool>, pub absorbable_types: HashMap<AbsorbableType, bool>,
pub boss_madness: bool, //pub boss_madness: bool,
pub randomize_bosses: bool, pub randomize_bosses: bool,
pub randomize_bosses_type: RandomizeBossesType, pub randomize_bosses_type: RandomizeBossesType,
pub randomize_boss_health: bool, //pub randomize_boss_health: bool,
pub randomize_boss_health_min_amount: u8, //pub randomize_boss_health_min_amount: u8,
pub randomize_boss_health_max_amount: u8, //pub randomize_boss_health_max_amount: u8,
pub randomize_boss_damage: bool, //pub randomize_boss_damage: bool,
pub randomize_boss_damage_min_amount: u8, //pub randomize_boss_damage_min_amount: u8,
pub randomize_boss_damage_max_amount: u8, //pub randomize_boss_damage_max_amount: u8,
pub randomize_boss_behavior: bool, //pub randomize_boss_behavior: bool,
pub randomize_dungeon_palettes: bool, pub randomize_dungeon_palettes: bool,
pub set_blackout_mode: bool, pub set_blackout_mode: bool,
@ -418,7 +424,7 @@ pub struct OptionFlags {
pub shuffle_music: bool, pub shuffle_music: bool,
pub bootleg_magic: bool, pub bootleg_magic: bool,
pub debug_mode: bool, pub debug_mode: bool,
pub custom_bosses: bool, //pub custom_bosses: bool,
pub heart_beep_speed: HeartBeepSpeed, pub heart_beep_speed: HeartBeepSpeed,
pub alternate_gfx: bool, pub alternate_gfx: bool,
pub shield_graphics: PathBuf, pub shield_graphics: PathBuf,
@ -472,20 +478,20 @@ impl OptionFlags {
randomize_enemy_health_type: bytes[4].try_into()?, randomize_enemy_health_type: bytes[4].try_into()?,
randomize_enemy_damage: bytes[5] != 0, randomize_enemy_damage: bytes[5] != 0,
allow_enemy_zero_damage: bytes[6] != 0, allow_enemy_zero_damage: bytes[6] != 0,
easy_mode_escape: bytes[7] != 0, //easy_mode_escape: bytes[7] != 0,
enemies_absorbable: bytes[8] != 0, enemies_absorbable: bytes[8] != 0,
absorbable_spawn_rate: bytes[9], absorbable_spawn_rate: bytes[9],
absorbable_types, absorbable_types,
boss_madness: bytes[24] != 0, //boss_madness: bytes[24] != 0,
randomize_bosses: bytes[25] != 0, randomize_bosses: bytes[25] != 0,
randomize_bosses_type: bytes[26].try_into()?, randomize_bosses_type: bytes[26].try_into()?,
randomize_boss_health: bytes[27] != 0, //randomize_boss_health: bytes[27] != 0,
randomize_boss_health_min_amount: bytes[28], //randomize_boss_health_min_amount: bytes[28],
randomize_boss_health_max_amount: bytes[29], //randomize_boss_health_max_amount: bytes[29],
randomize_boss_damage: bytes[30] != 0, //randomize_boss_damage: bytes[30] != 0,
randomize_boss_damage_min_amount: bytes[31], //randomize_boss_damage_min_amount: bytes[31],
randomize_boss_damage_max_amount: bytes[32], //randomize_boss_damage_max_amount: bytes[32],
randomize_boss_behavior: bytes[33] != 0, //randomize_boss_behavior: bytes[33] != 0,
randomize_dungeon_palettes: bytes[34] != 0, randomize_dungeon_palettes: bytes[34] != 0,
set_blackout_mode: bytes[35] != 0, set_blackout_mode: bytes[35] != 0,
randomize_overworld_palettes: bytes[36] != 0, randomize_overworld_palettes: bytes[36] != 0,
@ -500,7 +506,7 @@ impl OptionFlags {
shuffle_music: bytes[45] != 0, shuffle_music: bytes[45] != 0,
bootleg_magic: bytes[46] != 0, bootleg_magic: bytes[46] != 0,
debug_mode: bytes[47] != 0, debug_mode: bytes[47] != 0,
custom_bosses: bytes[48] != 0, //custom_bosses: bytes[48] != 0,
heart_beep_speed: bytes[49].try_into()?, heart_beep_speed: bytes[49].try_into()?,
alternate_gfx: bytes[50] != 0, alternate_gfx: bytes[50] != 0,
// Skip byte 51 (shield_graphics) // Skip byte 51 (shield_graphics)
@ -539,7 +545,7 @@ impl OptionFlags {
bytes.push(self.randomize_enemy_health_type as u8); bytes.push(self.randomize_enemy_health_type as u8);
bytes.push(self.randomize_enemy_damage as u8); bytes.push(self.randomize_enemy_damage as u8);
bytes.push(self.allow_enemy_zero_damage as u8); bytes.push(self.allow_enemy_zero_damage as u8);
bytes.push(self.easy_mode_escape as u8); bytes.push(0); //bytes.push(self.easy_mode_escape as u8);
bytes.push(self.enemies_absorbable as u8); bytes.push(self.enemies_absorbable as u8);
bytes.push(self.absorbable_spawn_rate); bytes.push(self.absorbable_spawn_rate);
@ -628,16 +634,16 @@ impl OptionFlags {
.unwrap_or(false) as u8, .unwrap_or(false) as u8,
); );
bytes.push(self.boss_madness as u8); bytes.push(0); //bytes.push(self.boss_madness as u8);
bytes.push(self.randomize_bosses as u8); bytes.push(self.randomize_bosses as u8);
bytes.push(self.randomize_bosses_type as u8); bytes.push(self.randomize_bosses_type as u8);
bytes.push(self.randomize_boss_health as u8); bytes.push(0); //bytes.push(self.randomize_boss_health as u8);
bytes.push(self.randomize_boss_health_min_amount); bytes.push(0); //bytes.push(self.randomize_boss_health_min_amount);
bytes.push(self.randomize_boss_health_max_amount); bytes.push(0); //bytes.push(self.randomize_boss_health_max_amount);
bytes.push(self.randomize_boss_damage as u8); bytes.push(0); //bytes.push(self.randomize_boss_damage as u8);
bytes.push(self.randomize_boss_damage_min_amount); bytes.push(0); //bytes.push(self.randomize_boss_damage_min_amount);
bytes.push(self.randomize_boss_damage_max_amount); bytes.push(0); //bytes.push(self.randomize_boss_damage_max_amount);
bytes.push(self.randomize_boss_behavior as u8); bytes.push(0); //bytes.push(self.randomize_boss_behavior as u8);
bytes.push(self.randomize_dungeon_palettes as u8); bytes.push(self.randomize_dungeon_palettes as u8);
bytes.push(self.set_blackout_mode as u8); bytes.push(self.set_blackout_mode as u8);
bytes.push(self.randomize_overworld_palettes as u8); bytes.push(self.randomize_overworld_palettes as u8);
@ -652,7 +658,7 @@ impl OptionFlags {
bytes.push(self.shuffle_music as u8); bytes.push(self.shuffle_music as u8);
bytes.push(self.bootleg_magic as u8); bytes.push(self.bootleg_magic as u8);
bytes.push(self.debug_mode as u8); bytes.push(self.debug_mode as u8);
bytes.push(self.custom_bosses as u8); bytes.push(0); //bytes.push(self.custom_bosses as u8);
bytes.push(self.heart_beep_speed as u8); bytes.push(self.heart_beep_speed as u8);
bytes.push(self.alternate_gfx as u8); bytes.push(self.alternate_gfx as u8);
bytes.push(0); // self.shield_graphics bytes.push(0); // self.shield_graphics
@ -695,20 +701,20 @@ impl Default for OptionFlags {
allow_enemy_zero_damage: false, allow_enemy_zero_damage: false,
shuffle_enemy_damage_groups: false, shuffle_enemy_damage_groups: false,
enemy_damage_chaos_mode: false, enemy_damage_chaos_mode: false,
easy_mode_escape: false, //easy_mode_escape: false,
enemies_absorbable: false, enemies_absorbable: false,
absorbable_spawn_rate: 0, absorbable_spawn_rate: 0,
absorbable_types: HashMap::new(), absorbable_types: HashMap::new(),
boss_madness: false, //boss_madness: false,
randomize_bosses: true, randomize_bosses: true,
randomize_bosses_type: RandomizeBossesType::Chaos, randomize_bosses_type: RandomizeBossesType::Chaos,
randomize_boss_health: false, //randomize_boss_health: false,
randomize_boss_health_min_amount: 0, //randomize_boss_health_min_amount: 0,
randomize_boss_health_max_amount: 0, //randomize_boss_health_max_amount: 0,
randomize_boss_damage: false, //randomize_boss_damage: false,
randomize_boss_damage_min_amount: 0, //randomize_boss_damage_min_amount: 0,
randomize_boss_damage_max_amount: 0, //randomize_boss_damage_max_amount: 0,
randomize_boss_behavior: false, //randomize_boss_behavior: false,
randomize_dungeon_palettes: true, randomize_dungeon_palettes: true,
set_blackout_mode: false, set_blackout_mode: false,
randomize_overworld_palettes: true, randomize_overworld_palettes: true,
@ -723,7 +729,7 @@ impl Default for OptionFlags {
shuffle_music: false, shuffle_music: false,
bootleg_magic: false, bootleg_magic: false,
debug_mode: false, debug_mode: false,
custom_bosses: false, //custom_bosses: false,
heart_beep_speed: HeartBeepSpeed::Half, heart_beep_speed: HeartBeepSpeed::Half,
alternate_gfx: false, alternate_gfx: false,
shield_graphics: ["shield_gfx", "normal.gfx"].iter().collect(), shield_graphics: ["shield_gfx", "normal.gfx"].iter().collect(),
@ -751,3 +757,17 @@ impl Default for OptionFlags {
} }
} }
} }
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_option_flags_serde() {
let empty = "{}";
let actual: OptionFlags = serde_json::from_str(empty).expect("Can't deserialize empty");
let expected = serde_json::to_string(&OptionFlags::default()).expect("Can't serialize default");
assert_eq!(serde_json::to_string(&actual).expect("Can't roundtrip"), expected);
}
}