mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +02:00
updatestring tables wip
This commit is contained in:
parent
2ea7be17a7
commit
4736b8a79f
4 changed files with 222 additions and 146 deletions
116
packet.js
116
packet.js
|
|
@ -1,4 +1,5 @@
|
|||
var ParserGenerator = require('./parsergenerator');
|
||||
var StringTable = require('./stringtable');
|
||||
|
||||
function logBase2 (num) {
|
||||
var result = 0;
|
||||
|
|
@ -129,31 +130,27 @@ Packet.parsers = {
|
|||
var bits = Math.log(maxEntries) / Math.LN2;
|
||||
var numEntries = stream.readBits(bits + 1);
|
||||
var length = stream.readBits(20);
|
||||
var userDataFixedSize = stream.readBits(1);
|
||||
var userDataFixedSize = !!stream.readBits(1);
|
||||
if (userDataFixedSize) {
|
||||
var userSize = stream.readBits(12);
|
||||
var userDataBits = stream.readBits(4);
|
||||
}
|
||||
var data = [];
|
||||
var end = stream._index + length;
|
||||
|
||||
var stringTable = new PacketStringTable(name, maxEntries, bits, userDataFixedSize, userSize || -1, userDataBits || -1, numEntries);
|
||||
stringTable.parse(stream);
|
||||
//console.log(stringTable);
|
||||
//console.log();
|
||||
//console.log(length);
|
||||
//console.log(end - stream._index);
|
||||
//console.log();
|
||||
//throw false;
|
||||
|
||||
for (var i = 0; i < numEntries; i++) {
|
||||
data.push(stream.readASCIIString());
|
||||
stream.readBits(7);
|
||||
data.push(stream.readASCIIString());
|
||||
//console.log(stream.readBits(bits + 1));
|
||||
//stream.readBits(1);
|
||||
//data.push(stream.readASCIIString());
|
||||
}
|
||||
stream._index = end;
|
||||
return {packetType: 'createStringTable'};
|
||||
//return {
|
||||
// packetType: 'createStringTable',
|
||||
// name : name,
|
||||
// entries : numEntries,
|
||||
// data : data
|
||||
//}
|
||||
return {
|
||||
packetType: 'createStringTable',
|
||||
table: stringTable
|
||||
};
|
||||
},
|
||||
13: function (stream) {
|
||||
var tableId = stream.readBits(5);
|
||||
|
|
@ -161,12 +158,33 @@ Packet.parsers = {
|
|||
var length = stream.readBits(20);
|
||||
var end = stream._index + length;
|
||||
stream.readBits(7);
|
||||
var strings = [];
|
||||
for (var i = 0; i < changeEntries; i++) {
|
||||
// // todo cleanup the 8/16 bits that get read in the string here
|
||||
strings.push(stream.readASCIIString());
|
||||
var strings = {};
|
||||
//var table = StringTable.tables[tableId];
|
||||
|
||||
// no idea why but it mostly works
|
||||
var a = stream.readBits(1);
|
||||
var b = stream.readBits(1);
|
||||
if (a && !b) {
|
||||
stream.readBits(12);
|
||||
} else if (!b) {
|
||||
stream.readBits(16);
|
||||
} else {
|
||||
stream.readBits(6);
|
||||
}
|
||||
//console.log(a ? 'a' : '!a')
|
||||
//console.log('table: ' + table.name);
|
||||
//console.log(' ' + table.entries.length + ' entries');
|
||||
for (var i = 0; i < changeEntries; i++) {
|
||||
//console.log(stream.readBits(2));
|
||||
var string = stream.readASCIIString();
|
||||
stream.readBits(16);
|
||||
//todo last entry overflows by 13 (3 bits at the end 13 before next entry?)
|
||||
strings[i] = string;
|
||||
}
|
||||
//throw false;
|
||||
//console.log(changeEntries);
|
||||
//console.log(strings);
|
||||
//console.log(end - stream._index);
|
||||
stream._index = end;
|
||||
//throw false;
|
||||
return {
|
||||
|
|
@ -231,7 +249,7 @@ Packet.parsers = {
|
|||
var lowPriority = !!stream.readBits(1);
|
||||
return {
|
||||
packetType: 'BSPDecal',
|
||||
postition : position,
|
||||
position: position,
|
||||
textureIndex: textureIndex,
|
||||
entIndex: entIndex,
|
||||
modelIndex: modelIndex,
|
||||
|
|
@ -290,9 +308,9 @@ Packet.parsers = {
|
|||
updatedBaseLink: updatedBaseLink
|
||||
}
|
||||
},
|
||||
27: ParserGenerator.make('tempEntities', 'count{8}length{17}data{$length}'),
|
||||
27: ParserGenerator.make('tempEntities', 'count{8}length{17}_{$length}'),
|
||||
28: ParserGenerator.make('preFetch', 'index{14}'),
|
||||
29: ParserGenerator.make('menu', 'type{16}length{16}data{$length}data{$length}data{$length}data{$length}data{$length}data{$length}data{$length}'),//length*8
|
||||
29: ParserGenerator.make('menu', 'type{16}length{16}_{$length}_{$length}_{$length}_{$length}_{$length}_{$length}_{$length}'),//length*8
|
||||
30: function (stream) {
|
||||
// list of game events and parameters
|
||||
var numEvents = stream.readBits(9);
|
||||
|
|
@ -394,4 +412,54 @@ var UserMessageType = {
|
|||
HapMeleeContact: 57
|
||||
};
|
||||
|
||||
var PacketStringTable = function (name, maxEntries, entryBits, userDataFixedSize, userDataSize, userDataSizeBits, numEntries) {
|
||||
this.name = name;
|
||||
this.maxEntries = maxEntries;
|
||||
this.entryBits = entryBits;
|
||||
this.userDataFixedSize = userDataFixedSize;
|
||||
this.userDataSize = userDataSize;
|
||||
this.userDataSizeBits = userDataSizeBits;
|
||||
this.numEntries = numEntries;
|
||||
this.id = PacketStringTable.tables.length;
|
||||
this.strings = [];
|
||||
PacketStringTable.tables.push(this);
|
||||
};
|
||||
|
||||
PacketStringTable.prototype.parse = function (stream) {
|
||||
var entryIndex, lastEntry = -1;
|
||||
for (var i = 0; i < this.numEntries; i++) {
|
||||
entryIndex = lastEntry + 1;
|
||||
this.strings.push(stream.readASCIIString());
|
||||
//if (!stream.readBits(1)) {
|
||||
// entryIndex = stream.readBits(this.entryBits);
|
||||
//}
|
||||
//lastEntry = entryIndex;
|
||||
//if (entryIndex < 0 || entryIndex >= this.maxEntries) {
|
||||
// throw 'invalid index';
|
||||
//}
|
||||
//var string = '';
|
||||
//if (stream.readBits(1)) {
|
||||
// if (stream.readBits(1)) {
|
||||
// throw 'substr not implented';
|
||||
// } else {
|
||||
// string = stream.readASCIIString();
|
||||
// }
|
||||
//}
|
||||
|
||||
if (stream.readBits(1)) { //user data
|
||||
if (this.userDataFixedSize) {
|
||||
var userData = stream.readBits(this.userDataSizeBits)
|
||||
} else {
|
||||
var bits = stream.readBits(14);
|
||||
userData = stream.readBits(bits);
|
||||
}
|
||||
console.log('userdata: ' + userData);
|
||||
}
|
||||
|
||||
//this.strings.push(string);
|
||||
}
|
||||
};
|
||||
|
||||
PacketStringTable.tables = [];
|
||||
|
||||
module.exports = Packet;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ Generator.make = function (name, string) {
|
|||
};
|
||||
try {
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
result[items[i][0]] = Generator.readItem(stream, items[i][1], result);
|
||||
var value = Generator.readItem(stream, items[i][1], result);
|
||||
if(items[i][0] !== '_'){
|
||||
result[items[i][0]] = value;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
throw 'Failed reading pattern ' + string;
|
||||
|
|
|
|||
|
|
@ -5,10 +5,11 @@ var StringTable = function (type, tick, stream, length) {
|
|||
this.length = length;//length in bytes
|
||||
};
|
||||
|
||||
StringTable.tables = [];
|
||||
|
||||
StringTable.prototype.parse = function () {
|
||||
var tableCount = this.stream.readBits(8);
|
||||
var tables = {};
|
||||
try {
|
||||
for (var i = 0; i < tableCount; i++) {
|
||||
var entries = [];
|
||||
var tableName = this.stream.readASCIIString();
|
||||
|
|
@ -20,10 +21,16 @@ StringTable.prototype.parse = function () {
|
|||
if (this.stream.readBits(1)) {
|
||||
var extraDataLength = this.stream.readBits(16);
|
||||
entry.extraData = this.stream.readASCIIString(extraDataLength);
|
||||
//console.log(entry.extraData.length-extraDataLength);
|
||||
}
|
||||
entries.push(entry);
|
||||
}
|
||||
tables[tableName] = entries;
|
||||
//console.log(tables);
|
||||
StringTable.tables.push({
|
||||
name: tableName,
|
||||
entries: entries
|
||||
});
|
||||
if (this.stream.readBits(1)) {
|
||||
this.stream.readASCIIString();
|
||||
if (this.stream.readBits(1)) {
|
||||
|
|
@ -33,8 +40,6 @@ StringTable.prototype.parse = function () {
|
|||
}
|
||||
}
|
||||
}
|
||||
}catch(e){}
|
||||
//console.log(tables);
|
||||
return [{
|
||||
packetType: 'stringTable',
|
||||
tables: tables
|
||||
|
|
|
|||
2
test.js
2
test.js
|
|
@ -1,7 +1,7 @@
|
|||
var Demo = require('./demo');
|
||||
var fs = require('fs');
|
||||
|
||||
fs.readFile("upward.dem", function (err, data) {
|
||||
fs.readFile("gully.dem", function (err, data) {
|
||||
if (err) throw err;
|
||||
var demo = Demo.fromNodeBuffer(data);
|
||||
var parser = demo.getParser();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue