Skip to content

Commit 1bc7936

Browse files
committed
Adjust SB data in WASM to use 1 letter race identifiers, simplify SB data parsing structure.
1 parent bf8d0e1 commit 1bc7936

File tree

4 files changed

+67
-113
lines changed

4 files changed

+67
-113
lines changed

broodrep-wasm/examples/index.html

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,16 @@
138138
color: #666;
139139
}
140140

141-
.race-terran {
141+
.race-t {
142142
color: #ff6b6b;
143143
}
144-
.race-protoss {
144+
.race-p {
145145
color: #4ecdc4;
146146
}
147-
.race-zerg {
147+
.race-z {
148148
color: #9b59b6;
149149
}
150-
.race-random {
150+
.race-r {
151151
color: #95a5a6;
152152
}
153153

@@ -263,7 +263,7 @@ <h3>ShieldBattery Data</h3>
263263
}
264264

265265
function getRaceClass(race) {
266-
return `race-${race.toLowerCase()}`
266+
return `race-${race}`
267267
}
268268

269269
function displayReplayInfo(replay) {
@@ -368,10 +368,7 @@ <h3>ShieldBattery Data</h3>
368368
if (shieldBatteryData) {
369369
shieldBatterySection.style.display = 'block'
370370

371-
const raceNames = ['Zerg', 'Terran', 'Protoss']
372-
const startingRaces = shieldBatteryData.startingRaces
373-
.map(race => raceNames[race] || `Random`)
374-
.join(', ')
371+
const startingRaces = shieldBatteryData.startingRaces.join(', ')
375372

376373
const activeUserIds = shieldBatteryData.userIds.filter(id => id !== 0)
377374
const mainPlayers = shieldBatteryData.teamGameMainPlayers

broodrep-wasm/src/lib.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,15 @@ impl From<broodrep::PlayerType> for PlayerType {
176176
}
177177

178178
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Tsify, Serialize, Deserialize)]
179-
#[serde(rename_all = "camelCase")]
180179
#[tsify(into_wasm_abi)]
181180
pub enum Race {
181+
#[serde(rename = "z")]
182182
Zerg,
183+
#[serde(rename = "t")]
183184
Terran,
185+
#[serde(rename = "p")]
184186
Protoss,
187+
#[serde(rename = "r")]
185188
Random,
186189
}
187190

@@ -318,7 +321,7 @@ pub struct ShieldBatteryData {
318321
pub starcraft_exe_build: u32,
319322
pub shieldbattery_version: String,
320323
pub team_game_main_players: [u8; 4],
321-
pub starting_races: [u8; 12],
324+
pub starting_races: [Race; 12],
322325
pub game_id: Uuid,
323326
pub user_ids: [u32; 8],
324327
pub game_logic_version: Option<u16>,
@@ -327,13 +330,13 @@ pub struct ShieldBatteryData {
327330
impl From<broodrep::ShieldBatteryData> for ShieldBatteryData {
328331
fn from(data: broodrep::ShieldBatteryData) -> Self {
329332
ShieldBatteryData {
330-
starcraft_exe_build: data.starcraft_exe_build(),
331-
shieldbattery_version: data.shieldbattery_version().to_string(),
332-
team_game_main_players: data.team_game_main_players(),
333-
starting_races: data.starting_races(),
334-
game_id: Uuid::from_u128(data.game_id()),
335-
user_ids: data.user_ids(),
336-
game_logic_version: data.game_logic_version(),
333+
starcraft_exe_build: data.starcraft_exe_build,
334+
shieldbattery_version: data.shieldbattery_version.to_string(),
335+
team_game_main_players: data.team_game_main_players,
336+
starting_races: data.starting_races.map(Into::into),
337+
game_id: Uuid::from_u128(data.game_id),
338+
user_ids: data.user_ids,
339+
game_logic_version: data.game_logic_version,
337340
}
338341
}
339342
}

broodrep/src/lib.rs

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ impl<R: Read + Seek> Replay<R> {
412412
let network_id = cursor.read_u8()?;
413413
cursor.seek(SeekFrom::Current(3))?; // unknown
414414
let player_type: PlayerType = cursor.read_u8()?.try_into()?;
415-
let race: Race = cursor.read_u8()?.try_into()?;
415+
let race: Race = cursor.read_u8()?.into();
416416
let team = cursor.read_u8()?;
417417
let mut name = vec![0u8; 26];
418418
cursor.read_exact(&mut name[..25])?;
@@ -836,15 +836,13 @@ pub enum Race {
836836
Random = 6,
837837
}
838838

839-
impl TryFrom<u8> for Race {
840-
type Error = BroodrepError;
841-
842-
fn try_from(value: u8) -> Result<Self, Self::Error> {
839+
impl From<u8> for Race {
840+
fn from(value: u8) -> Self {
843841
match value {
844-
0 => Ok(Race::Zerg),
845-
1 => Ok(Race::Terran),
846-
2 => Ok(Race::Protoss),
847-
_ => Ok(Race::Random),
842+
0 => Race::Zerg,
843+
1 => Race::Terran,
844+
2 => Race::Protoss,
845+
_ => Race::Random,
848846
}
849847
}
850848
}
@@ -1078,13 +1076,29 @@ mod tests {
10781076
assert!(data.is_some());
10791077
let data = data.unwrap();
10801078

1081-
assert_eq!(data.starcraft_exe_build(), 13515);
1082-
assert_eq!(data.shieldbattery_version(), "10.1.0");
1083-
assert_eq!(data.team_game_main_players(), [0, 0, 0, 0]);
1084-
assert_eq!(data.starting_races(), [2, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0]);
1085-
assert_eq!(data.game_id(), 56542772156747381282200559102402795521);
1086-
assert_eq!(data.user_ids(), [101, 112, 1, 113, 0, 0, 0, 0]);
1087-
assert_eq!(data.game_logic_version(), Some(3));
1079+
assert_eq!(data.starcraft_exe_build, 13515);
1080+
assert_eq!(data.shieldbattery_version, "10.1.0");
1081+
assert_eq!(data.team_game_main_players, [0, 0, 0, 0]);
1082+
assert_eq!(
1083+
data.starting_races,
1084+
[
1085+
Race::Protoss,
1086+
Race::Terran,
1087+
Race::Zerg,
1088+
Race::Terran,
1089+
Race::Terran,
1090+
Race::Zerg,
1091+
Race::Terran,
1092+
Race::Terran,
1093+
Race::Zerg,
1094+
Race::Zerg,
1095+
Race::Zerg,
1096+
Race::Zerg
1097+
]
1098+
);
1099+
assert_eq!(data.game_id, 56542772156747381282200559102402795521);
1100+
assert_eq!(data.user_ids, [101, 112, 1, 113, 0, 0, 0, 0]);
1101+
assert_eq!(data.game_logic_version, Some(3));
10881102
}
10891103

10901104
#[test]

broodrep/src/shieldbattery.rs

Lines changed: 19 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use std::{
66
use byteorder::{LittleEndian as LE, ReadBytesExt as _};
77
use thiserror::Error;
88

9+
use crate::Race;
10+
911
#[derive(Error, Debug)]
1012
pub enum ShieldBatteryDataError {
1113
#[error(transparent)]
@@ -15,83 +17,23 @@ pub enum ShieldBatteryDataError {
1517
}
1618

1719
#[derive(Debug, Clone)]
18-
pub enum ShieldBatteryData {
19-
Version0(ShieldBatteryDataV0),
20-
Version1(ShieldBatteryDataV0, ShieldBatteryDataV1),
21-
}
22-
23-
#[derive(Debug, Clone)]
24-
pub struct ShieldBatteryDataV0 {
25-
pub starcraft_exe_build: u32,
26-
pub shieldbattery_version: String,
27-
pub team_game_main_players: [u8; 4],
28-
pub starting_races: [u8; 12],
29-
pub game_id: u128,
30-
pub user_ids: [u32; 8],
31-
}
32-
33-
#[derive(Debug, Clone)]
34-
pub struct ShieldBatteryDataV1 {
35-
game_logic_version: u16,
36-
}
37-
38-
impl ShieldBatteryData {
20+
pub struct ShieldBatteryData {
3921
/// The build number of the StarCraft executable used to play the game.
40-
pub fn starcraft_exe_build(&self) -> u32 {
41-
match self {
42-
ShieldBatteryData::Version0(data) => data.starcraft_exe_build,
43-
ShieldBatteryData::Version1(data, _) => data.starcraft_exe_build,
44-
}
45-
}
46-
22+
pub starcraft_exe_build: u32,
4723
/// The version string of the ShieldBattery client used to play the game.
48-
pub fn shieldbattery_version(&self) -> &str {
49-
match self {
50-
ShieldBatteryData::Version0(data) => &data.shieldbattery_version,
51-
ShieldBatteryData::Version1(data, _) => &data.shieldbattery_version,
52-
}
53-
}
54-
24+
pub shieldbattery_version: String,
5525
/// Which players were the "main" players in a team game (e.g. Team Melee).
56-
pub fn team_game_main_players(&self) -> [u8; 4] {
57-
match self {
58-
ShieldBatteryData::Version0(data) => data.team_game_main_players,
59-
ShieldBatteryData::Version1(data, _) => data.team_game_main_players,
60-
}
61-
}
62-
26+
pub team_game_main_players: [u8; 4],
6327
/// The starting race for each player in the game.
64-
pub fn starting_races(&self) -> [u8; 12] {
65-
match self {
66-
ShieldBatteryData::Version0(data) => data.starting_races,
67-
ShieldBatteryData::Version1(data, _) => data.starting_races,
68-
}
69-
}
70-
28+
pub starting_races: [Race; 12],
7129
/// The game's ID on ShieldBattery (a UUID as a u128).
72-
pub fn game_id(&self) -> u128 {
73-
match self {
74-
ShieldBatteryData::Version0(data) => data.game_id,
75-
ShieldBatteryData::Version1(data, _) => data.game_id,
76-
}
77-
}
78-
30+
pub game_id: u128,
7931
/// The ShieldBattery user IDs of the players ingame, in the same order as the players in the
8032
/// replay header.
81-
pub fn user_ids(&self) -> [u32; 8] {
82-
match self {
83-
ShieldBatteryData::Version0(data) => data.user_ids,
84-
ShieldBatteryData::Version1(data, _) => data.user_ids,
85-
}
86-
}
87-
88-
/// The version of ShieldBattery game logic modifications used to play the game.
89-
pub fn game_logic_version(&self) -> Option<u16> {
90-
match self {
91-
ShieldBatteryData::Version0(_) => None,
92-
ShieldBatteryData::Version1(_, data) => Some(data.game_logic_version),
93-
}
94-
}
33+
pub user_ids: [u32; 8],
34+
/// The version of ShieldBattery game logic modifications used to play the game. May not be
35+
/// present on older replays.
36+
pub game_logic_version: Option<u16>,
9537
}
9638

9739
pub fn parse_shieldbattery_section(
@@ -109,25 +51,23 @@ pub fn parse_shieldbattery_section(
10951
data.read_exact(&mut team_game_main_players)?;
11052
let mut starting_races = [0u8; 12];
11153
data.read_exact(&mut starting_races)?;
54+
let starting_races = starting_races.map(Into::into);
11255
let game_id = data.read_u128::<LE>()?;
11356
let mut user_ids = [0u32; 8];
11457
data.read_u32_into::<LE>(&mut user_ids)?;
11558

116-
let v0 = ShieldBatteryDataV0 {
59+
let mut parsed = ShieldBatteryData {
11760
starcraft_exe_build,
11861
shieldbattery_version,
11962
team_game_main_players,
12063
starting_races,
12164
game_id,
12265
user_ids,
66+
game_logic_version: None,
12367
};
124-
if version == 0 {
125-
Ok(ShieldBatteryData::Version0(v0))
126-
} else
127-
/* if version >= 1 */
128-
{
129-
let game_logic_version = data.read_u16::<LE>()?;
130-
let v1 = ShieldBatteryDataV1 { game_logic_version };
131-
Ok(ShieldBatteryData::Version1(v0, v1))
68+
if version >= 1 {
69+
parsed.game_logic_version = Some(data.read_u16::<LE>()?);
13270
}
71+
72+
Ok(parsed)
13373
}

0 commit comments

Comments
 (0)