diff --git a/Cargo.toml b/Cargo.toml index ab2dbc2..7547018 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ serde = { version = "1.0.148", features = ["derive"] } serde_bytes = "0.11.7" serde-pickle = "1.1.1" serde_json = { version = "1.0.96", optional = true } +serde_repr = "0.1.12" serde_with = { version = "2.3.3", features = ["hex"] } thiserror = "1.0.37" zip = { version = "0.6.3", default-features = false, features = ["deflate"] } diff --git a/replays/20230512_2150__helaas_pindakaas_R159_SU_130PM_15146680594634860.wotbreplay b/replays/20230512_2150__helaas_pindakaas_R159_SU_130PM_15146680594634860.wotbreplay new file mode 100644 index 0000000..70e3822 Binary files /dev/null and b/replays/20230512_2150__helaas_pindakaas_R159_SU_130PM_15146680594634860.wotbreplay differ diff --git a/src/models.rs b/src/models.rs index 0be5d18..b275ad5 100644 --- a/src/models.rs +++ b/src/models.rs @@ -3,3 +3,4 @@ pub mod battle_results_dat; pub mod data; pub mod map_id; pub mod meta; +pub mod room_type; diff --git a/src/models/battle_results.rs b/src/models/battle_results.rs index a3f016f..c881fb3 100644 --- a/src/models/battle_results.rs +++ b/src/models/battle_results.rs @@ -2,6 +2,7 @@ use prost::bytes::Buf; use prost::{Enumeration, Message}; use serde::Serialize; +use crate::models::room_type::RoomType; use crate::result::Result; impl BattleResults { @@ -41,6 +42,9 @@ pub struct BattleResults { #[prost(message, required, tag = "8")] pub author: Author, + #[prost(enumeration = "RoomType", tag = "9")] + pub room_type: i32, + /// Author's free XP, including premium. #[prost(uint32, tag = "137")] pub free_xp: u32, diff --git a/src/models/map_id.rs b/src/models/map_id.rs index ac8d84e..1478e60 100644 --- a/src/models/map_id.rs +++ b/src/models/map_id.rs @@ -1,9 +1,9 @@ use prost::Enumeration; -use serde::{Deserialize, Serialize}; -use serde_with::rust::deserialize_ignore_any; +use serde_repr::{Deserialize_repr, Serialize_repr}; -#[derive(Debug, Deserialize, Serialize, Enumeration)] +#[derive(Debug, Serialize_repr, Deserialize_repr, Enumeration, Ord, PartialOrd, Eq, PartialEq)] #[serde(untagged)] +#[repr(u16)] pub enum MapId { DesertSands = 2, Middleburg = 3, @@ -13,6 +13,7 @@ pub enum MapId { FortDespair = 8, Himmelsdorf = 9, OasisPalms = 11, + GhostFactory = 12, Molendijk = 14, PortBay = 15, Castilla = 20, @@ -20,12 +21,14 @@ pub enum MapId { YamatoHarbor = 25, Canyon = 27, MayanRuins = 30, + DynastyPearl = 31, NavalFrontier = 35, Alpenstadt = 38, NewBay = 40, Normandy = 42, + Wasteland = 71, /// Default value for Protocol Buffers and fallback value for Serde. - #[serde(deserialize_with = "deserialize_ignore_any")] + #[serde(deserialize_with = "serde_with::rust::deserialize_ignore_any")] Undefined = 0, } diff --git a/src/models/room_type.rs b/src/models/room_type.rs new file mode 100644 index 0000000..13cd836 --- /dev/null +++ b/src/models/room_type.rs @@ -0,0 +1,18 @@ +use prost::Enumeration; +use serde::Serialize; + +#[derive(Debug, Enumeration, Serialize, Ord, PartialOrd, Eq, PartialEq)] +pub enum RoomType { + Any = 0, + Regular = 1, + TrainingRoom = 2, + Tournament = 4, + QuickTournament = 5, + Rating = 7, + MadGames = 8, + RealisticBattles = 22, + Uprising = 23, + GravityMode = 24, + Skirmish = 25, + BurningGames = 26, +} diff --git a/tests/battle_results.rs b/tests/battle_results.rs index 984a5c2..496856a 100644 --- a/tests/battle_results.rs +++ b/tests/battle_results.rs @@ -2,6 +2,7 @@ use std::fs::File; use anyhow::Result; use wotbreplay_parser::models::battle_results::BattleResults; +use wotbreplay_parser::models::room_type::RoomType; use wotbreplay_parser::replay::Replay; #[test] @@ -13,6 +14,7 @@ fn player_results_ok() -> Result<()> { let battle_results: BattleResults = battle_results_dat.try_into()?; assert_eq!(battle_results.winner_team_number, Some(2)); + assert_eq!(battle_results.room_type(), RoomType::Regular); assert_eq!(battle_results.author.team_number, 2); assert_eq!(battle_results.author.credits_earned, 59518); @@ -127,3 +129,13 @@ fn draw_ok() -> Result<()> { assert_eq!(battle_results.winner_team_number, None); Ok(()) } + +#[test] +fn room_type_ok() -> Result<()> { + let battle_results = Replay::open(File::open( + "replays/20230512_2150__helaas_pindakaas_R159_SU_130PM_15146680594634860.wotbreplay", + )?)? + .read_battle_results()?; + assert_eq!(battle_results.room_type(), RoomType::MadGames); + Ok(()) +} diff --git a/tests/meta.rs b/tests/meta.rs index 7d9ddeb..d2d5669 100644 --- a/tests/meta.rs +++ b/tests/meta.rs @@ -3,6 +3,7 @@ use std::fs::File; use anyhow::Result; +use wotbreplay_parser::models::map_id::MapId; use wotbreplay_parser::replay::Replay; #[test] @@ -14,7 +15,7 @@ fn meta_ok() -> Result<()> { assert_eq!(meta.arena_unique_id, "1661909200500084"); assert_eq!(meta.battle_duration_secs, 164.08485); assert_eq!(meta.tank_id, 26657); - // TODO: assert_eq!(meta.map_id); + assert_eq!(meta.map_id, MapId::DynastyPearl); Ok(()) }