UNPKG

uesavetool

Version:

A Node.js implementation for deserializing and converting GVAS/.sav files to JSON and vice-versa.

77 lines (75 loc) 2.64 kB
import { Property } from './index.js' import { PropertyFactory } from '../factories/index.js'; import { Serializer } from '../../utils/Serializer.js'; export class StructProperty extends Property { constructor() { super(); this.StoredPropertyType = ""; this.Properties = []; } get Size() { let size = this.Name.length + 4; size += this.Type.length + 4; size += 8; // 4 byte size + 4 byte padding size += this.StoredPropertyType.length + 4; size += 17; // 17 byte padding for (let i = 0; i < this.Properties.length; i++) { size += this.Properties[i].Size; } return size; } get HeaderSize() { let size = this.Name.length + 4; size += this.Type.length + 4; size += 8; size += this.StoredPropertyType.length + 4; size += 17; return size } get Count() { return this.Properties.length; } deserialize(serial, size) { // console.log(`Deserializing ${this.Name} Size: ${size}`) serial.seek(4); this.StoredPropertyType = serial.readString(); serial.seek(17); let end = serial.tell + size; let i = 0; while (serial.tell < end) { let Name = this.StoredPropertyType; let Type = 'Tuple'; let prop = PropertyFactory.create({ Name, Type }) prop.deserialize(serial) this.Properties.push(prop); i++; } // console.log(`Done Deserializing ${this.Name} Offset: ${serial.tell}`) return this; } serialize() { let serial = Serializer.alloc(this.Size); serial.writeString(this.Name); serial.writeString(this.Type); serial.writeInt32(this.Size - this.HeaderSize); serial.seek(4); serial.writeString(this.StoredPropertyType); serial.seek(17); for (let i = 0; i < this.Properties.length; i++) { serial.write(this.Properties[i].serialize()); } if (serial.tell !== this.Size) throw new SerializationError(this); return serial.Data; } static from(obj) { let struct = new StructProperty(); struct.Name = obj.Name; struct.Type = obj.Type; struct.StoredPropertyType = obj.StoredPropertyType; struct.Properties = []; if (obj.Properties !== undefined) obj.Properties.forEach((prop) => struct.Properties.push(PropertyFactory.create(prop))); return struct; } }