Skip to content

Commit

Permalink
fix: parse 1.30.2 replays, added 0x22 dynamic block length (#11)
Browse files Browse the repository at this point in the history
* fix: parse 1.30.2 replays, added 0x22 dynamic block length

* improvement: changed name of 0x22 remaining block content

* improvement: give gameStartRecord parser entity a proper name
  • Loading branch information
PBug90 authored Dec 12, 2018
1 parent cc91d57 commit 1c7bfed
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 12 deletions.
3 changes: 2 additions & 1 deletion parsers/gamedata.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ const PlayerChatMessageBlock = new Parser()

// 0x22
const Unknown0x22 = new Parser()
.skip(5)
.int8('length')
.string('content', {length: 'length'})

// 0x23
const Unknown0x23 = new Parser()
Expand Down
31 changes: 20 additions & 11 deletions parsers/header.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@ const PlayerRecordLadder = new Parser()
.string('runtimeMS', {encoding: 'hex', length: 4})
.int32le('raceFlags', { formatter: raceFlagFormatter })

const HostRecord = new Parser()
.int8('playerId')
.string('playerName', {zeroTerminated: true})
.uint8('addDataFlagHost')
.choice('additional', {tag: 'addDataFlagHost',
choices: {
8: PlayerRecordLadder,
0: new Parser().skip(0),
1: new Parser().skip(1),
2: new Parser().skip(2)
}})

const PlayerRecord = new Parser()
.int8('playerId')
.string('playerName', {zeroTerminated: true})
Expand All @@ -55,7 +67,8 @@ const PlayerRecord = new Parser()
choices: {
1: new Parser().skip(1),
8: PlayerRecordLadder,
2: new Parser().skip(2)
2: new Parser().skip(2),
0: new Parser().skip(0)
}})

const PlayerRecordInList = new Parser()
Expand All @@ -74,9 +87,8 @@ const PlayerSlotRecord = new Parser()
.int8('handicapFlag')

const GameMetaData = new Parser()
.skip(4)
.skip(1)
.nest('player', {type: PlayerRecord})
.skip(5)
.nest('player', {type: HostRecord})
.string('gameName', {zeroTerminated: true})
.skip(1)
.string('encodedString', {zeroTerminated: true, encoding: 'hex'})
Expand All @@ -88,20 +100,17 @@ const GameMetaData = new Parser()
.int8('hasRecord')
.choice(null, {tag: 'hasRecord',
choices: {
0: new Parser(),
22: PlayerRecordInList

},
defaultChoice: new Parser()
defaultChoice: new Parser().skip(-1)
}),
readUntil: function (item, buffer) {
const next = buffer.readInt8()
return (next !== 22 && next !== 25) || item.hasRecord === 25
},
formatter: (input) => {
input.splice(-1, 1)
return input
return next === 25
}
})
.int8('gameStartRecord')
.int16('dataByteCount')
.int8('slotRecordCount')
.array('playerSlotRecords', {type: PlayerSlotRecord, length: 'slotRecordCount'})
Expand Down
Binary file added replays/standard_1.302.w3g
Binary file not shown.
8 changes: 8 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,12 @@ describe('Replay parsing tests', () => {
expect(test.players['5'].detectedRace).toBe('N')
expect(Object.keys(test.players).length).toBe(2)
})

it('parses a standard 1.30.2 replay properly', () => {
const test = Parser.parse(`./replays/standard_1.302.w3g`)
expect(test.header.magic).toBe('Warcraft III recorded game\u001a')
expect(test.header.version).toBe(10030)
expect(test.matchup).toBe('NvU')
expect(Object.keys(test.players).length).toBe(2)
})
})

0 comments on commit 1c7bfed

Please sign in to comment.