@@ -31,7 +31,10 @@ fileInput.addEventListener('change', async event => {
3131 console .log (' Replay parsed:' , replay)
3232 console .log (' Game title:' , header .title )
3333 console .log (' Map name:' , header .mapName )
34- console .log (' Players:' , replay .players ().filter (p => ! p .isEmpty && ! p .isObserver ))
34+ console .log (
35+ ' Players:' ,
36+ replay .players ().filter (p => ! p .isEmpty && ! p .isObserver ),
37+ )
3538 } catch (error) {
3639 console .error (' Failed to parse replay:' , error)
3740 }
@@ -78,16 +81,19 @@ Parses a StarCraft replay file and returns a Replay object for retrieving game i
7881class Replay {
7982 readonly format: ReplayFormat // "legacy", "modern", or "modern121"
8083 readonly header: ReplayHeader // Game header information
81-
84+
8285 // Methods for retrieving player information
8386 players(): Player [] // All player slots (including empty)
8487 observers(): Player [] // Only observers
8588 slots(): Player [] // All slots
8689 hostPlayer(): Player | undefined // The host player if identifiable
87-
90+
8891 // Methods for retrieving raw section data
8992 getRawSection(section : ReplaySection ): Uint8Array | undefined
9093 getRawCustomSection(section_id : number ): Uint8Array | undefined
94+
95+ // Method for retrieving parsed ShieldBattery data
96+ getShieldBatterySection(): ShieldBatteryData | undefined
9197}
9298
9399interface ReplayHeader {
@@ -115,6 +121,29 @@ interface Player {
115121 isEmpty: boolean // Whether this is an empty slot
116122 isObserver: boolean // Whether this is an observer
117123}
124+
125+ interface ShieldBatteryData {
126+ starcraftExeBuild: number // StarCraft executable build number
127+ shieldbatteryVersion: string // ShieldBattery client version
128+ teamGameMainPlayers: [number , number , number , number ] // Main players in team games
129+ startingRaces: [
130+ number ,
131+ number ,
132+ number ,
133+ number ,
134+ number ,
135+ number ,
136+ number ,
137+ number ,
138+ number ,
139+ number ,
140+ number ,
141+ number ,
142+ ] // Starting race for each player
143+ gameId: string // Game UUID on ShieldBattery
144+ userIds: [number , number , number , number , number , number , number , number ] // ShieldBattery user IDs
145+ gameLogicVersion: number | undefined // Game logic version (if available)
146+ }
118147```
119148
120149### ` DecompressionConfig `
@@ -125,7 +154,7 @@ Configuration object for customizing security limits during replay parsing.
125154// Create decompression config object
126155const options = {
127156 maxDecompressedSize: 200 * 1024 * 1024 , // 200MB
128- maxCompressionRatio: 1000.0 // Allow 1000:1 compression ratio
157+ maxCompressionRatio: 1000.0 , // Allow 1000:1 compression ratio
129158}
130159
131160const replay = parseReplay (replayData, options)
@@ -143,6 +172,54 @@ configured due to limitations of Rust's time implementation.
143172
144173Returns the version of the broodrep library.
145174
175+ ## ShieldBattery Support
176+
177+ The library includes support for parsing ShieldBattery-specific data from replays created through the [ ShieldBattery] ( https://shieldbattery.net/ ) platform. This data provides additional context about games played on ShieldBattery.
178+
179+ ### Basic Usage
180+
181+ ``` javascript
182+ import { parseReplay } from ' @shieldbattery/broodrep'
183+
184+ // Parse a replay
185+ const replay = parseReplay (replayData)
186+
187+ // Check for ShieldBattery data
188+ const shieldBatteryData = replay .getShieldBatterySection ()
189+
190+ if (shieldBatteryData) {
191+ console .log (' Game ID:' , shieldBatteryData .gameId )
192+ console .log (' StarCraft Build:' , shieldBatteryData .starcraftExeBuild )
193+ console .log (' ShieldBattery Version:' , shieldBatteryData .shieldbatteryVersion )
194+
195+ // Game logic version (if available in newer format)
196+ if (shieldBatteryData .gameLogicVersion !== undefined ) {
197+ console .log (' Game Logic Version:' , shieldBatteryData .gameLogicVersion )
198+ }
199+
200+ // User IDs of active players
201+ const activeUserIds = shieldBatteryData .userIds .filter (id => id !== 0 )
202+ console .log (' User IDs:' , activeUserIds)
203+
204+ // Starting races as numbers (0=Zerg, 1=Terran, 2=Protoss, 6=Random)
205+ const activePlayers = replay .players ().filter (p => ! p .isEmpty && ! p .isObserver )
206+ const startingRaces = shieldBatteryData .startingRaces .slice (0 , activePlayers .length )
207+ console .log (' Starting Races:' , startingRaces)
208+ } else {
209+ console .log (' No ShieldBattery data (normal for non-ShieldBattery replays)' )
210+ }
211+ ```
212+
213+ ### ShieldBatteryData Fields
214+
215+ - ** ` gameId ` ** : Unique UUID for the game on ShieldBattery platform
216+ - ** ` starcraftExeBuild ` ** : Build number of the StarCraft executable used
217+ - ** ` shieldbatteryVersion ` ** : Version string of the ShieldBattery client
218+ - ** ` gameLogicVersion ` ** : Version of game logic modifications (if available)
219+ - ** ` userIds ` ** : Array of ShieldBattery user IDs corresponding to players
220+ - ** ` teamGameMainPlayers ` ** : Identifies main players in team games
221+ - ** ` startingRaces ` ** : Original race selection for each player slot (before randomization)
222+
146223## Building
147224
148225```` bash
0 commit comments