mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +02:00
simple parser for menu
This commit is contained in:
parent
344d76fb97
commit
70bdf0257e
4 changed files with 48 additions and 16 deletions
|
|
@ -5,7 +5,6 @@ import {EncodeClassInfo, ParseClassInfo} from '../Packet/ClassInfo';
|
||||||
import {EncodeCreateStringTable, ParseCreateStringTable} from '../Packet/CreateStringTable';
|
import {EncodeCreateStringTable, ParseCreateStringTable} from '../Packet/CreateStringTable';
|
||||||
import {ParseGameEvent} from '../Packet/GameEvent';
|
import {ParseGameEvent} from '../Packet/GameEvent';
|
||||||
import {EncodeGameEventList, ParseGameEventList} from '../Packet/GameEventList';
|
import {EncodeGameEventList, ParseGameEventList} from '../Packet/GameEventList';
|
||||||
import {ParseMenu} from '../Packet/Menu';
|
|
||||||
import {ParsePacketEntities} from '../Packet/PacketEntities';
|
import {ParsePacketEntities} from '../Packet/PacketEntities';
|
||||||
import {PacketParserMap, voidEncoder} from '../Packet/Parser';
|
import {PacketParserMap, voidEncoder} from '../Packet/Parser';
|
||||||
import {EncodeParseSounds, ParseParseSounds} from '../Packet/ParseSounds';
|
import {EncodeParseSounds, ParseParseSounds} from '../Packet/ParseSounds';
|
||||||
|
|
@ -53,7 +52,7 @@ export class Packet extends Parser {
|
||||||
26: {parser: ParsePacketEntities, encoder: voidEncoder},
|
26: {parser: ParsePacketEntities, encoder: voidEncoder},
|
||||||
27: {parser: ParseTempEntities, encoder: voidEncoder},
|
27: {parser: ParseTempEntities, encoder: voidEncoder},
|
||||||
28: make('preFetch', 'index{14}'),
|
28: make('preFetch', 'index{14}'),
|
||||||
29: {parser: ParseMenu, encoder: voidEncoder},
|
29: make('menu', 'type{u16}length{u16}data{$length*8}'),
|
||||||
30: {parser: ParseGameEventList, encoder: EncodeGameEventList},
|
30: {parser: ParseGameEventList, encoder: EncodeGameEventList},
|
||||||
31: make('getCvarValue', 'cookie{32}value{s}'),
|
31: make('getCvarValue', 'cookie{32}value{s}'),
|
||||||
32: make('cmdKeyValues', 'length{32}data{$length}'),
|
32: make('cmdKeyValues', 'length{32}data{$length}'),
|
||||||
|
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
import {BitStream} from 'bit-buffer';
|
|
||||||
import {MenuPacket} from '../../Data/Packet';
|
|
||||||
|
|
||||||
export function ParseMenu(stream: BitStream): MenuPacket {
|
|
||||||
const type = stream.readUint16();
|
|
||||||
const length = stream.readUint16();
|
|
||||||
const data = stream.readBitStream(length * 8); // length is in bytes
|
|
||||||
return {
|
|
||||||
packetType: 'menu',
|
|
||||||
type,
|
|
||||||
length,
|
|
||||||
data,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -47,6 +47,9 @@ function readItem(stream: BitStream, description: string, data) {
|
||||||
} else if (description[0] === 'u') {
|
} else if (description[0] === 'u') {
|
||||||
const length = parseInt(description.substr(1), 10);
|
const length = parseInt(description.substr(1), 10);
|
||||||
return stream.readBits(length);
|
return stream.readBits(length);
|
||||||
|
} else if (description[0] === '$' && description.substr(description.length - 2) === '*8') {
|
||||||
|
const variable = description.substr(1, description.length - 3);
|
||||||
|
return stream.readBitStream(data[variable] * 8);
|
||||||
} else if (description[0] === '$') {
|
} else if (description[0] === '$') {
|
||||||
const variable = description.substr(1);
|
const variable = description.substr(1);
|
||||||
return stream.readBitStream(data[variable]);
|
return stream.readBitStream(data[variable]);
|
||||||
|
|
@ -70,6 +73,9 @@ function writeItem(stream: BitStream, description: string, data, value: boolean
|
||||||
} else if (description[0] === 'u') {
|
} else if (description[0] === 'u') {
|
||||||
const length = parseInt(description.substr(1), 10);
|
const length = parseInt(description.substr(1), 10);
|
||||||
return stream.writeBits(value as number, length);
|
return stream.writeBits(value as number, length);
|
||||||
|
} else if (description[0] === '$' && description.substr(description.length - 2) === '*8') {
|
||||||
|
const variable = description.substr(1, description.length - 3);
|
||||||
|
return stream.writeBitStream(value as BitStream, data[variable] * 8);
|
||||||
} else if (description[0] === '$') {
|
} else if (description[0] === '$') {
|
||||||
const variable = description.substr(1);
|
const variable = description.substr(1);
|
||||||
return stream.writeBitStream(value as BitStream, data[variable]);
|
return stream.writeBitStream(value as BitStream, data[variable]);
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,32 @@ suite('Parser generator', () => {
|
||||||
assertGeneratedParser('length{u2}foo{$length}', stream, {length: 3, foo: expectedStream.readBitStream(3)}, 5);
|
assertGeneratedParser('length{u2}foo{$length}', stream, {length: 3, foo: expectedStream.readBitStream(3)}, 5);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Variable length *8', () => {
|
||||||
|
const stream = new BitStream(new ArrayBuffer(256));
|
||||||
|
stream.writeUint8(0b11111111);
|
||||||
|
stream.writeUint8(0b00001100);
|
||||||
|
stream.writeUint8(0b00001100);
|
||||||
|
stream.writeUint8(0b00001100);
|
||||||
|
stream.writeUint8(0b00001100);
|
||||||
|
stream.writeUint8(0b00001100);
|
||||||
|
stream.writeASCIIString('remaining');
|
||||||
|
stream.index = 0;
|
||||||
|
|
||||||
|
const expectedStream = new BitStream(new ArrayBuffer(256));
|
||||||
|
expectedStream.writeUint8(0b11111111);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.index = 2;
|
||||||
|
|
||||||
|
assertGeneratedParser('length{u2}foo{$length*8}', stream, {
|
||||||
|
length: 3,
|
||||||
|
foo: expectedStream.readBitStream(3 * 8)
|
||||||
|
}, 2 + 3 * 8);
|
||||||
|
});
|
||||||
|
|
||||||
test('Float32', () => {
|
test('Float32', () => {
|
||||||
const stream = new BitStream(new ArrayBuffer(64));
|
const stream = new BitStream(new ArrayBuffer(64));
|
||||||
stream.writeFloat32(12.234233856201172);
|
stream.writeFloat32(12.234233856201172);
|
||||||
|
|
@ -121,6 +147,21 @@ suite('Parser generator', () => {
|
||||||
bar: expectedStream.readBitStream(3)
|
bar: expectedStream.readBitStream(3)
|
||||||
}, 2 + 3);
|
}, 2 + 3);
|
||||||
});
|
});
|
||||||
|
test('Encode variable length*8', () => {
|
||||||
|
const expectedStream = new BitStream(new ArrayBuffer(256));
|
||||||
|
expectedStream.writeUint8(0b11111111);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.writeUint8(0b00001100);
|
||||||
|
expectedStream.index = 0;
|
||||||
|
|
||||||
|
assertGeneratedEncoder('foo{u2}bar{$foo*8}', {
|
||||||
|
foo: 3,
|
||||||
|
bar: expectedStream.readBitStream(3 * 8)
|
||||||
|
}, 2 + (3 * 8));
|
||||||
|
});
|
||||||
test('Encode float', () => {
|
test('Encode float', () => {
|
||||||
assertGeneratedEncoder('foo{f32}', {
|
assertGeneratedEncoder('foo{f32}', {
|
||||||
foo: 3.5
|
foo: 3.5
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue