mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +02:00
no need for a temp stream to encode the gameevent list
This commit is contained in:
parent
f88c919a8e
commit
7b9131b7fe
1 changed files with 13 additions and 24 deletions
|
|
@ -38,36 +38,25 @@ export function EncodeGameEventList(packet: GameEventListPacket, stream: BitStre
|
||||||
const definitions = Array.from(packet.eventList.values());
|
const definitions = Array.from(packet.eventList.values());
|
||||||
stream.writeBits(definitions.length, 9);
|
stream.writeBits(definitions.length, 9);
|
||||||
|
|
||||||
const eventListBitLength = getEventListLength(definitions);
|
const lengthStart = stream.index;
|
||||||
const eventListStream = new BitStream(new ArrayBuffer(Math.ceil(eventListBitLength / 8)));
|
stream.index += 20;
|
||||||
|
|
||||||
|
const eventListStart = stream.index;
|
||||||
|
|
||||||
for (const definition of definitions) {
|
for (const definition of definitions) {
|
||||||
eventListStream.writeBits(definition.id, 9);
|
stream.writeBits(definition.id, 9);
|
||||||
eventListStream.writeASCIIString(definition.name);
|
stream.writeASCIIString(definition.name);
|
||||||
for (const entry of definition.entries) {
|
for (const entry of definition.entries) {
|
||||||
eventListStream.writeBits(entry.type, 3);
|
stream.writeBits(entry.type, 3);
|
||||||
eventListStream.writeASCIIString(entry.name);
|
stream.writeASCIIString(entry.name);
|
||||||
}
|
}
|
||||||
eventListStream.writeBits(0, 3);
|
stream.writeBits(0, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
const finalLength = eventListStream.index;
|
const eventListEnd = stream.index;
|
||||||
stream.writeBits(finalLength, 20);
|
|
||||||
|
|
||||||
eventListStream.index = 0;
|
stream.index = lengthStart;
|
||||||
stream.writeBitStream(eventListStream);
|
stream.writeBits(eventListEnd - eventListStart, 20);
|
||||||
}
|
|
||||||
|
|
||||||
function getEventListLength(eventList: GameEventDefinition<GameEventType>[]) {
|
stream.index = eventListEnd;
|
||||||
return eventList.reduce((length: number, entry: GameEventDefinition<GameEventType>) => {
|
|
||||||
return length +
|
|
||||||
9 +
|
|
||||||
(entry.name.length + 1) * 8 +
|
|
||||||
3 +
|
|
||||||
entry.entries.reduce((length: number, event: GameEventEntry) => {
|
|
||||||
return length +
|
|
||||||
3
|
|
||||||
+ (event.name.length + 1) * 8;
|
|
||||||
}, 0);
|
|
||||||
}, 0);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue