1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-04 00:54:14 +02:00

strict game event types

This commit is contained in:
Robin Appelman 2017-09-02 22:44:10 +02:00
commit a7911f2d3d
11 changed files with 3925 additions and 96 deletions

View file

@ -1,47 +1,48 @@
import {BitStream} from 'bit-buffer';
import {
GameEvent as IGameEvent, GameEventDefinition, GameEventEntry, GameEventType,
GameEventValue, GameEventValueMap,
GameEventDefinition, GameEventEntry,
GameEventValue, GameEventValueType,
} from '../../Data/GameEvent';
import {GameEvent, GameEventType} from '../../Data/GameEventTypes';
import {Match} from '../../Data/Match';
import {GameEventPacket} from '../../Data/Packet';
function parseGameEvent(eventId: number, stream: BitStream, events: Map<number, GameEventDefinition>): IGameEvent {
function parseGameEvent(eventId: number, stream: BitStream, events: Map<number, GameEventDefinition<GameEventType>>) {
const eventDescription = events.get(eventId);
if (!eventDescription) {
throw new Error('unknown event type');
}
const values: GameEventValueMap = {};
const values: GameEvent['values'] = {};
for (const entry of eventDescription.entries) {
const value = getGameEventValue(stream, entry);
if (value) {
values[entry.name] = value;
}
}
const name = eventDescription.name;
return {
name: eventDescription.name,
name,
values,
};
}
function getGameEventValue(stream: BitStream, entry: GameEventEntry): GameEventValue | null {
switch (entry.type) {
case GameEventType.STRING:
case GameEventValueType.STRING:
return stream.readUTF8String();
case GameEventType.FLOAT:
case GameEventValueType.FLOAT:
return stream.readFloat32();
case GameEventType.LONG:
case GameEventValueType.LONG:
return stream.readUint32();
case GameEventType.SHORT:
case GameEventValueType.SHORT:
return stream.readUint16();
case GameEventType.BYTE:
case GameEventValueType.BYTE:
return stream.readUint8();
case GameEventType.BOOLEAN:
case GameEventValueType.BOOLEAN:
return stream.readBoolean();
case GameEventType.LOCAL:
case GameEventValueType.LOCAL:
return null;
default:
throw new Error('invalid game event type');
}
}
@ -53,6 +54,6 @@ export function ParseGameEvent(stream: BitStream, match: Match): GameEventPacket
stream.index = end;
return {
packetType: 'gameEvent',
event,
event: event as GameEvent,
};
}

View file

@ -1,6 +1,7 @@
import {BitStream} from 'bit-buffer';
import {GameEventDefinition, GameEventEntry} from '../../Data/GameEvent';
import {GameEventListPacket} from '../../Data/Packet';
import {GameEvent} from '../../Data/GameEventTypes';
export function ParseGameEventList(stream: BitStream): GameEventListPacket { // 30: gameEventList
const s = stream.index;
@ -8,10 +9,10 @@ export function ParseGameEventList(stream: BitStream): GameEventListPacket { //
// list of game events and parameters
const numEvents = stream.readBits(9);
const length = stream.readBits(20);
const eventList: Map<number, GameEventDefinition> = new Map();
const eventList: Map<number, GameEventDefinition<GameEvent['name']>> = new Map();
for (let i = 0; i < numEvents; i++) {
const id = stream.readBits(9);
const name = stream.readASCIIString();
const name = stream.readASCIIString() as GameEvent['name'];
let type = stream.readBits(3);
const entries: GameEventEntry[] = [];
while (type !== 0) {
@ -57,8 +58,8 @@ export function EncodeGameEventList(packet: GameEventListPacket, stream: BitStre
stream.writeBitStream(eventListStream);
}
function getEventListLength(eventList: GameEventDefinition[]) {
return eventList.reduce((length: number, entry: GameEventDefinition) => {
function getEventListLength(eventList: GameEventDefinition<GameEvent['name']>[]) {
return eventList.reduce((length: number, entry: GameEventDefinition<GameEvent['name']>) => {
return length +
9 +
(entry.name.length + 1) * 8 +