@@ -26,11 +26,12 @@ fileInput.addEventListener('change', async event => {
2626 const uint8Array = new Uint8Array (arrayBuffer)
2727
2828 try {
29- const replayInfo = parseReplay (uint8Array)
30- console .log (' Replay parsed:' , replayInfo)
31- console .log (' Game title:' , replayInfo .gameTitle )
32- console .log (' Map name:' , replayInfo .mapName )
33- console .log (' Players:' , replayInfo .activePlayers )
29+ const replay = parseReplay (uint8Array)
30+ const header = replay .header
31+ console .log (' Replay parsed:' , replay)
32+ console .log (' Game title:' , header .title )
33+ console .log (' Map name:' , header .mapName )
34+ console .log (' Players:' , replay .players ().filter (p => ! p .isEmpty && ! p .isObserver ))
3435 } catch (error) {
3536 console .error (' Failed to parse replay:' , error)
3637 }
@@ -48,73 +49,86 @@ const replayData = fs.readFileSync('example.rep')
4849const uint8Array = new Uint8Array (replayData)
4950
5051try {
51- const replayInfo = parseReplay (uint8Array)
52- console .log (' Game:' , replayInfo .gameTitle )
53- console .log (' Map:' , replayInfo .mapName )
54- console .log (' Format:' , replayInfo .format )
55- console .log (' Engine:' , replayInfo .engine )
56- console .log (' Players:' , replayInfo .activePlayers .length )
52+ const replay = parseReplay (uint8Array)
53+ const header = replay .header
54+ console .log (' Game:' , header .title )
55+ console .log (' Map:' , header .mapName )
56+ console .log (' Format:' , replay .format )
57+ console .log (' Engine:' , header .engine )
58+ console .log (' Players:' , replay .players ().filter (p => ! p .isEmpty && ! p .isObserver ).length )
5759} catch (error) {
5860 console .error (' Failed to parse replay:' , error)
5961}
6062```
6163
6264## API Reference
6365
64- ### ` parseReplay(data: Uint8Array, options?: DecompressionOptions ): ReplayInfo `
66+ ### ` parseReplay(data: Uint8Array, options?: DecompressionConfig ): Replay `
6567
66- Parses a StarCraft replay file and returns detailed information about the game.
68+ Parses a StarCraft replay file and returns a Replay object for retrieving game information .
6769
6870** Parameters:**
6971
7072- ` data ` : A ` Uint8Array ` containing the replay file bytes
7173- ` options ` : Optional decompression configuration to customize security limits
7274
73- ** Returns:** A ` ReplayInfo ` object containing :
75+ ** Returns:** A ` Replay ` object with the following interface :
7476
7577``` typescript
76- interface ReplayInfo {
77- format: string // "Legacy (pre-1.18)", "Modern (1.18-1.21)", or "Modern (1.21+)"
78- engine: string // "StarCraft" or "Brood War"
78+ class Replay {
79+ readonly format: ReplayFormat // "legacy", "modern", or "modern121"
80+ readonly header: ReplayHeader // Game header information
81+
82+ // Methods for retrieving player information
83+ players(): Player [] // All player slots (including empty)
84+ observers(): Player [] // Only observers
85+ slots(): Player [] // All slots
86+ hostPlayer(): Player | undefined // The host player if identifiable
87+
88+ // Methods for retrieving raw section data
89+ getRawSection(section : ReplaySection ): Uint8Array | undefined
90+ getRawCustomSection(section_id : number ): Uint8Array | undefined
91+ }
92+
93+ interface ReplayHeader {
94+ engine: Engine // "starCraft", "broodWar", or "unknown"
7995 frames: number // Number of game frames
80- startTime: number | null // Unix timestamp of game start (or null if invalid)
81- gameTitle: string // Game title
82- mapName: string // Map name
96+ startTime: number // Unix timestamp of game start
97+ title: string // Game title
8398 mapWidth: number // Map width in tiles
8499 mapHeight: number // Map height in tiles
85- gameSpeed: string // Game speed setting
86- gameType: string // Game type (e.g., "Melee", "Free For All")
100+ availableSlots: number // Number of available player slots
101+ speed: GameSpeed // Game speed setting
102+ gameType: GameType // Game type (e.g., "melee", "freeForAll")
87103 gameSubType: number // Game sub-type value
88104 hostName: string // Name of the game host
89- players: PlayerInfo [] // All player slots (including empty)
90- activePlayers: PlayerInfo [] // Only active players (non-empty, non-observers)
91- observers: PlayerInfo [] // Only observers
105+ mapName: string // Map name
92106}
93107
94- interface PlayerInfo {
95- slotId: number // Map slot ID
96- networkId: number // Network ID
97- playerType: string // "Human ", "Computer ", etc.
98- race: string // "Terran ", "Protoss ", "Zerg ", "Random "
108+ interface Player {
109+ slotId: number // Map slot ID (post-randomization)
110+ networkId: number // Network ID (255 for computer, 128-131 for observers)
111+ playerType: PlayerType // "inactive ", "computer", "human ", etc.
112+ race: Race // "zerg ", "terran ", "protoss ", "random "
99113 team: number // Team number
100114 name: string // Player name
101115 isEmpty: boolean // Whether this is an empty slot
102116 isObserver: boolean // Whether this is an observer
103117}
104118```
105119
106- ### ` DecompressionOptions `
120+ ### ` DecompressionConfig `
107121
108- Configuration class for customizing security limits during replay parsing.
122+ Configuration object for customizing security limits during replay parsing.
109123
110124``` javascript
111- import { DecompressionOptions } from ' ./pkg/broodrep_wasm.js '
112-
113- const options = new DecompressionOptions ()
114- options . maxDecompressedSize = 200 * 1024 * 1024 // 200MB
115- options . maxCompressionRatio = 1000.0 // Allow 1000:1 compression ratio
125+ // Create decompression config object
126+ const options = {
127+ maxDecompressedSize : 200 * 1024 * 1024 , // 200MB
128+ maxCompressionRatio : 1000.0 // Allow 1000:1 compression ratio
129+ }
116130
117- const replayInfo = parseReplay (replayData, options)
131+ const replay = parseReplay (replayData, options)
118132```
119133
120134** Properties:**
0 commit comments