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:
parent
df1aac6575
commit
8f0d372b13
9 changed files with 50 additions and 49 deletions
1
Makefile
1
Makefile
|
|
@ -13,7 +13,6 @@ watch: node_modules
|
|||
.PHONY: build
|
||||
build: node_modules
|
||||
node $(tsc)
|
||||
node $(tsc) -p tsconfig.es6.json
|
||||
|
||||
.PHONY: test
|
||||
test: node_modules
|
||||
|
|
|
|||
|
|
@ -63,7 +63,3 @@ export type GameEventValues = GameEventValueMap |
|
|||
RoundWinEventValues |
|
||||
PlayerSpawnEventValues |
|
||||
ObjectDestroyedValues;
|
||||
|
||||
export interface GameEventDefinitionMap {
|
||||
[id: number]: GameEventDefinition;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import {handleSayText2} from '../PacketHandler/SayText2';
|
|||
import {handleStringTable, handleStringTables, handleStringTableUpdate} from '../PacketHandler/StringTable';
|
||||
import {Building} from './Building';
|
||||
import {Death} from './Death';
|
||||
import {GameEventDefinitionMap} from './GameEvent';
|
||||
import {GameEventDefinition} from './GameEvent';
|
||||
import {PacketEntity} from './PacketEntity';
|
||||
import {Player} from './Player';
|
||||
import {PlayerResource} from './PlayerResource';
|
||||
|
|
@ -28,7 +28,7 @@ export class Match {
|
|||
public startTick: number;
|
||||
public intervalPerTick: number;
|
||||
public staticBaseLines: BitStream[];
|
||||
public eventDefinitions: GameEventDefinitionMap;
|
||||
public eventDefinitions: Map<number, GameEventDefinition>;
|
||||
public world: World;
|
||||
public players: Player[];
|
||||
public playerMap: { [entityId: number]: Player };
|
||||
|
|
@ -58,7 +58,7 @@ export class Match {
|
|||
this.sendTables = [];
|
||||
this.serverClasses = [];
|
||||
this.staticBaseLines = [];
|
||||
this.eventDefinitions = {};
|
||||
this.eventDefinitions = new Map();
|
||||
this.players = [];
|
||||
this.playerMap = {};
|
||||
this.world = {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import {BitStream} from 'bit-buffer';
|
||||
import {GameEvent, GameEventDefinitionMap} from './GameEvent';
|
||||
import {GameEvent, GameEventDefinition} from './GameEvent';
|
||||
import {PacketEntity} from './PacketEntity';
|
||||
import {SendTable} from './SendTable';
|
||||
import {ServerClass} from './ServerClass';
|
||||
|
|
@ -70,7 +70,7 @@ export interface GameEventPacket extends BasePacket {
|
|||
|
||||
export interface GameEventListPacket extends BasePacket {
|
||||
packetType: 'gameEventList';
|
||||
eventList: GameEventDefinitionMap;
|
||||
eventList: Map<number, GameEventDefinition>;
|
||||
}
|
||||
|
||||
export interface PacketEntitiesPacket extends BasePacket {
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
import {BitStream} from 'bit-buffer';
|
||||
import {
|
||||
GameEvent as IGameEvent, GameEventDefinition, GameEventDefinitionMap, GameEventEntry, GameEventType,
|
||||
GameEvent as IGameEvent, GameEventDefinition, GameEventEntry, GameEventType,
|
||||
GameEventValue, GameEventValueMap,
|
||||
} from '../../Data/GameEvent';
|
||||
import {Match} from '../../Data/Match';
|
||||
import {GameEventPacket} from '../../Data/Packet';
|
||||
|
||||
function parseGameEvent(eventId: number, stream: BitStream, events: GameEventDefinitionMap): IGameEvent {
|
||||
if (!events[eventId]) {
|
||||
function parseGameEvent(eventId: number, stream: BitStream, events: Map<number, GameEventDefinition>): IGameEvent {
|
||||
const eventDescription = events.get(eventId);
|
||||
if (!eventDescription) {
|
||||
throw new Error('unknown event type');
|
||||
}
|
||||
const eventDescription: GameEventDefinition = events[eventId];
|
||||
const values: GameEventValueMap = {};
|
||||
for (const entry of eventDescription.entries) {
|
||||
const value = getGameEventValue(stream, entry);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import {BitStream} from 'bit-buffer';
|
||||
import {GameEventDefinition, GameEventDefinitionMap, GameEventEntry} from '../../Data/GameEvent';
|
||||
import {GameEventDefinition, GameEventEntry} from '../../Data/GameEvent';
|
||||
import {GameEventListPacket} from '../../Data/Packet';
|
||||
|
||||
export function ParseGameEventList(stream: BitStream): GameEventListPacket { // 30: gameEventList
|
||||
|
|
@ -8,7 +8,7 @@ export function ParseGameEventList(stream: BitStream): GameEventListPacket { //
|
|||
// list of game events and parameters
|
||||
const numEvents = stream.readBits(9);
|
||||
const length = stream.readBits(20);
|
||||
const eventList: GameEventDefinitionMap = {};
|
||||
const eventList: Map<number, GameEventDefinition> = new Map();
|
||||
for (let i = 0; i < numEvents; i++) {
|
||||
const id = stream.readBits(9);
|
||||
const name = stream.readASCIIString();
|
||||
|
|
@ -21,11 +21,11 @@ export function ParseGameEventList(stream: BitStream): GameEventListPacket { //
|
|||
});
|
||||
type = stream.readBits(3);
|
||||
}
|
||||
eventList[id] = {
|
||||
eventList.set(id, {
|
||||
id,
|
||||
name,
|
||||
entries,
|
||||
};
|
||||
});
|
||||
}
|
||||
return {
|
||||
packetType: 'gameEventList',
|
||||
|
|
@ -34,13 +34,13 @@ export function ParseGameEventList(stream: BitStream): GameEventListPacket { //
|
|||
}
|
||||
|
||||
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)));
|
||||
|
||||
for (const id in packet.eventList) {
|
||||
const definition = packet.eventList[id] as GameEventDefinition;
|
||||
for (const definition of definitions) {
|
||||
eventListStream.writeBits(definition.id, 9);
|
||||
eventListStream.writeASCIIString(definition.name);
|
||||
for (const entry of definition.entries) {
|
||||
|
|
|
|||
|
|
@ -2,14 +2,20 @@ import {BitStream} from 'bit-buffer';
|
|||
import {assertEncoder, assertParser, getStream} from './PacketTest';
|
||||
import {readFileSync} from 'fs';
|
||||
import {EncodeGameEventList, ParseGameEventList} from '../../../../Parser/Packet/GameEventList';
|
||||
import {GameEventListPacket} from '../../../../Data/Packet';
|
||||
|
||||
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',
|
||||
'eventList': {
|
||||
'0': {
|
||||
'eventList': new Map([
|
||||
[0, {
|
||||
'id': 0,
|
||||
'name': 'server_spawn',
|
||||
'entries': [
|
||||
|
|
@ -54,8 +60,8 @@ const eventList = {
|
|||
'name': 'password'
|
||||
}
|
||||
]
|
||||
},
|
||||
'1': {
|
||||
}],
|
||||
[1, {
|
||||
'id': 1,
|
||||
'name': 'server_changelevel_failed',
|
||||
'entries': [
|
||||
|
|
@ -64,8 +70,8 @@ const eventList = {
|
|||
'name': 'levelname'
|
||||
}
|
||||
]
|
||||
},
|
||||
'2': {
|
||||
}],
|
||||
[2, {
|
||||
'id': 2,
|
||||
'name': 'server_shutdown',
|
||||
'entries': [
|
||||
|
|
@ -74,8 +80,8 @@ const eventList = {
|
|||
'name': 'reason'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}]
|
||||
])
|
||||
};
|
||||
|
||||
suite('GameEventList', () => {
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015.promise",
|
||||
"es5",
|
||||
"ES2017"
|
||||
],
|
||||
"module": "ES6",
|
||||
"target": "ES5",
|
||||
"outDir": "build/es6",
|
||||
"rootDir": "src",
|
||||
"declaration": true,
|
||||
"strictNullChecks": true,
|
||||
"sourceMap": true,
|
||||
"moduleResolution": "node"
|
||||
}
|
||||
"compilerOptions": {
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015.promise",
|
||||
"es5",
|
||||
"ES2017"
|
||||
],
|
||||
"module": "ES6",
|
||||
"target": "ES6",
|
||||
"outDir": "build",
|
||||
"rootDir": "src",
|
||||
"declaration": true,
|
||||
"strictNullChecks": true,
|
||||
"sourceMap": true,
|
||||
"moduleResolution": "node"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
"ES2017"
|
||||
],
|
||||
"module": "commonjs",
|
||||
"target": "ES5",
|
||||
"target": "ES6",
|
||||
"outDir": "build",
|
||||
"rootDir": "src",
|
||||
"declaration": true,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue