1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-03 16:44:12 +02:00

use Map instead of Object for gameEventList

This commit is contained in:
Robin Appelman 2017-09-02 02:11:20 +02:00
commit 8f0d372b13
9 changed files with 50 additions and 49 deletions

View file

@ -13,7 +13,6 @@ watch: node_modules
.PHONY: build .PHONY: build
build: node_modules build: node_modules
node $(tsc) node $(tsc)
node $(tsc) -p tsconfig.es6.json
.PHONY: test .PHONY: test
test: node_modules test: node_modules

View file

@ -63,7 +63,3 @@ export type GameEventValues = GameEventValueMap |
RoundWinEventValues | RoundWinEventValues |
PlayerSpawnEventValues | PlayerSpawnEventValues |
ObjectDestroyedValues; ObjectDestroyedValues;
export interface GameEventDefinitionMap {
[id: number]: GameEventDefinition;
}

View file

@ -7,7 +7,7 @@ import {handleSayText2} from '../PacketHandler/SayText2';
import {handleStringTable, handleStringTables, handleStringTableUpdate} from '../PacketHandler/StringTable'; import {handleStringTable, handleStringTables, handleStringTableUpdate} from '../PacketHandler/StringTable';
import {Building} from './Building'; import {Building} from './Building';
import {Death} from './Death'; import {Death} from './Death';
import {GameEventDefinitionMap} from './GameEvent'; import {GameEventDefinition} from './GameEvent';
import {PacketEntity} from './PacketEntity'; import {PacketEntity} from './PacketEntity';
import {Player} from './Player'; import {Player} from './Player';
import {PlayerResource} from './PlayerResource'; import {PlayerResource} from './PlayerResource';
@ -28,7 +28,7 @@ export class Match {
public startTick: number; public startTick: number;
public intervalPerTick: number; public intervalPerTick: number;
public staticBaseLines: BitStream[]; public staticBaseLines: BitStream[];
public eventDefinitions: GameEventDefinitionMap; public eventDefinitions: Map<number, GameEventDefinition>;
public world: World; public world: World;
public players: Player[]; public players: Player[];
public playerMap: { [entityId: number]: Player }; public playerMap: { [entityId: number]: Player };
@ -58,7 +58,7 @@ export class Match {
this.sendTables = []; this.sendTables = [];
this.serverClasses = []; this.serverClasses = [];
this.staticBaseLines = []; this.staticBaseLines = [];
this.eventDefinitions = {}; this.eventDefinitions = new Map();
this.players = []; this.players = [];
this.playerMap = {}; this.playerMap = {};
this.world = { this.world = {

View file

@ -1,5 +1,5 @@
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
import {GameEvent, GameEventDefinitionMap} from './GameEvent'; import {GameEvent, GameEventDefinition} from './GameEvent';
import {PacketEntity} from './PacketEntity'; import {PacketEntity} from './PacketEntity';
import {SendTable} from './SendTable'; import {SendTable} from './SendTable';
import {ServerClass} from './ServerClass'; import {ServerClass} from './ServerClass';
@ -70,7 +70,7 @@ export interface GameEventPacket extends BasePacket {
export interface GameEventListPacket extends BasePacket { export interface GameEventListPacket extends BasePacket {
packetType: 'gameEventList'; packetType: 'gameEventList';
eventList: GameEventDefinitionMap; eventList: Map<number, GameEventDefinition>;
} }
export interface PacketEntitiesPacket extends BasePacket { export interface PacketEntitiesPacket extends BasePacket {

View file

@ -1,16 +1,16 @@
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
import { import {
GameEvent as IGameEvent, GameEventDefinition, GameEventDefinitionMap, GameEventEntry, GameEventType, GameEvent as IGameEvent, GameEventDefinition, GameEventEntry, GameEventType,
GameEventValue, GameEventValueMap, GameEventValue, GameEventValueMap,
} from '../../Data/GameEvent'; } from '../../Data/GameEvent';
import {Match} from '../../Data/Match'; import {Match} from '../../Data/Match';
import {GameEventPacket} from '../../Data/Packet'; import {GameEventPacket} from '../../Data/Packet';
function parseGameEvent(eventId: number, stream: BitStream, events: GameEventDefinitionMap): IGameEvent { function parseGameEvent(eventId: number, stream: BitStream, events: Map<number, GameEventDefinition>): IGameEvent {
if (!events[eventId]) { const eventDescription = events.get(eventId);
if (!eventDescription) {
throw new Error('unknown event type'); throw new Error('unknown event type');
} }
const eventDescription: GameEventDefinition = events[eventId];
const values: GameEventValueMap = {}; const values: GameEventValueMap = {};
for (const entry of eventDescription.entries) { for (const entry of eventDescription.entries) {
const value = getGameEventValue(stream, entry); const value = getGameEventValue(stream, entry);

View file

@ -1,5 +1,5 @@
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
import {GameEventDefinition, GameEventDefinitionMap, GameEventEntry} from '../../Data/GameEvent'; import {GameEventDefinition, GameEventEntry} from '../../Data/GameEvent';
import {GameEventListPacket} from '../../Data/Packet'; import {GameEventListPacket} from '../../Data/Packet';
export function ParseGameEventList(stream: BitStream): GameEventListPacket { // 30: gameEventList export function ParseGameEventList(stream: BitStream): GameEventListPacket { // 30: gameEventList
@ -8,7 +8,7 @@ export function ParseGameEventList(stream: BitStream): GameEventListPacket { //
// list of game events and parameters // list of game events and parameters
const numEvents = stream.readBits(9); const numEvents = stream.readBits(9);
const length = stream.readBits(20); const length = stream.readBits(20);
const eventList: GameEventDefinitionMap = {}; const eventList: Map<number, GameEventDefinition> = new Map();
for (let i = 0; i < numEvents; i++) { for (let i = 0; i < numEvents; i++) {
const id = stream.readBits(9); const id = stream.readBits(9);
const name = stream.readASCIIString(); const name = stream.readASCIIString();
@ -21,11 +21,11 @@ export function ParseGameEventList(stream: BitStream): GameEventListPacket { //
}); });
type = stream.readBits(3); type = stream.readBits(3);
} }
eventList[id] = { eventList.set(id, {
id, id,
name, name,
entries, entries,
}; });
} }
return { return {
packetType: 'gameEventList', packetType: 'gameEventList',
@ -34,13 +34,13 @@ export function ParseGameEventList(stream: BitStream): GameEventListPacket { //
} }
export function EncodeGameEventList(packet: GameEventListPacket, stream: BitStream) { export function EncodeGameEventList(packet: GameEventListPacket, stream: BitStream) {
stream.writeBits(Object.keys(packet.eventList).length, 9); const definitions = Array.from(packet.eventList.values());
stream.writeBits(definitions.length, 9);
const eventListBitLength = getEventListLength(Object.values(packet.eventList)); const eventListBitLength = getEventListLength(definitions);
const eventListStream = new BitStream(new ArrayBuffer(Math.ceil(eventListBitLength / 8))); const eventListStream = new BitStream(new ArrayBuffer(Math.ceil(eventListBitLength / 8)));
for (const id in packet.eventList) { for (const definition of definitions) {
const definition = packet.eventList[id] as GameEventDefinition;
eventListStream.writeBits(definition.id, 9); eventListStream.writeBits(definition.id, 9);
eventListStream.writeASCIIString(definition.name); eventListStream.writeASCIIString(definition.name);
for (const entry of definition.entries) { for (const entry of definition.entries) {

View file

@ -2,14 +2,20 @@ import {BitStream} from 'bit-buffer';
import {assertEncoder, assertParser, getStream} from './PacketTest'; import {assertEncoder, assertParser, getStream} from './PacketTest';
import {readFileSync} from 'fs'; import {readFileSync} from 'fs';
import {EncodeGameEventList, ParseGameEventList} from '../../../../Parser/Packet/GameEventList'; import {EncodeGameEventList, ParseGameEventList} from '../../../../Parser/Packet/GameEventList';
import {GameEventListPacket} from '../../../../Data/Packet';
const data = JSON.parse(readFileSync(__dirname + '/../../../data/gameEventListData.json', 'utf8')); const data = JSON.parse(readFileSync(__dirname + '/../../../data/gameEventListData.json', 'utf8'));
const expected = JSON.parse(readFileSync(__dirname + '/../../../data/gameEventList.json', 'utf8')); const expectedSource = JSON.parse(readFileSync(__dirname + '/../../../data/gameEventList.json', 'utf8'));
const eventList = { const expected = {
packetType: 'gameEventList',
eventList: new Map(Object.entries(expectedSource.eventList))
};
const eventList: GameEventListPacket = {
'packetType': 'gameEventList', 'packetType': 'gameEventList',
'eventList': { 'eventList': new Map([
'0': { [0, {
'id': 0, 'id': 0,
'name': 'server_spawn', 'name': 'server_spawn',
'entries': [ 'entries': [
@ -54,8 +60,8 @@ const eventList = {
'name': 'password' 'name': 'password'
} }
] ]
}, }],
'1': { [1, {
'id': 1, 'id': 1,
'name': 'server_changelevel_failed', 'name': 'server_changelevel_failed',
'entries': [ 'entries': [
@ -64,8 +70,8 @@ const eventList = {
'name': 'levelname' 'name': 'levelname'
} }
] ]
}, }],
'2': { [2, {
'id': 2, 'id': 2,
'name': 'server_shutdown', 'name': 'server_shutdown',
'entries': [ 'entries': [
@ -74,8 +80,8 @@ const eventList = {
'name': 'reason' 'name': 'reason'
} }
] ]
} }]
} ])
}; };
suite('GameEventList', () => { suite('GameEventList', () => {

View file

@ -7,8 +7,8 @@
"ES2017" "ES2017"
], ],
"module": "ES6", "module": "ES6",
"target": "ES5", "target": "ES6",
"outDir": "build/es6", "outDir": "build",
"rootDir": "src", "rootDir": "src",
"declaration": true, "declaration": true,
"strictNullChecks": true, "strictNullChecks": true,

View file

@ -7,7 +7,7 @@
"ES2017" "ES2017"
], ],
"module": "commonjs", "module": "commonjs",
"target": "ES5", "target": "ES6",
"outDir": "build", "outDir": "build",
"rootDir": "src", "rootDir": "src",
"declaration": true, "declaration": true,