mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +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
|
.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
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,3 @@ export type GameEventValues = GameEventValueMap |
|
||||||
RoundWinEventValues |
|
RoundWinEventValues |
|
||||||
PlayerSpawnEventValues |
|
PlayerSpawnEventValues |
|
||||||
ObjectDestroyedValues;
|
ObjectDestroyedValues;
|
||||||
|
|
||||||
export interface GameEventDefinitionMap {
|
|
||||||
[id: number]: GameEventDefinition;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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 = {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"lib": [
|
"lib": [
|
||||||
"dom",
|
"dom",
|
||||||
"es2015.promise",
|
"es2015.promise",
|
||||||
"es5",
|
"es5",
|
||||||
"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,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"moduleResolution": "node"
|
"moduleResolution": "node"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue