@etothepii/satisfactory-file-parser 0.0.7 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/build/index.d.ts +0 -4
- package/build/index.js +0 -7
- package/build/parser/blueprint-reader.d.ts +0 -18
- package/build/parser/blueprint-reader.js +0 -128
- package/build/parser/blueprint-writer.d.ts +0 -21
- package/build/parser/blueprint-writer.js +0 -64
- package/build/parser/byte/alignment.enum.d.ts +0 -4
- package/build/parser/byte/alignment.enum.js +0 -5
- package/build/parser/byte/byte-reader.class.d.ts +0 -38
- package/build/parser/byte/byte-reader.class.js +0 -128
- package/build/parser/byte/byte-writer.class.d.ts +0 -38
- package/build/parser/byte/byte-writer.class.js +0 -146
- package/build/parser/error/parser.error.d.ts +0 -12
- package/build/parser/error/parser.error.js +0 -21
- package/build/parser/parser.d.ts +0 -44
- package/build/parser/parser.js +0 -81
- package/build/parser/satisfactory/blueprint/blueprint.d.ts +0 -20
- package/build/parser/satisfactory/blueprint/blueprint.js +0 -1
- package/build/parser/satisfactory/level.class.d.ts +0 -21
- package/build/parser/satisfactory/level.class.js +0 -144
- package/build/parser/satisfactory/objects/DataFields.d.ts +0 -13
- package/build/parser/satisfactory/objects/DataFields.js +0 -245
- package/build/parser/satisfactory/objects/ObjectReference.d.ts +0 -9
- package/build/parser/satisfactory/objects/ObjectReference.js +0 -13
- package/build/parser/satisfactory/objects/Property.d.ts +0 -270
- package/build/parser/satisfactory/objects/Property.js +0 -1119
- package/build/parser/satisfactory/objects/SaveComponent.d.ts +0 -16
- package/build/parser/satisfactory/objects/SaveComponent.js +0 -27
- package/build/parser/satisfactory/objects/SaveEntity.d.ts +0 -25
- package/build/parser/satisfactory/objects/SaveEntity.js +0 -66
- package/build/parser/satisfactory/objects/SaveObject.d.ts +0 -14
- package/build/parser/satisfactory/objects/SaveObject.js +0 -25
- package/build/parser/satisfactory/satisfactory-save.class.d.ts +0 -57
- package/build/parser/satisfactory/satisfactory-save.class.js +0 -7
- package/build/parser/satisfactory/static-data.d.ts +0 -7
- package/build/parser/satisfactory/static-data.js +0 -1
- package/build/parser/satisfactory/structs/util.types.d.ts +0 -40
- package/build/parser/satisfactory/structs/util.types.js +0 -75
- package/build/parser/save-reader.d.ts +0 -43
- package/build/parser/save-reader.js +0 -243
- package/build/parser/save-writer.d.ts +0 -22
- package/build/parser/save-writer.js +0 -114
package/build/parser/parser.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { SatisfactorySave } from "./satisfactory/satisfactory-save.class";
|
|
3
|
-
import { SaveProjectionConfig } from "./save-reader";
|
|
4
|
-
export declare class SaveParser {
|
|
5
|
-
/**
|
|
6
|
-
* serializes a save file into binary and reports back on individual callbacks.
|
|
7
|
-
* @param save the save file to serialize into binary.
|
|
8
|
-
* @param onBinaryBeforeCompressing gets called on the binary save body before it is compressed.
|
|
9
|
-
* @param onHeader gets called on the binary save header, which is always uncompressed.
|
|
10
|
-
* @param onChunk gets called when a chunk of the compressed save body was generated. Often, files' save bodies consist of multiple chunks.
|
|
11
|
-
* @param onFinish gets called when all chunks have been generated. A summary of the chunk sizes and count is reported.
|
|
12
|
-
*/
|
|
13
|
-
static WriteSave(save: SatisfactorySave, onBinaryBeforeCompressing: (buffer: ArrayBuffer) => void, onHeader: (header: Uint8Array) => void, onChunk: (chunk: Uint8Array) => void, onFinish: (summary: {
|
|
14
|
-
errors: string[];
|
|
15
|
-
chunkSummary: {
|
|
16
|
-
uncompressedSize: number;
|
|
17
|
-
compressedSize: number;
|
|
18
|
-
}[];
|
|
19
|
-
}) => void): void;
|
|
20
|
-
/**
|
|
21
|
-
* parses a save object from a binary buffer and reports back on decompressing the save body in a callback.
|
|
22
|
-
* @param file the binary content to be parsed.
|
|
23
|
-
* @param additionalData additional static data that is not contained in save files. For example, power slugs and resource nodes.
|
|
24
|
-
* @param onSaveDecompressed gets called when the entire binary save body has been decompressed.
|
|
25
|
-
* @returns a brief summary
|
|
26
|
-
*/
|
|
27
|
-
static ParseSaveFile(file: Buffer, onSaveDecompressed?: (buffer: ArrayBuffer) => void, onProgress?: (progress: number, message?: string) => void): SatisfactorySave;
|
|
28
|
-
/**
|
|
29
|
-
* Does Projection on a Save Object in order to reduce it's complexity.
|
|
30
|
-
* @param save the save object in question.
|
|
31
|
-
* @param config the projection config to apply.
|
|
32
|
-
* @returns a save object that has been projected / modified. Do not try to serialize it into an actual save tho! Since information has been transformed.
|
|
33
|
-
*/
|
|
34
|
-
static ProjectSave(save: SatisfactorySave, config: SaveProjectionConfig): SatisfactorySave;
|
|
35
|
-
/**
|
|
36
|
-
* It JSON.stringifies any parsed content safely. The original JSON.stringify() has some flaws that get in the way, so it is custom wrapped. The original has some problems:
|
|
37
|
-
* 1. it cannot stringify bigints. So we help out by converting it into a string.
|
|
38
|
-
* 2. It cannot distinguish between 0 and -0. But a float32 is encoded in a uint8Array for 0 to be [0,0,0,0] (0x00000000) and -0 to be [0,0,0,128] (0x00000080) in little endian.
|
|
39
|
-
* @param obj
|
|
40
|
-
* @param indent
|
|
41
|
-
* @returns a string that is safely stringified.
|
|
42
|
-
*/
|
|
43
|
-
static JSONStringifyModified: (obj: any, indent?: number) => string;
|
|
44
|
-
}
|
package/build/parser/parser.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { Level } from "./satisfactory/level.class";
|
|
2
|
-
import { SatisfactorySave } from "./satisfactory/satisfactory-save.class";
|
|
3
|
-
import { SaveReader, projectionFilterApplies } from "./save-reader";
|
|
4
|
-
import { SaveWriter } from "./save-writer";
|
|
5
|
-
class SaveParser {
|
|
6
|
-
/**
|
|
7
|
-
* serializes a save file into binary and reports back on individual callbacks.
|
|
8
|
-
* @param save the save file to serialize into binary.
|
|
9
|
-
* @param onBinaryBeforeCompressing gets called on the binary save body before it is compressed.
|
|
10
|
-
* @param onHeader gets called on the binary save header, which is always uncompressed.
|
|
11
|
-
* @param onChunk gets called when a chunk of the compressed save body was generated. Often, files' save bodies consist of multiple chunks.
|
|
12
|
-
* @param onFinish gets called when all chunks have been generated. A summary of the chunk sizes and count is reported.
|
|
13
|
-
*/
|
|
14
|
-
static WriteSave(save, onBinaryBeforeCompressing, onHeader, onChunk, onFinish) {
|
|
15
|
-
const writer = new SaveWriter();
|
|
16
|
-
SaveWriter.WriteHeader(writer, save.header);
|
|
17
|
-
const posAfterHeader = writer.getBufferPosition();
|
|
18
|
-
SaveWriter.WriteLevels(writer, save, save.header.buildVersion);
|
|
19
|
-
writer.endWriting();
|
|
20
|
-
writer.generateChunks(save.compressionInfo, posAfterHeader, onBinaryBeforeCompressing, onHeader, onChunk, onFinish);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* parses a save object from a binary buffer and reports back on decompressing the save body in a callback.
|
|
24
|
-
* @param file the binary content to be parsed.
|
|
25
|
-
* @param additionalData additional static data that is not contained in save files. For example, power slugs and resource nodes.
|
|
26
|
-
* @param onSaveDecompressed gets called when the entire binary save body has been decompressed.
|
|
27
|
-
* @returns a brief summary
|
|
28
|
-
*/
|
|
29
|
-
static ParseSaveFile(file, onSaveDecompressed = () => { }, onProgress = () => { }) {
|
|
30
|
-
const reader = new SaveReader(file.buffer, onProgress);
|
|
31
|
-
// read header
|
|
32
|
-
const header = reader.readHeader();
|
|
33
|
-
const save = new SatisfactorySave(header);
|
|
34
|
-
// inflate chunks
|
|
35
|
-
const inflateResult = reader.inflateChunks();
|
|
36
|
-
// call callback on decompressed save body
|
|
37
|
-
onSaveDecompressed(reader.getBuffer());
|
|
38
|
-
// parse levels
|
|
39
|
-
const levelParseResult = reader.readLevels();
|
|
40
|
-
save.levels = reader.levels;
|
|
41
|
-
save.compressionInfo = reader.compressionInfo;
|
|
42
|
-
save.trailingCollectedObjects = reader.trailingCollectedObjects;
|
|
43
|
-
return save;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Does Projection on a Save Object in order to reduce it's complexity.
|
|
47
|
-
* @param save the save object in question.
|
|
48
|
-
* @param config the projection config to apply.
|
|
49
|
-
* @returns a save object that has been projected / modified. Do not try to serialize it into an actual save tho! Since information has been transformed.
|
|
50
|
-
*/
|
|
51
|
-
static ProjectSave(save, config) {
|
|
52
|
-
return {
|
|
53
|
-
header: save.header,
|
|
54
|
-
trailingCollectedObjects: save.trailingCollectedObjects,
|
|
55
|
-
levels: save.levels.map(level => {
|
|
56
|
-
const lvl = new Level(level.name);
|
|
57
|
-
lvl.collectables = level.collectables;
|
|
58
|
-
lvl.objects = level.objects.filter(obj => projectionFilterApplies(config, obj));
|
|
59
|
-
return lvl;
|
|
60
|
-
})
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* It JSON.stringifies any parsed content safely. The original JSON.stringify() has some flaws that get in the way, so it is custom wrapped. The original has some problems:
|
|
66
|
-
* 1. it cannot stringify bigints. So we help out by converting it into a string.
|
|
67
|
-
* 2. It cannot distinguish between 0 and -0. But a float32 is encoded in a uint8Array for 0 to be [0,0,0,0] (0x00000000) and -0 to be [0,0,0,128] (0x00000080) in little endian.
|
|
68
|
-
* @param obj
|
|
69
|
-
* @param indent
|
|
70
|
-
* @returns a string that is safely stringified.
|
|
71
|
-
*/
|
|
72
|
-
SaveParser.JSONStringifyModified = (obj, indent = 0) => JSON.stringify(obj, (key, value) => {
|
|
73
|
-
if (typeof value === 'bigint') {
|
|
74
|
-
return value.toString();
|
|
75
|
-
}
|
|
76
|
-
else if (value === 0 && 1 / value < 0) { // -0
|
|
77
|
-
return '-0';
|
|
78
|
-
}
|
|
79
|
-
return value;
|
|
80
|
-
}, indent);
|
|
81
|
-
export { SaveParser };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { SaveComponent } from "../objects/SaveComponent";
|
|
2
|
-
import { SaveEntity } from "../objects/SaveEntity";
|
|
3
|
-
import { ChunkCompressionInfo } from "../satisfactory-save.class";
|
|
4
|
-
import { col4 } from "../structs/util.types";
|
|
5
|
-
export interface BlueprintConfig {
|
|
6
|
-
description: string;
|
|
7
|
-
color: col4;
|
|
8
|
-
iconID: number;
|
|
9
|
-
}
|
|
10
|
-
export type BlueprintHeader = {
|
|
11
|
-
itemCosts: [string, number][];
|
|
12
|
-
recipeReferences: string[];
|
|
13
|
-
};
|
|
14
|
-
export interface Blueprint {
|
|
15
|
-
name: string;
|
|
16
|
-
compressionInfo: ChunkCompressionInfo;
|
|
17
|
-
header: BlueprintHeader;
|
|
18
|
-
config: BlueprintConfig;
|
|
19
|
-
objects: (SaveEntity | SaveComponent)[];
|
|
20
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { ByteReader } from "../byte/byte-reader.class";
|
|
2
|
-
import { ByteWriter } from "../byte/byte-writer.class";
|
|
3
|
-
import { SaveReader } from "../save-reader";
|
|
4
|
-
import { ObjectReference } from "./objects/ObjectReference";
|
|
5
|
-
import { SaveComponent } from "./objects/SaveComponent";
|
|
6
|
-
import { SaveEntity } from "./objects/SaveEntity";
|
|
7
|
-
import { SaveObject } from "./objects/SaveObject";
|
|
8
|
-
export declare class Level {
|
|
9
|
-
name: string;
|
|
10
|
-
objects: (SaveEntity | SaveComponent)[];
|
|
11
|
-
collectables: ObjectReference[];
|
|
12
|
-
constructor(name: string);
|
|
13
|
-
static SerializeObjectHeaders(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[]): void;
|
|
14
|
-
static WriteLevel(writer: ByteWriter, level: Level, buildVersion: number): void;
|
|
15
|
-
static SerializeObjectContents(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[], buildVersion: number): void;
|
|
16
|
-
static ReadObjectHeaders(reader: ByteReader, objectsList: SaveObject[], onProgressCallback: (progress: number, msg?: string) => void): void;
|
|
17
|
-
static ReadObjectContents(reader: ByteReader, objectsList: SaveObject[], buildVersion: number, onProgressCallback: (progress: number, msg?: string) => void): void;
|
|
18
|
-
static ReadLevel(reader: SaveReader, levelName: string, buildVersion: number): Level;
|
|
19
|
-
static SerializeCollectablesList(writer: ByteWriter, collectables: ObjectReference[]): void;
|
|
20
|
-
static ReadCollectablesList(reader: SaveReader): ObjectReference[];
|
|
21
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { ObjectReference } from "./objects/ObjectReference";
|
|
2
|
-
import { isSaveComponent, SaveComponent } from "./objects/SaveComponent";
|
|
3
|
-
import { isSaveEntity, SaveEntity } from "./objects/SaveEntity";
|
|
4
|
-
export class Level {
|
|
5
|
-
constructor(name) {
|
|
6
|
-
this.name = name;
|
|
7
|
-
this.objects = [];
|
|
8
|
-
this.collectables = [];
|
|
9
|
-
}
|
|
10
|
-
static SerializeObjectHeaders(writer, objects) {
|
|
11
|
-
writer.writeInt32(objects.length);
|
|
12
|
-
for (const obj of objects) {
|
|
13
|
-
switch (obj.type) {
|
|
14
|
-
case 'SaveEntity':
|
|
15
|
-
writer.writeInt32(SaveEntity.TypeID);
|
|
16
|
-
SaveEntity.SerializeHeader(writer, obj);
|
|
17
|
-
break;
|
|
18
|
-
case 'SaveComponent':
|
|
19
|
-
writer.writeInt32(SaveComponent.TypeID);
|
|
20
|
-
SaveComponent.SerializeHeader(writer, obj);
|
|
21
|
-
break;
|
|
22
|
-
default:
|
|
23
|
-
console.log('Unknown object type', obj);
|
|
24
|
-
break;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
static WriteLevel(writer, level, buildVersion) {
|
|
29
|
-
const lenIndicatorHeaderAndCollectableSize = writer.getBufferPosition();
|
|
30
|
-
writer.writeInt32(0);
|
|
31
|
-
Level.SerializeObjectHeaders(writer, level.objects);
|
|
32
|
-
Level.SerializeCollectablesList(writer, level.collectables);
|
|
33
|
-
// replace binary size from earlier for - object headers + collectables
|
|
34
|
-
writer.writeBinarySizeFromPosition(lenIndicatorHeaderAndCollectableSize, lenIndicatorHeaderAndCollectableSize + 4);
|
|
35
|
-
// write entities
|
|
36
|
-
Level.SerializeObjectContents(writer, level.objects, buildVersion);
|
|
37
|
-
Level.SerializeCollectablesList(writer, level.collectables);
|
|
38
|
-
}
|
|
39
|
-
static SerializeObjectContents(writer, objects, buildVersion) {
|
|
40
|
-
const lenIndicatorEntities = writer.getBufferPosition();
|
|
41
|
-
writer.writeInt32(0);
|
|
42
|
-
writer.writeInt32(objects.length);
|
|
43
|
-
for (const obj of objects) {
|
|
44
|
-
const lenReplacementPosition = writer.getBufferPosition();
|
|
45
|
-
writer.writeInt32(0);
|
|
46
|
-
if (isSaveEntity(obj)) {
|
|
47
|
-
SaveEntity.SerializeData(writer, obj, buildVersion);
|
|
48
|
-
}
|
|
49
|
-
else if (isSaveComponent(obj)) {
|
|
50
|
-
SaveComponent.SerializeData(writer, obj, buildVersion);
|
|
51
|
-
}
|
|
52
|
-
writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
|
|
53
|
-
}
|
|
54
|
-
writer.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 4);
|
|
55
|
-
}
|
|
56
|
-
static ReadObjectHeaders(reader, objectsList, onProgressCallback) {
|
|
57
|
-
let countObjectHeaders = reader.readInt32();
|
|
58
|
-
for (let i = 0; i < countObjectHeaders; i++) {
|
|
59
|
-
if (i % 1000 === 0) {
|
|
60
|
-
onProgressCallback(reader.getBufferProgress());
|
|
61
|
-
}
|
|
62
|
-
let objectType = reader.readInt32();
|
|
63
|
-
switch (objectType) {
|
|
64
|
-
case SaveEntity.TypeID:
|
|
65
|
-
let object = new SaveEntity('', '', '', '');
|
|
66
|
-
SaveEntity.ParseHeader(reader, object);
|
|
67
|
-
objectsList.push(object);
|
|
68
|
-
break;
|
|
69
|
-
case SaveComponent.TypeID:
|
|
70
|
-
let component = new SaveComponent('', '', '', '');
|
|
71
|
-
SaveComponent.ParseHeader(reader, component);
|
|
72
|
-
objectsList.push(component);
|
|
73
|
-
break;
|
|
74
|
-
default:
|
|
75
|
-
console.log('Unknown object type', objectType);
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
static ReadObjectContents(reader, objectsList, buildVersion, onProgressCallback) {
|
|
81
|
-
const binarySize = reader.readInt32(); // entities binary length
|
|
82
|
-
const posBefore = reader.getBufferPosition();
|
|
83
|
-
const countEntities = reader.readInt32();
|
|
84
|
-
if (countEntities !== objectsList.length) {
|
|
85
|
-
throw new Error(`possibly corrupt. entity content count ${countEntities} does not object count of ${objectsList.length}`);
|
|
86
|
-
}
|
|
87
|
-
// definitely after i=25467
|
|
88
|
-
for (let i = 0; i < countEntities; i++) {
|
|
89
|
-
if (i % 1000 === 0) {
|
|
90
|
-
onProgressCallback(reader.getBufferProgress());
|
|
91
|
-
}
|
|
92
|
-
const len = reader.readInt32();
|
|
93
|
-
const before = reader.getBufferPosition();
|
|
94
|
-
const obj = objectsList[i];
|
|
95
|
-
if (isSaveEntity(obj)) {
|
|
96
|
-
SaveEntity.ParseData(obj, len, reader, buildVersion);
|
|
97
|
-
}
|
|
98
|
-
else if (isSaveComponent(obj)) {
|
|
99
|
-
SaveComponent.ParseData(obj, len, reader, buildVersion);
|
|
100
|
-
}
|
|
101
|
-
const after = reader.getBufferPosition();
|
|
102
|
-
if (after - before !== len) {
|
|
103
|
-
console.warn('entity may be corrupt', this.name, i);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
const posAfter = reader.getBufferPosition();
|
|
107
|
-
if (posAfter - posBefore !== binarySize) {
|
|
108
|
-
//WARNING
|
|
109
|
-
console.warn('save seems corrupt.', this.name);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
static ReadLevel(reader, levelName, buildVersion) {
|
|
113
|
-
const level = new Level(levelName);
|
|
114
|
-
reader.readInt32(); // object headers + collectables binary length
|
|
115
|
-
// object headers
|
|
116
|
-
Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback);
|
|
117
|
-
// collectables
|
|
118
|
-
reader.onProgressCallback(reader.getBufferProgress());
|
|
119
|
-
level.collectables = Level.ReadCollectablesList(reader);
|
|
120
|
-
// objects contents
|
|
121
|
-
Level.ReadObjectContents(reader, level.objects, buildVersion, reader.onProgressCallback);
|
|
122
|
-
// collectables 2nd time.
|
|
123
|
-
reader.onProgressCallback(reader.getBufferProgress());
|
|
124
|
-
Level.ReadCollectablesList(reader);
|
|
125
|
-
return level;
|
|
126
|
-
}
|
|
127
|
-
// collected stuff
|
|
128
|
-
static SerializeCollectablesList(writer, collectables) {
|
|
129
|
-
writer.writeInt32(collectables.length);
|
|
130
|
-
for (const collectable of collectables) {
|
|
131
|
-
ObjectReference.Serialize(writer, collectable);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
// collected stuff
|
|
135
|
-
static ReadCollectablesList(reader) {
|
|
136
|
-
let countCollected = reader.readInt32();
|
|
137
|
-
const collected = [];
|
|
138
|
-
for (let i = 0; i < countCollected; i++) {
|
|
139
|
-
const collectable = ObjectReference.Parse(reader);
|
|
140
|
-
collected.push(collectable);
|
|
141
|
-
}
|
|
142
|
-
return collected;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { ByteReader } from "../../byte/byte-reader.class";
|
|
2
|
-
import { SaveWriter } from "../../save-writer";
|
|
3
|
-
import { AbstractBaseProperty } from "./Property";
|
|
4
|
-
export declare class DataFields {
|
|
5
|
-
properties: any[];
|
|
6
|
-
trailingData: number[];
|
|
7
|
-
shouldBeNulled: boolean;
|
|
8
|
-
constructor();
|
|
9
|
-
static Parse(length: number, reader: ByteReader, buildVersion: number): DataFields;
|
|
10
|
-
static ParseProperty(reader: ByteReader, buildVersion: number, propertyName: string): AbstractBaseProperty | null;
|
|
11
|
-
static Serialize(writer: SaveWriter, fields: DataFields, buildVersion: number): void;
|
|
12
|
-
static SerializeProperty(writer: SaveWriter, property: AbstractBaseProperty, propertyName: string, buildVersion: number): void;
|
|
13
|
-
}
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import { ArrayProperty, BoolProperty, ByteProperty, DoubleProperty, EnumProperty, FloatProperty, Int32Property, Int64Property, Int8Property, MapProperty, ObjectProperty, SetProperty, StrProperty, StructProperty, TextProperty, Uint32Property, Uint8Property } from "./Property";
|
|
2
|
-
export class DataFields {
|
|
3
|
-
constructor() {
|
|
4
|
-
this.properties = [];
|
|
5
|
-
this.trailingData = [];
|
|
6
|
-
this.shouldBeNulled = false;
|
|
7
|
-
}
|
|
8
|
-
static Parse(length, reader, buildVersion) {
|
|
9
|
-
const start = reader.getBufferPosition();
|
|
10
|
-
const fields = new DataFields();
|
|
11
|
-
if (length === 0) {
|
|
12
|
-
//WARNING
|
|
13
|
-
fields.shouldBeNulled = true;
|
|
14
|
-
return fields;
|
|
15
|
-
}
|
|
16
|
-
let propertyName = reader.readString();
|
|
17
|
-
while (propertyName !== 'None') {
|
|
18
|
-
const property = DataFields.ParseProperty(reader, buildVersion, propertyName);
|
|
19
|
-
fields.properties.push(property);
|
|
20
|
-
propertyName = reader.readString();
|
|
21
|
-
}
|
|
22
|
-
let int1 = reader.readInt32();
|
|
23
|
-
if (int1 !== 0) {
|
|
24
|
-
//WARNING
|
|
25
|
-
}
|
|
26
|
-
const end = reader.getBufferPosition();
|
|
27
|
-
let remainingBytes = start + length - end;
|
|
28
|
-
fields.trailingData = Array.from(reader.readBytes(remainingBytes));
|
|
29
|
-
return fields;
|
|
30
|
-
}
|
|
31
|
-
static ParseProperty(reader, buildVersion, propertyName) {
|
|
32
|
-
let currentProperty = {};
|
|
33
|
-
if (currentProperty.name === 'None') {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
//TODO: What is this extra byte that is appearing sometime?
|
|
37
|
-
// i dont think there is an extra byte.
|
|
38
|
-
/*
|
|
39
|
-
let extraByteTest = reader.readByte();
|
|
40
|
-
if (extraByteTest !== 0) {
|
|
41
|
-
reader.currentByte -= 1;
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
console.log('Property extra byte', currentProperty);
|
|
45
|
-
}
|
|
46
|
-
*/
|
|
47
|
-
//TODO assign type and index after parsing.
|
|
48
|
-
const propertyType = reader.readString();
|
|
49
|
-
const binarySize = reader.readInt32();
|
|
50
|
-
const index = reader.readInt32();
|
|
51
|
-
const before = reader.getBufferPosition();
|
|
52
|
-
let overhead = 0;
|
|
53
|
-
switch (propertyType) {
|
|
54
|
-
case 'BoolProperty':
|
|
55
|
-
currentProperty = BoolProperty.Parse(reader, propertyType, index);
|
|
56
|
-
overhead = BoolProperty.CalcOverhead(currentProperty);
|
|
57
|
-
break;
|
|
58
|
-
case 'ByteProperty':
|
|
59
|
-
currentProperty = ByteProperty.Parse(reader, propertyType, index);
|
|
60
|
-
overhead = ByteProperty.CalcOverhead(currentProperty);
|
|
61
|
-
break;
|
|
62
|
-
case 'Int8Property':
|
|
63
|
-
currentProperty = Int8Property.Parse(reader, propertyType, index);
|
|
64
|
-
overhead = Int8Property.CalcOverhead(currentProperty);
|
|
65
|
-
break;
|
|
66
|
-
case 'UInt8Property':
|
|
67
|
-
currentProperty = Uint8Property.Parse(reader, propertyType, index);
|
|
68
|
-
overhead = Uint8Property.CalcOverhead(currentProperty);
|
|
69
|
-
break;
|
|
70
|
-
case 'IntProperty':
|
|
71
|
-
case 'Int32Property':
|
|
72
|
-
currentProperty = Int32Property.Parse(reader, propertyType, index);
|
|
73
|
-
overhead = Int32Property.CalcOverhead(currentProperty);
|
|
74
|
-
break;
|
|
75
|
-
case 'UInt32Property':
|
|
76
|
-
currentProperty = Uint32Property.Parse(reader, propertyType, index);
|
|
77
|
-
overhead = Uint32Property.CalcOverhead(currentProperty);
|
|
78
|
-
break;
|
|
79
|
-
case 'Int64Property':
|
|
80
|
-
currentProperty = Int64Property.Parse(reader, propertyType, index);
|
|
81
|
-
overhead = Int64Property.CalcOverhead(currentProperty);
|
|
82
|
-
break;
|
|
83
|
-
// TODO
|
|
84
|
-
/*
|
|
85
|
-
case 'UInt64Property':
|
|
86
|
-
currentProperty = Int64Property.Parse(reader, propertyType, index);
|
|
87
|
-
break;
|
|
88
|
-
*/
|
|
89
|
-
case 'SingleProperty':
|
|
90
|
-
case 'FloatProperty':
|
|
91
|
-
currentProperty = FloatProperty.Parse(reader, propertyType, index);
|
|
92
|
-
overhead = FloatProperty.CalcOverhead(currentProperty);
|
|
93
|
-
break;
|
|
94
|
-
case 'DoubleProperty':
|
|
95
|
-
currentProperty = DoubleProperty.Parse(reader, propertyType, index);
|
|
96
|
-
overhead = DoubleProperty.CalcOverhead(currentProperty);
|
|
97
|
-
break;
|
|
98
|
-
case 'StrProperty':
|
|
99
|
-
case 'NameProperty':
|
|
100
|
-
currentProperty = StrProperty.Parse(reader, propertyType, index);
|
|
101
|
-
overhead = StrProperty.CalcOverhead(currentProperty);
|
|
102
|
-
break;
|
|
103
|
-
case 'ObjectProperty':
|
|
104
|
-
case 'InterfaceProperty':
|
|
105
|
-
currentProperty = ObjectProperty.Parse(reader, propertyType, index);
|
|
106
|
-
overhead = ObjectProperty.CalcOverhead(currentProperty);
|
|
107
|
-
break;
|
|
108
|
-
case 'EnumProperty':
|
|
109
|
-
currentProperty = EnumProperty.Parse(reader, propertyType, index);
|
|
110
|
-
overhead = EnumProperty.CalcOverhead(currentProperty);
|
|
111
|
-
break;
|
|
112
|
-
case 'StructProperty':
|
|
113
|
-
currentProperty = StructProperty.Parse(reader, propertyType, index, binarySize);
|
|
114
|
-
overhead = StructProperty.CalcOverhead(currentProperty);
|
|
115
|
-
break;
|
|
116
|
-
case 'ArrayProperty':
|
|
117
|
-
currentProperty = ArrayProperty.Parse(reader, propertyType, index, propertyName);
|
|
118
|
-
overhead = ArrayProperty.CalcOverhead(currentProperty);
|
|
119
|
-
break;
|
|
120
|
-
case 'MapProperty':
|
|
121
|
-
//currentProperty = reader.readMapProperty(currentProperty, '');
|
|
122
|
-
currentProperty = MapProperty.Parse(reader, propertyName, buildVersion, binarySize);
|
|
123
|
-
overhead = MapProperty.CalcOverhead(currentProperty);
|
|
124
|
-
break;
|
|
125
|
-
case 'TextProperty':
|
|
126
|
-
currentProperty = TextProperty.Parse(reader, propertyType, index);
|
|
127
|
-
overhead = TextProperty.CalcOverhead(currentProperty);
|
|
128
|
-
break;
|
|
129
|
-
case 'SetProperty':
|
|
130
|
-
currentProperty = SetProperty.Parse(reader, propertyType, index, propertyName);
|
|
131
|
-
overhead = SetProperty.CalcOverhead(currentProperty);
|
|
132
|
-
break;
|
|
133
|
-
default:
|
|
134
|
-
throw new Error(`Unimplemented type ${propertyType}`);
|
|
135
|
-
}
|
|
136
|
-
currentProperty.name = propertyName;
|
|
137
|
-
const readBytes = reader.getBufferPosition() - before - overhead;
|
|
138
|
-
if (readBytes !== binarySize) {
|
|
139
|
-
throw new Error(`possibly corrupt. Read ${readBytes} for ${propertyType} ${propertyName}, but ${binarySize} were indicated.`);
|
|
140
|
-
}
|
|
141
|
-
return currentProperty;
|
|
142
|
-
}
|
|
143
|
-
static Serialize(writer, fields, buildVersion) {
|
|
144
|
-
for (const property of fields.properties) {
|
|
145
|
-
writer.writeString(property.name);
|
|
146
|
-
DataFields.SerializeProperty(writer, property, property.name, buildVersion);
|
|
147
|
-
}
|
|
148
|
-
writer.writeString('None');
|
|
149
|
-
writer.writeInt32(0);
|
|
150
|
-
writer.writeBytesArray(fields.trailingData);
|
|
151
|
-
}
|
|
152
|
-
static SerializeProperty(writer, property, propertyName, buildVersion) {
|
|
153
|
-
writer.writeString(property.ueType);
|
|
154
|
-
// binary length indicator
|
|
155
|
-
const lenIndicator = writer.getBufferPosition();
|
|
156
|
-
writer.writeInt32(0);
|
|
157
|
-
// write index if it is not 0. Since it normally is.
|
|
158
|
-
writer.writeInt32(property.index ?? 0);
|
|
159
|
-
const start = writer.getBufferPosition();
|
|
160
|
-
let overhead = 0;
|
|
161
|
-
switch (property.ueType) {
|
|
162
|
-
case 'BoolProperty':
|
|
163
|
-
overhead = BoolProperty.CalcOverhead(property);
|
|
164
|
-
BoolProperty.Serialize(writer, property);
|
|
165
|
-
break;
|
|
166
|
-
case 'ByteProperty':
|
|
167
|
-
overhead = ByteProperty.CalcOverhead(property);
|
|
168
|
-
ByteProperty.Serialize(writer, property);
|
|
169
|
-
break;
|
|
170
|
-
case 'Int8Property':
|
|
171
|
-
overhead = Int8Property.CalcOverhead(property);
|
|
172
|
-
Int8Property.Serialize(writer, property);
|
|
173
|
-
break;
|
|
174
|
-
case 'UInt8Property':
|
|
175
|
-
overhead = Uint8Property.CalcOverhead(property);
|
|
176
|
-
Uint8Property.Serialize(writer, property);
|
|
177
|
-
break;
|
|
178
|
-
case 'IntProperty':
|
|
179
|
-
case 'Int32Property':
|
|
180
|
-
overhead = Int32Property.CalcOverhead(property);
|
|
181
|
-
Int32Property.Serialize(writer, property);
|
|
182
|
-
break;
|
|
183
|
-
case 'UInt32Property':
|
|
184
|
-
overhead = Uint32Property.CalcOverhead(property);
|
|
185
|
-
Uint32Property.Serialize(writer, property);
|
|
186
|
-
break;
|
|
187
|
-
case 'Int64Property':
|
|
188
|
-
overhead = Int64Property.CalcOverhead(property);
|
|
189
|
-
Int64Property.Serialize(writer, property);
|
|
190
|
-
break;
|
|
191
|
-
// TODO: uint64Property
|
|
192
|
-
case 'SingleProperty':
|
|
193
|
-
case 'FloatProperty':
|
|
194
|
-
overhead = FloatProperty.CalcOverhead(property);
|
|
195
|
-
FloatProperty.Serialize(writer, property);
|
|
196
|
-
break;
|
|
197
|
-
case 'DoubleProperty':
|
|
198
|
-
overhead = DoubleProperty.CalcOverhead(property);
|
|
199
|
-
DoubleProperty.Serialize(writer, property);
|
|
200
|
-
break;
|
|
201
|
-
case 'StrProperty':
|
|
202
|
-
case 'NameProperty':
|
|
203
|
-
overhead = StrProperty.CalcOverhead(property);
|
|
204
|
-
StrProperty.Serialize(writer, property);
|
|
205
|
-
break;
|
|
206
|
-
case 'ObjectProperty':
|
|
207
|
-
case 'InterfaceProperty':
|
|
208
|
-
overhead = ObjectProperty.CalcOverhead(property);
|
|
209
|
-
ObjectProperty.Serialize(writer, property);
|
|
210
|
-
break;
|
|
211
|
-
case 'EnumProperty':
|
|
212
|
-
overhead = EnumProperty.CalcOverhead(property);
|
|
213
|
-
EnumProperty.Serialize(writer, property);
|
|
214
|
-
break;
|
|
215
|
-
case 'ByteProperty':
|
|
216
|
-
overhead = ByteProperty.CalcOverhead(property);
|
|
217
|
-
ByteProperty.Serialize(writer, property);
|
|
218
|
-
break;
|
|
219
|
-
case 'StructProperty':
|
|
220
|
-
overhead = StructProperty.CalcOverhead(property);
|
|
221
|
-
StructProperty.Serialize(writer, property);
|
|
222
|
-
break;
|
|
223
|
-
case 'ArrayProperty':
|
|
224
|
-
overhead = ArrayProperty.CalcOverhead(property);
|
|
225
|
-
ArrayProperty.Serialize(writer, property, propertyName);
|
|
226
|
-
break;
|
|
227
|
-
case 'MapProperty':
|
|
228
|
-
overhead = MapProperty.CalcOverhead(property);
|
|
229
|
-
MapProperty.Serialize(writer, property);
|
|
230
|
-
break;
|
|
231
|
-
case 'TextProperty':
|
|
232
|
-
overhead = TextProperty.CalcOverhead(property);
|
|
233
|
-
TextProperty.Serialize(writer, property);
|
|
234
|
-
break;
|
|
235
|
-
case 'SetProperty':
|
|
236
|
-
overhead = SetProperty.CalcOverhead(property);
|
|
237
|
-
SetProperty.Serialize(writer, property);
|
|
238
|
-
break;
|
|
239
|
-
default:
|
|
240
|
-
throw new Error(`Unimplemented type ${property.type}`);
|
|
241
|
-
}
|
|
242
|
-
// replace len indicator.
|
|
243
|
-
writer.writeBinarySizeFromPosition(lenIndicator, start + overhead);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { ByteReader } from "../../byte/byte-reader.class";
|
|
2
|
-
import { ByteWriter } from "../../byte/byte-writer.class";
|
|
3
|
-
export declare class ObjectReference {
|
|
4
|
-
levelName: string;
|
|
5
|
-
pathName: string;
|
|
6
|
-
constructor(levelName: string, pathName: string);
|
|
7
|
-
static Parse(reader: ByteReader): ObjectReference;
|
|
8
|
-
static Serialize(writer: ByteWriter, ref: ObjectReference): void;
|
|
9
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export class ObjectReference {
|
|
2
|
-
constructor(levelName, pathName) {
|
|
3
|
-
this.levelName = levelName;
|
|
4
|
-
this.pathName = pathName;
|
|
5
|
-
}
|
|
6
|
-
static Parse(reader) {
|
|
7
|
-
return new ObjectReference(reader.readString(), reader.readString());
|
|
8
|
-
}
|
|
9
|
-
static Serialize(writer, ref) {
|
|
10
|
-
writer.writeString(ref.levelName);
|
|
11
|
-
writer.writeString(ref.pathName);
|
|
12
|
-
}
|
|
13
|
-
}
|