mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 09:04:13 +02:00
strict game event types
This commit is contained in:
parent
b3e69f1af4
commit
a7911f2d3d
11 changed files with 3925 additions and 96 deletions
|
|
@ -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,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 +
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue