uesavetool
Version:
A Node.js implementation for deserializing and converting GVAS/.sav files to JSON and vice-versa.
75 lines (73 loc) • 2.47 kB
JavaScript
import { Buffer } from 'buffer'
import { Property } from './index.js'
import { PropertyFactory } from '../factories/index.js';
import { SerializationError } from '../index.js'
import { Serializer } from '../../utils/Serializer.js';
export class ArrayProperty extends Property {
constructor() {
super();
this.StoredPropertyType = "";
this.Property = new Property();
}
get Size() {
let size = 0;
size += this.Name.length + 4;
size += this.Type.length + 4;
size += 8; // 4 byte size + 4 byte padding
size += this.StoredPropertyType.length + 4;
size += 5; // 1 byte padding + 2 byte int + 2 byte padding
size += this.Property.Size;
return size;
}
get HeaderSize() {
let size = this.Name.length + 4;
size += this.Type.length + 4;
size += 8;
size += this.StoredPropertyType.length + 4;
size += 1;
return size;
}
get ArraySize() {
if (this.StoredPropertyType === 'IntProperty\0')
return 12;
else
return this.Size - this.HeaderSize;
}
deserialize(serial) {
serial.seek(4);
this.StoredPropertyType = serial.readString()
serial.seek(1);
let count = serial.readInt16();
serial.seek(2);
this.Property = PropertyFactory.createArray({
Name: this.Name,
Type: this.StoredPropertyType
});
this.Property.deserialize(serial, count)
return this;
}
serialize() {
let serial = Serializer.alloc(this.Size);
serial.writeString(this.Name);
serial.writeString(this.Type);
serial.writeInt32(this.ArraySize);
serial.seek(4);
serial.writeString(this.StoredPropertyType);
serial.seek(1);
serial.writeInt16(this.Property.Count);
serial.seek(2);
serial.write(this.Property.serialize());
if (serial.tell !== this.Size)
throw new SerializationError(this);
return serial.Data;
}
static from(obj) {
let array = new ArrayProperty();
array.Name = obj.Name;
array.Type = obj.Type;
array.StoredPropertyType = obj.StoredPropertyType;
if (obj.Property !== undefined)
array.Property = PropertyFactory.createArray(obj.Property);
return array;
}
}